• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ability_connect_manager.h"
17 
18 #include <algorithm>
19 
20 #include "ability_connect_callback_stub.h"
21 #include "ability_manager_errors.h"
22 #include "ability_manager_service.h"
23 #include "ability_util.h"
24 #include "hitrace_meter.h"
25 #include "hilog_wrapper.h"
26 #include "in_process_call_wrapper.h"
27 #include "parameter.h"
28 
29 namespace OHOS {
30 namespace AAFwk {
AbilityConnectManager(int userId)31 AbilityConnectManager::AbilityConnectManager(int userId) : userId_(userId)
32 {}
33 
~AbilityConnectManager()34 AbilityConnectManager::~AbilityConnectManager()
35 {}
36 
StartAbility(const AbilityRequest & abilityRequest)37 int AbilityConnectManager::StartAbility(const AbilityRequest &abilityRequest)
38 {
39     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
40     std::lock_guard<std::recursive_mutex> guard(Lock_);
41     return StartAbilityLocked(abilityRequest);
42 }
43 
TerminateAbility(const sptr<IRemoteObject> & token)44 int AbilityConnectManager::TerminateAbility(const sptr<IRemoteObject> &token)
45 {
46     std::lock_guard<std::recursive_mutex> guard(Lock_);
47     auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
48     MoveToTerminatingMap(abilityRecord);
49     return TerminateAbilityLocked(token);
50 }
51 
TerminateAbility(const std::shared_ptr<AbilityRecord> & caller,int requestCode)52 int AbilityConnectManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &caller, int requestCode)
53 {
54     HILOG_INFO("Terminate ability.");
55     std::lock_guard<std::recursive_mutex> guard(Lock_);
56 
57     std::shared_ptr<AbilityRecord> targetAbility = nullptr;
58     int result = static_cast<int>(ABILITY_VISIBLE_FALSE_DENY_REQUEST);
59     std::for_each(serviceMap_.begin(),
60         serviceMap_.end(),
61         [&targetAbility, &caller, requestCode, &result](ServiceMapType::reference service) {
62             auto callerList = service.second->GetCallerRecordList();
63             for (auto &it : callerList) {
64                 if (it->GetCaller() == caller && it->GetRequestCode() == requestCode) {
65                     targetAbility = service.second;
66                     if (targetAbility) {
67                         auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
68                         CHECK_POINTER(abilityMs);
69                         result = abilityMs->JudgeAbilityVisibleControl(targetAbility->GetAbilityInfo());
70                     }
71                     break;
72                 }
73             }
74         });
75 
76     if (!targetAbility) {
77         HILOG_ERROR("targetAbility error.");
78         return NO_FOUND_ABILITY_BY_CALLER;
79     }
80     if (result != ERR_OK) {
81         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
82         return result;
83     }
84 
85     MoveToTerminatingMap(targetAbility);
86     return TerminateAbilityLocked(targetAbility->GetToken());
87 }
88 
StopServiceAbility(const AbilityRequest & abilityRequest)89 int AbilityConnectManager::StopServiceAbility(const AbilityRequest &abilityRequest)
90 {
91     HILOG_INFO("Stop Service ability.");
92     std::lock_guard<std::recursive_mutex> guard(Lock_);
93     return StopServiceAbilityLocked(abilityRequest);
94 }
95 
TerminateAbilityResult(const sptr<IRemoteObject> & token,int startId)96 int AbilityConnectManager::TerminateAbilityResult(const sptr<IRemoteObject> &token, int startId)
97 {
98     HILOG_INFO("Terminate ability result.");
99     std::lock_guard<std::recursive_mutex> guard(Lock_);
100     return TerminateAbilityResultLocked(token, startId);
101 }
102 
StartAbilityLocked(const AbilityRequest & abilityRequest)103 int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityRequest)
104 {
105     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
106     HILOG_INFO("Start ability locked, ability_name: %{public}s",
107         abilityRequest.want.GetElement().GetURI().c_str());
108 
109     std::shared_ptr<AbilityRecord> targetService;
110     bool isLoadedAbility = false;
111     GetOrCreateServiceRecord(abilityRequest, false, targetService, isLoadedAbility);
112     CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
113 
114     targetService->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
115 
116     if (!isLoadedAbility) {
117         LoadAbility(targetService);
118     } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
119         // It may have been started through connect
120         CommandAbility(targetService);
121     } else {
122         HILOG_ERROR("Target service is already activating.");
123         return START_SERVICE_ABILITY_ACTIVATING;
124     }
125 
126     sptr<Token> token = targetService->GetToken();
127     sptr<Token> preToken = nullptr;
128     if (targetService->GetPreAbilityRecord()) {
129         preToken = targetService->GetPreAbilityRecord()->GetToken();
130     }
131     DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
132     return ERR_OK;
133 }
134 
TerminateAbilityLocked(const sptr<IRemoteObject> & token)135 int AbilityConnectManager::TerminateAbilityLocked(const sptr<IRemoteObject> &token)
136 {
137     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
138     HILOG_INFO("Terminate ability locked.");
139     auto abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
140     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
141 
142     if (abilityRecord->IsTerminating()) {
143         HILOG_INFO("Ability is on terminating.");
144         return ERR_OK;
145     }
146 
147     if (!abilityRecord->GetConnectRecordList().empty()) {
148         HILOG_INFO("Target service has been connected. Post disconnect task.");
149         auto connectRecordList = abilityRecord->GetConnectRecordList();
150         HandleTerminateDisconnectTask(connectRecordList);
151     }
152 
153     auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
154         HILOG_WARN("Disconnect ability terminate timeout.");
155         connectManager->HandleStopTimeoutTask(abilityRecord);
156     };
157     abilityRecord->Terminate(timeoutTask);
158 
159     return ERR_OK;
160 }
161 
TerminateAbilityResultLocked(const sptr<IRemoteObject> & token,int startId)162 int AbilityConnectManager::TerminateAbilityResultLocked(const sptr<IRemoteObject> &token, int startId)
163 {
164     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
165     HILOG_INFO("Terminate ability result locked, startId: %{public}d", startId);
166     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
167 
168     auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
169     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
170 
171     if (abilityRecord->GetStartId() != startId) {
172         HILOG_ERROR("Start id not equal.");
173         return TERMINATE_ABILITY_RESULT_FAILED;
174     }
175 
176     MoveToTerminatingMap(abilityRecord);
177     return TerminateAbilityLocked(token);
178 }
179 
StopServiceAbilityLocked(const AbilityRequest & abilityRequest)180 int AbilityConnectManager::StopServiceAbilityLocked(const AbilityRequest &abilityRequest)
181 {
182     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
183     HILOG_INFO("Stop service ability locked.");
184     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
185         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
186     auto abilityRecord = GetServiceRecordByElementName(element.GetURI());
187     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
188 
189     if (abilityRecord->IsTerminating()) {
190         HILOG_INFO("Ability is on terminating.");
191         return ERR_OK;
192     }
193 
194     if (!abilityRecord->GetConnectRecordList().empty()) {
195         HILOG_INFO("Target service has been connected. Post disconnect task.");
196         auto connectRecordList = abilityRecord->GetConnectRecordList();
197         HandleTerminateDisconnectTask(connectRecordList);
198     }
199 
200     auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
201         HILOG_WARN("Disconnect ability terminate timeout.");
202         connectManager->HandleStopTimeoutTask(abilityRecord);
203     };
204 
205     MoveToTerminatingMap(abilityRecord);
206     abilityRecord->Terminate(timeoutTask);
207 
208     return ERR_OK;
209 }
210 
GetOrCreateServiceRecord(const AbilityRequest & abilityRequest,const bool isCreatedByConnect,std::shared_ptr<AbilityRecord> & targetService,bool & isLoadedAbility)211 void AbilityConnectManager::GetOrCreateServiceRecord(const AbilityRequest &abilityRequest,
212     const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
213 {
214     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
215     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
216         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
217     auto serviceMapIter = serviceMap_.find(element.GetURI());
218     if (serviceMapIter == serviceMap_.end()) {
219         targetService = AbilityRecord::CreateAbilityRecord(abilityRequest);
220         if (targetService) {
221             targetService->SetOwnerMissionUserId(userId_);
222         }
223 
224         if (isCreatedByConnect && targetService != nullptr) {
225             targetService->SetCreateByConnectMode();
226         }
227         if (targetService && abilityRequest.abilityInfo.name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
228             targetService->SetLauncherRoot();
229             targetService->SetKeepAlive();
230             targetService->SetRestartTime(abilityRequest.restartTime);
231             targetService->SetRestartCount(abilityRequest.restartCount);
232         } else if (IsAbilityNeedKeepAlive(targetService)) {
233             targetService->SetKeepAlive();
234             targetService->SetRestartTime(abilityRequest.restartTime);
235             targetService->SetRestartCount(abilityRequest.restartCount);
236         }
237         serviceMap_.emplace(element.GetURI(), targetService);
238         isLoadedAbility = false;
239     } else {
240         targetService = serviceMapIter->second;
241         if (targetService != nullptr) {
242             // want may be changed for the same ability.
243             targetService->SetWant(abilityRequest.want);
244         }
245         isLoadedAbility = true;
246     }
247 }
248 
GetConnectRecordListFromMap(const sptr<IAbilityConnection> & connect,std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)249 void AbilityConnectManager::GetConnectRecordListFromMap(
250     const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
251 {
252     auto connectMapIter = connectMap_.find(connect->AsObject());
253     if (connectMapIter != connectMap_.end()) {
254         connectRecordList = connectMapIter->second;
255     }
256 }
257 
ConnectAbilityLocked(const AbilityRequest & abilityRequest,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken)258 int AbilityConnectManager::ConnectAbilityLocked(const AbilityRequest &abilityRequest,
259     const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken)
260 {
261     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
262     HILOG_DEBUG("Connect ability called, callee:%{public}s.", abilityRequest.want.GetElement().GetURI().c_str());
263     std::lock_guard<std::recursive_mutex> guard(Lock_);
264 
265     // 1. get target service ability record, and check whether it has been loaded.
266     std::shared_ptr<AbilityRecord> targetService;
267     bool isLoadedAbility = false;
268     GetOrCreateServiceRecord(abilityRequest, true, targetService, isLoadedAbility);
269     CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
270     // 2. get target connectRecordList, and check whether this callback has been connected.
271     ConnectListType connectRecordList;
272     GetConnectRecordListFromMap(connect, connectRecordList);
273     bool isCallbackConnected = !connectRecordList.empty();
274     // 3. If this service ability and callback has been connected, There is no need to connect repeatedly
275     if (isLoadedAbility && (isCallbackConnected) && IsAbilityConnected(targetService, connectRecordList)) {
276         HILOG_INFO("Service and callback was connected.");
277         return ERR_OK;
278     }
279 
280     // 4. Other cases , need to connect the service ability
281     auto connectRecord = ConnectionRecord::CreateConnectionRecord(callerToken, targetService, connect);
282     CHECK_POINTER_AND_RETURN(connectRecord, ERR_INVALID_VALUE);
283     connectRecord->AttachCallerInfo();
284     connectRecord->SetConnectState(ConnectionState::CONNECTING);
285     targetService->AddConnectRecordToList(connectRecord);
286     connectRecordList.push_back(connectRecord);
287     if (isCallbackConnected) {
288         RemoveConnectDeathRecipient(connect);
289         connectMap_.erase(connectMap_.find(connect->AsObject()));
290     }
291     AddConnectDeathRecipient(connect);
292     connectMap_.emplace(connect->AsObject(), connectRecordList);
293 
294     // 5. load or connect ability
295     int ret = ERR_OK;
296     if (!isLoadedAbility) {
297         LoadAbility(targetService);
298     } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
299         // this service ability has not first connect
300         if (targetService->GetConnectRecordList().size() > 1) {
301             if (eventHandler_ != nullptr) {
302                 auto task = [connectRecord]() { connectRecord->CompleteConnect(ERR_OK); };
303                 eventHandler_->PostTask(task);
304             }
305         } else {
306             ConnectAbility(targetService);
307         }
308     } else {
309         HILOG_INFO("Target service ability is activating, just wait for callback");
310     }
311 
312     auto token = targetService->GetToken();
313     auto preToken = iface_cast<Token>(connectRecord->GetToken());
314     DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
315     return ret;
316 }
317 
DisconnectAbilityLocked(const sptr<IAbilityConnection> & connect)318 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)
319 {
320     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
321     HILOG_INFO("Disconnect ability begin.");
322     std::lock_guard<std::recursive_mutex> guard(Lock_);
323 
324     // 1. check whether callback was connected.
325     ConnectListType connectRecordList;
326     GetConnectRecordListFromMap(connect, connectRecordList);
327     if (connectRecordList.empty()) {
328         HILOG_ERROR("Can't find the connect list from connect map by callback.");
329         return CONNECTION_NOT_EXIST;
330     }
331 
332     // 2. schedule disconnect to target service
333     for (auto &connectRecord : connectRecordList) {
334         if (connectRecord) {
335             auto abilityRecord = connectRecord->GetAbilityRecord();
336             CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
337             HILOG_INFO("Disconnect ability, caller:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
338             auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
339             CHECK_POINTER_AND_RETURN(abilityMs, GET_ABILITY_SERVICE_FAILED);
340             int result = abilityMs->JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
341             if (result != ERR_OK) {
342                 HILOG_ERROR("Judge ability visible error.");
343                 return result;
344             }
345             int ret = connectRecord->DisconnectAbility();
346             if (ret != ERR_OK) {
347                 HILOG_ERROR("Disconnect ability fail , ret = %{public}d.", ret);
348                 return ret;
349             }
350 
351             if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
352                 HILOG_WARN("This record: %{public}d complete disconnect directly.", connectRecord->GetRecordId());
353                 connectRecord->CompleteDisconnect(ERR_OK, false);
354                 RemoveConnectionRecordFromMap(connectRecord);
355             }
356         }
357     }
358 
359     return ERR_OK;
360 }
361 
AttachAbilityThreadLocked(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)362 int AbilityConnectManager::AttachAbilityThreadLocked(
363     const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
364 {
365     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
366     std::lock_guard<std::recursive_mutex> guard(Lock_);
367     auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
368     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
369     if (eventHandler_ != nullptr) {
370         int recordId = abilityRecord->GetRecordId();
371         std::string taskName = std::string("LoadTimeout_") + std::to_string(recordId);
372         eventHandler_->RemoveTask(taskName);
373         eventHandler_->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetEventId());
374     }
375     std::string element = abilityRecord->GetWant().GetElement().GetURI();
376     HILOG_DEBUG("Ability: %{public}s", element.c_str());
377     abilityRecord->SetScheduler(scheduler);
378     abilityRecord->Inactivate();
379 
380     return ERR_OK;
381 }
382 
OnAppStateChanged(const AppInfo & info)383 void AbilityConnectManager::OnAppStateChanged(const AppInfo &info)
384 {
385     std::lock_guard<std::recursive_mutex> guard(Lock_);
386     std::for_each(serviceMap_.begin(), serviceMap_.end(), [&info](ServiceMapType::reference service) {
387         if (service.second && (info.processName == service.second->GetAbilityInfo().process ||
388                                   info.processName == service.second->GetApplicationInfo().bundleName)) {
389             auto appName = service.second->GetApplicationInfo().name;
390             auto uid = service.second->GetAbilityInfo().applicationInfo.uid;
391             auto isExist = [&appName, &uid](
392                                const AppData &appData) { return appData.appName == appName && appData.uid == uid; };
393             auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
394             if (iter != info.appData.end()) {
395                 service.second->SetAppState(info.state);
396             }
397         }
398     });
399 }
400 
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state)401 int AbilityConnectManager::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)
402 {
403     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
404     std::lock_guard<std::recursive_mutex> guard(Lock_);
405     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
406     std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
407     std::shared_ptr<AbilityRecord> abilityRecord;
408     if (static_cast<AbilityState>(targetState) == AbilityState::INACTIVE) {
409         abilityRecord = GetExtensionByTokenFromSeriveMap(token);
410     } else if (static_cast<AbilityState>(targetState) == AbilityState::INITIAL) {
411         abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
412     } else {
413         abilityRecord = nullptr;
414     }
415     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
416     std::string element = abilityRecord->GetWant().GetElement().GetURI();
417     HILOG_DEBUG("Ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
418 
419     switch (state) {
420         case AbilityState::INACTIVE: {
421             if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
422                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
423                     token, AppExecFwk::AbilityState::ABILITY_STATE_CREATE);
424             } else {
425                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
426                     token, AppExecFwk::ExtensionState::EXTENSION_STATE_CREATE);
427                 auto preloadTask = [owner = weak_from_this(), abilityRecord] {
428                     auto acm = owner.lock();
429                     if (acm == nullptr) {
430                         HILOG_ERROR("AbilityConnectManager is nullptr.");
431                         return;
432                     }
433                     acm->ProcessPreload(abilityRecord);
434                 };
435                 if (eventHandler_ != nullptr) {
436                     eventHandler_->PostTask(preloadTask);
437                 }
438             }
439             return DispatchInactive(abilityRecord, state);
440         }
441         case AbilityState::INITIAL: {
442             if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
443                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
444                     token, AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED);
445             } else {
446                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
447                     token, AppExecFwk::ExtensionState::EXTENSION_STATE_TERMINATED);
448             }
449             return DispatchTerminate(abilityRecord);
450         }
451         default: {
452             HILOG_WARN("Don't support transiting state: %{public}d", state);
453             return ERR_INVALID_VALUE;
454         }
455     }
456 }
457 
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const458 void AbilityConnectManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
459 {
460     auto bms = AbilityUtil::GetBundleManager();
461     CHECK_POINTER(bms);
462     auto abilityInfo = record->GetAbilityInfo();
463     Want want;
464     want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
465     auto uid = record->GetUid();
466     want.SetParam("uid", uid);
467     bms->ProcessPreload(want);
468 }
469 
ScheduleConnectAbilityDoneLocked(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)470 int AbilityConnectManager::ScheduleConnectAbilityDoneLocked(
471     const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
472 {
473     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
474     std::lock_guard<std::recursive_mutex> guard(Lock_);
475     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
476 
477     auto abilityRecord = Token::GetAbilityRecordByToken(token);
478     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
479 
480     std::string element = abilityRecord->GetWant().GetElement().GetURI();
481     HILOG_DEBUG("Connect ability done, ability: %{public}s.", element.c_str());
482 
483     if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
484         (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
485         HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
486         return INVALID_CONNECTION_STATE;
487     }
488 
489     if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
490         DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
491             token, AppExecFwk::AbilityState::ABILITY_STATE_CONNECTED);
492     } else {
493         DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
494             token, AppExecFwk::ExtensionState::EXTENSION_STATE_CONNECTED);
495     }
496 
497     abilityRecord->SetConnRemoteObject(remoteObject);
498     // There may be multiple callers waiting for the connection result
499     auto connectRecordList = abilityRecord->GetConnectRecordList();
500     for (auto &connectRecord : connectRecordList) {
501         connectRecord->ScheduleConnectAbilityDone();
502     }
503 
504     return ERR_OK;
505 }
506 
ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> & token)507 int AbilityConnectManager::ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)
508 {
509     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
510     std::lock_guard<std::recursive_mutex> guard(Lock_);
511     auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
512     CHECK_POINTER_AND_RETURN(abilityRecord, CONNECTION_NOT_EXIST);
513 
514     auto connect = abilityRecord->GetDisconnectingRecord();
515     CHECK_POINTER_AND_RETURN(connect, CONNECTION_NOT_EXIST);
516 
517     if (!abilityRecord->IsAbilityState(AbilityState::ACTIVE)) {
518         HILOG_ERROR("The service ability state is not active ,state: %{public}d", abilityRecord->GetAbilityState());
519         return INVALID_CONNECTION_STATE;
520     }
521 
522     if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
523         DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
524             token, AppExecFwk::AbilityState::ABILITY_STATE_DISCONNECTED);
525     } else {
526         DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
527             token, AppExecFwk::ExtensionState::EXTENSION_STATE_DISCONNECTED);
528     }
529 
530     std::string element = abilityRecord->GetWant().GetElement().GetURI();
531     HILOG_DEBUG("Disconnect ability done, service:%{public}s.", element.c_str());
532 
533     // complete disconnect and remove record from conn map
534     connect->ScheduleDisconnectAbilityDone();
535     abilityRecord->RemoveConnectRecordFromList(connect);
536     if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
537         HILOG_INFO("Service ability has no any connection, and not started , need terminate.");
538         auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
539             HILOG_WARN("Disconnect ability terminate timeout.");
540             connectManager->HandleStopTimeoutTask(abilityRecord);
541         };
542         MoveToTerminatingMap(abilityRecord);
543         abilityRecord->Terminate(timeoutTask);
544     }
545     RemoveConnectionRecordFromMap(connect);
546 
547     return ERR_OK;
548 }
549 
ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> & token)550 int AbilityConnectManager::ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)
551 {
552     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
553     std::lock_guard<std::recursive_mutex> guard(Lock_);
554     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
555     auto abilityRecord = Token::GetAbilityRecordByToken(token);
556     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
557     std::string element = abilityRecord->GetWant().GetElement().GetURI();
558     HILOG_DEBUG("Ability: %{public}s", element.c_str());
559 
560     if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
561         (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
562         HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
563         return INVALID_CONNECTION_STATE;
564     }
565     // complete command and pop waiting start ability from queue.
566     CompleteCommandAbility(abilityRecord);
567 
568     return ERR_OK;
569 }
570 
CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)571 void AbilityConnectManager::CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)
572 {
573     CHECK_POINTER(abilityRecord);
574 
575     if (eventHandler_) {
576         int recordId = abilityRecord->GetRecordId();
577         std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
578                                std::to_string(abilityRecord->GetStartId());
579         eventHandler_->RemoveTask(taskName);
580     }
581 
582     abilityRecord->SetAbilityState(AbilityState::ACTIVE);
583 }
584 
GetServiceRecordByElementName(const std::string & element)585 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementName(const std::string &element)
586 {
587     std::lock_guard<std::recursive_mutex> guard(Lock_);
588     auto mapIter = serviceMap_.find(element);
589     if (mapIter != serviceMap_.end()) {
590         return mapIter->second;
591     }
592     return nullptr;
593 }
594 
GetExtensionByTokenFromSeriveMap(const sptr<IRemoteObject> & token)595 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromSeriveMap(const sptr<IRemoteObject> &token)
596 {
597     std::lock_guard<std::recursive_mutex> guard(Lock_);
598     auto IsMatch = [token](auto service) {
599         if (!service.second) {
600             return false;
601         }
602         sptr<IRemoteObject> srcToken = service.second->GetToken();
603         return srcToken == token;
604     };
605     auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
606     if (serviceRecord != serviceMap_.end()) {
607         return serviceRecord->second;
608     }
609     return nullptr;
610 }
611 
GetExtensionByTokenFromTerminatingMap(const sptr<IRemoteObject> & token)612 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromTerminatingMap(
613     const sptr<IRemoteObject> &token)
614 {
615     std::lock_guard<std::recursive_mutex> guard(Lock_);
616     auto IsMatch = [token](auto& extension) {
617         if (extension.second == nullptr) {
618             return false;
619         }
620         auto&& terminatingToken = extension.second->GetToken();
621         if (terminatingToken != nullptr) {
622             return terminatingToken->AsObject() == token;
623         }
624         return false;
625     };
626 
627     auto terminatingExtensionRecord =
628         std::find_if(terminatingExtensionMap_.begin(), terminatingExtensionMap_.end(), IsMatch);
629     if (terminatingExtensionRecord != terminatingExtensionMap_.end()) {
630         return terminatingExtensionRecord->second;
631     }
632     return nullptr;
633 }
634 
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)635 std::list<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRecordListByCallback(
636     sptr<IAbilityConnection> callback)
637 {
638     std::lock_guard<std::recursive_mutex> guard(Lock_);
639     std::list<std::shared_ptr<ConnectionRecord>> connectList;
640     auto connectMapIter = connectMap_.find(callback->AsObject());
641     if (connectMapIter != connectMap_.end()) {
642         connectList = connectMapIter->second;
643     }
644     return connectList;
645 }
646 
GetAbilityRecordByEventId(int64_t eventId)647 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetAbilityRecordByEventId(int64_t eventId)
648 {
649     std::lock_guard<std::recursive_mutex> guard(Lock_);
650     auto IsMatch = [eventId](auto service) {
651         if (!service.second) {
652             return false;
653         }
654         return eventId == service.second->GetEventId();
655     };
656     auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
657     if (serviceRecord != serviceMap_.end()) {
658         return serviceRecord->second;
659     }
660     return nullptr;
661 }
662 
LoadAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)663 void AbilityConnectManager::LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
664 {
665     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
666     CHECK_POINTER(abilityRecord);
667     abilityRecord->SetStartTime();
668 
669     if (!abilityRecord->CanRestartRootLauncher()) {
670         HILOG_ERROR("Root launcher restart is out of max count.");
671         RemoveServiceAbility(abilityRecord);
672         return;
673     }
674 
675     PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
676 
677     sptr<Token> token = abilityRecord->GetToken();
678     sptr<Token> perToken = nullptr;
679     if (abilityRecord->IsCreateByConnect()) {
680         perToken = iface_cast<Token>(abilityRecord->GetConnectingRecord()->GetToken());
681     } else {
682         auto callerList = abilityRecord->GetCallerRecordList();
683         if (!callerList.empty() && callerList.back()) {
684             auto caller = callerList.back()->GetCaller();
685             if (caller) {
686                 perToken = caller->GetToken();
687             }
688         }
689     }
690     DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
691         token, perToken, abilityRecord->GetAbilityInfo(), abilityRecord->GetApplicationInfo(),
692         abilityRecord->GetWant());
693 }
694 
PostRestartResidentTask(const AbilityRequest & abilityRequest)695 void AbilityConnectManager::PostRestartResidentTask(const AbilityRequest &abilityRequest)
696 {
697     HILOG_INFO("PostRestartResidentTask start.");
698     CHECK_POINTER(eventHandler_);
699     std::string taskName = std::string("RestartResident_") + std::string(abilityRequest.abilityInfo.name);
700     auto task = [abilityRequest, connectManager = shared_from_this()]() {
701         CHECK_POINTER(connectManager);
702         connectManager->HandleRestartResidentTask(abilityRequest);
703     };
704     int restartIntervalTime = 0;
705     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
706     if (abilityMgr) {
707         abilityMgr->GetRestartIntervalTime(restartIntervalTime);
708     }
709     HILOG_DEBUG("PostRestartResidentTask, time:%{public}d", restartIntervalTime);
710     eventHandler_->PostTask(task, taskName, restartIntervalTime);
711     HILOG_INFO("PostRestartResidentTask end.");
712 }
713 
HandleRestartResidentTask(const AbilityRequest & abilityRequest)714 void AbilityConnectManager::HandleRestartResidentTask(const AbilityRequest &abilityRequest)
715 {
716     HILOG_INFO("HandleRestartResidentTask start.");
717     auto findRestartResidentTask = [abilityRequest](const AbilityRequest &requestInfo) {
718         return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
719             requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
720             requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
721     };
722     auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(), findRestartResidentTask);
723     if (findIter != restartResidentTaskList_.end()) {
724         restartResidentTaskList_.erase(findIter);
725     }
726     StartAbilityLocked(abilityRequest);
727 }
728 
PostTimeOutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,uint32_t messageId)729 void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)
730 {
731     CHECK_POINTER(abilityRecord);
732     CHECK_POINTER(eventHandler_);
733     if (messageId != AbilityConnectManager::LOAD_TIMEOUT_MSG &&
734         messageId != AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
735         HILOG_ERROR("Timeout task messageId is error.");
736         return;
737     }
738 
739     int recordId;
740     std::string taskName;
741     int resultCode;
742     uint32_t delayTime;
743     if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
744         // first load ability, There is at most one connect record.
745         recordId = abilityRecord->GetRecordId();
746         taskName = std::string("LoadTimeout_") + std::to_string(recordId);
747         resultCode = LOAD_ABILITY_TIMEOUT;
748         delayTime = AbilityManagerService::LOAD_TIMEOUT;
749     } else {
750         auto connectRecord = abilityRecord->GetConnectingRecord();
751         CHECK_POINTER(connectRecord);
752         recordId = connectRecord->GetRecordId();
753         taskName = std::string("ConnectTimeout_") + std::to_string(recordId);
754         resultCode = CONNECTION_TIMEOUT;
755         delayTime = AbilityManagerService::CONNECT_TIMEOUT;
756     }
757 
758     // check libc.hook_mode
759     const int bufferLen = 128;
760     char paramOutBuf[bufferLen] = {0};
761     const char *hook_mode = "startup:";
762     int ret = GetParameter("libc.hook_mode", "", paramOutBuf, bufferLen - 1);
763     if (ret > 0 && strncmp(paramOutBuf, hook_mode, strlen(hook_mode)) == 0) {
764         HILOG_DEBUG("Hook_mode: no timeoutTask");
765         return;
766     }
767 
768     auto timeoutTask = [abilityRecord, connectManager = shared_from_this(), resultCode]() {
769         HILOG_WARN("Connect or load ability timeout.");
770         connectManager->HandleStartTimeoutTask(abilityRecord, resultCode);
771     };
772 
773     eventHandler_->PostTask(timeoutTask, taskName, delayTime);
774 }
775 
HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode)776 void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, int resultCode)
777 {
778     HILOG_DEBUG("Complete connect or load ability timeout.");
779     std::lock_guard<std::recursive_mutex> guard(Lock_);
780     CHECK_POINTER(abilityRecord);
781     auto connectingList = abilityRecord->GetConnectingRecordList();
782     for (auto &connectRecord : connectingList) {
783         if (connectRecord == nullptr) {
784             HILOG_WARN("ConnectRecord is nullptr.");
785             continue;
786         }
787         connectRecord->CompleteDisconnect(ERR_OK, true);
788         abilityRecord->RemoveConnectRecordFromList(connectRecord);
789         RemoveConnectionRecordFromMap(connectRecord);
790     }
791 
792     if (GetExtensionByTokenFromSeriveMap(abilityRecord->GetToken()) == nullptr) {
793         HILOG_ERROR("Timeojut ability record is not exist in service map.");
794         return;
795     }
796     MoveToTerminatingMap(abilityRecord);
797 
798     if (resultCode == LOAD_ABILITY_TIMEOUT) {
799         HILOG_WARN("Load time out , remove target service record from services map.");
800         RemoveServiceAbility(abilityRecord);
801         if (abilityRecord->GetAbilityInfo().name != AbilityConfig::LAUNCHER_ABILITY_NAME) {
802             DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
803             if (IsAbilityNeedKeepAlive(abilityRecord)) {
804                 HILOG_WARN("Load time out , try to restart.");
805                 RestartAbility(abilityRecord, userId_);
806             }
807         }
808     }
809 
810     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
811         // terminate the timeout root launcher.
812         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
813         if (resultCode == LOAD_ABILITY_TIMEOUT) {
814             StartRootLauncher(abilityRecord);
815         }
816     }
817 }
818 
HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord)819 void AbilityConnectManager::HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
820 {
821     HILOG_DEBUG("HandleCommandTimeoutTask start");
822     std::lock_guard<std::recursive_mutex> guard(Lock_);
823     CHECK_POINTER(abilityRecord);
824     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
825         HILOG_DEBUG("Handle root launcher command timeout.");
826         // terminate the timeout root launcher.
827         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
828     }
829     HILOG_DEBUG("HandleCommandTimeoutTask end");
830 }
831 
StartRootLauncher(const std::shared_ptr<AbilityRecord> & abilityRecord)832 void AbilityConnectManager::StartRootLauncher(const std::shared_ptr<AbilityRecord> &abilityRecord)
833 {
834     CHECK_POINTER(abilityRecord);
835     AbilityRequest requestInfo;
836     requestInfo.want = abilityRecord->GetWant();
837     requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
838     requestInfo.appInfo = abilityRecord->GetApplicationInfo();
839     requestInfo.restartTime = abilityRecord->GetRestartTime();
840     requestInfo.restart = true;
841     requestInfo.restartCount = abilityRecord->GetRestartCount() - 1;
842 
843     HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
844     StartAbilityLocked(requestInfo);
845 }
846 
HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord)847 void AbilityConnectManager::HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
848 {
849     HILOG_DEBUG("Complete stop ability timeout start.");
850     std::lock_guard<std::recursive_mutex> guard(Lock_);
851     CHECK_POINTER(abilityRecord);
852     TerminateDone(abilityRecord);
853 }
854 
HandleTerminateDisconnectTask(const ConnectListType & connectlist)855 void AbilityConnectManager::HandleTerminateDisconnectTask(const ConnectListType& connectlist)
856 {
857     HILOG_DEBUG("Disconnect ability when terminate.");
858     std::lock_guard<std::recursive_mutex> guard(Lock_);
859     for (auto& connectRecord : connectlist) {
860         if (!connectRecord) {
861             continue;
862         }
863         auto targetService = connectRecord->GetAbilityRecord();
864         if (targetService) {
865             HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
866             connectRecord->CompleteDisconnect(ERR_OK, true);
867             targetService->RemoveConnectRecordFromList(connectRecord);
868             RemoveConnectionRecordFromMap(connectRecord);
869         };
870     }
871 }
872 
DispatchInactive(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)873 int AbilityConnectManager::DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
874 {
875     CHECK_POINTER_AND_RETURN(eventHandler_, ERR_INVALID_VALUE);
876     if (!abilityRecord->IsAbilityState(AbilityState::INACTIVATING)) {
877         HILOG_ERROR("Ability transition life state error. expect %{public}d, actual %{public}d callback %{public}d",
878             AbilityState::INACTIVATING,
879             abilityRecord->GetAbilityState(),
880             state);
881         return ERR_INVALID_VALUE;
882     }
883     eventHandler_->RemoveEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecord->GetEventId());
884 
885     // complete inactive
886     abilityRecord->SetAbilityState(AbilityState::INACTIVE);
887     if (abilityRecord->IsCreateByConnect()) {
888         ConnectAbility(abilityRecord);
889     } else {
890         CommandAbility(abilityRecord);
891     }
892 
893     return ERR_OK;
894 }
895 
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)896 int AbilityConnectManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
897 {
898     // remove terminate timeout task
899     if (eventHandler_ != nullptr) {
900         eventHandler_->RemoveTask(std::to_string(abilityRecord->GetEventId()));
901     }
902     // complete terminate
903     TerminateDone(abilityRecord);
904     return ERR_OK;
905 }
906 
ConnectAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)907 void AbilityConnectManager::ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
908 {
909     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
910     CHECK_POINTER(abilityRecord);
911     PostTimeOutTask(abilityRecord, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
912     abilityRecord->ConnectAbility();
913 }
914 
CommandAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)915 void AbilityConnectManager::CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
916 {
917     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
918     if (eventHandler_ != nullptr) {
919         // first connect ability, There is at most one connect record.
920         int recordId = abilityRecord->GetRecordId();
921         abilityRecord->AddStartId();
922         std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
923                                std::to_string(abilityRecord->GetStartId());
924         auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
925             HILOG_ERROR("Command ability timeout. %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
926             connectManager->HandleCommandTimeoutTask(abilityRecord);
927         };
928         eventHandler_->PostTask(timeoutTask, taskName, AbilityManagerService::COMMAND_TIMEOUT);
929         // scheduling command ability
930         abilityRecord->CommandAbility();
931     }
932 }
933 
TerminateDone(const std::shared_ptr<AbilityRecord> & abilityRecord)934 void AbilityConnectManager::TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)
935 {
936     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
937     if (!abilityRecord->IsAbilityState(AbilityState::TERMINATING)) {
938         std::string expect = AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING);
939         std::string actual = AbilityRecord::ConvertAbilityState(abilityRecord->GetAbilityState());
940         HILOG_ERROR(
941             "Transition life state error. expect %{public}s, actual %{public}s", expect.c_str(), actual.c_str());
942         return;
943     }
944     DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(abilityRecord->GetToken(), false);
945     RemoveServiceAbility(abilityRecord);
946 }
947 
IsAbilityConnected(const std::shared_ptr<AbilityRecord> & abilityRecord,const std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)948 bool AbilityConnectManager::IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord,
949     const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
950 {
951     auto isMatch = [abilityRecord](auto connectRecord) -> bool {
952         if (abilityRecord == nullptr || connectRecord == nullptr) {
953             return false;
954         }
955         if (abilityRecord != connectRecord->GetAbilityRecord()) {
956             return false;
957         }
958         return true;
959     };
960     return std::any_of(connectRecordList.begin(), connectRecordList.end(), isMatch);
961 }
962 
RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> & connection)963 void AbilityConnectManager::RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> &connection)
964 {
965     for (auto &connectCallback : connectMap_) {
966         auto &connectList = connectCallback.second;
967         auto connectRecord = std::find(connectList.begin(), connectList.end(), connection);
968         if (connectRecord != connectList.end()) {
969             HILOG_INFO("Remove connrecord(%{public}d) from maplist.", (*connectRecord)->GetRecordId());
970             connectList.remove(connection);
971             if (connectList.empty()) {
972                 HILOG_INFO("Remove connlist from map.");
973                 sptr<IAbilityConnection> connect = iface_cast<IAbilityConnection>(connectCallback.first);
974                 RemoveConnectDeathRecipient(connect);
975                 connectMap_.erase(connectCallback.first);
976             }
977             return;
978         }
979     }
980 }
981 
RemoveServiceAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)982 void AbilityConnectManager::RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
983 {
984     CHECK_POINTER(abilityRecord);
985     auto& abilityInfo = abilityRecord->GetAbilityInfo();
986     AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
987         abilityInfo.moduleName);
988     HILOG_DEBUG("Remove service(%{public}s) from terminating map.", element.GetURI().c_str());
989     terminatingExtensionMap_.erase(element.GetURI());
990 }
991 
AddConnectDeathRecipient(const sptr<IAbilityConnection> & connect)992 void AbilityConnectManager::AddConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
993 {
994     CHECK_POINTER(connect);
995     CHECK_POINTER(connect->AsObject());
996     auto it = recipientMap_.find(connect->AsObject());
997     if (it != recipientMap_.end()) {
998         HILOG_ERROR("This death recipient has been added.");
999         return;
1000     } else {
1001         std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1002         sptr<IRemoteObject::DeathRecipient> deathRecipient =
1003             new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1004                 auto abilityConnectManager = thisWeakPtr.lock();
1005                 if (abilityConnectManager) {
1006                     abilityConnectManager->OnCallBackDied(remote);
1007                 }
1008             });
1009         connect->AsObject()->AddDeathRecipient(deathRecipient);
1010         recipientMap_.emplace(connect->AsObject(), deathRecipient);
1011     }
1012 }
1013 
RemoveConnectDeathRecipient(const sptr<IAbilityConnection> & connect)1014 void AbilityConnectManager::RemoveConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
1015 {
1016     CHECK_POINTER(connect);
1017     CHECK_POINTER(connect->AsObject());
1018     auto it = recipientMap_.find(connect->AsObject());
1019     if (it != recipientMap_.end()) {
1020         it->first->RemoveDeathRecipient(it->second);
1021         recipientMap_.erase(it);
1022         return;
1023     }
1024 }
1025 
OnCallBackDied(const wptr<IRemoteObject> & remote)1026 void AbilityConnectManager::OnCallBackDied(const wptr<IRemoteObject> &remote)
1027 {
1028     auto object = remote.promote();
1029     CHECK_POINTER(object);
1030     if (eventHandler_) {
1031         auto task = [object, connectManager = shared_from_this()]() { connectManager->HandleCallBackDiedTask(object); };
1032         eventHandler_->PostTask(task, TASK_ON_CALLBACK_DIED);
1033     }
1034 }
1035 
HandleCallBackDiedTask(const sptr<IRemoteObject> & connect)1036 void AbilityConnectManager::HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)
1037 {
1038     HILOG_INFO("Handle call back died task.");
1039     std::lock_guard<std::recursive_mutex> guard(Lock_);
1040     CHECK_POINTER(connect);
1041     auto it = connectMap_.find(connect);
1042     if (it != connectMap_.end()) {
1043         ConnectListType connectRecordList = it->second;
1044         for (auto &connRecord : connectRecordList) {
1045             connRecord->ClearConnCallBack();
1046         }
1047     } else {
1048         HILOG_INFO("Died object can't find from conn map.");
1049         return;
1050     }
1051     sptr<IAbilityConnection> object = iface_cast<IAbilityConnection>(connect);
1052     DisconnectAbilityLocked(object);
1053 }
1054 
OnAbilityDied(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1055 void AbilityConnectManager::OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1056 {
1057     HILOG_INFO("On ability died.");
1058     CHECK_POINTER(abilityRecord);
1059     if (abilityRecord->GetAbilityInfo().type != AbilityType::SERVICE &&
1060         abilityRecord->GetAbilityInfo().type != AbilityType::EXTENSION) {
1061         HILOG_DEBUG("Ability type is not service.");
1062         return;
1063     }
1064     if (eventHandler_) {
1065         auto task = [abilityRecord, connectManager = shared_from_this(), currentUserId]() {
1066             connectManager->HandleAbilityDiedTask(abilityRecord, currentUserId);
1067         };
1068         eventHandler_->PostTask(task, TASK_ON_ABILITY_DIED);
1069     }
1070 }
1071 
OnTimeOut(uint32_t msgId,int64_t eventId)1072 void AbilityConnectManager::OnTimeOut(uint32_t msgId, int64_t eventId)
1073 {
1074     HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1075     std::lock_guard<std::recursive_mutex> guard(Lock_);
1076     auto abilityRecord = GetAbilityRecordByEventId(eventId);
1077     if (abilityRecord == nullptr) {
1078         HILOG_ERROR("AbilityConnectManager on time out event: ability record is nullptr.");
1079         return;
1080     }
1081     HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId, abilityRecord->GetAbilityInfo().name.c_str());
1082 
1083     switch (msgId) {
1084         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1085             HandleInactiveTimeout(abilityRecord);
1086             break;
1087         default:
1088             break;
1089     }
1090 }
1091 
HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> & ability)1092 void AbilityConnectManager::HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)
1093 {
1094     HILOG_DEBUG("HandleInactiveTimeout start");
1095     std::lock_guard<std::recursive_mutex> guard(Lock_);
1096     CHECK_POINTER(ability);
1097     if (ability->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1098         HILOG_DEBUG("Handle root launcher inactive timeout.");
1099         // terminate the timeout root launcher.
1100         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1101     }
1102 
1103     HILOG_DEBUG("HandleInactiveTimeout end");
1104 }
1105 
IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> & abilityRecord)1106 bool AbilityConnectManager::IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)
1107 {
1108     auto bms = AbilityUtil::GetBundleManager();
1109     CHECK_POINTER_AND_RETURN(bms, false);
1110     std::vector<AppExecFwk::BundleInfo> bundleInfos;
1111     bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD);
1112     if (!getBundleInfos) {
1113         HILOG_ERROR("Handle ability died task, get bundle infos failed");
1114         return false;
1115     }
1116 
1117     auto CheckIsAbilityNeedKeepAlive = [](const AppExecFwk::HapModuleInfo &hapModuleInfo,
1118         const std::string processName, std::string &mainElement) {
1119         if (!hapModuleInfo.isModuleJson) {
1120             // old application model
1121             mainElement = hapModuleInfo.mainAbility;
1122             for (auto abilityInfo : hapModuleInfo.abilityInfos) {
1123                 if (abilityInfo.process == processName && abilityInfo.name == mainElement) {
1124                     return true;
1125                 }
1126             }
1127             return false;
1128         }
1129 
1130         // new application model
1131         if (hapModuleInfo.process == processName) {
1132             mainElement = hapModuleInfo.mainElementName;
1133             return true;
1134         }
1135         return false;
1136     };
1137 
1138     auto GetKeepAliveAbilities = [&](std::vector<std::pair<std::string, std::string>> &keepAliveAbilities) {
1139         for (size_t i = 0; i < bundleInfos.size(); i++) {
1140             std::string processName = bundleInfos[i].applicationInfo.process;
1141             if (!bundleInfos[i].isKeepAlive || processName.empty()) {
1142                 continue;
1143             }
1144             std::string bundleName = bundleInfos[i].name;
1145             for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) {
1146                 std::string mainElement;
1147                 if (CheckIsAbilityNeedKeepAlive(hapModuleInfo, processName, mainElement) && !mainElement.empty()) {
1148                     keepAliveAbilities.push_back(std::make_pair(bundleName, mainElement));
1149                 }
1150             }
1151         }
1152     };
1153 
1154     auto findKeepAliveAbility = [abilityRecord](const std::pair<std::string, std::string> &keepAlivePair) {
1155         return ((abilityRecord->GetAbilityInfo().bundleName == keepAlivePair.first &&
1156                 abilityRecord->GetAbilityInfo().name == keepAlivePair.second) ||
1157                 abilityRecord->GetAbilityInfo().name == AbilityConfig::SYSTEM_UI_ABILITY_NAME ||
1158                 abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME);
1159     };
1160 
1161     std::vector<std::pair<std::string, std::string>> keepAliveAbilities;
1162     GetKeepAliveAbilities(keepAliveAbilities);
1163     auto findIter = find_if(keepAliveAbilities.begin(), keepAliveAbilities.end(), findKeepAliveAbility);
1164     if (findIter != keepAliveAbilities.end()) {
1165         abilityRecord->SetKeepAlive();
1166         return true;
1167     }
1168     return false;
1169 }
1170 
HandleAbilityDiedTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1171 void AbilityConnectManager::HandleAbilityDiedTask(
1172     const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1173 {
1174     HILOG_INFO("Handle ability died task.");
1175     std::lock_guard<std::recursive_mutex> guard(Lock_);
1176     CHECK_POINTER(abilityRecord);
1177     ConnectListType connlist = abilityRecord->GetConnectRecordList();
1178     for (auto &connectRecord : connlist) {
1179         HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
1180         connectRecord->CompleteDisconnect(ERR_OK, true);
1181         abilityRecord->RemoveConnectRecordFromList(connectRecord);
1182         RemoveConnectionRecordFromMap(connectRecord);
1183     }
1184 
1185     if (abilityRecord->IsTerminating()) {
1186         HILOG_INFO("Handle extension DiedByTerminating.");
1187         RemoveServiceAbility(abilityRecord);
1188         if (IsAbilityNeedKeepAlive(abilityRecord)) {
1189             HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1190             RestartAbility(abilityRecord, currentUserId);
1191         }
1192         return;
1193     }
1194 
1195     if (GetExtensionByTokenFromSeriveMap(abilityRecord->GetToken()) == nullptr) {
1196         HILOG_ERROR("Died ability record is not exist in service map.");
1197         return;
1198     }
1199 
1200     MoveToTerminatingMap(abilityRecord);
1201     RemoveServiceAbility(abilityRecord);
1202     if (IsAbilityNeedKeepAlive(abilityRecord)) {
1203         HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1204         RestartAbility(abilityRecord, currentUserId);
1205     }
1206 }
1207 
RestartAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1208 void AbilityConnectManager::RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1209 {
1210     HILOG_INFO("Restart ability");
1211     AbilityRequest requestInfo;
1212     requestInfo.want = abilityRecord->GetWant();
1213     requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
1214     requestInfo.appInfo = abilityRecord->GetApplicationInfo();
1215     requestInfo.restartTime = abilityRecord->GetRestartTime();
1216     requestInfo.restart = true;
1217     abilityRecord->SetRestarting(true);
1218 
1219     if (currentUserId != userId_ &&
1220         abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1221         HILOG_WARN("delay restart root launcher until switch user.");
1222         return;
1223     }
1224 
1225     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1226         requestInfo.restartCount = abilityRecord->GetRestartCount();
1227         HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
1228         StartAbilityLocked(requestInfo);
1229         return;
1230     }
1231 
1232     // restart other resident ability
1233     if (abilityRecord->CanRestartResident()) {
1234         requestInfo.restartCount = abilityRecord->GetRestartCount();
1235         requestInfo.restartTime = AbilityUtil::SystemTimeMillis();
1236         StartAbilityLocked(requestInfo);
1237     } else {
1238         auto findRestartResidentTask = [requestInfo](const AbilityRequest &abilityRequest) {
1239             return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
1240                 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
1241                 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
1242         };
1243         auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(),
1244             findRestartResidentTask);
1245         if (findIter != restartResidentTaskList_.end()) {
1246             HILOG_WARN("The restart task has been registered.");
1247             return;
1248         }
1249         restartResidentTaskList_.emplace_back(requestInfo);
1250         PostRestartResidentTask(requestInfo);
1251     }
1252 }
1253 
DumpState(std::vector<std::string> & info,bool isClient,const std::string & args) const1254 void AbilityConnectManager::DumpState(std::vector<std::string> &info, bool isClient, const std::string &args) const
1255 {
1256     HILOG_INFO("DumpState args:%{public}s.", args.c_str());
1257     if (!args.empty()) {
1258         auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
1259             return service.first.compare(args) == 0;
1260         });
1261         if (it != serviceMap_.end()) {
1262             info.emplace_back("uri [ " + it->first + " ]");
1263             it->second->DumpService(info, isClient);
1264         } else {
1265             info.emplace_back(args + ": Nothing to dump.");
1266         }
1267     } else {
1268         auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
1269         info.emplace_back("  ExtensionRecords:");
1270         for (auto &&service : serviceMap_) {
1271             info.emplace_back("    uri [" + service.first + "]");
1272             service.second->DumpService(info, isClient);
1273         }
1274     }
1275 }
1276 
DumpStateByUri(std::vector<std::string> & info,bool isClient,const std::string & args,std::vector<std::string> & params) const1277 void AbilityConnectManager::DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args,
1278     std::vector<std::string> &params) const
1279 {
1280     HILOG_INFO("DumpState args:%{public}s, params size: %{public}zu", args.c_str(), params.size());
1281     auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
1282         return service.first.compare(args) == 0;
1283     });
1284     if (it != serviceMap_.end()) {
1285         info.emplace_back("uri [ " + it->first + " ]");
1286         it->second->DumpService(info, params, isClient);
1287     } else {
1288         info.emplace_back(args + ": Nothing to dump.");
1289     }
1290 }
1291 
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info,const int32_t userId,bool isPerm)1292 void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info,
1293     const int32_t userId, bool isPerm)
1294 {
1295     HILOG_INFO("Get extension running info.");
1296     std::lock_guard<std::recursive_mutex> guard(Lock_);
1297     auto mgr = shared_from_this();
1298     auto queryInfo = [&info, upperLimit, userId, isPerm, mgr](ServiceMapType::reference service) {
1299         if (static_cast<int>(info.size()) >= upperLimit) {
1300             return;
1301         }
1302         auto abilityRecord = service.second;
1303         CHECK_POINTER(abilityRecord);
1304 
1305         if (isPerm) {
1306             mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1307         } else {
1308             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1309             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1310             if (callingTokenId == tokenID) {
1311                 mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1312             }
1313         }
1314     };
1315     std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1316 }
1317 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)1318 void AbilityConnectManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
1319 {
1320     HILOG_INFO("Query running ability infos.");
1321     std::lock_guard<std::recursive_mutex> guard(Lock_);
1322 
1323     auto queryInfo = [&info, isPerm](ServiceMapType::reference service) {
1324         auto abilityRecord = service.second;
1325         CHECK_POINTER(abilityRecord);
1326 
1327         if (isPerm) {
1328             DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1329         } else {
1330             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1331             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1332             if (callingTokenId == tokenID) {
1333                 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1334             }
1335         }
1336     };
1337 
1338     std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1339 }
1340 
GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> & abilityRecord,const int32_t userId,std::vector<ExtensionRunningInfo> & info)1341 void AbilityConnectManager::GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord, const int32_t userId,
1342     std::vector<ExtensionRunningInfo> &info)
1343 {
1344     ExtensionRunningInfo extensionInfo;
1345     AppExecFwk::RunningProcessInfo processInfo;
1346     extensionInfo.extension = abilityRecord->GetWant().GetElement();
1347     auto bms = AbilityUtil::GetBundleManager();
1348     CHECK_POINTER(bms);
1349     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
1350     bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfos(abilityRecord->GetWant(),
1351         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, extensionInfos));
1352     if (queryResult) {
1353         HILOG_INFO("Query Extension Ability Infos Success.");
1354         auto abilityInfo = abilityRecord->GetAbilityInfo();
1355         auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &extensionInfo) {
1356             HILOG_INFO("%{public}s, %{public}s", extensionInfo.bundleName.c_str(), extensionInfo.name.c_str());
1357             return extensionInfo.bundleName == abilityInfo.bundleName && extensionInfo.name == abilityInfo.name
1358                 && extensionInfo.applicationInfo.uid == abilityInfo.applicationInfo.uid;
1359         };
1360         auto infoIter = std::find_if(extensionInfos.begin(), extensionInfos.end(), isExist);
1361         if (infoIter != extensionInfos.end()) {
1362             HILOG_INFO("Get target success.");
1363             extensionInfo.type = (*infoIter).type;
1364         }
1365     }
1366     DelayedSingleton<AppScheduler>::GetInstance()->
1367         GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
1368     extensionInfo.pid = processInfo.pid_;
1369     extensionInfo.uid = processInfo.uid_;
1370     extensionInfo.processName = processInfo.processName_;
1371     extensionInfo.startTime = abilityRecord->GetStartTime();
1372     ConnectListType connectRecordList = abilityRecord->GetConnectRecordList();
1373     for (auto &connectRecord : connectRecordList) {
1374         if (connectRecord == nullptr) {
1375             HILOG_DEBUG("connectRecord is nullptr.");
1376             continue;
1377         }
1378         auto callerAbilityRecord = Token::GetAbilityRecordByToken(connectRecord->GetToken());
1379         if (callerAbilityRecord == nullptr) {
1380             HILOG_DEBUG("callerAbilityRecord is nullptr.");
1381             continue;
1382         }
1383         std::string package = callerAbilityRecord->GetAbilityInfo().bundleName;
1384         extensionInfo.clientPackage.emplace_back(package);
1385     }
1386     info.emplace_back(extensionInfo);
1387 }
1388 
StopAllExtensions()1389 void AbilityConnectManager::StopAllExtensions()
1390 {
1391     HILOG_INFO("StopAllExtensions begin.");
1392     std::lock_guard<std::recursive_mutex> guard(Lock_);
1393     for (auto it = serviceMap_.begin(); it != serviceMap_.end();) {
1394         auto targetExtension = it->second;
1395         if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION) {
1396             terminatingExtensionMap_.emplace(it->first, it->second);
1397             serviceMap_.erase(it++);
1398             TerminateAbilityLocked(targetExtension->GetToken());
1399         } else {
1400             it++;
1401         }
1402     }
1403     HILOG_INFO("StopAllExtensions end.");
1404 }
1405 
MoveToTerminatingMap(const std::shared_ptr<AbilityRecord> & abilityRecord)1406 void AbilityConnectManager::MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)
1407 {
1408     CHECK_POINTER(abilityRecord);
1409     auto& abilityInfo = abilityRecord->GetAbilityInfo();
1410     AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1411         abilityInfo.moduleName);
1412     terminatingExtensionMap_.emplace(element.GetURI(), abilityRecord);
1413     serviceMap_.erase(element.GetURI());
1414 }
1415 }  // namespace AAFwk
1416 }  // namespace OHOS
1417