• 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 #include <mutex>
20 
21 #include "ability_connect_callback_stub.h"
22 #include "ability_manager_errors.h"
23 #include "ability_manager_service.h"
24 #include "ability_util.h"
25 #include "appfreeze_manager.h"
26 #include "hitrace_meter.h"
27 #include "hilog_wrapper.h"
28 #include "in_process_call_wrapper.h"
29 #include "parameter.h"
30 #include "session/host/include/zidl/session_interface.h"
31 #include "ui_extension_utils.h"
32 
33 namespace OHOS {
34 namespace AAFwk {
35 namespace {
36 constexpr char EVENT_KEY_UID[] = "UID";
37 constexpr char EVENT_KEY_PID[] = "PID";
38 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
39 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
40 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
41 #ifdef SUPPORT_ASAN
42 const int LOAD_TIMEOUT_MULTIPLE = 150;
43 const int CONNECT_TIMEOUT_MULTIPLE = 45;
44 const int COMMAND_TIMEOUT_MULTIPLE = 75;
45 const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 75;
46 #else
47 const int LOAD_TIMEOUT_MULTIPLE = 10;
48 const int CONNECT_TIMEOUT_MULTIPLE = 3;
49 const int COMMAND_TIMEOUT_MULTIPLE = 5;
50 const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 5;
51 #endif
52 }
53 
AbilityConnectManager(int userId)54 AbilityConnectManager::AbilityConnectManager(int userId) : userId_(userId)
55 {}
56 
~AbilityConnectManager()57 AbilityConnectManager::~AbilityConnectManager()
58 {}
59 
StartAbility(const AbilityRequest & abilityRequest)60 int AbilityConnectManager::StartAbility(const AbilityRequest &abilityRequest)
61 {
62     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
63     std::lock_guard guard(Lock_);
64     return StartAbilityLocked(abilityRequest);
65 }
66 
TerminateAbility(const sptr<IRemoteObject> & token)67 int AbilityConnectManager::TerminateAbility(const sptr<IRemoteObject> &token)
68 {
69     std::lock_guard guard(Lock_);
70     return TerminateAbilityInner(token);
71 }
72 
TerminateAbilityInner(const sptr<IRemoteObject> & token)73 int AbilityConnectManager::TerminateAbilityInner(const sptr<IRemoteObject> &token)
74 {
75     auto abilityRecord = GetExtensionFromServiceMapInner(token);
76     MoveToTerminatingMap(abilityRecord);
77     return TerminateAbilityLocked(token);
78 }
79 
StopServiceAbility(const AbilityRequest & abilityRequest)80 int AbilityConnectManager::StopServiceAbility(const AbilityRequest &abilityRequest)
81 {
82     HILOG_INFO("call");
83     std::lock_guard guard(Lock_);
84     return StopServiceAbilityLocked(abilityRequest);
85 }
86 
StartAbilityLocked(const AbilityRequest & abilityRequest)87 int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityRequest)
88 {
89     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
90     HILOG_INFO("ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
91 
92     std::shared_ptr<AbilityRecord> targetService;
93     bool isLoadedAbility = false;
94     GetOrCreateServiceRecord(abilityRequest, false, targetService, isLoadedAbility);
95     CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
96 
97     targetService->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
98 
99     targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_EXTENSION);
100 
101     if (UIExtensionUtils::IsUIExtension(targetService->GetAbilityInfo().extensionAbilityType)
102         && abilityRequest.sessionInfo && abilityRequest.sessionInfo->sessionToken) {
103         auto &remoteObj = abilityRequest.sessionInfo->sessionToken;
104         uiExtensionMap_.emplace(remoteObj, UIExtWindowMapValType(targetService, abilityRequest.sessionInfo));
105         AddUIExtWindowDeathRecipient(remoteObj);
106     }
107 
108     if (!isLoadedAbility) {
109         LoadAbility(targetService);
110     } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
111         // It may have been started through connect
112         targetService->SetWant(abilityRequest.want);
113         CommandAbility(targetService);
114     } else if (UIExtensionUtils::IsUIExtension(targetService->GetAbilityInfo().extensionAbilityType)
115         && targetService->IsReady() && !targetService->IsAbilityState(AbilityState::INACTIVATING)) {
116         targetService->SetWant(abilityRequest.want);
117         CommandAbilityWindow(targetService, abilityRequest.sessionInfo, WIN_CMD_FOREGROUND);
118     } else {
119         HILOG_INFO("Target service is already activating.");
120         EnqueueStartServiceReq(abilityRequest);
121         return ERR_OK;
122     }
123 
124     sptr<Token> token = targetService->GetToken();
125     sptr<Token> preToken = nullptr;
126     if (targetService->GetPreAbilityRecord()) {
127         preToken = targetService->GetPreAbilityRecord()->GetToken();
128     }
129     DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
130     return ERR_OK;
131 }
132 
EnqueueStartServiceReq(const AbilityRequest & abilityRequest)133 void AbilityConnectManager::EnqueueStartServiceReq(const AbilityRequest &abilityRequest)
134 {
135     std::lock_guard guard(startServiceReqListLock_);
136     auto abilityUri = abilityRequest.want.GetElement().GetURI();
137     auto reqListIt = startServiceReqList_.find(abilityUri);
138     if (reqListIt != startServiceReqList_.end()) {
139         reqListIt->second->push_back(abilityRequest);
140     } else {
141         auto reqList = std::make_shared<std::list<AbilityRequest>>();
142         reqList->push_back(abilityRequest);
143         startServiceReqList_.emplace(abilityUri, reqList);
144 
145         CHECK_POINTER(taskHandler_);
146         auto callback = [abilityUri, connectManager = shared_from_this()]() {
147             std::lock_guard guard{connectManager->startServiceReqListLock_};
148             auto exist = connectManager->startServiceReqList_.erase(abilityUri);
149             if (exist) {
150                 HILOG_ERROR("Target service %{public}s start timeout", abilityUri.c_str());
151             }
152         };
153 
154         int connectTimeout =
155             AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
156         taskHandler_->SubmitTask(callback, std::string("start_service_timeout:") + abilityUri,
157             connectTimeout);
158     }
159 }
160 
TerminateAbilityLocked(const sptr<IRemoteObject> & token)161 int AbilityConnectManager::TerminateAbilityLocked(const sptr<IRemoteObject> &token)
162 {
163     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
164     HILOG_INFO("Terminate ability locked.");
165     auto abilityRecord = GetExtensionFromTerminatingMapInner(token);
166     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
167 
168     if (abilityRecord->IsTerminating()) {
169         HILOG_INFO("Ability is on terminating.");
170         return ERR_OK;
171     }
172 
173     if (!abilityRecord->GetConnectRecordList().empty()) {
174         HILOG_INFO("Target service has been connected. Post disconnect task.");
175         auto connectRecordList = abilityRecord->GetConnectRecordList();
176         HandleTerminateDisconnectTask(connectRecordList);
177     }
178 
179     auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
180         HILOG_WARN("Disconnect ability terminate timeout.");
181         connectManager->HandleStopTimeoutTask(abilityRecord);
182     };
183     abilityRecord->Terminate(timeoutTask);
184 
185     return ERR_OK;
186 }
187 
StopServiceAbilityLocked(const AbilityRequest & abilityRequest)188 int AbilityConnectManager::StopServiceAbilityLocked(const AbilityRequest &abilityRequest)
189 {
190     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
191     HILOG_INFO("call");
192     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
193         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
194     auto abilityRecord = GetServiceRecordByElementNameInner(element.GetURI());
195     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
196 
197     if (abilityRecord->IsTerminating()) {
198         HILOG_INFO("Ability is on terminating.");
199         return ERR_OK;
200     }
201 
202     if (!abilityRecord->GetConnectRecordList().empty()) {
203         HILOG_INFO("Post disconnect task.");
204         auto connectRecordList = abilityRecord->GetConnectRecordList();
205         HandleTerminateDisconnectTask(connectRecordList);
206     }
207 
208     TerminateRecord(abilityRecord);
209     return ERR_OK;
210 }
211 
GetOrCreateServiceRecord(const AbilityRequest & abilityRequest,const bool isCreatedByConnect,std::shared_ptr<AbilityRecord> & targetService,bool & isLoadedAbility)212 void AbilityConnectManager::GetOrCreateServiceRecord(const AbilityRequest &abilityRequest,
213     const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
214 {
215     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
216     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
217         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
218     auto serviceMapIter = serviceMap_.find(element.GetURI());
219     if (serviceMapIter == serviceMap_.end()) {
220         targetService = AbilityRecord::CreateAbilityRecord(abilityRequest);
221         if (targetService) {
222             targetService->SetOwnerMissionUserId(userId_);
223         }
224 
225         if (isCreatedByConnect && targetService != nullptr) {
226             targetService->SetCreateByConnectMode();
227         }
228         if (targetService && abilityRequest.abilityInfo.name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
229             targetService->SetLauncherRoot();
230             targetService->SetKeepAlive();
231             targetService->SetRestartTime(abilityRequest.restartTime);
232             targetService->SetRestartCount(abilityRequest.restartCount);
233         } else if (IsAbilityNeedKeepAlive(targetService)) {
234             targetService->SetKeepAlive();
235             targetService->SetRestartTime(abilityRequest.restartTime);
236             targetService->SetRestartCount(abilityRequest.restartCount);
237         }
238         serviceMap_.emplace(element.GetURI(), targetService);
239         isLoadedAbility = false;
240     } else {
241         targetService = serviceMapIter->second;
242         isLoadedAbility = true;
243     }
244 }
245 
GetConnectRecordListFromMap(const sptr<IAbilityConnection> & connect,std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)246 void AbilityConnectManager::GetConnectRecordListFromMap(
247     const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
248 {
249     auto connectMapIter = connectMap_.find(connect->AsObject());
250     if (connectMapIter != connectMap_.end()) {
251         connectRecordList = connectMapIter->second;
252     }
253 }
254 
ConnectAbilityLocked(const AbilityRequest & abilityRequest,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,sptr<SessionInfo> sessionInfo)255 int AbilityConnectManager::ConnectAbilityLocked(const AbilityRequest &abilityRequest,
256     const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, sptr<SessionInfo> sessionInfo)
257 {
258     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
259     HILOG_INFO("callee:%{public}s.", abilityRequest.want.GetElement().GetURI().c_str());
260     std::lock_guard guard(Lock_);
261 
262     // 1. get target service ability record, and check whether it has been loaded.
263     std::shared_ptr<AbilityRecord> targetService;
264     bool isLoadedAbility = false;
265     GetOrCreateServiceRecord(abilityRequest, true, targetService, isLoadedAbility);
266     CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
267     // 2. get target connectRecordList, and check whether this callback has been connected.
268     ConnectListType connectRecordList;
269     GetConnectRecordListFromMap(connect, connectRecordList);
270     bool isCallbackConnected = !connectRecordList.empty();
271     // 3. If this service ability and callback has been connected, There is no need to connect repeatedly
272     if (isLoadedAbility && (isCallbackConnected) && IsAbilityConnected(targetService, connectRecordList)) {
273         HILOG_INFO("Service and callback was connected.");
274         return ERR_OK;
275     }
276 
277     // 4. Other cases , need to connect the service ability
278     auto connectRecord = ConnectionRecord::CreateConnectionRecord(callerToken, targetService, connect);
279     CHECK_POINTER_AND_RETURN(connectRecord, ERR_INVALID_VALUE);
280     connectRecord->AttachCallerInfo();
281     connectRecord->SetConnectState(ConnectionState::CONNECTING);
282     targetService->AddConnectRecordToList(connectRecord);
283     targetService->SetSessionInfo(sessionInfo);
284     connectRecordList.push_back(connectRecord);
285     if (isCallbackConnected) {
286         RemoveConnectDeathRecipient(connect);
287         connectMap_.erase(connectMap_.find(connect->AsObject()));
288     }
289     AddConnectDeathRecipient(connect);
290     connectMap_.emplace(connect->AsObject(), connectRecordList);
291     targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_CONNECT_EXTENSION);
292 
293     if (UIExtensionUtils::IsWindowExtension(targetService->GetAbilityInfo().extensionAbilityType)
294         && abilityRequest.sessionInfo) {
295         windowExtensionMap_.emplace(connect->AsObject(),
296             WindowExtMapValType(targetService->GetApplicationInfo().accessTokenId, abilityRequest.sessionInfo));
297     }
298 
299     // 5. load or connect ability
300     int ret = ERR_OK;
301     if (!isLoadedAbility) {
302         LoadAbility(targetService);
303     } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
304         // this service ability has connected already
305         targetService->SetWant(abilityRequest.want);
306         HandleActiveAbility(targetService, connectRecord);
307     } else {
308         HILOG_INFO("Target service is activating, wait for callback");
309     }
310 
311     auto token = targetService->GetToken();
312     auto preToken = iface_cast<Token>(connectRecord->GetToken());
313     DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
314     return ret;
315 }
316 
HandleActiveAbility(std::shared_ptr<AbilityRecord> & targetService,std::shared_ptr<ConnectionRecord> & connectRecord)317 void AbilityConnectManager::HandleActiveAbility(std::shared_ptr<AbilityRecord> &targetService,
318     std::shared_ptr<ConnectionRecord> &connectRecord)
319 {
320     if (targetService == nullptr) {
321         HILOG_WARN("null target service.");
322         return;
323     }
324     if (targetService->GetConnectRecordList().size() > 1) {
325         if (taskHandler_ != nullptr && targetService->GetConnRemoteObject()) {
326             auto task = [connectRecord]() { connectRecord->CompleteConnect(ERR_OK); };
327             taskHandler_->SubmitTask(task);
328         } else {
329             HILOG_INFO("Target service is connecting, wait for callback");
330         }
331     } else {
332         ConnectAbility(targetService);
333     }
334 }
335 
DisconnectAbilityLocked(const sptr<IAbilityConnection> & connect)336 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)
337 {
338     std::lock_guard guard(Lock_);
339     return DisconnectAbilityLocked(connect, false);
340 }
341 
DisconnectAbilityLocked(const sptr<IAbilityConnection> & connect,bool force)342 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect, bool force)
343 {
344     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
345     HILOG_INFO("call");
346 
347     // 1. check whether callback was connected.
348     ConnectListType connectRecordList;
349     GetConnectRecordListFromMap(connect, connectRecordList);
350     if (connectRecordList.empty()) {
351         HILOG_ERROR("Can't find the connect list from connect map by callback.");
352         return CONNECTION_NOT_EXIST;
353     }
354 
355     // 2. schedule disconnect to target service
356     int result = ERR_OK;
357     ConnectListType list;
358     for (auto &connectRecord : connectRecordList) {
359         if (connectRecord) {
360             auto abilityRecord = connectRecord->GetAbilityRecord();
361             CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
362             HILOG_INFO("abilityName: %{public}s, bundleName: %{public}s",
363                 abilityRecord->GetAbilityInfo().name.c_str(), abilityRecord->GetAbilityInfo().bundleName.c_str());
364             if (connectRecord->GetCallerTokenId() != IPCSkeleton::GetCallingTokenID() &&
365                 static_cast<uint32_t>(IPCSkeleton::GetSelfTokenID() != IPCSkeleton::GetCallingTokenID())) {
366                 HILOG_WARN("The caller is inconsistent with the caller stored in the connectRecord.");
367                 continue;
368             }
369 
370             if (force) {
371                 DisconnectRecordForce(list, connectRecord);
372             } else {
373                 result = DisconnectRecordNormal(list, connectRecord);
374             }
375 
376             if (result != ERR_OK) {
377                 HILOG_ERROR("Disconnect ability fail , ret = %{public}d.", result);
378                 break;
379             }
380         }
381     }
382     for (auto&& connectRecord : list) {
383         RemoveConnectionRecordFromMap(connectRecord);
384     }
385 
386     return result;
387 }
388 
TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)389 void AbilityConnectManager::TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)
390 {
391     auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
392         HILOG_WARN("Disconnect ability terminate timeout.");
393         connectManager->HandleStopTimeoutTask(abilityRecord);
394     };
395 
396     MoveToTerminatingMap(abilityRecord);
397     abilityRecord->Terminate(timeoutTask);
398 }
399 
DisconnectRecordNormal(ConnectListType & list,std::shared_ptr<ConnectionRecord> connectRecord) const400 int AbilityConnectManager::DisconnectRecordNormal(ConnectListType &list,
401     std::shared_ptr<ConnectionRecord> connectRecord) const
402 {
403     auto result = connectRecord->DisconnectAbility();
404     if (result != ERR_OK) {
405         HILOG_ERROR("Disconnect ability fail , ret = %{public}d.", result);
406         return result;
407     }
408 
409     if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
410         HILOG_WARN("This record: %{public}d complete disconnect directly.", connectRecord->GetRecordId());
411         connectRecord->CompleteDisconnect(ERR_OK, false);
412         list.emplace_back(connectRecord);
413     }
414     return ERR_OK;
415 }
416 
DisconnectRecordForce(ConnectListType & list,std::shared_ptr<ConnectionRecord> connectRecord)417 void AbilityConnectManager::DisconnectRecordForce(ConnectListType &list,
418     std::shared_ptr<ConnectionRecord> connectRecord)
419 {
420     auto abilityRecord = connectRecord->GetAbilityRecord();
421     if (abilityRecord == nullptr) {
422         HILOG_ERROR("Disconnect force abilityRecord null");
423         return;
424     }
425     abilityRecord->RemoveConnectRecordFromList(connectRecord);
426     connectRecord->CompleteDisconnect(ERR_OK, true);
427     list.emplace_back(connectRecord);
428     if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
429         HILOG_WARN("Force terminate ability record state: %{public}d.", abilityRecord->GetAbilityState());
430         TerminateRecord(abilityRecord);
431     }
432 }
433 
AttachAbilityThreadLocked(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)434 int AbilityConnectManager::AttachAbilityThreadLocked(
435     const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
436 {
437     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
438     std::lock_guard guard(Lock_);
439     auto abilityRecord = GetExtensionFromServiceMapInner(token);
440     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
441     if (taskHandler_ != nullptr) {
442         int recordId = abilityRecord->GetRecordId();
443         std::string taskName = std::string("LoadTimeout_") + std::to_string(recordId);
444         taskHandler_->CancelTask(taskName);
445     }
446     if (eventHandler_) {
447         eventHandler_->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG,
448             abilityRecord->GetAbilityRecordId());
449     }
450     std::string element = abilityRecord->GetWant().GetElement().GetURI();
451     HILOG_DEBUG("Ability: %{public}s", element.c_str());
452     abilityRecord->SetScheduler(scheduler);
453     abilityRecord->Inactivate();
454 
455     return ERR_OK;
456 }
457 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const int32_t state)458 void AbilityConnectManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
459 {
460     HILOG_DEBUG("state: %{public}d", state);
461     std::lock_guard guard(Lock_);
462     AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
463     if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
464         auto abilityRecord = GetExtensionFromServiceMapInner(token);
465         CHECK_POINTER(abilityRecord);
466         if (!UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
467             HILOG_ERROR("Not ui extension.");
468             return;
469         }
470         if (abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
471             HILOG_WARN("abilityRecord is foregrounding.");
472             return;
473         }
474         std::string element = abilityRecord->GetWant().GetElement().GetURI();
475         HILOG_DEBUG("Ability is %{public}s, start to foreground.", element.c_str());
476         MoveToForeground(abilityRecord);
477     }
478 }
479 
OnAppStateChanged(const AppInfo & info)480 void AbilityConnectManager::OnAppStateChanged(const AppInfo &info)
481 {
482     std::lock_guard guard(Lock_);
483     std::for_each(serviceMap_.begin(), serviceMap_.end(), [&info](ServiceMapType::reference service) {
484         if (service.second && (info.processName == service.second->GetAbilityInfo().process ||
485                                   info.processName == service.second->GetApplicationInfo().bundleName)) {
486             auto appName = service.second->GetApplicationInfo().name;
487             auto uid = service.second->GetAbilityInfo().applicationInfo.uid;
488             auto isExist = [&appName, &uid](
489                                const AppData &appData) { return appData.appName == appName && appData.uid == uid; };
490             auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
491             if (iter != info.appData.end()) {
492                 service.second->SetAppState(info.state);
493             }
494         }
495     });
496 }
497 
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state)498 int AbilityConnectManager::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)
499 {
500     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
501     std::lock_guard guard(Lock_);
502     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
503     std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
504     std::shared_ptr<AbilityRecord> abilityRecord;
505     if (targetState == AbilityState::INACTIVE
506         || targetState == AbilityState::FOREGROUND
507         || targetState == AbilityState::BACKGROUND) {
508         abilityRecord = GetExtensionFromServiceMapInner(token);
509     } else if (targetState == AbilityState::INITIAL) {
510         abilityRecord = GetExtensionFromTerminatingMapInner(token);
511     } else {
512         abilityRecord = nullptr;
513     }
514     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
515     std::string element = abilityRecord->GetWant().GetElement().GetURI();
516     HILOG_DEBUG("Ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
517 
518     switch (targetState) {
519         case AbilityState::INACTIVE: {
520             if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
521                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
522                     token, AppExecFwk::AbilityState::ABILITY_STATE_CREATE);
523             } else {
524                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
525                     token, AppExecFwk::ExtensionState::EXTENSION_STATE_CREATE);
526                 auto preloadTask = [owner = weak_from_this(), abilityRecord] {
527                     auto acm = owner.lock();
528                     if (acm == nullptr) {
529                         HILOG_ERROR("AbilityConnectManager is nullptr.");
530                         return;
531                     }
532                     acm->ProcessPreload(abilityRecord);
533                 };
534                 if (taskHandler_ != nullptr) {
535                     taskHandler_->SubmitTask(preloadTask);
536                 }
537             }
538             return DispatchInactive(abilityRecord, state);
539         }
540         case AbilityState::FOREGROUND: {
541             return DispatchForeground(abilityRecord);
542         }
543         case AbilityState::BACKGROUND: {
544             return DispatchBackground(abilityRecord);
545         }
546         case AbilityState::INITIAL: {
547             if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
548                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
549                     token, AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED);
550             } else {
551                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
552                     token, AppExecFwk::ExtensionState::EXTENSION_STATE_TERMINATED);
553             }
554             return DispatchTerminate(abilityRecord);
555         }
556         default: {
557             HILOG_WARN("Don't support transiting state: %{public}d", state);
558             return ERR_INVALID_VALUE;
559         }
560     }
561 }
562 
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const563 void AbilityConnectManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
564 {
565     auto bms = AbilityUtil::GetBundleManager();
566     CHECK_POINTER(bms);
567     auto abilityInfo = record->GetAbilityInfo();
568     Want want;
569     want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
570     auto uid = record->GetUid();
571     want.SetParam("uid", uid);
572     bms->ProcessPreload(want);
573 }
574 
ScheduleConnectAbilityDoneLocked(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)575 int AbilityConnectManager::ScheduleConnectAbilityDoneLocked(
576     const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
577 {
578     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
579     std::lock_guard guard(Lock_);
580     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
581 
582     auto abilityRecord = Token::GetAbilityRecordByToken(token);
583     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
584 
585     std::string element = abilityRecord->GetWant().GetElement().GetURI();
586     HILOG_DEBUG("Connect ability done, ability: %{public}s.", element.c_str());
587 
588     if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
589         (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
590         HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
591         return INVALID_CONNECTION_STATE;
592     }
593 
594     if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
595         DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
596             token, AppExecFwk::AbilityState::ABILITY_STATE_CONNECTED);
597     } else {
598         DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
599             token, AppExecFwk::ExtensionState::EXTENSION_STATE_CONNECTED);
600     }
601 
602     abilityRecord->SetConnRemoteObject(remoteObject);
603     // There may be multiple callers waiting for the connection result
604     auto connectRecordList = abilityRecord->GetConnectRecordList();
605     for (auto &connectRecord : connectRecordList) {
606         connectRecord->ScheduleConnectAbilityDone();
607     }
608 
609     return ERR_OK;
610 }
611 
ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> & token)612 int AbilityConnectManager::ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)
613 {
614     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
615     std::lock_guard guard(Lock_);
616     auto abilityRecord = GetExtensionFromServiceMapInner(token);
617     CHECK_POINTER_AND_RETURN(abilityRecord, CONNECTION_NOT_EXIST);
618 
619     auto connect = abilityRecord->GetDisconnectingRecord();
620     CHECK_POINTER_AND_RETURN(connect, CONNECTION_NOT_EXIST);
621 
622     if (!abilityRecord->IsAbilityState(AbilityState::ACTIVE)) {
623         HILOG_ERROR("The service ability state is not active ,state: %{public}d", abilityRecord->GetAbilityState());
624         return INVALID_CONNECTION_STATE;
625     }
626 
627     if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
628         DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
629             token, AppExecFwk::AbilityState::ABILITY_STATE_DISCONNECTED);
630     } else {
631         DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
632             token, AppExecFwk::ExtensionState::EXTENSION_STATE_DISCONNECTED);
633     }
634 
635     std::string element = abilityRecord->GetWant().GetElement().GetURI();
636     HILOG_DEBUG("Disconnect ability done, service:%{public}s.", element.c_str());
637 
638     // complete disconnect and remove record from conn map
639     connect->ScheduleDisconnectAbilityDone();
640     abilityRecord->RemoveConnectRecordFromList(connect);
641     if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
642         HILOG_INFO("Service ability has no any connection, and not started , need terminate.");
643         TerminateRecord(abilityRecord);
644     }
645     RemoveConnectionRecordFromMap(connect);
646 
647     return ERR_OK;
648 }
649 
ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> & token)650 int AbilityConnectManager::ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)
651 {
652     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
653     std::lock_guard guard(Lock_);
654     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
655     auto abilityRecord = Token::GetAbilityRecordByToken(token);
656     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
657     std::string element = abilityRecord->GetWant().GetElement().GetURI();
658     HILOG_DEBUG("Ability: %{public}s", element.c_str());
659 
660     if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
661         (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
662         HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
663         return INVALID_CONNECTION_STATE;
664     }
665     // complete command and pop waiting start ability from queue.
666     CompleteCommandAbility(abilityRecord);
667 
668     return ERR_OK;
669 }
670 
ScheduleCommandAbilityWindowDone(const sptr<IRemoteObject> & token,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd,AbilityCommand abilityCmd)671 int AbilityConnectManager::ScheduleCommandAbilityWindowDone(
672     const sptr<IRemoteObject> &token,
673     const sptr<SessionInfo> &sessionInfo,
674     WindowCommand winCmd,
675     AbilityCommand abilityCmd)
676 {
677     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
678     std::lock_guard guard(Lock_);
679     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
680     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
681     auto abilityRecord = Token::GetAbilityRecordByToken(token);
682     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
683     std::string element = abilityRecord->GetWant().GetElement().GetURI();
684     HILOG_DEBUG("Ability: %{public}s, persistentId: %{private}d, winCmd: %{public}d, abilityCmd: %{public}d",
685         element.c_str(), sessionInfo->persistentId, winCmd, abilityCmd);
686 
687     if (taskHandler_) {
688         int recordId = abilityRecord->GetRecordId();
689         std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
690                                std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
691         taskHandler_->CancelTask(taskName);
692     }
693 
694     if (winCmd == WIN_CMD_DESTROY) {
695         HandleCommandDestroy(sessionInfo);
696     }
697 
698     switch (abilityCmd) {
699         case ABILITY_CMD_FOREGROUND: {
700             if (abilityRecord->IsAbilityState(AbilityState::INACTIVE)
701                 || abilityRecord->IsAbilityState(AbilityState::BACKGROUND)
702                 || abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
703                 HILOG_DEBUG("Foreground %{public}s", element.c_str());
704                 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
705             }
706             break;
707         }
708         case ABILITY_CMD_BACKGROUND: {
709             if (abilityRecord->IsAbilityState(AbilityState::INACTIVE)
710                 || abilityRecord->IsAbilityState(AbilityState::FOREGROUND)
711                 || abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
712                 MoveToBackground(abilityRecord);
713             }
714             break;
715         }
716         case ABILITY_CMD_DESTROY: {
717             EventInfo eventInfo;
718             eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
719             eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
720             EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
721             eventInfo.errCode = TerminateAbilityInner(token);
722             if (eventInfo.errCode != ERR_OK) {
723                 EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
724             }
725             break;
726         }
727         default:
728             HILOG_WARN("not supported ability cmd");
729             break;;
730     }
731 
732     CompleteStartServiceReq(element);
733     return ERR_OK;
734 }
735 
HandleCommandDestroy(const sptr<SessionInfo> & sessionInfo)736 void AbilityConnectManager::HandleCommandDestroy(const sptr<SessionInfo> &sessionInfo)
737 {
738     if (sessionInfo == nullptr) {
739         HILOG_WARN("null session info.");
740         return;
741     }
742     if (sessionInfo->sessionToken) {
743         RemoveUIExtWindowDeathRecipient(sessionInfo->sessionToken);
744         size_t ret = uiExtensionMap_.erase(sessionInfo->sessionToken);
745         if (ret > 0) {
746             return;
747         }
748 
749         for (auto& item : windowExtensionMap_) {
750             auto sessionInfoVal = item.second.second;
751             if (sessionInfoVal && sessionInfoVal->callerToken == sessionInfo->sessionToken) {
752                 windowExtensionMap_.erase(item.first);
753                 break;
754             }
755         }
756     }
757 }
758 
CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)759 void AbilityConnectManager::CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)
760 {
761     CHECK_POINTER(abilityRecord);
762     if (taskHandler_) {
763         int recordId = abilityRecord->GetRecordId();
764         std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
765                                std::to_string(abilityRecord->GetStartId());
766         taskHandler_->CancelTask(taskName);
767     }
768 
769     abilityRecord->SetAbilityState(AbilityState::ACTIVE);
770 
771     // manage queued request
772     auto abilityInfo = abilityRecord->GetAbilityInfo();
773     AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName,
774                                     abilityInfo.name, abilityInfo.moduleName);
775     CompleteStartServiceReq(element.GetURI());
776 }
777 
CompleteStartServiceReq(const std::string & serviceUri)778 void AbilityConnectManager::CompleteStartServiceReq(const std::string &serviceUri)
779 {
780     std::shared_ptr<std::list<OHOS::AAFwk::AbilityRequest>> reqList;
781     {
782         std::lock_guard guard(startServiceReqListLock_);
783         auto it = startServiceReqList_.find(serviceUri);
784         if (it != startServiceReqList_.end()) {
785             reqList = it->second;
786             startServiceReqList_.erase(it);
787         }
788     }
789 
790     if (reqList) {
791         HILOG_INFO("Target service is already activating : %{public}zu", reqList->size());
792         for (const auto &req: *reqList) {
793             StartAbilityLocked(req);
794         }
795     }
796 }
797 
GetServiceRecordByElementName(const std::string & element)798 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementName(const std::string &element)
799 {
800     std::lock_guard guard(Lock_);
801     return GetServiceRecordByElementNameInner(element);
802 }
803 
GetServiceRecordByElementNameInner(const std::string & element)804 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementNameInner(const std::string &element)
805 {
806     auto mapIter = serviceMap_.find(element);
807     if (mapIter != serviceMap_.end()) {
808         return mapIter->second;
809     }
810     return nullptr;
811 }
812 
GetExtensionByTokenFromServiceMap(const sptr<IRemoteObject> & token)813 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromServiceMap(
814     const sptr<IRemoteObject> &token)
815 {
816     std::lock_guard guard(Lock_);
817     return GetExtensionFromServiceMapInner(token);
818 }
819 
GetExtensionFromServiceMapInner(const sptr<IRemoteObject> & token)820 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionFromServiceMapInner(
821     const sptr<IRemoteObject> &token)
822 {
823     auto IsMatch = [token](auto service) {
824         if (!service.second) {
825             return false;
826         }
827         sptr<IRemoteObject> srcToken = service.second->GetToken();
828         return srcToken == token;
829     };
830     auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
831     if (serviceRecord != serviceMap_.end()) {
832         return serviceRecord->second;
833     }
834     return nullptr;
835 }
836 
GetUIExtensioBySessionInfo(const sptr<SessionInfo> & sessionInfo)837 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetUIExtensioBySessionInfo(
838     const sptr<SessionInfo> &sessionInfo)
839 {
840     std::lock_guard guard(Lock_);
841     CHECK_POINTER_AND_RETURN(sessionInfo, nullptr);
842     auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
843     CHECK_POINTER_AND_RETURN(sessionToken, nullptr);
844     std::string descriptor = Str16ToStr8(sessionToken->GetDescriptor());
845     if (descriptor != "OHOS.ISession") {
846         HILOG_ERROR("Input token is not a sessionToken, token->GetDescriptor(): %{public}s",
847             descriptor.c_str());
848         return nullptr;
849     }
850 
851     auto it = uiExtensionMap_.find(sessionToken->AsObject());
852     if (it != uiExtensionMap_.end()) {
853         auto abilityRecord = it->second.first.lock();
854         if (abilityRecord == nullptr) {
855             HILOG_WARN("abilityRecord is nullptr.");
856             RemoveUIExtWindowDeathRecipient(sessionToken->AsObject());
857             uiExtensionMap_.erase(it);
858             return nullptr;
859         }
860         auto savedSessionInfo = it->second.second;
861         if (!savedSessionInfo || savedSessionInfo->sessionToken != sessionInfo->sessionToken
862             || savedSessionInfo->callerToken != sessionInfo->callerToken) {
863             HILOG_WARN("Inconsistent sessionInfo.");
864             return nullptr;
865         }
866         return abilityRecord;
867     } else {
868         HILOG_ERROR("UIExtension not found.");
869     }
870     return nullptr;
871 }
872 
GetExtensionByTokenFromTerminatingMap(const sptr<IRemoteObject> & token)873 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromTerminatingMap(
874     const sptr<IRemoteObject> &token)
875 {
876     std::lock_guard guard(Lock_);
877     return GetExtensionFromTerminatingMapInner(token);
878 }
879 
GetExtensionFromTerminatingMapInner(const sptr<IRemoteObject> & token)880 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionFromTerminatingMapInner(
881     const sptr<IRemoteObject> &token)
882 {
883     auto IsMatch = [token](auto& extension) {
884         if (extension.second == nullptr) {
885             return false;
886         }
887         auto&& terminatingToken = extension.second->GetToken();
888         if (terminatingToken != nullptr) {
889             return terminatingToken->AsObject() == token;
890         }
891         return false;
892     };
893 
894     auto terminatingExtensionRecord =
895         std::find_if(terminatingExtensionMap_.begin(), terminatingExtensionMap_.end(), IsMatch);
896     if (terminatingExtensionRecord != terminatingExtensionMap_.end()) {
897         return terminatingExtensionRecord->second;
898     }
899     return nullptr;
900 }
901 
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)902 std::list<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRecordListByCallback(
903     sptr<IAbilityConnection> callback)
904 {
905     std::lock_guard guard(Lock_);
906     std::list<std::shared_ptr<ConnectionRecord>> connectList;
907     auto connectMapIter = connectMap_.find(callback->AsObject());
908     if (connectMapIter != connectMap_.end()) {
909         connectList = connectMapIter->second;
910     }
911     return connectList;
912 }
913 
GetAbilityRecordById(int64_t abilityRecordId)914 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetAbilityRecordById(int64_t abilityRecordId)
915 {
916     auto IsMatch = [abilityRecordId](auto service) {
917         if (!service.second) {
918             return false;
919         }
920         return abilityRecordId == service.second->GetAbilityRecordId();
921     };
922     auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
923     if (serviceRecord != serviceMap_.end()) {
924         return serviceRecord->second;
925     }
926     return nullptr;
927 }
928 
LoadAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)929 void AbilityConnectManager::LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
930 {
931     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
932     CHECK_POINTER(abilityRecord);
933     abilityRecord->SetStartTime();
934 
935     if (!abilityRecord->CanRestartRootLauncher()) {
936         HILOG_ERROR("Root launcher restart is out of max count.");
937         RemoveServiceAbility(abilityRecord);
938         return;
939     }
940 
941     PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
942 
943     sptr<Token> token = abilityRecord->GetToken();
944     sptr<Token> perToken = nullptr;
945     if (abilityRecord->IsCreateByConnect()) {
946         perToken = iface_cast<Token>(abilityRecord->GetConnectingRecord()->GetToken());
947     } else {
948         auto callerList = abilityRecord->GetCallerRecordList();
949         if (!callerList.empty() && callerList.back()) {
950             auto caller = callerList.back()->GetCaller();
951             if (caller) {
952                 perToken = caller->GetToken();
953             }
954         }
955     }
956     DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
957         token, perToken, abilityRecord->GetAbilityInfo(), abilityRecord->GetApplicationInfo(),
958         abilityRecord->GetWant());
959 }
960 
PostRestartResidentTask(const AbilityRequest & abilityRequest)961 void AbilityConnectManager::PostRestartResidentTask(const AbilityRequest &abilityRequest)
962 {
963     HILOG_INFO("PostRestartResidentTask start.");
964     CHECK_POINTER(taskHandler_);
965     std::string taskName = std::string("RestartResident_") + std::string(abilityRequest.abilityInfo.name);
966     auto task = [abilityRequest, connectManager = shared_from_this()]() {
967         CHECK_POINTER(connectManager);
968         connectManager->HandleRestartResidentTask(abilityRequest);
969     };
970     int restartIntervalTime = 0;
971     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
972     if (abilityMgr) {
973         restartIntervalTime = AmsConfigurationParameter::GetInstance().GetRestartIntervalTime();
974     }
975     HILOG_DEBUG("PostRestartResidentTask, time:%{public}d", restartIntervalTime);
976     taskHandler_->SubmitTask(task, taskName, restartIntervalTime);
977     HILOG_INFO("PostRestartResidentTask end.");
978 }
979 
HandleRestartResidentTask(const AbilityRequest & abilityRequest)980 void AbilityConnectManager::HandleRestartResidentTask(const AbilityRequest &abilityRequest)
981 {
982     HILOG_INFO("HandleRestartResidentTask start.");
983     auto findRestartResidentTask = [abilityRequest](const AbilityRequest &requestInfo) {
984         return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
985             requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
986             requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
987     };
988     auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(), findRestartResidentTask);
989     if (findIter != restartResidentTaskList_.end()) {
990         restartResidentTaskList_.erase(findIter);
991     }
992     StartAbilityLocked(abilityRequest);
993 }
994 
PostTimeOutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,uint32_t messageId)995 void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)
996 {
997     CHECK_POINTER(abilityRecord);
998     CHECK_POINTER(taskHandler_);
999     if (messageId != AbilityConnectManager::LOAD_TIMEOUT_MSG &&
1000         messageId != AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1001         HILOG_ERROR("Timeout task messageId is error.");
1002         return;
1003     }
1004 
1005     int recordId;
1006     std::string taskName;
1007     int resultCode;
1008     uint32_t delayTime;
1009     if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
1010         // first load ability, There is at most one connect record.
1011         recordId = abilityRecord->GetRecordId();
1012         taskName = std::string("LoadTimeout_") + std::to_string(recordId);
1013         resultCode = LOAD_ABILITY_TIMEOUT;
1014         delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE;
1015     } else {
1016         auto connectRecord = abilityRecord->GetConnectingRecord();
1017         CHECK_POINTER(connectRecord);
1018         recordId = connectRecord->GetRecordId();
1019         taskName = std::string("ConnectTimeout_") + std::to_string(recordId);
1020         resultCode = CONNECTION_TIMEOUT;
1021         delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
1022     }
1023 
1024     // check libc.hook_mode
1025     const int bufferLen = 128;
1026     char paramOutBuf[bufferLen] = {0};
1027     const char *hook_mode = "startup:";
1028     int ret = GetParameter("libc.hook_mode", "", paramOutBuf, bufferLen - 1);
1029     if (ret > 0 && strncmp(paramOutBuf, hook_mode, strlen(hook_mode)) == 0) {
1030         HILOG_DEBUG("Hook_mode: no timeoutTask");
1031         return;
1032     }
1033 
1034     auto timeoutTask = [abilityRecord, connectManager = shared_from_this(), resultCode]() {
1035         HILOG_WARN("Connect or load ability timeout.");
1036         connectManager->HandleStartTimeoutTask(abilityRecord, resultCode);
1037     };
1038     taskHandler_->SubmitTask(timeoutTask, taskName, delayTime);
1039 }
1040 
HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode)1041 void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, int resultCode)
1042 {
1043     HILOG_DEBUG("Complete connect or load ability timeout.");
1044     std::lock_guard guard(Lock_);
1045     CHECK_POINTER(abilityRecord);
1046     auto connectingList = abilityRecord->GetConnectingRecordList();
1047     for (auto &connectRecord : connectingList) {
1048         if (connectRecord == nullptr) {
1049             HILOG_WARN("ConnectRecord is nullptr.");
1050             continue;
1051         }
1052         connectRecord->CompleteDisconnect(ERR_OK, true);
1053         abilityRecord->RemoveConnectRecordFromList(connectRecord);
1054         RemoveConnectionRecordFromMap(connectRecord);
1055     }
1056 
1057     if (GetExtensionFromServiceMapInner(abilityRecord->GetToken()) == nullptr) {
1058         HILOG_ERROR("Timeojut ability record is not exist in service map.");
1059         return;
1060     }
1061     MoveToTerminatingMap(abilityRecord);
1062 
1063     if (resultCode == LOAD_ABILITY_TIMEOUT) {
1064         HILOG_WARN("Load time out , remove target service record from services map.");
1065         RemoveServiceAbility(abilityRecord);
1066         if (abilityRecord->GetAbilityInfo().name != AbilityConfig::LAUNCHER_ABILITY_NAME) {
1067             DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1068             if (IsAbilityNeedKeepAlive(abilityRecord)) {
1069                 HILOG_WARN("Load time out , try to restart.");
1070                 RestartAbility(abilityRecord, userId_);
1071             }
1072         }
1073     }
1074 
1075     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1076         // terminate the timeout root launcher.
1077         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1078         if (resultCode == LOAD_ABILITY_TIMEOUT) {
1079             StartRootLauncher(abilityRecord);
1080         }
1081     }
1082 }
1083 
HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord)1084 void AbilityConnectManager::HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1085 {
1086     HILOG_DEBUG("HandleCommandTimeoutTask start");
1087     std::lock_guard guard(Lock_);
1088     CHECK_POINTER(abilityRecord);
1089     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1090         HILOG_DEBUG("Handle root launcher command timeout.");
1091         // terminate the timeout root launcher.
1092         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1093     }
1094     HILOG_DEBUG("HandleCommandTimeoutTask end");
1095 }
1096 
HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd)1097 void AbilityConnectManager::HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord,
1098     const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1099 {
1100     HILOG_DEBUG("start");
1101     std::lock_guard guard(Lock_);
1102     CHECK_POINTER(abilityRecord);
1103     // manage queued request
1104     auto abilityInfo = abilityRecord->GetAbilityInfo();
1105     AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName,
1106                                     abilityInfo.name, abilityInfo.moduleName);
1107     CompleteStartServiceReq(element.GetURI());
1108     HILOG_DEBUG("end");
1109 }
1110 
StartRootLauncher(const std::shared_ptr<AbilityRecord> & abilityRecord)1111 void AbilityConnectManager::StartRootLauncher(const std::shared_ptr<AbilityRecord> &abilityRecord)
1112 {
1113     CHECK_POINTER(abilityRecord);
1114     AbilityRequest requestInfo;
1115     requestInfo.want = abilityRecord->GetWant();
1116     requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
1117     requestInfo.appInfo = abilityRecord->GetApplicationInfo();
1118     requestInfo.restartTime = abilityRecord->GetRestartTime();
1119     requestInfo.restart = true;
1120     requestInfo.restartCount = abilityRecord->GetRestartCount() - 1;
1121 
1122     HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
1123     StartAbilityLocked(requestInfo);
1124 }
1125 
HandleStopTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)1126 void AbilityConnectManager::HandleStopTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)
1127 {
1128     HILOG_DEBUG("Complete stop ability timeout start.");
1129     std::lock_guard guard(Lock_);
1130     CHECK_POINTER(abilityRecord);
1131     TerminateDone(abilityRecord);
1132 }
1133 
HandleTerminateDisconnectTask(const ConnectListType & connectlist)1134 void AbilityConnectManager::HandleTerminateDisconnectTask(const ConnectListType& connectlist)
1135 {
1136     HILOG_DEBUG("Disconnect ability when terminate.");
1137     for (auto& connectRecord : connectlist) {
1138         if (!connectRecord) {
1139             continue;
1140         }
1141         auto targetService = connectRecord->GetAbilityRecord();
1142         if (targetService) {
1143             HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
1144             connectRecord->CompleteDisconnect(ERR_OK, true);
1145             targetService->RemoveConnectRecordFromList(connectRecord);
1146             RemoveConnectionRecordFromMap(connectRecord);
1147         };
1148     }
1149 }
1150 
DispatchInactive(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)1151 int AbilityConnectManager::DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
1152 {
1153     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1154     CHECK_POINTER_AND_RETURN(eventHandler_, ERR_INVALID_VALUE);
1155     if (!abilityRecord->IsAbilityState(AbilityState::INACTIVATING)) {
1156         HILOG_ERROR("Ability transition life state error. expect %{public}d, actual %{public}d callback %{public}d",
1157             AbilityState::INACTIVATING,
1158             abilityRecord->GetAbilityState(),
1159             state);
1160         return ERR_INVALID_VALUE;
1161     }
1162     eventHandler_->RemoveEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1163 
1164     // complete inactive
1165     abilityRecord->SetAbilityState(AbilityState::INACTIVE);
1166     if (abilityRecord->IsCreateByConnect()) {
1167         ConnectAbility(abilityRecord);
1168     } else if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1169         CommandAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo(), WIN_CMD_FOREGROUND);
1170     } else {
1171         CommandAbility(abilityRecord);
1172         if (abilityRecord->GetConnectRecordList().size() > 0) {
1173             // It means someone called connectAbility when service was loading
1174             ConnectAbility(abilityRecord);
1175         }
1176     }
1177 
1178     return ERR_OK;
1179 }
1180 
DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord)1181 int AbilityConnectManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1182 {
1183     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1184     CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1185     // remove foreground timeout task.
1186     taskHandler_->CancelTask("foreground_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1187 
1188     auto self(shared_from_this());
1189     auto task = [self, abilityRecord]() { self->CompleteForeground(abilityRecord); };
1190     taskHandler_->SubmitTask(task);
1191 
1192     return ERR_OK;
1193 }
1194 
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1195 int AbilityConnectManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1196 {
1197     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1198     CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1199     // remove background timeout task.
1200     taskHandler_->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1201 
1202     auto self(shared_from_this());
1203     auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1204     taskHandler_->SubmitTask(task);
1205 
1206     return ERR_OK;
1207 }
1208 
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1209 int AbilityConnectManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1210 {
1211     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1212     // remove terminate timeout task
1213     if (taskHandler_ != nullptr) {
1214         taskHandler_->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1215     }
1216     // complete terminate
1217     TerminateDone(abilityRecord);
1218     return ERR_OK;
1219 }
1220 
ConnectAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1221 void AbilityConnectManager::ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1222 {
1223     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1224     CHECK_POINTER(abilityRecord);
1225     PostTimeOutTask(abilityRecord, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1226     abilityRecord->ConnectAbility();
1227 }
1228 
CommandAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1229 void AbilityConnectManager::CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1230 {
1231     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1232     if (taskHandler_ != nullptr) {
1233         // first connect ability, There is at most one connect record.
1234         int recordId = abilityRecord->GetRecordId();
1235         abilityRecord->AddStartId();
1236         std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
1237                                std::to_string(abilityRecord->GetStartId());
1238         auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
1239             HILOG_ERROR("Command ability timeout. %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1240             connectManager->HandleCommandTimeoutTask(abilityRecord);
1241         };
1242         int commandTimeout =
1243             AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_TIMEOUT_MULTIPLE;
1244         taskHandler_->SubmitTask(timeoutTask, taskName, commandTimeout);
1245         // scheduling command ability
1246         abilityRecord->CommandAbility();
1247     }
1248 }
1249 
CommandAbilityWindow(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd)1250 void AbilityConnectManager::CommandAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord,
1251     const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1252 {
1253     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1254     CHECK_POINTER(abilityRecord);
1255     CHECK_POINTER(sessionInfo);
1256     HILOG_DEBUG("ability: %{public}s, persistentId: %{private}d, wincmd: %{public}d",
1257         abilityRecord->GetAbilityInfo().name.c_str(), sessionInfo->persistentId, winCmd);
1258     if (taskHandler_ != nullptr) {
1259         int recordId = abilityRecord->GetRecordId();
1260         std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
1261             std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
1262         auto timeoutTask = [abilityRecord, sessionInfo, winCmd, connectManager = shared_from_this()]() {
1263             HILOG_ERROR("Command window timeout. %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1264             connectManager->HandleCommandWindowTimeoutTask(abilityRecord, sessionInfo, winCmd);
1265         };
1266         int commandWindowTimeout =
1267             AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_WINDOW_TIMEOUT_MULTIPLE;
1268         taskHandler_->SubmitTask(timeoutTask, taskName, commandWindowTimeout);
1269         // scheduling command ability
1270         abilityRecord->CommandAbilityWindow(sessionInfo, winCmd);
1271     }
1272 }
1273 
TerminateDone(const std::shared_ptr<AbilityRecord> & abilityRecord)1274 void AbilityConnectManager::TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)
1275 {
1276     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1277     CHECK_POINTER(abilityRecord);
1278     if (!abilityRecord->IsAbilityState(AbilityState::TERMINATING)) {
1279         std::string expect = AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING);
1280         std::string actual = AbilityRecord::ConvertAbilityState(abilityRecord->GetAbilityState());
1281         HILOG_ERROR(
1282             "Transition life state error. expect %{public}s, actual %{public}s", expect.c_str(), actual.c_str());
1283         return;
1284     }
1285     abilityRecord->RemoveAbilityDeathRecipient();
1286     DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(abilityRecord->GetToken(), false);
1287     RemoveServiceAbility(abilityRecord);
1288 }
1289 
IsAbilityConnected(const std::shared_ptr<AbilityRecord> & abilityRecord,const std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)1290 bool AbilityConnectManager::IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord,
1291     const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
1292 {
1293     auto isMatch = [abilityRecord](auto connectRecord) -> bool {
1294         if (abilityRecord == nullptr || connectRecord == nullptr) {
1295             return false;
1296         }
1297         if (abilityRecord != connectRecord->GetAbilityRecord()) {
1298             return false;
1299         }
1300         return true;
1301     };
1302     return std::any_of(connectRecordList.begin(), connectRecordList.end(), isMatch);
1303 }
1304 
RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> & connection)1305 void AbilityConnectManager::RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> &connection)
1306 {
1307     for (auto &connectCallback : connectMap_) {
1308         auto &connectList = connectCallback.second;
1309         auto connectRecord = std::find(connectList.begin(), connectList.end(), connection);
1310         if (connectRecord != connectList.end()) {
1311             HILOG_INFO("connrecord(%{public}d)", (*connectRecord)->GetRecordId());
1312             connectList.remove(connection);
1313             if (connectList.empty()) {
1314                 HILOG_INFO("connlist");
1315                 sptr<IAbilityConnection> connect = iface_cast<IAbilityConnection>(connectCallback.first);
1316                 RemoveConnectDeathRecipient(connect);
1317                 connectMap_.erase(connectCallback.first);
1318             }
1319             return;
1320         }
1321     }
1322 }
1323 
RemoveServiceAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1324 void AbilityConnectManager::RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1325 {
1326     CHECK_POINTER(abilityRecord);
1327     auto& abilityInfo = abilityRecord->GetAbilityInfo();
1328     AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1329         abilityInfo.moduleName);
1330     HILOG_DEBUG("Remove service(%{public}s) from terminating map.", element.GetURI().c_str());
1331     terminatingExtensionMap_.erase(element.GetURI());
1332 }
1333 
AddConnectDeathRecipient(const sptr<IAbilityConnection> & connect)1334 void AbilityConnectManager::AddConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
1335 {
1336     CHECK_POINTER(connect);
1337     CHECK_POINTER(connect->AsObject());
1338     auto it = recipientMap_.find(connect->AsObject());
1339     if (it != recipientMap_.end()) {
1340         HILOG_ERROR("This death recipient has been added.");
1341         return;
1342     } else {
1343         std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1344         sptr<IRemoteObject::DeathRecipient> deathRecipient =
1345             new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1346                 auto abilityConnectManager = thisWeakPtr.lock();
1347                 if (abilityConnectManager) {
1348                     abilityConnectManager->OnCallBackDied(remote);
1349                 }
1350             });
1351         if (!connect->AsObject()->AddDeathRecipient(deathRecipient)) {
1352             HILOG_ERROR("AddDeathRecipient failed.");
1353         }
1354         recipientMap_.emplace(connect->AsObject(), deathRecipient);
1355     }
1356 }
1357 
RemoveConnectDeathRecipient(const sptr<IAbilityConnection> & connect)1358 void AbilityConnectManager::RemoveConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
1359 {
1360     CHECK_POINTER(connect);
1361     CHECK_POINTER(connect->AsObject());
1362     auto it = recipientMap_.find(connect->AsObject());
1363     if (it != recipientMap_.end()) {
1364         it->first->RemoveDeathRecipient(it->second);
1365         recipientMap_.erase(it);
1366         return;
1367     }
1368 }
1369 
OnCallBackDied(const wptr<IRemoteObject> & remote)1370 void AbilityConnectManager::OnCallBackDied(const wptr<IRemoteObject> &remote)
1371 {
1372     auto object = remote.promote();
1373     CHECK_POINTER(object);
1374     if (taskHandler_) {
1375         auto task = [object, connectManager = shared_from_this()]() { connectManager->HandleCallBackDiedTask(object); };
1376         taskHandler_->SubmitTask(task, TASK_ON_CALLBACK_DIED);
1377     }
1378 }
1379 
HandleCallBackDiedTask(const sptr<IRemoteObject> & connect)1380 void AbilityConnectManager::HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)
1381 {
1382     HILOG_INFO("Handle call back died task.");
1383     std::lock_guard guard(Lock_);
1384     CHECK_POINTER(connect);
1385     auto item = windowExtensionMap_.find(connect);
1386     if (item != windowExtensionMap_.end()) {
1387         windowExtensionMap_.erase(item);
1388     }
1389     auto it = connectMap_.find(connect);
1390     if (it != connectMap_.end()) {
1391         ConnectListType connectRecordList = it->second;
1392         for (auto &connRecord : connectRecordList) {
1393             connRecord->ClearConnCallBack();
1394         }
1395     } else {
1396         HILOG_INFO("Died object can't find from conn map.");
1397         return;
1398     }
1399     sptr<IAbilityConnection> object = iface_cast<IAbilityConnection>(connect);
1400     DisconnectAbilityLocked(object, true);
1401 }
1402 
OnAbilityDied(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1403 void AbilityConnectManager::OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1404 {
1405     HILOG_INFO("On ability died.");
1406     CHECK_POINTER(abilityRecord);
1407     if (abilityRecord->GetAbilityInfo().type != AbilityType::SERVICE &&
1408         abilityRecord->GetAbilityInfo().type != AbilityType::EXTENSION) {
1409         HILOG_DEBUG("Ability type is not service.");
1410         return;
1411     }
1412     if (taskHandler_) {
1413         auto task = [abilityRecord, connectManager = shared_from_this(), currentUserId]() {
1414             connectManager->HandleAbilityDiedTask(abilityRecord, currentUserId);
1415         };
1416         taskHandler_->SubmitTask(task, TASK_ON_ABILITY_DIED);
1417     }
1418 }
1419 
OnTimeOut(uint32_t msgId,int64_t abilityRecordId)1420 void AbilityConnectManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId)
1421 {
1422     HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1423     std::lock_guard guard(Lock_);
1424     auto abilityRecord = GetAbilityRecordById(abilityRecordId);
1425     if (abilityRecord == nullptr) {
1426         HILOG_ERROR("AbilityConnectManager on time out event: ability record is nullptr.");
1427         return;
1428     }
1429     HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId,
1430         abilityRecord->GetAbilityInfo().name.c_str());
1431 
1432     switch (msgId) {
1433         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1434             HandleInactiveTimeout(abilityRecord);
1435             break;
1436         default:
1437             break;
1438     }
1439 }
1440 
HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> & ability)1441 void AbilityConnectManager::HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)
1442 {
1443     HILOG_DEBUG("HandleInactiveTimeout start");
1444     CHECK_POINTER(ability);
1445     if (ability->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1446         HILOG_DEBUG("Handle root launcher inactive timeout.");
1447         // terminate the timeout root launcher.
1448         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1449     }
1450 
1451     HILOG_DEBUG("HandleInactiveTimeout end");
1452 }
1453 
IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> & abilityRecord)1454 bool AbilityConnectManager::IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)
1455 {
1456     if ((abilityRecord->GetApplicationInfo().bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME &&
1457             abilityRecord->GetAbilityInfo().name == AbilityConfig::SYSTEM_UI_ABILITY_NAME) ||
1458         (abilityRecord->GetApplicationInfo().bundleName == AbilityConfig::LAUNCHER_BUNDLE_NAME &&
1459             abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME)) {
1460         return true;
1461     }
1462     auto bms = AbilityUtil::GetBundleManager();
1463     CHECK_POINTER_AND_RETURN(bms, false);
1464     std::vector<AppExecFwk::BundleInfo> bundleInfos;
1465     bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD);
1466     if (!getBundleInfos) {
1467         HILOG_ERROR("Handle ability died task, get bundle infos failed");
1468         return false;
1469     }
1470 
1471     auto CheckIsAbilityNeedKeepAlive = [](const AppExecFwk::HapModuleInfo &hapModuleInfo,
1472         const std::string processName, std::string &mainElement) {
1473         if (!hapModuleInfo.isModuleJson) {
1474             // old application model
1475             mainElement = hapModuleInfo.mainAbility;
1476             for (auto abilityInfo : hapModuleInfo.abilityInfos) {
1477                 if (abilityInfo.process == processName && abilityInfo.name == mainElement) {
1478                     return true;
1479                 }
1480             }
1481             return false;
1482         }
1483 
1484         // new application model
1485         if (hapModuleInfo.process == processName) {
1486             mainElement = hapModuleInfo.mainElementName;
1487             return true;
1488         }
1489         return false;
1490     };
1491 
1492     auto GetKeepAliveAbilities = [&](std::vector<std::pair<std::string, std::string>> &keepAliveAbilities) {
1493         for (size_t i = 0; i < bundleInfos.size(); i++) {
1494             std::string processName = bundleInfos[i].applicationInfo.process;
1495             if (!bundleInfos[i].isKeepAlive || processName.empty()) {
1496                 continue;
1497             }
1498             std::string bundleName = bundleInfos[i].name;
1499             for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) {
1500                 std::string mainElement;
1501                 if (CheckIsAbilityNeedKeepAlive(hapModuleInfo, processName, mainElement) && !mainElement.empty()) {
1502                     keepAliveAbilities.push_back(std::make_pair(bundleName, mainElement));
1503                 }
1504             }
1505         }
1506     };
1507 
1508     auto findKeepAliveAbility = [abilityRecord](const std::pair<std::string, std::string> &keepAlivePair) {
1509         return ((abilityRecord->GetAbilityInfo().bundleName == keepAlivePair.first &&
1510                 abilityRecord->GetAbilityInfo().name == keepAlivePair.second));
1511     };
1512 
1513     std::vector<std::pair<std::string, std::string>> keepAliveAbilities;
1514     GetKeepAliveAbilities(keepAliveAbilities);
1515     auto findIter = find_if(keepAliveAbilities.begin(), keepAliveAbilities.end(), findKeepAliveAbility);
1516     if (findIter != keepAliveAbilities.end()) {
1517         abilityRecord->SetKeepAlive();
1518         return true;
1519     }
1520     return false;
1521 }
1522 
HandleAbilityDiedTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1523 void AbilityConnectManager::HandleAbilityDiedTask(
1524     const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1525 {
1526     HILOG_INFO("Handle ability died task.");
1527     std::lock_guard guard(Lock_);
1528     CHECK_POINTER(abilityRecord);
1529     abilityRecord->SetConnRemoteObject(nullptr);
1530     ConnectListType connlist = abilityRecord->GetConnectRecordList();
1531     for (auto &connectRecord : connlist) {
1532         HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
1533         connectRecord->CompleteDisconnect(ERR_OK, true);
1534         abilityRecord->RemoveConnectRecordFromList(connectRecord);
1535         RemoveConnectionRecordFromMap(connectRecord);
1536     }
1537 
1538     if (abilityRecord->IsTerminating()) {
1539         HILOG_INFO("Handle extension DiedByTerminating.");
1540         RemoveServiceAbility(abilityRecord);
1541         if (IsAbilityNeedKeepAlive(abilityRecord)) {
1542             HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1543             RestartAbility(abilityRecord, currentUserId);
1544         }
1545         return;
1546     }
1547 
1548     if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1549         HandleUIExtensionDied(abilityRecord);
1550     }
1551 
1552     if (GetExtensionFromServiceMapInner(abilityRecord->GetToken()) == nullptr) {
1553         HILOG_ERROR("Died ability record is not exist in service map.");
1554         return;
1555     }
1556 
1557     MoveToTerminatingMap(abilityRecord);
1558     RemoveServiceAbility(abilityRecord);
1559     if (IsAbilityNeedKeepAlive(abilityRecord)) {
1560         HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1561         RestartAbility(abilityRecord, currentUserId);
1562     }
1563 }
1564 
HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> & abilityRecord)1565 void AbilityConnectManager::HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> &abilityRecord)
1566 {
1567     HILOG_DEBUG("called");
1568     CHECK_POINTER(abilityRecord);
1569     for (auto it = uiExtensionMap_.begin(); it != uiExtensionMap_.end();) {
1570         std::shared_ptr<AbilityRecord> uiExtAbility = it->second.first.lock();
1571         if (uiExtAbility == nullptr) {
1572             HILOG_WARN("uiExtAbility is nullptr");
1573             RemoveUIExtWindowDeathRecipient(it->first);
1574             it = uiExtensionMap_.erase(it);
1575             continue;
1576         }
1577 
1578         if (abilityRecord == uiExtAbility) {
1579             sptr<Rosen::ISession> sessionProxy = iface_cast<Rosen::ISession>(it->first);
1580             if (sessionProxy) {
1581                 HILOG_DEBUG("start NotifyExtensionDied");
1582                 sessionProxy->NotifyExtensionDied();
1583             }
1584             RemoveUIExtWindowDeathRecipient(it->first);
1585             it = uiExtensionMap_.erase(it);
1586             continue;
1587         }
1588         it++;
1589     }
1590 }
1591 
RestartAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1592 void AbilityConnectManager::RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1593 {
1594     HILOG_INFO("Restart ability");
1595     AbilityRequest requestInfo;
1596     requestInfo.want = abilityRecord->GetWant();
1597     requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
1598     requestInfo.appInfo = abilityRecord->GetApplicationInfo();
1599     requestInfo.restartTime = abilityRecord->GetRestartTime();
1600     requestInfo.restart = true;
1601     abilityRecord->SetRestarting(true);
1602 
1603     if (currentUserId != userId_ &&
1604         abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1605         HILOG_WARN("delay restart root launcher until switch user.");
1606         return;
1607     }
1608 
1609     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1610         requestInfo.restartCount = abilityRecord->GetRestartCount();
1611         HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
1612         StartAbilityLocked(requestInfo);
1613         return;
1614     }
1615 
1616     // restart other resident ability
1617     if (abilityRecord->CanRestartResident()) {
1618         requestInfo.restartCount = abilityRecord->GetRestartCount();
1619         requestInfo.restartTime = AbilityUtil::SystemTimeMillis();
1620         StartAbilityLocked(requestInfo);
1621     } else {
1622         auto findRestartResidentTask = [requestInfo](const AbilityRequest &abilityRequest) {
1623             return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
1624                 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
1625                 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
1626         };
1627         auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(),
1628             findRestartResidentTask);
1629         if (findIter != restartResidentTaskList_.end()) {
1630             HILOG_WARN("The restart task has been registered.");
1631             return;
1632         }
1633         restartResidentTaskList_.emplace_back(requestInfo);
1634         PostRestartResidentTask(requestInfo);
1635     }
1636 }
1637 
DumpState(std::vector<std::string> & info,bool isClient,const std::string & args)1638 void AbilityConnectManager::DumpState(std::vector<std::string> &info, bool isClient, const std::string &args)
1639 {
1640     HILOG_INFO("args:%{public}s.", args.c_str());
1641     ServiceMapType serviceMapBack;
1642     {
1643         std::lock_guard guard(Lock_);
1644         serviceMapBack = serviceMap_;
1645     }
1646     if (!args.empty()) {
1647         auto it = std::find_if(serviceMapBack.begin(), serviceMapBack.end(), [&args](const auto &service) {
1648             return service.first.compare(args) == 0;
1649         });
1650         if (it != serviceMapBack.end()) {
1651             info.emplace_back("uri [ " + it->first + " ]");
1652             if (it->second != nullptr) {
1653                 it->second->DumpService(info, isClient);
1654             }
1655         } else {
1656             info.emplace_back(args + ": Nothing to dump.");
1657         }
1658     } else {
1659         info.emplace_back("  ExtensionRecords:");
1660         for (auto &&service : serviceMapBack) {
1661             info.emplace_back("    uri [" + service.first + "]");
1662             if (service.second != nullptr) {
1663                 service.second->DumpService(info, isClient);
1664             }
1665         }
1666     }
1667 }
1668 
DumpStateByUri(std::vector<std::string> & info,bool isClient,const std::string & args,std::vector<std::string> & params)1669 void AbilityConnectManager::DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args,
1670     std::vector<std::string> &params)
1671 {
1672     HILOG_INFO("args:%{public}s, params size: %{public}zu", args.c_str(), params.size());
1673     std::shared_ptr<AbilityRecord> extensionAbilityRecord = nullptr;
1674     {
1675         std::lock_guard guard(Lock_);
1676         auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
1677             return service.first.compare(args) == 0;
1678         });
1679         if (it != serviceMap_.end()) {
1680             info.emplace_back("uri [ " + it->first + " ]");
1681             extensionAbilityRecord = it->second;
1682         } else {
1683             info.emplace_back(args + ": Nothing to dump.");
1684         }
1685     }
1686     if (extensionAbilityRecord != nullptr) {
1687         extensionAbilityRecord->DumpService(info, params, isClient);
1688     }
1689 }
1690 
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info,const int32_t userId,bool isPerm)1691 void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info,
1692     const int32_t userId, bool isPerm)
1693 {
1694     HILOG_DEBUG("Get extension running info.");
1695     std::lock_guard guard(Lock_);
1696     auto mgr = shared_from_this();
1697     auto queryInfo = [&info, upperLimit, userId, isPerm, mgr](ServiceMapType::reference service) {
1698         if (static_cast<int>(info.size()) >= upperLimit) {
1699             return;
1700         }
1701         auto abilityRecord = service.second;
1702         CHECK_POINTER(abilityRecord);
1703 
1704         if (isPerm) {
1705             mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1706         } else {
1707             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1708             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1709             if (callingTokenId == tokenID) {
1710                 mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1711             }
1712         }
1713     };
1714     std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1715 }
1716 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)1717 void AbilityConnectManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
1718 {
1719     HILOG_DEBUG("call");
1720     std::lock_guard guard(Lock_);
1721 
1722     auto queryInfo = [&info, isPerm](ServiceMapType::reference service) {
1723         auto abilityRecord = service.second;
1724         CHECK_POINTER(abilityRecord);
1725 
1726         if (isPerm) {
1727             DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1728         } else {
1729             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1730             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1731             if (callingTokenId == tokenID) {
1732                 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1733             }
1734         }
1735     };
1736 
1737     std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1738 }
1739 
GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> & abilityRecord,const int32_t userId,std::vector<ExtensionRunningInfo> & info)1740 void AbilityConnectManager::GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord,
1741     const int32_t userId, std::vector<ExtensionRunningInfo> &info)
1742 {
1743     ExtensionRunningInfo extensionInfo;
1744     AppExecFwk::RunningProcessInfo processInfo;
1745     extensionInfo.extension = abilityRecord->GetWant().GetElement();
1746     auto bms = AbilityUtil::GetBundleManager();
1747     CHECK_POINTER(bms);
1748     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
1749     bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfos(abilityRecord->GetWant(),
1750         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, extensionInfos));
1751     if (queryResult) {
1752         HILOG_DEBUG("Success");
1753         auto abilityInfo = abilityRecord->GetAbilityInfo();
1754         auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &extensionInfo) {
1755             HILOG_DEBUG("%{public}s, %{public}s", extensionInfo.bundleName.c_str(), extensionInfo.name.c_str());
1756             return extensionInfo.bundleName == abilityInfo.bundleName && extensionInfo.name == abilityInfo.name
1757                 && extensionInfo.applicationInfo.uid == abilityInfo.applicationInfo.uid;
1758         };
1759         auto infoIter = std::find_if(extensionInfos.begin(), extensionInfos.end(), isExist);
1760         if (infoIter != extensionInfos.end()) {
1761             HILOG_DEBUG("Get target success.");
1762             extensionInfo.type = (*infoIter).type;
1763         }
1764     }
1765     DelayedSingleton<AppScheduler>::GetInstance()->
1766         GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
1767     extensionInfo.pid = processInfo.pid_;
1768     extensionInfo.uid = processInfo.uid_;
1769     extensionInfo.processName = processInfo.processName_;
1770     extensionInfo.startTime = abilityRecord->GetStartTime();
1771     ConnectListType connectRecordList = abilityRecord->GetConnectRecordList();
1772     for (auto &connectRecord : connectRecordList) {
1773         if (connectRecord == nullptr) {
1774             HILOG_DEBUG("connectRecord is nullptr.");
1775             continue;
1776         }
1777         auto callerAbilityRecord = Token::GetAbilityRecordByToken(connectRecord->GetToken());
1778         if (callerAbilityRecord == nullptr) {
1779             HILOG_DEBUG("callerAbilityRecord is nullptr.");
1780             continue;
1781         }
1782         std::string package = callerAbilityRecord->GetAbilityInfo().bundleName;
1783         extensionInfo.clientPackage.emplace_back(package);
1784     }
1785     info.emplace_back(extensionInfo);
1786 }
1787 
StopAllExtensions()1788 void AbilityConnectManager::StopAllExtensions()
1789 {
1790     HILOG_INFO("StopAllExtensions begin.");
1791     std::lock_guard guard(Lock_);
1792     for (auto it = serviceMap_.begin(); it != serviceMap_.end();) {
1793         auto targetExtension = it->second;
1794         if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION) {
1795             terminatingExtensionMap_.emplace(it->first, it->second);
1796             serviceMap_.erase(it++);
1797             TerminateAbilityLocked(targetExtension->GetToken());
1798         } else {
1799             it++;
1800         }
1801     }
1802 }
1803 
MoveToForeground(const std::shared_ptr<AbilityRecord> & abilityRecord)1804 void AbilityConnectManager::MoveToForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1805 {
1806     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1807     if (abilityRecord == nullptr) {
1808         HILOG_ERROR("ability record is null.");
1809         return;
1810     }
1811 
1812     auto self(weak_from_this());
1813     auto task = [abilityRecord, self]() {
1814         auto selfObj = self.lock();
1815         if (selfObj == nullptr) {
1816             HILOG_WARN("mgr is invalid.");
1817             return;
1818         }
1819         HILOG_ERROR("move to foreground timeout.");
1820         selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::FOREGROUND_TIMEOUT_MSG);
1821     };
1822     abilityRecord->ForegroundAbility(task);
1823 }
1824 
MoveToBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1825 void AbilityConnectManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1826 {
1827     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1828     if (abilityRecord == nullptr) {
1829         HILOG_ERROR("Move the ui extension ability to background fail, ability record is null.");
1830         return;
1831     }
1832     HILOG_DEBUG("Move the ui extension ability to background, ability:%{public}s.",
1833         abilityRecord->GetAbilityInfo().name.c_str());
1834     abilityRecord->SetIsNewWant(false);
1835 
1836     auto self(weak_from_this());
1837     auto task = [abilityRecord, self]() {
1838         auto selfObj = self.lock();
1839         if (selfObj == nullptr) {
1840             HILOG_WARN("mgr is invalid.");
1841             return;
1842         }
1843         HILOG_ERROR("move to background timeout.");
1844         selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
1845         selfObj->CompleteBackground(abilityRecord);
1846     };
1847     abilityRecord->BackgroundAbility(task);
1848 }
1849 
CompleteForeground(const std::shared_ptr<AbilityRecord> & abilityRecord)1850 void AbilityConnectManager::CompleteForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1851 {
1852     std::lock_guard guard(Lock_);
1853     if (abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
1854         HILOG_ERROR("Ability state is %{public}d, it can't complete foreground.", abilityRecord->GetAbilityState());
1855         return;
1856     }
1857 
1858     abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
1859 }
1860 
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1861 void AbilityConnectManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1862 {
1863     std::lock_guard guard(Lock_);
1864     if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1865         HILOG_ERROR("Ability state is %{public}d, it can't complete background.", abilityRecord->GetAbilityState());
1866         return;
1867     }
1868 
1869     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1870     // send application state to AppMS.
1871     // notify AppMS to update application state.
1872     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1873 }
1874 
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> & ability,uint32_t msgId)1875 void AbilityConnectManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId)
1876 {
1877     if (ability == nullptr) {
1878         HILOG_ERROR("ability is nullptr");
1879         return;
1880     }
1881 
1882     AppExecFwk::RunningProcessInfo processInfo = {};
1883     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1884     if (processInfo.pid_ == 0) {
1885         HILOG_ERROR("error: the ability[%{public}s], app may fork fail or not running.",
1886             ability->GetAbilityInfo().name.data());
1887         return;
1888     }
1889     int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
1890     std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1891     switch (msgId) {
1892         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1893             msgContent += "load timeout";
1894             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1895             break;
1896         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1897             msgContent += "active timeout";
1898             break;
1899         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1900             msgContent += "inactive timeout";
1901             break;
1902         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1903             msgContent += "foreground timeout";
1904             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1905             break;
1906         case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1907             msgContent += "background timeout";
1908             break;
1909         case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1910             msgContent += "terminate timeout";
1911             break;
1912         default:
1913             return;
1914     }
1915     std::string eventName = AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
1916 
1917     HILOG_WARN("LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
1918         "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1919         ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1920     AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(
1921         typeId, processInfo.pid_, eventName, ability->GetAbilityInfo().bundleName, msgContent);
1922 }
1923 
MoveToTerminatingMap(const std::shared_ptr<AbilityRecord> & abilityRecord)1924 void AbilityConnectManager::MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)
1925 {
1926     CHECK_POINTER(abilityRecord);
1927     auto& abilityInfo = abilityRecord->GetAbilityInfo();
1928     AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1929         abilityInfo.moduleName);
1930     terminatingExtensionMap_.emplace(element.GetURI(), abilityRecord);
1931     serviceMap_.erase(element.GetURI());
1932 }
1933 
AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> & session)1934 void AbilityConnectManager::AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
1935 {
1936     CHECK_POINTER(session);
1937     auto it = uiExtRecipientMap_.find(session);
1938     if (it != uiExtRecipientMap_.end()) {
1939         HILOG_ERROR("This death recipient has been added.");
1940         return;
1941     } else {
1942         std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1943         sptr<IRemoteObject::DeathRecipient> deathRecipient =
1944             new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1945                 auto abilityConnectManager = thisWeakPtr.lock();
1946                 if (abilityConnectManager) {
1947                     abilityConnectManager->OnUIExtWindowDied(remote);
1948                 }
1949             });
1950         if (!session->AddDeathRecipient(deathRecipient)) {
1951             HILOG_ERROR("AddDeathRecipient failed.");
1952         }
1953         uiExtRecipientMap_.emplace(session, deathRecipient);
1954     }
1955 }
1956 
RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> & session)1957 void AbilityConnectManager::RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
1958 {
1959     CHECK_POINTER(session);
1960     auto it = uiExtRecipientMap_.find(session);
1961     if (it != uiExtRecipientMap_.end()) {
1962         it->first->RemoveDeathRecipient(it->second);
1963         uiExtRecipientMap_.erase(it);
1964         return;
1965     }
1966 }
1967 
OnUIExtWindowDied(const wptr<IRemoteObject> & remote)1968 void AbilityConnectManager::OnUIExtWindowDied(const wptr<IRemoteObject> &remote)
1969 {
1970     auto object = remote.promote();
1971     CHECK_POINTER(object);
1972     if (taskHandler_) {
1973         auto task = [object, connectManager = shared_from_this()]() {
1974             connectManager->HandleUIExtWindowDiedTask(object);
1975         };
1976         taskHandler_->SubmitTask(task);
1977     }
1978 }
1979 
HandleUIExtWindowDiedTask(const sptr<IRemoteObject> & remote)1980 void AbilityConnectManager::HandleUIExtWindowDiedTask(const sptr<IRemoteObject> &remote)
1981 {
1982     HILOG_DEBUG("call.");
1983     std::lock_guard guard(Lock_);
1984     CHECK_POINTER(remote);
1985     auto it = uiExtensionMap_.find(remote);
1986     if (it != uiExtensionMap_.end()) {
1987         auto abilityRecord = it->second.first.lock();
1988         if (abilityRecord) {
1989             CommandAbilityWindow(abilityRecord, it->second.second, WIN_CMD_DESTROY);
1990         } else {
1991             HILOG_INFO("abilityRecord is nullptr");
1992         }
1993         RemoveUIExtWindowDeathRecipient(remote);
1994         uiExtensionMap_.erase(it);
1995     } else {
1996         HILOG_INFO("Died object can't find from map.");
1997         return;
1998     }
1999 }
2000 
IsUIExtensionFocused(uint32_t uiExtensionTokenId,const sptr<IRemoteObject> & focusToken)2001 bool AbilityConnectManager::IsUIExtensionFocused(uint32_t uiExtensionTokenId, const sptr<IRemoteObject>& focusToken)
2002 {
2003     std::lock_guard guard(Lock_);
2004     for (auto& item: uiExtensionMap_) {
2005         auto uiExtension = item.second.first.lock();
2006         auto sessionInfo = item.second.second;
2007         if (uiExtension && uiExtension->GetApplicationInfo().accessTokenId == uiExtensionTokenId
2008             && sessionInfo && sessionInfo->callerToken == focusToken) {
2009             return true;
2010         }
2011     }
2012     return false;
2013 }
2014 
IsWindowExtensionFocused(uint32_t extensionTokenId,const sptr<IRemoteObject> & focusToken)2015 bool AbilityConnectManager::IsWindowExtensionFocused(uint32_t extensionTokenId, const sptr<IRemoteObject>& focusToken)
2016 {
2017     std::lock_guard guard(Lock_);
2018     for (auto& item: windowExtensionMap_) {
2019         uint32_t windowExtTokenId = item.second.first;
2020         auto sessionInfo = item.second.second;
2021         if (windowExtTokenId == extensionTokenId && sessionInfo && sessionInfo->callerToken == focusToken) {
2022             return true;
2023         }
2024     }
2025     return false;
2026 }
2027 }  // namespace AAFwk
2028 }  // namespace OHOS
2029