1 /*
2  * Copyright (c) 2021-2024 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 <regex>
19 
20 #include "ability_manager_service.h"
21 #include "ability_permission_util.h"
22 #include "ability_resident_process_rdb.h"
23 #include "appfreeze_manager.h"
24 #include "app_exit_reason_data_manager.h"
25 #include "assert_fault_callback_death_mgr.h"
26 #include "global_constant.h"
27 #include "hitrace_meter.h"
28 #include "int_wrapper.h"
29 #include "multi_instance_utils.h"
30 #include "res_sched_util.h"
31 #include "session/host/include/zidl/session_interface.h"
32 #include "startup_util.h"
33 #include "ui_extension_utils.h"
34 #include "ui_service_extension_connection_constants.h"
35 #include "cache_extension_utils.h"
36 #include "datetime_ex.h"
37 #include "init_reboot.h"
38 
39 namespace OHOS {
40 namespace AAFwk {
41 namespace {
42 constexpr char EVENT_KEY_UID[] = "UID";
43 constexpr char EVENT_KEY_PID[] = "PID";
44 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
45 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
46 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
47 const std::string DEBUG_APP = "debugApp";
48 const std::string FRS_APP_INDEX = "ohos.extra.param.key.frs_index";
49 const std::string FRS_BUNDLE_NAME = "com.ohos.formrenderservice";
50 const std::string UIEXTENSION_ABILITY_ID = "ability.want.params.uiExtensionAbilityId";
51 const std::string UIEXTENSION_ROOT_HOST_PID = "ability.want.params.uiExtensionRootHostPid";
52 const std::string MAX_UINT64_VALUE = "18446744073709551615";
53 const std::string IS_PRELOAD_UIEXTENSION_ABILITY = "ability.want.params.is_preload_uiextension_ability";
54 const std::string SEPARATOR = ":";
55 #ifdef SUPPORT_ASAN
56 const int LOAD_TIMEOUT_MULTIPLE = 150;
57 const int CONNECT_TIMEOUT_MULTIPLE = 45;
58 const int COMMAND_TIMEOUT_MULTIPLE = 75;
59 const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 75;
60 #else
61 const int LOAD_TIMEOUT_MULTIPLE = 10;
62 const int CONNECT_TIMEOUT_MULTIPLE = 10;
63 const int COMMAND_TIMEOUT_MULTIPLE = 5;
64 const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 5;
65 #endif
66 const int32_t AUTO_DISCONNECT_INFINITY = -1;
67 constexpr const char* FROZEN_WHITE_DIALOG = "com.huawei.hmos.huaweicast";
68 constexpr char BUNDLE_NAME_DIALOG[] = "com.ohos.amsdialog";
69 constexpr char ABILITY_NAME_ASSERT_FAULT_DIALOG[] = "AssertFaultDialog";
70 constexpr const char* WANT_PARAMS_APP_RESTART_FLAG = "ohos.aafwk.app.restart";
71 
72 const std::string XIAOYI_BUNDLE_NAME = "com.huawei.hmos.vassistant";
73 
IsSpecialAbility(const AppExecFwk::AbilityInfo &abilityInfo)74 bool IsSpecialAbility(const AppExecFwk::AbilityInfo &abilityInfo)
75 {
76     std::vector<std::pair<std::string, std::string>> trustAbilities{
77         { AbilityConfig::SCENEBOARD_BUNDLE_NAME, AbilityConfig::SCENEBOARD_ABILITY_NAME },
78         { AbilityConfig::SYSTEM_UI_BUNDLE_NAME, AbilityConfig::SYSTEM_UI_ABILITY_NAME },
79         { AbilityConfig::LAUNCHER_BUNDLE_NAME, AbilityConfig::LAUNCHER_ABILITY_NAME }
80     };
81     for (const auto &pair : trustAbilities) {
82         if (pair.first == abilityInfo.bundleName && pair.second == abilityInfo.name) {
83             return true;
84         }
85     }
86     return false;
87 }
88 }
89 
AbilityConnectManager(int userId)90 AbilityConnectManager::AbilityConnectManager(int userId) : userId_(userId)
91 {
92     uiExtensionAbilityRecordMgr_ = std::make_unique<AbilityRuntime::ExtensionRecordManager>(userId);
93 }
94 
~AbilityConnectManager()95 AbilityConnectManager::~AbilityConnectManager()
96 {}
97 
StartAbility(const AbilityRequest &abilityRequest)98 int AbilityConnectManager::StartAbility(const AbilityRequest &abilityRequest)
99 {
100     std::lock_guard guard(serialMutex_);
101     return StartAbilityLocked(abilityRequest);
102 }
103 
TerminateAbility(const sptr<IRemoteObject> &token)104 int AbilityConnectManager::TerminateAbility(const sptr<IRemoteObject> &token)
105 {
106     std::lock_guard guard(serialMutex_);
107     return TerminateAbilityInner(token);
108 }
109 
TerminateAbilityInner(const sptr<IRemoteObject> &token)110 int AbilityConnectManager::TerminateAbilityInner(const sptr<IRemoteObject> &token)
111 {
112     auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
113     if (abilityRecord == nullptr) {
114         abilityRecord = GetExtensionByTokenFromAbilityCache(token);
115     }
116     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
117     std::string element = abilityRecord->GetURI();
118     TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate ability, ability is %{public}s.", element.c_str());
119     if (IsUIExtensionAbility(abilityRecord)) {
120         if (!abilityRecord->IsConnectListEmpty()) {
121             TAG_LOGD(AAFwkTag::ABILITYMGR, "exist connection, don't terminate");
122             return ERR_OK;
123         } else if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND) ||
124             abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING) ||
125             abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
126             TAG_LOGD(AAFwkTag::ABILITYMGR, "current ability is active");
127             DoBackgroundAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo());
128             MoveToTerminatingMap(abilityRecord);
129             return ERR_OK;
130         }
131     }
132     MoveToTerminatingMap(abilityRecord);
133     return TerminateAbilityLocked(token);
134 }
135 
StopServiceAbility(const AbilityRequest &abilityRequest)136 int AbilityConnectManager::StopServiceAbility(const AbilityRequest &abilityRequest)
137 {
138     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
139     std::lock_guard guard(serialMutex_);
140     return StopServiceAbilityLocked(abilityRequest);
141 }
142 
StartAbilityLocked(const AbilityRequest &abilityRequest)143 int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityRequest)
144 {
145     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
146     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
147 
148     int32_t ret = AbilityPermissionUtil::GetInstance().CheckMultiInstanceKeyForExtension(abilityRequest);
149     if (ret != ERR_OK) {
150         //  Do not distinguishing specific error codes
151         return ERR_INVALID_VALUE;
152     }
153 
154     std::shared_ptr<AbilityRecord> targetService;
155     bool isLoadedAbility = false;
156     if (UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType)) {
157         auto callerAbilityRecord = AAFwk::Token::GetAbilityRecordByToken(abilityRequest.callerToken);
158         if (callerAbilityRecord == nullptr) {
159             TAG_LOGE(AAFwkTag::ABILITYMGR, "null callerAbilityRecord");
160             return ERR_NULL_OBJECT;
161         }
162         std::string hostBundleName = callerAbilityRecord->GetAbilityInfo().bundleName;
163         ret = GetOrCreateExtensionRecord(abilityRequest, false, hostBundleName, targetService, isLoadedAbility);
164         if (ret != ERR_OK) {
165             TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, ret: %{public}d", ret);
166             return ret;
167         }
168     } else {
169         GetOrCreateServiceRecord(abilityRequest, false, targetService, isLoadedAbility);
170     }
171     CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
172     TAG_LOGI(AAFwkTag::ABILITYMGR, "StartAbility:%{public}s", targetService->GetURI().c_str());
173 
174     targetService->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
175 
176     targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_EXTENSION);
177 
178     targetService->DoBackgroundAbilityWindowDelayed(false);
179 
180     targetService->SetSessionInfo(abilityRequest.sessionInfo);
181 
182     if (IsUIExtensionAbility(targetService) && abilityRequest.sessionInfo && abilityRequest.sessionInfo->sessionToken) {
183         auto &remoteObj = abilityRequest.sessionInfo->sessionToken;
184         {
185             std::lock_guard guard(uiExtensionMapMutex_);
186             uiExtensionMap_[remoteObj] = UIExtWindowMapValType(targetService, abilityRequest.sessionInfo);
187         }
188         AddUIExtWindowDeathRecipient(remoteObj);
189     }
190 
191     ret = ReportXiaoYiToRSSIfNeeded(abilityRequest.abilityInfo);
192     if (ret != ERR_OK) {
193         return ret;
194     }
195 
196     if (!isLoadedAbility) {
197         TAG_LOGD(AAFwkTag::ABILITYMGR, "Target service has not been loaded.");
198         SetLastExitReason(abilityRequest, targetService);
199         if (IsUIExtensionAbility(targetService)) {
200             targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
201         }
202         targetService->GrantUriPermissionForServiceExtension();
203         LoadAbility(targetService);
204     } else if (targetService->IsAbilityState(AbilityState::ACTIVE) && !IsUIExtensionAbility(targetService)) {
205         // It may have been started through connect
206         targetService->SetWant(abilityRequest.want);
207         targetService->GrantUriPermissionForServiceExtension();
208         CommandAbility(targetService);
209     } else if (IsUIExtensionAbility(targetService)) {
210         DoForegroundUIExtension(targetService, abilityRequest);
211     } else {
212         TAG_LOGI(AAFwkTag::ABILITYMGR, "targetService activating");
213         EnqueueStartServiceReq(abilityRequest);
214         return ERR_OK;
215     }
216     return ERR_OK;
217 }
218 
SetLastExitReason( const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &targetRecord)219 void AbilityConnectManager::SetLastExitReason(
220     const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &targetRecord)
221 {
222     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
223     if (targetRecord == nullptr || !UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType)) {
224         TAG_LOGD(AAFwkTag::ABILITYMGR, "Failed to set UIExtensionAbility last exit reason.");
225         return;
226     }
227     auto appExitReasonDataMgr = DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance();
228     if (appExitReasonDataMgr == nullptr) {
229         TAG_LOGE(AAFwkTag::ABILITYMGR, "null appExitReasonDataMgr");
230         return;
231     }
232 
233     ExitReason exitReason = { REASON_UNKNOWN, "" };
234     const std::string keyEx = targetRecord->GetAbilityInfo().bundleName + SEPARATOR +
235                               targetRecord->GetAbilityInfo().moduleName + SEPARATOR +
236                               targetRecord->GetAbilityInfo().name;
237     if (!appExitReasonDataMgr->GetUIExtensionAbilityExitReason(keyEx, exitReason)) {
238         TAG_LOGD(AAFwkTag::ABILITYMGR, "There is no record of UIExtensionAbility's last exit reason in the database.");
239         return;
240     }
241     targetRecord->SetLastExitReason(exitReason);
242 }
243 
DoForegroundUIExtension(std::shared_ptr<AbilityRecord> abilityRecord, const AbilityRequest &abilityRequest)244 void AbilityConnectManager::DoForegroundUIExtension(std::shared_ptr<AbilityRecord> abilityRecord,
245     const AbilityRequest &abilityRequest)
246 {
247     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
248     CHECK_POINTER(abilityRecord);
249     CHECK_POINTER(abilityRequest.sessionInfo);
250     auto abilitystateStr = abilityRecord->ConvertAbilityState(abilityRecord->GetAbilityState());
251     TAG_LOGI(AAFwkTag::ABILITYMGR,
252         "foreground ability: %{public}s, persistentId: %{public}d, abilityState: %{public}s",
253         abilityRecord->GetURI().c_str(), abilityRequest.sessionInfo->persistentId, abilitystateStr.c_str());
254     if (abilityRecord->IsReady() && !abilityRecord->IsAbilityState(AbilityState::INACTIVATING) &&
255         !abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING) &&
256         !abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING) &&
257         abilityRecord->IsAbilityWindowReady()) {
258         if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
259             abilityRecord->SetWant(abilityRequest.want);
260             CommandAbilityWindow(abilityRecord, abilityRequest.sessionInfo, WIN_CMD_FOREGROUND);
261             return;
262         } else {
263             abilityRecord->SetWant(abilityRequest.want);
264             abilityRecord->PostUIExtensionAbilityTimeoutTask(AbilityManagerService::FOREGROUND_TIMEOUT_MSG);
265             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
266             return;
267         }
268     }
269     EnqueueStartServiceReq(abilityRequest, abilityRecord->GetURI());
270 }
271 
EnqueueStartServiceReq(const AbilityRequest &abilityRequest, const std::string &serviceUri)272 void AbilityConnectManager::EnqueueStartServiceReq(const AbilityRequest &abilityRequest, const std::string &serviceUri)
273 {
274     std::lock_guard guard(startServiceReqListLock_);
275     auto abilityUri = abilityRequest.want.GetElement().GetURI();
276     if (!serviceUri.empty()) {
277         abilityUri = serviceUri;
278     }
279     TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityUri: %{public}s", abilityUri.c_str());
280     auto reqListIt = startServiceReqList_.find(abilityUri);
281     if (reqListIt != startServiceReqList_.end()) {
282         reqListIt->second->push_back(abilityRequest);
283     } else {
284         auto reqList = std::make_shared<std::list<AbilityRequest>>();
285         reqList->push_back(abilityRequest);
286         startServiceReqList_.emplace(abilityUri, reqList);
287 
288         CHECK_POINTER(taskHandler_);
289         auto callback = [abilityUri, connectManager = shared_from_this()]() {
290             std::lock_guard guard{connectManager->startServiceReqListLock_};
291             auto exist = connectManager->startServiceReqList_.erase(abilityUri);
292             if (exist) {
293                 TAG_LOGE(AAFwkTag::ABILITYMGR, "Target service %{public}s start timeout", abilityUri.c_str());
294             }
295         };
296 
297         int connectTimeout =
298             AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
299         taskHandler_->SubmitTask(callback, std::string("start_service_timeout:") + abilityUri,
300             connectTimeout);
301     }
302 }
303 
TerminateAbilityLocked(const sptr<IRemoteObject> &token)304 int AbilityConnectManager::TerminateAbilityLocked(const sptr<IRemoteObject> &token)
305 {
306     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
307     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
308     auto abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
309     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
310 
311     if (abilityRecord->IsTerminating()) {
312         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is on terminating.");
313         return ERR_OK;
314     }
315 
316     if (!abilityRecord->GetConnectRecordList().empty()) {
317         TAG_LOGI(AAFwkTag::ABILITYMGR, "target service connected");
318         auto connectRecordList = abilityRecord->GetConnectRecordList();
319         HandleTerminateDisconnectTask(connectRecordList);
320     }
321 
322     auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
323         TAG_LOGW(AAFwkTag::ABILITYMGR, "disconnect timeout");
324         connectManager->HandleStopTimeoutTask(abilityRecord);
325     };
326     abilityRecord->Terminate(timeoutTask);
327     if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
328         AddUIExtensionAbilityRecordToTerminatedList(abilityRecord);
329     } else {
330         RemoveUIExtensionAbilityRecord(abilityRecord);
331     }
332 
333     return ERR_OK;
334 }
335 
StopServiceAbilityLocked(const AbilityRequest &abilityRequest)336 int AbilityConnectManager::StopServiceAbilityLocked(const AbilityRequest &abilityRequest)
337 {
338     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
339     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
340     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, GenerateBundleName(abilityRequest),
341         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
342     std::string serviceKey = element.GetURI();
343     if (FRS_BUNDLE_NAME == abilityRequest.abilityInfo.bundleName) {
344         serviceKey = serviceKey + std::to_string(abilityRequest.want.GetIntParam(FRS_APP_INDEX, 0));
345     }
346     auto abilityRecord = GetServiceRecordByElementName(serviceKey);
347     if (abilityRecord == nullptr) {
348         abilityRecord = AbilityCacheManager::GetInstance().Get(abilityRequest);
349         AddToServiceMap(serviceKey, abilityRecord);
350     }
351     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
352 
353     if (abilityRecord->IsTerminating()) {
354         TAG_LOGI(AAFwkTag::ABILITYMGR, "ability terminating");
355         return ERR_OK;
356     }
357 
358     if (!abilityRecord->GetConnectRecordList().empty()) {
359         TAG_LOGI(AAFwkTag::ABILITYMGR, "post disconnect task");
360         auto connectRecordList = abilityRecord->GetConnectRecordList();
361         HandleTerminateDisconnectTask(connectRecordList);
362     }
363 
364     TerminateRecord(abilityRecord);
365     EventInfo eventInfo = BuildEventInfo(abilityRecord);
366     EventReport::SendStopServiceEvent(EventName::STOP_SERVICE, eventInfo);
367     return ERR_OK;
368 }
369 
GetOrCreateExtensionRecord(const AbilityRequest &abilityRequest, bool isCreatedByConnect, const std::string &hostBundleName, std::shared_ptr<AbilityRecord> &extensionRecord, bool &isLoaded)370 int32_t AbilityConnectManager::GetOrCreateExtensionRecord(const AbilityRequest &abilityRequest, bool isCreatedByConnect,
371     const std::string &hostBundleName, std::shared_ptr<AbilityRecord> &extensionRecord, bool &isLoaded)
372 {
373     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
374     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
375         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
376     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
377     if (uiExtensionAbilityRecordMgr_->IsBelongToManager(abilityRequest.abilityInfo)) {
378         int32_t ret = uiExtensionAbilityRecordMgr_->GetOrCreateExtensionRecord(
379             abilityRequest, hostBundleName, extensionRecord, isLoaded);
380         if (ret != ERR_OK) {
381             return ret;
382         }
383         extensionRecord->SetCreateByConnectMode(isCreatedByConnect);
384         std::string extensionRecordKey = element.GetURI() + std::to_string(extensionRecord->GetUIExtensionAbilityId());
385         extensionRecord->SetURI(extensionRecordKey);
386         TAG_LOGD(AAFwkTag::ABILITYMGR, "Service map add, hostBundleName:%{public}s, key: %{public}s",
387             hostBundleName.c_str(), extensionRecordKey.c_str());
388         AddToServiceMap(extensionRecordKey, extensionRecord);
389         if (IsAbilityNeedKeepAlive(extensionRecord)) {
390             extensionRecord->SetRestartTime(abilityRequest.restartTime);
391             extensionRecord->SetRestartCount(abilityRequest.restartCount);
392         }
393         return ERR_OK;
394     }
395     return ERR_INVALID_VALUE;
396 }
397 
GetOrCreateServiceRecord(const AbilityRequest &abilityRequest, const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)398 void AbilityConnectManager::GetOrCreateServiceRecord(const AbilityRequest &abilityRequest,
399     const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
400 {
401     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
402     // lifecycle is not complete when window extension is reused
403     bool noReuse = UIExtensionUtils::IsWindowExtension(abilityRequest.abilityInfo.extensionAbilityType);
404     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, GenerateBundleName(abilityRequest),
405         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
406     std::string serviceKey = element.GetURI();
407     if (FRS_BUNDLE_NAME == abilityRequest.abilityInfo.bundleName) {
408         serviceKey = element.GetURI() + std::to_string(abilityRequest.want.GetIntParam(FRS_APP_INDEX, 0));
409     }
410     {
411         std::lock_guard lock(serviceMapMutex_);
412         auto serviceMapIter = serviceMap_.find(serviceKey);
413         targetService = serviceMapIter == serviceMap_.end() ? nullptr : serviceMapIter->second;
414     }
415     if (targetService == nullptr &&
416         CacheExtensionUtils::IsCacheExtensionType(abilityRequest.abilityInfo.extensionAbilityType)) {
417         targetService = AbilityCacheManager::GetInstance().Get(abilityRequest);
418         if (targetService != nullptr) {
419             AddToServiceMap(serviceKey, targetService);
420         }
421     }
422     if (noReuse && targetService) {
423         if (IsSpecialAbility(abilityRequest.abilityInfo)) {
424             TAG_LOGI(AAFwkTag::ABILITYMGR, "removing ability: %{public}s", element.GetURI().c_str());
425         }
426         std::lock_guard lock(serviceMapMutex_);
427         serviceMap_.erase(serviceKey);
428     }
429     isLoadedAbility = true;
430     if (noReuse || targetService == nullptr) {
431         targetService = AbilityRecord::CreateAbilityRecord(abilityRequest);
432         CHECK_POINTER(targetService);
433         targetService->SetOwnerMissionUserId(userId_);
434         if (isCreatedByConnect) {
435             targetService->SetCreateByConnectMode();
436         }
437         if (abilityRequest.abilityInfo.name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
438             targetService->SetLauncherRoot();
439             targetService->SetRestartTime(abilityRequest.restartTime);
440             targetService->SetRestartCount(abilityRequest.restartCount);
441         } else if (IsAbilityNeedKeepAlive(targetService)) {
442             targetService->SetRestartTime(abilityRequest.restartTime);
443             targetService->SetRestartCount(abilityRequest.restartCount);
444         }
445         if (MultiInstanceUtils::IsMultiInstanceApp(abilityRequest.appInfo)) {
446             targetService->SetInstanceKey(MultiInstanceUtils::GetValidExtensionInstanceKey(abilityRequest));
447         }
448         AddToServiceMap(serviceKey, targetService);
449         isLoadedAbility = false;
450     }
451 }
452 
GetConnectRecordListFromMap( const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)453 void AbilityConnectManager::GetConnectRecordListFromMap(
454     const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
455 {
456     std::lock_guard lock(connectMapMutex_);
457     auto connectMapIter = connectMap_.find(connect->AsObject());
458     if (connectMapIter != connectMap_.end()) {
459         connectRecordList = connectMapIter->second;
460     }
461 }
462 
GetOrCreateTargetServiceRecord( const AbilityRequest &abilityRequest, const sptr<UIExtensionAbilityConnectInfo> &connectInfo, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)463 int32_t AbilityConnectManager::GetOrCreateTargetServiceRecord(
464     const AbilityRequest &abilityRequest, const sptr<UIExtensionAbilityConnectInfo> &connectInfo,
465     std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
466 {
467     if (UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType) && connectInfo != nullptr) {
468         int32_t ret = GetOrCreateExtensionRecord(
469             abilityRequest, true, connectInfo->hostBundleName, targetService, isLoadedAbility);
470         if (ret != ERR_OK || targetService == nullptr) {
471             TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOrCreateExtensionRecord fail");
472             return ERR_NULL_OBJECT;
473         }
474         connectInfo->uiExtensionAbilityId = targetService->GetUIExtensionAbilityId();
475         TAG_LOGD(AAFwkTag::ABILITYMGR, "UIExtensionAbility id %{public}d.", connectInfo->uiExtensionAbilityId);
476     } else {
477         GetOrCreateServiceRecord(abilityRequest, true, targetService, isLoadedAbility);
478     }
479     CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
480     return ERR_OK;
481 }
482 
PreloadUIExtensionAbilityLocked(const AbilityRequest &abilityRequest, std::string &hostBundleName)483 int AbilityConnectManager::PreloadUIExtensionAbilityLocked(const AbilityRequest &abilityRequest,
484     std::string &hostBundleName)
485 {
486     std::lock_guard guard(serialMutex_);
487     return PreloadUIExtensionAbilityInner(abilityRequest, hostBundleName);
488 }
489 
PreloadUIExtensionAbilityInner(const AbilityRequest &abilityRequest, std::string &hostBundleName)490 int AbilityConnectManager::PreloadUIExtensionAbilityInner(const AbilityRequest &abilityRequest,
491     std::string &hostBundleName)
492 {
493     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
494     if (!UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType)) {
495         TAG_LOGE(AAFwkTag::ABILITYMGR, "can't preload non-uiextension type");
496         return ERR_WRONG_INTERFACE_CALL;
497     }
498     int32_t ret = AbilityPermissionUtil::GetInstance().CheckMultiInstanceKeyForExtension(abilityRequest);
499     if (ret != ERR_OK) {
500         //  Do not distinguishing specific error codes
501         return ERR_INVALID_VALUE;
502     }
503     std::shared_ptr<ExtensionRecord> extensionRecord = nullptr;
504     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
505     int32_t extensionRecordId = INVALID_EXTENSION_RECORD_ID;
506     ret = uiExtensionAbilityRecordMgr_->CreateExtensionRecord(abilityRequest, hostBundleName,
507         extensionRecord, extensionRecordId);
508     if (ret != ERR_OK) {
509         TAG_LOGE(AAFwkTag::ABILITYMGR, "CreateExtensionRecord ERR");
510         return ret;
511     }
512     CHECK_POINTER_AND_RETURN(extensionRecord, ERR_NULL_OBJECT);
513     std::shared_ptr<AbilityRecord> targetService = extensionRecord->abilityRecord_;
514     AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
515         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
516     std::string extensionRecordKey = element.GetURI() + std::to_string(targetService->GetUIExtensionAbilityId());
517     targetService->SetURI(extensionRecordKey);
518     AddToServiceMap(extensionRecordKey, targetService);
519     LoadAbility(targetService);
520     return ERR_OK;
521 }
522 
UnloadUIExtensionAbility(const std::shared_ptr<AAFwk::AbilityRecord> &abilityRecord, std::string &hostBundleName)523 int AbilityConnectManager::UnloadUIExtensionAbility(const std::shared_ptr<AAFwk::AbilityRecord> &abilityRecord,
524     std::string &hostBundleName)
525 {
526     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
527     //Get preLoadUIExtensionInfo
528     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
529     auto preLoadUIExtensionInfo = std::make_tuple(abilityRecord->GetWant().GetElement().GetAbilityName(),
530         abilityRecord->GetWant().GetElement().GetBundleName(),
531         abilityRecord->GetWant().GetElement().GetModuleName(), hostBundleName);
532     //delete preLoadUIExtensionMap
533     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
534     auto extensionRecordId = abilityRecord->GetUIExtensionAbilityId();
535     uiExtensionAbilityRecordMgr_->RemovePreloadUIExtensionRecordById(preLoadUIExtensionInfo, extensionRecordId);
536     //terminate preload uiextension
537     auto token = abilityRecord->GetToken();
538     auto result = TerminateAbilityInner(token);
539     if (result != ERR_OK) {
540         TAG_LOGE(AAFwkTag::ABILITYMGR, "terminate error");
541         return result;
542     }
543     return ERR_OK;
544 }
545 
ReportEventToRSS(const AppExecFwk::AbilityInfo &abilityInfo, const std::shared_ptr<AbilityRecord> abilityRecord, sptr<IRemoteObject> callerToken)546 void AbilityConnectManager::ReportEventToRSS(const AppExecFwk::AbilityInfo &abilityInfo,
547     const std::shared_ptr<AbilityRecord> abilityRecord, sptr<IRemoteObject> callerToken)
548 {
549     if (taskHandler_ == nullptr) {
550         TAG_LOGD(AAFwkTag::ABILITYMGR, "taskHandler_ null");
551         return;
552     }
553 
554     std::string reason = ResSchedUtil::GetInstance().GetThawReasonByAbilityType(abilityInfo);
555     const int32_t uid = abilityInfo.applicationInfo.uid;
556     const std::string bundleName = abilityInfo.applicationInfo.bundleName;
557     const int32_t pid = (abilityRecord->GetPid() > 0) ? abilityRecord->GetPid() : -1;
558     auto callerAbility = Token::GetAbilityRecordByToken(callerToken);
559     const int32_t callerPid = (callerAbility != nullptr) ? callerAbility->GetPid() : IPCSkeleton::GetCallingPid();
560     TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}d_%{public}s_%{public}d reason=%{public}s callerPid=%{public}d", uid,
561         bundleName.c_str(), pid, reason.c_str(), callerPid);
562     taskHandler_->SubmitTask([uid, bundleName, reason, pid, callerPid]() {
563         ResSchedUtil::GetInstance().ReportEventToRSS(uid, bundleName, reason, pid, callerPid);
564     });
565 }
566 
ConnectAbilityLocked(const AbilityRequest &abilityRequest, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, sptr<SessionInfo> sessionInfo, sptr<UIExtensionAbilityConnectInfo> connectInfo)567 int AbilityConnectManager::ConnectAbilityLocked(const AbilityRequest &abilityRequest,
568     const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, sptr<SessionInfo> sessionInfo,
569     sptr<UIExtensionAbilityConnectInfo> connectInfo)
570 {
571     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
572     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
573     auto connectObject = connect->AsObject();
574     std::lock_guard guard(serialMutex_);
575 
576     // 1. get target service ability record, and check whether it has been loaded.
577     int32_t ret = AbilityPermissionUtil::GetInstance().CheckMultiInstanceKeyForExtension(abilityRequest);
578     if (ret != ERR_OK) {
579         //  Do not distinguishing specific error codes
580         return ERR_INVALID_VALUE;
581     }
582     std::shared_ptr<AbilityRecord> targetService;
583     bool isLoadedAbility = false;
584     ret = GetOrCreateTargetServiceRecord(abilityRequest, connectInfo, targetService, isLoadedAbility);
585     if (ret != ERR_OK) {
586         return ret;
587     }
588     if (abilityRequest.abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::REMOTE_NOTIFICATION) {
589         ReportEventToRSS(abilityRequest.abilityInfo, targetService, callerToken);
590     }
591     // 2. get target connectRecordList, and check whether this callback has been connected.
592     ConnectListType connectRecordList;
593     GetConnectRecordListFromMap(connect, connectRecordList);
594     bool isCallbackConnected = !connectRecordList.empty();
595     // 3. If this service ability and callback has been connected, There is no need to connect repeatedly
596     if (isLoadedAbility && (isCallbackConnected) && IsAbilityConnected(targetService, connectRecordList)) {
597         TAG_LOGI(AAFwkTag::ABILITYMGR, "Service/callback connected");
598         return ERR_OK;
599     }
600 
601     // 4. Other cases , need to connect the service ability
602     auto connectRecord = ConnectionRecord::CreateConnectionRecord(callerToken, targetService, connect);
603     CHECK_POINTER_AND_RETURN(connectRecord, ERR_INVALID_VALUE);
604     connectRecord->AttachCallerInfo();
605     connectRecord->SetConnectState(ConnectionState::CONNECTING);
606     if (targetService->GetAbilityInfo().extensionAbilityType == AppExecFwk::ExtensionAbilityType::UI_SERVICE) {
607         connectRecord->SetConnectWant(abilityRequest.want);
608     }
609     targetService->AddConnectRecordToList(connectRecord);
610     targetService->SetSessionInfo(sessionInfo);
611     connectRecordList.push_back(connectRecord);
612     AddConnectObjectToMap(connectObject, connectRecordList, isCallbackConnected);
613     targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_CONNECT_EXTENSION);
614 
615     if (UIExtensionUtils::IsWindowExtension(targetService->GetAbilityInfo().extensionAbilityType)
616         && abilityRequest.sessionInfo) {
617         std::lock_guard guard(windowExtensionMapMutex_);
618         windowExtensionMap_.emplace(connectObject,
619             WindowExtMapValType(targetService->GetApplicationInfo().accessTokenId, abilityRequest.sessionInfo));
620     }
621 
622     auto &abilityInfo = abilityRequest.abilityInfo;
623     ret = ReportXiaoYiToRSSIfNeeded(abilityInfo);
624     if (ret != ERR_OK) {
625         return ret;
626     }
627 
628     if (!isLoadedAbility) {
629         LoadAbility(targetService);
630     } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
631         targetService->SetWant(abilityRequest.want);
632         HandleActiveAbility(targetService, connectRecord);
633     } else {
634         TAG_LOGI(AAFwkTag::ABILITYMGR, "TargetService activing");
635         targetService->SaveConnectWant(abilityRequest.want);
636     }
637     return ret;
638 }
639 
HandleActiveAbility(std::shared_ptr<AbilityRecord> &targetService, std::shared_ptr<ConnectionRecord> &connectRecord)640 void AbilityConnectManager::HandleActiveAbility(std::shared_ptr<AbilityRecord> &targetService,
641     std::shared_ptr<ConnectionRecord> &connectRecord)
642 {
643     TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called.", __func__);
644     if (targetService == nullptr) {
645         TAG_LOGW(AAFwkTag::ABILITYMGR, "null targetService");
646         return;
647     }
648     AppExecFwk::ExtensionAbilityType extType = targetService->GetAbilityInfo().extensionAbilityType;
649     bool isAbilityUIServiceExt = (extType == AppExecFwk::ExtensionAbilityType::UI_SERVICE);
650     if (isAbilityUIServiceExt) {
651         if (connectRecord != nullptr) {
652             Want want = connectRecord->GetConnectWant();
653             int connectRecordId = connectRecord->GetRecordId();
654             ConnectUIServiceExtAbility(targetService, connectRecordId, want);
655         }
656         targetService->RemoveSignatureInfo();
657         return;
658     }
659 
660     if (targetService->GetConnectRecordList().size() > 1) {
661         targetService->RemoveSignatureInfo();
662         if (taskHandler_ != nullptr && targetService->GetConnRemoteObject()) {
663             auto task = [connectRecord]() { connectRecord->CompleteConnect(ERR_OK); };
664             taskHandler_->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
665         } else {
666             TAG_LOGI(AAFwkTag::ABILITYMGR, "connecting");
667         }
668     } else {
669         ConnectAbility(targetService);
670     }
671 }
672 
DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)673 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)
674 {
675     std::lock_guard guard(serialMutex_);
676     return DisconnectAbilityLocked(connect, false);
677 }
678 
DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect, bool callerDied)679 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect, bool callerDied)
680 {
681     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
682     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
683 
684     // 1. check whether callback was connected.
685     ConnectListType connectRecordList;
686     GetConnectRecordListFromMap(connect, connectRecordList);
687     if (connectRecordList.empty()) {
688         TAG_LOGE(AAFwkTag::ABILITYMGR, "recordList empty");
689         return CONNECTION_NOT_EXIST;
690     }
691 
692     // 2. schedule disconnect to target service
693     int result = ERR_OK;
694     ConnectListType list;
695     for (auto &connectRecord : connectRecordList) {
696         if (connectRecord) {
697             auto abilityRecord = connectRecord->GetAbilityRecord();
698             CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
699             TAG_LOGD(AAFwkTag::ABILITYMGR, "abilityName: %{public}s, bundleName: %{public}s",
700                 abilityRecord->GetAbilityInfo().name.c_str(), abilityRecord->GetAbilityInfo().bundleName.c_str());
701             if (abilityRecord->GetAbilityInfo().type == AbilityType::EXTENSION) {
702                 RemoveExtensionDelayDisconnectTask(connectRecord);
703             }
704             if (connectRecord->GetCallerTokenId() != IPCSkeleton::GetCallingTokenID() &&
705                 static_cast<uint32_t>(IPCSkeleton::GetSelfTokenID() != IPCSkeleton::GetCallingTokenID())) {
706                 TAG_LOGW(AAFwkTag::ABILITYMGR, "inconsistent caller");
707                 continue;
708             }
709 
710             result = DisconnectRecordNormal(list, connectRecord, callerDied);
711             if (result != ERR_OK && callerDied) {
712                 DisconnectRecordForce(list, connectRecord);
713                 result = ERR_OK;
714             }
715 
716             if (result != ERR_OK) {
717                 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail , ret = %{public}d", result);
718                 break;
719             } else {
720                 EventInfo eventInfo = BuildEventInfo(abilityRecord);
721                 EventReport::SendDisconnectServiceEvent(EventName::DISCONNECT_SERVICE, eventInfo);
722             }
723         }
724     }
725     for (auto&& connectRecord : list) {
726         RemoveConnectionRecordFromMap(connectRecord);
727     }
728 
729     return result;
730 }
731 
TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)732 void AbilityConnectManager::TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)
733 {
734     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
735     if (!GetExtensionByIdFromServiceMap(abilityRecord->GetRecordId()) &&
736         !AbilityCacheManager::GetInstance().FindRecordByToken(abilityRecord->GetToken())) {
737         return;
738     }
739     auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
740         TAG_LOGW(AAFwkTag::ABILITYMGR, "disconnect timeout");
741         connectManager->HandleStopTimeoutTask(abilityRecord);
742     };
743 
744     MoveToTerminatingMap(abilityRecord);
745     abilityRecord->Terminate(timeoutTask);
746 }
747 
DisconnectRecordNormal(ConnectListType &list, std::shared_ptr<ConnectionRecord> connectRecord, bool callerDied) const748 int AbilityConnectManager::DisconnectRecordNormal(ConnectListType &list,
749     std::shared_ptr<ConnectionRecord> connectRecord, bool callerDied) const
750 {
751     auto result = connectRecord->DisconnectAbility();
752     if (result != ERR_OK) {
753         TAG_LOGE(AAFwkTag::ABILITYMGR, "fail:%{public}d", result);
754         return result;
755     }
756 
757     if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
758         TAG_LOGW(AAFwkTag::ABILITYMGR, "DisconnectRecordNormal disconnect record:%{public}d",
759             connectRecord->GetRecordId());
760         connectRecord->CompleteDisconnect(ERR_OK, callerDied);
761         list.emplace_back(connectRecord);
762     }
763     return ERR_OK;
764 }
765 
DisconnectRecordForce(ConnectListType &list, std::shared_ptr<ConnectionRecord> connectRecord)766 void AbilityConnectManager::DisconnectRecordForce(ConnectListType &list,
767     std::shared_ptr<ConnectionRecord> connectRecord)
768 {
769     auto abilityRecord = connectRecord->GetAbilityRecord();
770     if (abilityRecord == nullptr) {
771         TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
772         return;
773     }
774     abilityRecord->RemoveConnectRecordFromList(connectRecord);
775     connectRecord->CompleteDisconnect(ERR_OK, true);
776     list.emplace_back(connectRecord);
777     bool isUIService = (abilityRecord->GetAbilityInfo().extensionAbilityType ==
778         AppExecFwk::ExtensionAbilityType::UI_SERVICE);
779     if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0 && !isUIService) {
780         TAG_LOGW(AAFwkTag::ABILITYMGR, "force terminate ability record state: %{public}d",
781             abilityRecord->GetAbilityState());
782         TerminateRecord(abilityRecord);
783     }
784 }
785 
AttachAbilityThreadLocked( const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)786 int AbilityConnectManager::AttachAbilityThreadLocked(
787     const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
788 {
789     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
790     std::lock_guard guard(serialMutex_);
791     auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
792     if (abilityRecord == nullptr) {
793         abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
794         if (abilityRecord != nullptr) {
795             TAG_LOGW(AAFwkTag::ABILITYMGR, "Ability:%{public}s, user:%{public}d",
796                 abilityRecord->GetURI().c_str(), userId_);
797         }
798         auto tmpRecord = Token::GetAbilityRecordByToken(token);
799         if (tmpRecord && tmpRecord != abilityRecord) {
800             TAG_LOGW(AAFwkTag::ABILITYMGR, "Token:%{public}s, user:%{public}d",
801                 tmpRecord->GetURI().c_str(), userId_);
802         }
803         if (!IsUIExtensionAbility(abilityRecord)) {
804             abilityRecord = nullptr;
805         }
806     }
807     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
808     std::string element = abilityRecord->GetURI();
809     TAG_LOGI(AAFwkTag::ABILITYMGR, "ability:%{public}s", element.c_str());
810     if (taskHandler_ != nullptr) {
811         int recordId = abilityRecord->GetRecordId();
812         std::string taskName = std::string("LoadTimeout_") + std::to_string(recordId);
813         taskHandler_->CancelTask(taskName);
814     }
815     if (eventHandler_) {
816         abilityRecord->RemoveLoadTimeoutTask();
817     }
818     if (abilityRecord->IsSceneBoard()) {
819         TAG_LOGI(AAFwkTag::ABILITYMGR, "attach Ability: %{public}s", element.c_str());
820         sceneBoardTokenId_ = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
821     }
822     abilityRecord->SetScheduler(scheduler);
823     abilityRecord->RemoveSpecifiedWantParam(UIEXTENSION_ABILITY_ID);
824     abilityRecord->RemoveSpecifiedWantParam(UIEXTENSION_ROOT_HOST_PID);
825     if (IsUIExtensionAbility(abilityRecord) && !abilityRecord->IsCreateByConnect()
826         && !abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
827         abilityRecord->PostUIExtensionAbilityTimeoutTask(AbilityManagerService::FOREGROUND_TIMEOUT_MSG);
828         DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
829     } else {
830         TAG_LOGD(AAFwkTag::ABILITYMGR, "Inactivate");
831         abilityRecord->Inactivate();
832     }
833     return ERR_OK;
834 }
835 
OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)836 void AbilityConnectManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
837 {
838     TAG_LOGD(AAFwkTag::ABILITYMGR, "state: %{public}d", state);
839     std::lock_guard guard(serialMutex_);
840     AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
841     if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
842         auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
843         CHECK_POINTER(abilityRecord);
844         if (!IsUIExtensionAbility(abilityRecord)) {
845             TAG_LOGE(AAFwkTag::ABILITYMGR, "Not ui extension");
846             return;
847         }
848         if (abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
849             TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord foregrounding");
850             return;
851         }
852         std::string element = abilityRecord->GetURI();
853         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is %{public}s, start to foreground.", element.c_str());
854         abilityRecord->GrantUriPermissionForUIExtension();
855         abilityRecord->ForegroundUIExtensionAbility();
856     }
857 }
858 
OnAppStateChanged(const AppInfo &info)859 void AbilityConnectManager::OnAppStateChanged(const AppInfo &info)
860 {
861     auto serviceMap = GetServiceMap();
862     std::for_each(serviceMap.begin(), serviceMap.end(), [&info](ServiceMapType::reference service) {
863         if (service.second && (info.processName == service.second->GetAbilityInfo().process ||
864                                   info.processName == service.second->GetApplicationInfo().bundleName)) {
865             auto appName = service.second->GetApplicationInfo().name;
866             auto uid = service.second->GetAbilityInfo().applicationInfo.uid;
867             auto isExist = [&appName, &uid](
868                                const AppData &appData) { return appData.appName == appName && appData.uid == uid; };
869             auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
870             if (iter != info.appData.end()) {
871                 service.second->SetAppState(info.state);
872             }
873         }
874     });
875 
876     auto cacheAbilityList = AbilityCacheManager::GetInstance().GetAbilityList();
877     std::for_each(cacheAbilityList.begin(), cacheAbilityList.end(), [&info](std::shared_ptr<AbilityRecord> &service) {
878         if (service && (info.processName == service->GetAbilityInfo().process ||
879             info.processName == service->GetApplicationInfo().bundleName)) {
880             auto appName = service->GetApplicationInfo().name;
881             auto uid = service->GetAbilityInfo().applicationInfo.uid;
882             auto isExist = [&appName, &uid](const AppData &appData) {
883                 return appData.appName == appName && appData.uid == uid;
884             };
885             auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
886             if (iter != info.appData.end()) {
887                 service->SetAppState(info.state);
888             }
889         }
890     });
891 }
892 
AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)893 int AbilityConnectManager::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)
894 {
895     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
896     std::lock_guard guard(serialMutex_);
897     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
898     std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
899     std::shared_ptr<AbilityRecord> abilityRecord;
900     if (targetState == AbilityState::INACTIVE) {
901         abilityRecord = GetExtensionByTokenFromServiceMap(token);
902     } else if (targetState == AbilityState::FOREGROUND || targetState == AbilityState::BACKGROUND) {
903         abilityRecord = GetExtensionByTokenFromServiceMap(token);
904         if (abilityRecord == nullptr) {
905             abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
906         }
907     } else if (targetState == AbilityState::INITIAL) {
908         abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
909     }
910 
911     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
912     std::string element = abilityRecord->GetURI();
913     TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called, ability:%{public}s, state:%{public}s",
914         __func__, element.c_str(), abilityState.c_str());
915 
916     switch (targetState) {
917         case AbilityState::INACTIVE: {
918             if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
919                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
920                     token, AppExecFwk::AbilityState::ABILITY_STATE_CREATE);
921             } else {
922                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
923                     token, AppExecFwk::ExtensionState::EXTENSION_STATE_CREATE);
924                 auto preloadTask = [owner = weak_from_this(), abilityRecord] {
925                     auto acm = owner.lock();
926                     if (acm == nullptr) {
927                         TAG_LOGE(AAFwkTag::ABILITYMGR, "null AbilityConnectManager");
928                         return;
929                     }
930                     acm->ProcessPreload(abilityRecord);
931                 };
932                 if (taskHandler_ != nullptr) {
933                     taskHandler_->SubmitTask(preloadTask);
934                 }
935             }
936             return DispatchInactive(abilityRecord, state);
937         }
938         case AbilityState::FOREGROUND: {
939             abilityRecord->RemoveSignatureInfo();
940             return DispatchForeground(abilityRecord);
941         }
942         case AbilityState::BACKGROUND: {
943             return DispatchBackground(abilityRecord);
944         }
945         case AbilityState::INITIAL: {
946             if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
947                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
948                     token, AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED);
949             } else {
950                 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
951                     token, AppExecFwk::ExtensionState::EXTENSION_STATE_TERMINATED);
952             }
953             return DispatchTerminate(abilityRecord);
954         }
955         default: {
956             TAG_LOGW(AAFwkTag::ABILITYMGR, "not support transiting state: %{public}d", state);
957             return ERR_INVALID_VALUE;
958         }
959     }
960 }
961 
AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> &token, const WindowConfig &windowConfig)962 int AbilityConnectManager::AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> &token,
963     const WindowConfig &windowConfig)
964 {
965     std::lock_guard<ffrt::mutex> guard(serialMutex_);
966     auto abilityRecord = Token::GetAbilityRecordByToken(token);
967     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
968     abilityRecord->SaveAbilityWindowConfig(windowConfig);
969     return ERR_OK;
970 }
971 
ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const972 void AbilityConnectManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
973 {
974     auto bundleMgrHelper = AbilityUtil::GetBundleManagerHelper();
975     CHECK_POINTER(record);
976     CHECK_POINTER(bundleMgrHelper);
977     auto abilityInfo = record->GetAbilityInfo();
978     Want want;
979     want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
980     auto uid = record->GetUid();
981     want.SetParam("uid", uid);
982     bundleMgrHelper->ProcessPreload(want);
983 }
984 
ScheduleConnectAbilityDoneLocked( const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)985 int AbilityConnectManager::ScheduleConnectAbilityDoneLocked(
986     const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
987 {
988     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
989     std::lock_guard guard(serialMutex_);
990     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
991 
992     auto abilityRecord = Token::GetAbilityRecordByToken(token);
993     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
994 
995     std::string element = abilityRecord->GetURI();
996     TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called, Connect ability done, ability: %{public}s.",
997         __func__, element.c_str());
998 
999     if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
1000         (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
1001         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not inactive, state: %{public}d",
1002             abilityRecord->GetAbilityState());
1003         return INVALID_CONNECTION_STATE;
1004     }
1005     abilityRecord->RemoveConnectWant();
1006     abilityRecord->RemoveSignatureInfo();
1007 
1008     if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
1009         DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
1010             token, AppExecFwk::AbilityState::ABILITY_STATE_CONNECTED);
1011     } else {
1012         DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
1013             token, AppExecFwk::ExtensionState::EXTENSION_STATE_CONNECTED);
1014     }
1015     EventInfo eventInfo = BuildEventInfo(abilityRecord);
1016     eventInfo.userId = userId_;
1017     eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1018     eventInfo.moduleName = abilityRecord->GetAbilityInfo().moduleName;
1019     eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
1020     EventReport::SendConnectServiceEvent(EventName::CONNECT_SERVICE, eventInfo);
1021 
1022     abilityRecord->SetConnRemoteObject(remoteObject);
1023     // There may be multiple callers waiting for the connection result
1024     auto connectRecordList = abilityRecord->GetConnectRecordList();
1025     for (auto &connectRecord : connectRecordList) {
1026         connectRecord->ScheduleConnectAbilityDone();
1027         if (abilityRecord->GetAbilityInfo().type == AbilityType::EXTENSION &&
1028             abilityRecord->GetAbilityInfo().extensionAbilityType != AppExecFwk::ExtensionAbilityType::SERVICE) {
1029             PostExtensionDelayDisconnectTask(connectRecord);
1030         }
1031     }
1032     CompleteStartServiceReq(abilityRecord->GetURI());
1033     ResSchedUtil::GetInstance().ReportLoadingEventToRss(LoadingStage::CONNECT_END, abilityRecord->GetPid(),
1034         abilityRecord->GetUid());
1035     return ERR_OK;
1036 }
1037 
ProcessEliminateAbilityRecord(std::shared_ptr<AbilityRecord> eliminateRecord)1038 void AbilityConnectManager::ProcessEliminateAbilityRecord(std::shared_ptr<AbilityRecord> eliminateRecord)
1039 {
1040     CHECK_POINTER(eliminateRecord);
1041     std::string eliminateKey = eliminateRecord->GetURI();
1042     if (FRS_BUNDLE_NAME == eliminateRecord->GetAbilityInfo().bundleName) {
1043         eliminateKey = eliminateKey +
1044             std::to_string(eliminateRecord->GetWant().GetIntParam(FRS_APP_INDEX, 0));
1045     }
1046     AddToServiceMap(eliminateKey, eliminateRecord);
1047     TerminateRecord(eliminateRecord);
1048 }
1049 
TerminateOrCacheAbility(std::shared_ptr<AbilityRecord> abilityRecord)1050 void AbilityConnectManager::TerminateOrCacheAbility(std::shared_ptr<AbilityRecord> abilityRecord)
1051 {
1052     RemoveUIExtensionAbilityRecord(abilityRecord);
1053     if (abilityRecord->IsSceneBoard()) {
1054         return;
1055     }
1056     if (IsCacheExtensionAbilityType(abilityRecord)) {
1057         std::string serviceKey = abilityRecord->GetURI();
1058         auto abilityInfo = abilityRecord->GetAbilityInfo();
1059         TAG_LOGD(AAFwkTag::ABILITYMGR, "Cache the ability, service:%{public}s, extension type %{public}d",
1060             serviceKey.c_str(), abilityInfo.extensionAbilityType);
1061         if (FRS_BUNDLE_NAME == abilityInfo.bundleName) {
1062             AppExecFwk::ElementName elementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1063                 abilityInfo.moduleName);
1064             serviceKey = elementName.GetURI() +
1065                 std::to_string(abilityRecord->GetWant().GetIntParam(FRS_APP_INDEX, 0));
1066         }
1067         {
1068             std::lock_guard lock(serviceMapMutex_);
1069             serviceMap_.erase(serviceKey);
1070         }
1071         auto eliminateRecord = AbilityCacheManager::GetInstance().Put(abilityRecord);
1072         if (eliminateRecord != nullptr) {
1073             TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate the eliminated ability, service:%{public}s.",
1074                 eliminateRecord->GetURI().c_str());
1075             ProcessEliminateAbilityRecord(eliminateRecord);
1076         }
1077         return;
1078     }
1079     TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate the ability, service:%{public}s, extension type %{public}d",
1080         abilityRecord->GetURI().c_str(), abilityRecord->GetAbilityInfo().extensionAbilityType);
1081     TerminateRecord(abilityRecord);
1082 }
1083 
ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)1084 int AbilityConnectManager::ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)
1085 {
1086     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1087     std::lock_guard guard(serialMutex_);
1088     auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
1089     CHECK_POINTER_AND_RETURN(abilityRecord, CONNECTION_NOT_EXIST);
1090 
1091     auto connect = abilityRecord->GetDisconnectingRecord();
1092     CHECK_POINTER_AND_RETURN(connect, CONNECTION_NOT_EXIST);
1093 
1094     if (!abilityRecord->IsAbilityState(AbilityState::ACTIVE)) {
1095         if (IsUIExtensionAbility(abilityRecord) && (abilityRecord->IsForeground() ||
1096             abilityRecord->IsAbilityState(AbilityState::BACKGROUND) ||
1097             abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING))) {
1098             // uiextension ability support connect and start, so the ability state maybe others
1099             TAG_LOGI(
1100                 AAFwkTag::ABILITYMGR, "disconnect when ability state: %{public}d", abilityRecord->GetAbilityState());
1101         } else {
1102             TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not active, state: %{public}d",
1103                 abilityRecord->GetAbilityState());
1104             return INVALID_CONNECTION_STATE;
1105         }
1106     }
1107 
1108     if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
1109         DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
1110             token, AppExecFwk::AbilityState::ABILITY_STATE_DISCONNECTED);
1111     } else {
1112         DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
1113             token, AppExecFwk::ExtensionState::EXTENSION_STATE_DISCONNECTED);
1114     }
1115 
1116     std::string element = abilityRecord->GetURI();
1117     TAG_LOGI(AAFwkTag::ABILITYMGR, "ScheduleDisconnectAbilityDoneLocked called, service:%{public}s.",
1118         element.c_str());
1119 
1120     // complete disconnect and remove record from conn map
1121     connect->ScheduleDisconnectAbilityDone();
1122     abilityRecord->RemoveConnectRecordFromList(connect);
1123     if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
1124         if (IsUIExtensionAbility(abilityRecord) && CheckUIExtensionAbilitySessionExist(abilityRecord)) {
1125             TAG_LOGI(AAFwkTag::ABILITYMGR, "exist ui extension component, don't terminate when disconnect");
1126         } else if (abilityRecord->GetAbilityInfo().extensionAbilityType ==
1127             AppExecFwk::ExtensionAbilityType::UI_SERVICE) {
1128             TAG_LOGI(AAFwkTag::ABILITYMGR, "don't terminate uiservice");
1129         } else {
1130             TAG_LOGI(AAFwkTag::ABILITYMGR,
1131                 "Service ability has no any connection, and not started, need terminate or cache.");
1132             TerminateOrCacheAbility(abilityRecord);
1133         }
1134     }
1135     RemoveConnectionRecordFromMap(connect);
1136 
1137     return ERR_OK;
1138 }
1139 
ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)1140 int AbilityConnectManager::ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)
1141 {
1142     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1143     std::lock_guard guard(serialMutex_);
1144     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
1145     auto abilityRecord = Token::GetAbilityRecordByToken(token);
1146     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1147     std::string element = abilityRecord->GetURI();
1148     TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called, Ability: %{public}s", __func__, element.c_str());
1149 
1150     if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
1151         (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
1152         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not inactive, state: %{public}d",
1153             abilityRecord->GetAbilityState());
1154         return INVALID_CONNECTION_STATE;
1155     }
1156     EventInfo eventInfo = BuildEventInfo(abilityRecord);
1157     EventReport::SendStartServiceEvent(EventName::START_SERVICE, eventInfo);
1158     abilityRecord->RemoveSignatureInfo();
1159     // complete command and pop waiting start ability from queue.
1160     CompleteCommandAbility(abilityRecord);
1161 
1162     return ERR_OK;
1163 }
1164 
ScheduleCommandAbilityWindowDone( const sptr<IRemoteObject> &token, const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd, AbilityCommand abilityCmd)1165 int AbilityConnectManager::ScheduleCommandAbilityWindowDone(
1166     const sptr<IRemoteObject> &token,
1167     const sptr<SessionInfo> &sessionInfo,
1168     WindowCommand winCmd,
1169     AbilityCommand abilityCmd)
1170 {
1171     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1172     std::lock_guard guard(serialMutex_);
1173     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
1174     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
1175     auto abilityRecord = Token::GetAbilityRecordByToken(token);
1176     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1177     std::string element = abilityRecord->GetURI();
1178     TAG_LOGI(AAFwkTag::ABILITYMGR,
1179         "ability:%{public}s, persistentId:%{private}d, winCmd:%{public}d, abilityCmd:%{public}d", element.c_str(),
1180         sessionInfo->persistentId, winCmd, abilityCmd);
1181 
1182     // Only foreground mode need cancel, cause only foreground CommandAbilityWindow post timeout task.
1183     if (taskHandler_ && winCmd == WIN_CMD_FOREGROUND) {
1184         int recordId = abilityRecord->GetRecordId();
1185         std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
1186                                std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
1187         taskHandler_->CancelTask(taskName);
1188     }
1189 
1190     if (winCmd == WIN_CMD_DESTROY) {
1191         HandleCommandDestroy(sessionInfo);
1192     }
1193 
1194     abilityRecord->SetAbilityWindowState(sessionInfo, winCmd, true);
1195 
1196     CompleteStartServiceReq(element);
1197     return ERR_OK;
1198 }
1199 
HandleCommandDestroy(const sptr<SessionInfo> &sessionInfo)1200 void AbilityConnectManager::HandleCommandDestroy(const sptr<SessionInfo> &sessionInfo)
1201 {
1202     if (sessionInfo == nullptr) {
1203         TAG_LOGW(AAFwkTag::ABILITYMGR, "null sessionInfo");
1204         return;
1205     }
1206     if (sessionInfo->sessionToken) {
1207         RemoveUIExtWindowDeathRecipient(sessionInfo->sessionToken);
1208         size_t ret = 0;
1209         {
1210             std::lock_guard guard(uiExtensionMapMutex_);
1211             ret = uiExtensionMap_.erase(sessionInfo->sessionToken);
1212         }
1213         if (ret > 0) {
1214             return;
1215         }
1216 
1217         std::lock_guard guard(windowExtensionMapMutex_);
1218         for (auto& item : windowExtensionMap_) {
1219             auto sessionInfoVal = item.second.second;
1220             if (sessionInfoVal && sessionInfoVal->callerToken == sessionInfo->sessionToken) {
1221                 windowExtensionMap_.erase(item.first);
1222                 break;
1223             }
1224         }
1225     }
1226 }
1227 
CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)1228 void AbilityConnectManager::CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)
1229 {
1230     CHECK_POINTER(abilityRecord);
1231     if (taskHandler_) {
1232         int recordId = abilityRecord->GetRecordId();
1233         std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
1234                                std::to_string(abilityRecord->GetStartId());
1235         taskHandler_->CancelTask(taskName);
1236     }
1237 
1238     abilityRecord->SetAbilityState(AbilityState::ACTIVE);
1239 
1240     // manage queued request
1241     CompleteStartServiceReq(abilityRecord->GetURI());
1242     if (abilityRecord->NeedConnectAfterCommand()) {
1243         abilityRecord->UpdateConnectWant();
1244         ConnectAbility(abilityRecord);
1245     }
1246 }
1247 
CompleteStartServiceReq(const std::string &serviceUri)1248 void AbilityConnectManager::CompleteStartServiceReq(const std::string &serviceUri)
1249 {
1250     std::shared_ptr<std::list<OHOS::AAFwk::AbilityRequest>> reqList;
1251     {
1252         std::lock_guard guard(startServiceReqListLock_);
1253         auto it = startServiceReqList_.find(serviceUri);
1254         if (it != startServiceReqList_.end()) {
1255             reqList = it->second;
1256             startServiceReqList_.erase(it);
1257             if (taskHandler_) {
1258                 taskHandler_->CancelTask(std::string("start_service_timeout:") + serviceUri);
1259             }
1260         }
1261     }
1262 
1263     if (reqList) {
1264         TAG_LOGI(AAFwkTag::ABILITYMGR, "target service activating: %{public}zu, uri: %{public}s", reqList->size(),
1265             serviceUri.c_str());
1266         for (const auto &req: *reqList) {
1267             StartAbilityLocked(req);
1268         }
1269     }
1270 }
1271 
GetServiceRecordByElementName(const std::string &element)1272 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementName(const std::string &element)
1273 {
1274     std::lock_guard guard(serviceMapMutex_);
1275     auto mapIter = serviceMap_.find(element);
1276     if (mapIter != serviceMap_.end()) {
1277         return mapIter->second;
1278     }
1279     return nullptr;
1280 }
1281 
GetExtensionByTokenFromServiceMap( const sptr<IRemoteObject> &token)1282 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromServiceMap(
1283     const sptr<IRemoteObject> &token)
1284 {
1285     auto IsMatch = [token](auto service) {
1286         if (!service.second) {
1287             return false;
1288         }
1289         sptr<IRemoteObject> srcToken = service.second->GetToken();
1290         return srcToken == token;
1291     };
1292     std::lock_guard lock(serviceMapMutex_);
1293     auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
1294     if (serviceRecord != serviceMap_.end()) {
1295         return serviceRecord->second;
1296     }
1297     return nullptr;
1298 }
1299 
GetExtensionByTokenFromAbilityCache( const sptr<IRemoteObject> &token)1300 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromAbilityCache(
1301     const sptr<IRemoteObject> &token)
1302 {
1303     return AbilityCacheManager::GetInstance().FindRecordByToken(token);
1304 }
1305 
GetExtensionByIdFromServiceMap( const int64_t &abilityRecordId)1306 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByIdFromServiceMap(
1307     const int64_t &abilityRecordId)
1308 {
1309     auto IsMatch = [abilityRecordId](auto &service) {
1310         if (!service.second) {
1311             return false;
1312         }
1313         return service.second->GetAbilityRecordId() == abilityRecordId;
1314     };
1315 
1316     std::lock_guard lock(serviceMapMutex_);
1317     auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
1318     if (serviceRecord != serviceMap_.end()) {
1319         return serviceRecord->second;
1320     }
1321     return nullptr;
1322 }
1323 
GetExtensionByIdFromTerminatingMap( const int64_t &abilityRecordId)1324 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByIdFromTerminatingMap(
1325     const int64_t &abilityRecordId)
1326 {
1327     auto IsMatch = [abilityRecordId](auto &extensionRecord) {
1328         if (extensionRecord == nullptr) {
1329             return false;
1330         }
1331         return extensionRecord->GetAbilityRecordId() == abilityRecordId;
1332     };
1333 
1334     std::lock_guard lock(serviceMapMutex_);
1335     auto extensionRecord = std::find_if(terminatingExtensionList_.begin(), terminatingExtensionList_.end(), IsMatch);
1336     if (extensionRecord != terminatingExtensionList_.end()) {
1337         return *extensionRecord;
1338     }
1339     return nullptr;
1340 }
1341 
GetUIExtensionBySessionInfo( const sptr<SessionInfo> &sessionInfo)1342 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetUIExtensionBySessionInfo(
1343     const sptr<SessionInfo> &sessionInfo)
1344 {
1345     CHECK_POINTER_AND_RETURN(sessionInfo, nullptr);
1346     auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1347     CHECK_POINTER_AND_RETURN(sessionToken, nullptr);
1348 
1349     std::lock_guard guard(uiExtensionMapMutex_);
1350     auto it = uiExtensionMap_.find(sessionToken->AsObject());
1351     if (it != uiExtensionMap_.end()) {
1352         auto abilityRecord = it->second.first.lock();
1353         if (abilityRecord == nullptr) {
1354             TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord null");
1355             RemoveUIExtWindowDeathRecipient(sessionToken->AsObject());
1356             uiExtensionMap_.erase(it);
1357             return nullptr;
1358         }
1359         auto savedSessionInfo = it->second.second;
1360         if (!savedSessionInfo || savedSessionInfo->sessionToken != sessionInfo->sessionToken
1361             || savedSessionInfo->callerToken != sessionInfo->callerToken) {
1362             TAG_LOGW(AAFwkTag::ABILITYMGR, "inconsistent sessionInfo");
1363             return nullptr;
1364         }
1365         return abilityRecord;
1366     } else {
1367         TAG_LOGE(AAFwkTag::ABILITYMGR, "UIExtension not found");
1368     }
1369     return nullptr;
1370 }
1371 
GetExtensionByTokenFromTerminatingMap( const sptr<IRemoteObject> &token)1372 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromTerminatingMap(
1373     const sptr<IRemoteObject> &token)
1374 {
1375     auto IsMatch = [token](auto& extensionRecord) {
1376         if (extensionRecord == nullptr) {
1377             return false;
1378         }
1379         auto terminatingToken = extensionRecord->GetToken();
1380         if (terminatingToken != nullptr) {
1381             return terminatingToken->AsObject() == token;
1382         }
1383         return false;
1384     };
1385 
1386     std::lock_guard lock(serviceMapMutex_);
1387     auto terminatingExtensionRecord =
1388         std::find_if(terminatingExtensionList_.begin(), terminatingExtensionList_.end(), IsMatch);
1389     if (terminatingExtensionRecord != terminatingExtensionList_.end()) {
1390         return *terminatingExtensionRecord;
1391     }
1392     return nullptr;
1393 }
1394 
GetConnectRecordListByCallback( sptr<IAbilityConnection> callback)1395 std::list<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRecordListByCallback(
1396     sptr<IAbilityConnection> callback)
1397 {
1398     std::lock_guard guard(connectMapMutex_);
1399     std::list<std::shared_ptr<ConnectionRecord>> connectList;
1400     auto connectMapIter = connectMap_.find(callback->AsObject());
1401     if (connectMapIter != connectMap_.end()) {
1402         connectList = connectMapIter->second;
1403     }
1404     return connectList;
1405 }
1406 
LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)1407 void AbilityConnectManager::LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1408 {
1409     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1410     CHECK_POINTER(abilityRecord);
1411     abilityRecord->SetStartTime();
1412 
1413     if (!abilityRecord->CanRestartRootLauncher()) {
1414         TAG_LOGE(AAFwkTag::ABILITYMGR, "CanRestartRootLauncher fail");
1415         RemoveServiceAbility(abilityRecord);
1416         return;
1417     }
1418     if (!abilityRecord->IsDebugApp()) {
1419         TAG_LOGD(AAFwkTag::ABILITYMGR, "IsDebug is false, here is not debug app");
1420         PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
1421     }
1422     sptr<Token> token = abilityRecord->GetToken();
1423     sptr<Token> perToken = nullptr;
1424     if (abilityRecord->IsCreateByConnect()) {
1425         perToken = iface_cast<Token>(abilityRecord->GetConnectingRecord()->GetToken());
1426     } else {
1427         auto callerList = abilityRecord->GetCallerRecordList();
1428         if (!callerList.empty() && callerList.back()) {
1429             auto caller = callerList.back()->GetCaller();
1430             if (caller) {
1431                 perToken = caller->GetToken();
1432             }
1433         }
1434     }
1435 
1436     UpdateUIExtensionInfo(abilityRecord);
1437     DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
1438         token, perToken, abilityRecord->GetAbilityInfo(), abilityRecord->GetApplicationInfo(),
1439         abilityRecord->GetWant(), abilityRecord->GetRecordId(), abilityRecord->GetInstanceKey());
1440     abilityRecord->SetLoadState(AbilityLoadState::LOADING);
1441 }
1442 
PostRestartResidentTask(const AbilityRequest &abilityRequest)1443 void AbilityConnectManager::PostRestartResidentTask(const AbilityRequest &abilityRequest)
1444 {
1445     TAG_LOGI(AAFwkTag::ABILITYMGR, "PostRestartResidentTask start");
1446     CHECK_POINTER(taskHandler_);
1447     std::string taskName = std::string("RestartResident_") + std::string(abilityRequest.abilityInfo.name);
1448     auto task = [abilityRequest, connectManager = shared_from_this()]() {
1449         CHECK_POINTER(connectManager);
1450         connectManager->HandleRestartResidentTask(abilityRequest);
1451     };
1452     int restartIntervalTime = 0;
1453     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
1454     if (abilityMgr) {
1455         restartIntervalTime = AmsConfigurationParameter::GetInstance().GetRestartIntervalTime();
1456     }
1457     TAG_LOGD(AAFwkTag::ABILITYMGR, "PostRestartResidentTask, time:%{public}d", restartIntervalTime);
1458     taskHandler_->SubmitTask(task, taskName, restartIntervalTime);
1459     TAG_LOGI(AAFwkTag::ABILITYMGR, "PostRestartResidentTask end");
1460 }
1461 
HandleRestartResidentTask(const AbilityRequest &abilityRequest)1462 void AbilityConnectManager::HandleRestartResidentTask(const AbilityRequest &abilityRequest)
1463 {
1464     TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleRestartResidentTask start");
1465     std::lock_guard guard(serialMutex_);
1466     auto findRestartResidentTask = [abilityRequest](const AbilityRequest &requestInfo) {
1467         return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
1468             requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
1469             requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
1470     };
1471     auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(), findRestartResidentTask);
1472     if (findIter != restartResidentTaskList_.end()) {
1473         restartResidentTaskList_.erase(findIter);
1474     }
1475     StartAbilityLocked(abilityRequest);
1476 }
1477 
PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)1478 void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)
1479 {
1480     CHECK_POINTER(abilityRecord);
1481     int connectRecordId = 0;
1482     if (messageId == AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1483         auto connectRecord = abilityRecord->GetConnectingRecord();
1484         CHECK_POINTER(connectRecord);
1485         connectRecordId = connectRecord->GetRecordId();
1486     }
1487     PostTimeOutTask(abilityRecord, connectRecordId, messageId);
1488 }
1489 
PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, int connectRecordId, uint32_t messageId)1490 void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord,
1491     int connectRecordId, uint32_t messageId)
1492 {
1493     CHECK_POINTER(abilityRecord);
1494     CHECK_POINTER(taskHandler_);
1495 
1496     std::string taskName;
1497     int32_t delayTime = 0;
1498     if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
1499         if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1500             return abilityRecord->PostUIExtensionAbilityTimeoutTask(messageId);
1501         }
1502         // first load ability, There is at most one connect record.
1503         int recordId = abilityRecord->GetRecordId();
1504         taskName = std::string("LoadTimeout_") + std::to_string(recordId);
1505         delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE;
1506     } else if (messageId == AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1507         taskName = std::string("ConnectTimeout_") + std::to_string(connectRecordId);
1508         delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
1509         ResSchedUtil::GetInstance().ReportLoadingEventToRss(LoadingStage::CONNECT_BEGIN, abilityRecord->GetPid(),
1510             abilityRecord->GetUid(), delayTime);
1511     } else {
1512         TAG_LOGE(AAFwkTag::ABILITYMGR, "messageId error");
1513         return;
1514     }
1515 
1516     // check libc.hook_mode
1517     const int bufferLen = 128;
1518     char paramOutBuf[bufferLen] = {0};
1519     const char *hook_mode = "startup:";
1520     int ret = GetParameter("libc.hook_mode", "", paramOutBuf, bufferLen - 1);
1521     if (ret > 0 && strncmp(paramOutBuf, hook_mode, strlen(hook_mode)) == 0) {
1522         TAG_LOGD(AAFwkTag::ABILITYMGR, "Hook_mode: no timeoutTask");
1523         return;
1524     }
1525 
1526     auto timeoutTask = [abilityRecord, connectManager = shared_from_this(), messageId]() {
1527         if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
1528             connectManager->HandleStartTimeoutTask(abilityRecord);
1529         } else if (messageId == AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1530             connectManager->HandleConnectTimeoutTask(abilityRecord);
1531         }
1532     };
1533     taskHandler_->SubmitTask(timeoutTask, taskName, delayTime);
1534 }
1535 
HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)1536 void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1537 {
1538     TAG_LOGW(AAFwkTag::ABILITYMGR, "load timeout");
1539     std::lock_guard guard(serialMutex_);
1540     CHECK_POINTER(abilityRecord);
1541     abilityRecord->SetLoadState(AbilityLoadState::FAILED);
1542     if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1543         TAG_LOGE(AAFwkTag::ABILITYMGR, "consume session timeout, Uri: %{public}s", abilityRecord->GetURI().c_str());
1544         if (uiExtensionAbilityRecordMgr_ != nullptr && IsCallerValid(abilityRecord)) {
1545             TAG_LOGW(AAFwkTag::ABILITYMGR, "start load timeout");
1546             uiExtensionAbilityRecordMgr_->LoadTimeout(abilityRecord->GetUIExtensionAbilityId());
1547         }
1548     }
1549     auto connectingList = abilityRecord->GetConnectingRecordList();
1550     for (auto &connectRecord : connectingList) {
1551         if (connectRecord == nullptr) {
1552             TAG_LOGW(AAFwkTag::ABILITYMGR, "connectRecord null");
1553             continue;
1554         }
1555         connectRecord->CompleteDisconnect(ERR_OK, false, true);
1556         abilityRecord->RemoveConnectRecordFromList(connectRecord);
1557         RemoveConnectionRecordFromMap(connectRecord);
1558     }
1559 
1560     if (GetExtensionByTokenFromServiceMap(abilityRecord->GetToken()) == nullptr) {
1561         TAG_LOGE(AAFwkTag::ABILITYMGR, "timeout ability record not exist");
1562         return;
1563     }
1564     TAG_LOGW(AAFwkTag::ABILITYMGR, "AbilityUri:%{public}s,user:%{public}d", abilityRecord->GetURI().c_str(), userId_);
1565     MoveToTerminatingMap(abilityRecord);
1566     RemoveServiceAbility(abilityRecord);
1567     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1568     if (abilityRecord->IsSceneBoard()) {
1569         if (DelayedSingleton<AbilityManagerService>::GetInstance()->GetUserId() == userId_) {
1570             RestartAbility(abilityRecord, userId_);
1571         }
1572         PrintTimeOutLog(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
1573         return;
1574     }
1575     if (IsAbilityNeedKeepAlive(abilityRecord)) {
1576         TAG_LOGW(AAFwkTag::ABILITYMGR, "load timeout");
1577         RestartAbility(abilityRecord, userId_);
1578     }
1579 }
1580 
HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)1581 void AbilityConnectManager::HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1582 {
1583     CHECK_POINTER(abilityRecord);
1584     if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1585         TAG_LOGD(AAFwkTag::ABILITYMGR, "Handle root launcher command timeout.");
1586         // terminate the timeout root launcher.
1587         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1588     }
1589     TAG_LOGD(AAFwkTag::ABILITYMGR, "HandleCommandTimeoutTask end");
1590 }
1591 
HandleConnectTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)1592 void AbilityConnectManager::HandleConnectTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)
1593 {
1594     TAG_LOGW(AAFwkTag::ABILITYMGR, "connect timeout");
1595     CHECK_POINTER(abilityRecord);
1596     auto connectList = abilityRecord->GetConnectRecordList();
1597     std::lock_guard guard(serialMutex_);
1598     for (const auto &connectRecord : connectList) {
1599         RemoveExtensionDelayDisconnectTask(connectRecord);
1600         connectRecord->CancelConnectTimeoutTask();
1601         connectRecord->CompleteDisconnect(ERR_OK, false, true);
1602         abilityRecord->RemoveConnectRecordFromList(connectRecord);
1603         RemoveConnectionRecordFromMap(connectRecord);
1604     }
1605 
1606     if (IsSpecialAbility(abilityRecord->GetAbilityInfo()) || abilityRecord->GetStartId() != 0) {
1607         TAG_LOGI(AAFwkTag::ABILITYMGR, "no need terminate");
1608         return;
1609     }
1610 
1611     TerminateRecord(abilityRecord);
1612 }
1613 
HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)1614 void AbilityConnectManager::HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord,
1615     const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1616 {
1617     TAG_LOGD(AAFwkTag::ABILITYMGR, "start");
1618     std::lock_guard guard(serialMutex_);
1619     CHECK_POINTER(abilityRecord);
1620     abilityRecord->SetAbilityWindowState(sessionInfo, winCmd, true);
1621     // manage queued request
1622     CompleteStartServiceReq(abilityRecord->GetURI());
1623     TAG_LOGD(AAFwkTag::ABILITYMGR, "end");
1624 }
1625 
HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)1626 void AbilityConnectManager::HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1627 {
1628     TAG_LOGD(AAFwkTag::ABILITYMGR, "Complete stop ability timeout start.");
1629     std::lock_guard guard(serialMutex_);
1630     CHECK_POINTER(abilityRecord);
1631     if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1632         if (uiExtensionAbilityRecordMgr_ != nullptr && IsCallerValid(abilityRecord)) {
1633             TAG_LOGW(AAFwkTag::ABILITYMGR, "start terminate timeout");
1634             uiExtensionAbilityRecordMgr_->TerminateTimeout(abilityRecord->GetUIExtensionAbilityId());
1635         }
1636         PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1637     }
1638     TerminateDone(abilityRecord);
1639 }
1640 
HandleTerminateDisconnectTask(const ConnectListType& connectlist)1641 void AbilityConnectManager::HandleTerminateDisconnectTask(const ConnectListType& connectlist)
1642 {
1643     TAG_LOGD(AAFwkTag::ABILITYMGR, "Disconnect ability when terminate.");
1644     for (auto& connectRecord : connectlist) {
1645         if (!connectRecord) {
1646             continue;
1647         }
1648         auto targetService = connectRecord->GetAbilityRecord();
1649         if (targetService) {
1650             TAG_LOGW(AAFwkTag::ABILITYMGR, "record complete disconnect. recordId:%{public}d",
1651                 connectRecord->GetRecordId());
1652             connectRecord->CompleteDisconnect(ERR_OK, false, true);
1653             targetService->RemoveConnectRecordFromList(connectRecord);
1654             RemoveConnectionRecordFromMap(connectRecord);
1655         };
1656     }
1657 }
1658 
DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)1659 int AbilityConnectManager::DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
1660 {
1661     TAG_LOGD(AAFwkTag::ABILITYMGR, "DispatchInactive call");
1662     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1663     CHECK_POINTER_AND_RETURN(eventHandler_, ERR_INVALID_VALUE);
1664     if (!abilityRecord->IsAbilityState(AbilityState::INACTIVATING)) {
1665         TAG_LOGE(AAFwkTag::ABILITYMGR,
1666             "error. expect %{public}d, actual %{public}d callback %{public}d",
1667             AbilityState::INACTIVATING, abilityRecord->GetAbilityState(), state);
1668         return ERR_INVALID_VALUE;
1669     }
1670     eventHandler_->RemoveEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1671 
1672     // complete inactive
1673     abilityRecord->SetAbilityState(AbilityState::INACTIVE);
1674     if (abilityRecord->IsCreateByConnect()) {
1675         ConnectAbility(abilityRecord);
1676     } else if (abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
1677         TAG_LOGD(AAFwkTag::ABILITYMGR, "IS_PRELOAD_UIEXTENSION_ABILITY");
1678         auto ret = uiExtensionAbilityRecordMgr_->AddPreloadUIExtensionRecord(abilityRecord);
1679         if (ret != ERR_OK) {
1680             TAG_LOGE(AAFwkTag::ABILITYMGR, "AddPreloadUIExtensionRecord error");
1681             return ret;
1682         }
1683         return ERR_OK;
1684     } else {
1685         CommandAbility(abilityRecord);
1686         if (abilityRecord->GetConnectRecordList().size() > 0) {
1687             // It means someone called connectAbility when service was loading
1688             abilityRecord->UpdateConnectWant();
1689             ConnectAbility(abilityRecord);
1690         }
1691     }
1692 
1693     return ERR_OK;
1694 }
1695 
DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)1696 int AbilityConnectManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1697 {
1698     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1699     CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1700     // remove foreground timeout task.
1701     abilityRecord->RemoveForegroundTimeoutTask();
1702     auto self(shared_from_this());
1703     auto task = [self, abilityRecord]() { self->CompleteForeground(abilityRecord); };
1704     taskHandler_->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
1705 
1706     return ERR_OK;
1707 }
1708 
DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)1709 int AbilityConnectManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1710 {
1711     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1712     CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1713     // remove background timeout task.
1714     taskHandler_->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1715 
1716     auto self(shared_from_this());
1717     auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1718     taskHandler_->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
1719 
1720     return ERR_OK;
1721 }
1722 
DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)1723 int AbilityConnectManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1724 {
1725     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1726     // remove terminate timeout task
1727     if (taskHandler_ != nullptr) {
1728         taskHandler_->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1729     }
1730     // complete terminate
1731     TerminateDone(abilityRecord);
1732     return ERR_OK;
1733 }
1734 
ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)1735 void AbilityConnectManager::ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1736 {
1737     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1738     CHECK_POINTER(abilityRecord);
1739     AppExecFwk::ExtensionAbilityType extType = abilityRecord->GetAbilityInfo().extensionAbilityType;
1740     if (extType == AppExecFwk::ExtensionAbilityType::UI_SERVICE) {
1741         ResumeConnectAbility(abilityRecord);
1742     } else {
1743         PostTimeOutTask(abilityRecord, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1744         abilityRecord->ConnectAbility();
1745     }
1746 }
1747 
ConnectUIServiceExtAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int connectRecordId, const Want &want)1748 void AbilityConnectManager::ConnectUIServiceExtAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1749     int connectRecordId, const Want &want)
1750 {
1751     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1752     CHECK_POINTER(abilityRecord);
1753     PostTimeOutTask(abilityRecord, connectRecordId, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1754     abilityRecord->ConnectAbilityWithWant(want);
1755 }
1756 
ResumeConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)1757 void AbilityConnectManager::ResumeConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1758 {
1759     TAG_LOGI(AAFwkTag::ABILITYMGR, "ResumeConnectAbility");
1760     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1761     CHECK_POINTER(abilityRecord);
1762     std::list<std::shared_ptr<ConnectionRecord>> connectingList = abilityRecord->GetConnectingRecordList();
1763     for (auto &connectRecord : connectingList) {
1764         if (connectRecord == nullptr) {
1765             TAG_LOGW(AAFwkTag::ABILITYMGR, "connectRecord null");
1766             continue;
1767         }
1768         int connectRecordId = connectRecord->GetRecordId();
1769         PostTimeOutTask(abilityRecord, connectRecordId, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1770         abilityRecord->ConnectAbilityWithWant(connectRecord->GetConnectWant());
1771     }
1772 }
1773 
CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)1774 void AbilityConnectManager::CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1775 {
1776     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1777     CHECK_POINTER(abilityRecord);
1778     if (taskHandler_ != nullptr) {
1779         // first connect ability, There is at most one connect record.
1780         int recordId = abilityRecord->GetRecordId();
1781         abilityRecord->AddStartId();
1782         std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
1783                                std::to_string(abilityRecord->GetStartId());
1784         auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
1785             TAG_LOGE(AAFwkTag::ABILITYMGR, "command ability timeout. %{public}s",
1786                 abilityRecord->GetAbilityInfo().name.c_str());
1787             connectManager->HandleCommandTimeoutTask(abilityRecord);
1788         };
1789         int commandTimeout =
1790             AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_TIMEOUT_MULTIPLE;
1791         taskHandler_->SubmitTask(timeoutTask, taskName, commandTimeout);
1792         // scheduling command ability
1793         abilityRecord->CommandAbility();
1794     }
1795 }
1796 
CommandAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord, const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)1797 void AbilityConnectManager::CommandAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord,
1798     const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1799 {
1800     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1801     CHECK_POINTER(abilityRecord);
1802     CHECK_POINTER(sessionInfo);
1803     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s, persistentId: %{private}d, wincmd: %{public}d",
1804         abilityRecord->GetURI().c_str(), sessionInfo->persistentId, winCmd);
1805     abilityRecord->SetAbilityWindowState(sessionInfo, winCmd, false);
1806     if (taskHandler_ != nullptr) {
1807         int recordId = abilityRecord->GetRecordId();
1808         std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
1809             std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
1810         auto timeoutTask = [abilityRecord, sessionInfo, winCmd, connectManager = shared_from_this()]() {
1811             TAG_LOGE(AAFwkTag::ABILITYMGR, "command window timeout. %{public}s",
1812                 abilityRecord->GetAbilityInfo().name.c_str());
1813             connectManager->HandleCommandWindowTimeoutTask(abilityRecord, sessionInfo, winCmd);
1814         };
1815         int commandWindowTimeout =
1816             AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_WINDOW_TIMEOUT_MULTIPLE;
1817         taskHandler_->SubmitTask(timeoutTask, taskName, commandWindowTimeout);
1818         // scheduling command ability
1819         abilityRecord->CommandAbilityWindow(sessionInfo, winCmd);
1820     }
1821 }
1822 
BackgroundAbilityWindowLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, const sptr<SessionInfo> &sessionInfo)1823 void AbilityConnectManager::BackgroundAbilityWindowLocked(const std::shared_ptr<AbilityRecord> &abilityRecord,
1824     const sptr<SessionInfo> &sessionInfo)
1825 {
1826     std::lock_guard guard(serialMutex_);
1827     DoBackgroundAbilityWindow(abilityRecord, sessionInfo);
1828 }
1829 
DoBackgroundAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord, const sptr<SessionInfo> &sessionInfo)1830 void AbilityConnectManager::DoBackgroundAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord,
1831     const sptr<SessionInfo> &sessionInfo)
1832 {
1833     CHECK_POINTER(abilityRecord);
1834     CHECK_POINTER(sessionInfo);
1835     auto abilitystateStr = abilityRecord->ConvertAbilityState(abilityRecord->GetAbilityState());
1836     TAG_LOGI(AAFwkTag::ABILITYMGR,
1837         "ability:%{public}s, persistentId:%{public}d, abilityState:%{public}s",
1838         abilityRecord->GetURI().c_str(), sessionInfo->persistentId, abilitystateStr.c_str());
1839     if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
1840         MoveToBackground(abilityRecord);
1841     } else if (abilityRecord->IsAbilityState(AbilityState::INITIAL) ||
1842         abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
1843         TAG_LOGI(AAFwkTag::ABILITYMGR, "exist initial or foregrounding task");
1844         abilityRecord->DoBackgroundAbilityWindowDelayed(true);
1845     } else if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
1846         TAG_LOGW(AAFwkTag::ABILITYMGR, "invalid ability state");
1847     }
1848 }
1849 
TerminateAbilityWindowLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, const sptr<SessionInfo> &sessionInfo)1850 void AbilityConnectManager::TerminateAbilityWindowLocked(const std::shared_ptr<AbilityRecord> &abilityRecord,
1851     const sptr<SessionInfo> &sessionInfo)
1852 {
1853     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1854     CHECK_POINTER(abilityRecord);
1855     CHECK_POINTER(sessionInfo);
1856     auto abilitystateStr = abilityRecord->ConvertAbilityState(abilityRecord->GetAbilityState());
1857     TAG_LOGI(AAFwkTag::ABILITYMGR,
1858         "ability:%{public}s, persistentId:%{public}d, abilityState:%{public}s",
1859         abilityRecord->GetURI().c_str(), sessionInfo->persistentId, abilitystateStr.c_str());
1860     EventInfo eventInfo;
1861     eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1862     eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
1863     EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
1864     std::lock_guard guard(serialMutex_);
1865     eventInfo.errCode = TerminateAbilityInner(abilityRecord->GetToken());
1866     if (eventInfo.errCode != ERR_OK) {
1867         EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1868     }
1869 }
1870 
TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)1871 void AbilityConnectManager::TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)
1872 {
1873     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1874     CHECK_POINTER(abilityRecord);
1875     if (!abilityRecord->IsAbilityState(AbilityState::TERMINATING)) {
1876         std::string expect = AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING);
1877         std::string actual = AbilityRecord::ConvertAbilityState(abilityRecord->GetAbilityState());
1878         TAG_LOGE(AAFwkTag::ABILITYMGR,
1879             "error. expect %{public}s, actual %{public}s", expect.c_str(), actual.c_str());
1880         return;
1881     }
1882     IN_PROCESS_CALL_WITHOUT_RET(abilityRecord->RevokeUriPermission());
1883     abilityRecord->RemoveAbilityDeathRecipient();
1884     if (abilityRecord->IsSceneBoard()) {
1885         TAG_LOGI(AAFwkTag::ABILITYMGR, "scb exit, kill processes");
1886         KillProcessesByUserId();
1887     }
1888     DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(abilityRecord->GetToken(), false);
1889     if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1890         RemoveUIExtensionAbilityRecord(abilityRecord);
1891     }
1892     RemoveServiceAbility(abilityRecord);
1893 }
1894 
IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord, const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)1895 bool AbilityConnectManager::IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord,
1896     const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
1897 {
1898     auto isMatch = [abilityRecord](auto connectRecord) -> bool {
1899         if (abilityRecord == nullptr || connectRecord == nullptr) {
1900             return false;
1901         }
1902         if (abilityRecord != connectRecord->GetAbilityRecord()) {
1903             return false;
1904         }
1905         return true;
1906     };
1907     return std::any_of(connectRecordList.begin(), connectRecordList.end(), isMatch);
1908 }
1909 
RemoveConnectionRecordFromMap(std::shared_ptr<ConnectionRecord> connection)1910 void AbilityConnectManager::RemoveConnectionRecordFromMap(std::shared_ptr<ConnectionRecord> connection)
1911 {
1912     std::lock_guard lock(connectMapMutex_);
1913     for (auto &connectCallback : connectMap_) {
1914         auto &connectList = connectCallback.second;
1915         auto connectRecord = std::find(connectList.begin(), connectList.end(), connection);
1916         if (connectRecord != connectList.end()) {
1917             TAG_LOGD(AAFwkTag::ABILITYMGR, "connrecord(%{public}d)", (*connectRecord)->GetRecordId());
1918             connectList.remove(connection);
1919             if (connectList.empty()) {
1920                 RemoveConnectDeathRecipient(connectCallback.first);
1921                 connectMap_.erase(connectCallback.first);
1922             }
1923             return;
1924         }
1925     }
1926 }
1927 
RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)1928 void AbilityConnectManager::RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1929 {
1930     CHECK_POINTER(abilityRecord);
1931     TAG_LOGD(AAFwkTag::ABILITYMGR, "Remove service(%{public}s) from terminating map.", abilityRecord->GetURI().c_str());
1932     std::lock_guard lock(serviceMapMutex_);
1933     terminatingExtensionList_.remove(abilityRecord);
1934 }
1935 
AddConnectDeathRecipient(sptr<IRemoteObject> connectObject)1936 void AbilityConnectManager::AddConnectDeathRecipient(sptr<IRemoteObject> connectObject)
1937 {
1938     CHECK_POINTER(connectObject);
1939     {
1940         std::lock_guard guard(recipientMapMutex_);
1941         auto it = recipientMap_.find(connectObject);
1942         if (it != recipientMap_.end()) {
1943             TAG_LOGE(AAFwkTag::ABILITYMGR, "recipient added before");
1944             return;
1945         }
1946     }
1947 
1948     std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1949     sptr<IRemoteObject::DeathRecipient> deathRecipient =
1950         new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1951             auto abilityConnectManager = thisWeakPtr.lock();
1952             if (abilityConnectManager) {
1953                 abilityConnectManager->OnCallBackDied(remote);
1954             }
1955         });
1956     if (!connectObject->AddDeathRecipient(deathRecipient)) {
1957         TAG_LOGE(AAFwkTag::ABILITYMGR, "AddDeathRecipient fail");
1958         return;
1959     }
1960     std::lock_guard guard(recipientMapMutex_);
1961     recipientMap_.emplace(connectObject, deathRecipient);
1962 }
1963 
RemoveConnectDeathRecipient(sptr<IRemoteObject> connectObject)1964 void AbilityConnectManager::RemoveConnectDeathRecipient(sptr<IRemoteObject> connectObject)
1965 {
1966     CHECK_POINTER(connectObject);
1967     sptr<IRemoteObject::DeathRecipient> deathRecipient;
1968     {
1969         std::lock_guard guard(recipientMapMutex_);
1970         auto it = recipientMap_.find(connectObject);
1971         if (it == recipientMap_.end()) {
1972             return;
1973         }
1974         deathRecipient = it->second;
1975         recipientMap_.erase(it);
1976     }
1977 
1978     connectObject->RemoveDeathRecipient(deathRecipient);
1979 }
1980 
OnCallBackDied(const wptr<IRemoteObject> &remote)1981 void AbilityConnectManager::OnCallBackDied(const wptr<IRemoteObject> &remote)
1982 {
1983     auto object = remote.promote();
1984     CHECK_POINTER(object);
1985     if (taskHandler_) {
1986         auto task = [object, connectManager = shared_from_this()]() { connectManager->HandleCallBackDiedTask(object); };
1987         taskHandler_->SubmitTask(task, TASK_ON_CALLBACK_DIED);
1988     }
1989 }
1990 
HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)1991 void AbilityConnectManager::HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)
1992 {
1993     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
1994     CHECK_POINTER(connect);
1995     {
1996         std::lock_guard guard(windowExtensionMapMutex_);
1997         auto item = windowExtensionMap_.find(connect);
1998         if (item != windowExtensionMap_.end()) {
1999             windowExtensionMap_.erase(item);
2000         }
2001     }
2002 
2003     {
2004         std::lock_guard guard(connectMapMutex_);
2005         auto it = connectMap_.find(connect);
2006         if (it != connectMap_.end()) {
2007             ConnectListType connectRecordList = it->second;
2008             for (auto &connRecord : connectRecordList) {
2009                 connRecord->ClearConnCallBack();
2010             }
2011         } else {
2012             TAG_LOGI(AAFwkTag::ABILITYMGR, "not find");
2013             return;
2014         }
2015     }
2016 
2017     sptr<IAbilityConnection> object = iface_cast<IAbilityConnection>(connect);
2018     std::lock_guard guard(serialMutex_);
2019     DisconnectAbilityLocked(object, true);
2020 }
2021 
GetActiveUIExtensionList( const int32_t pid, std::vector<std::string> &extensionList)2022 int32_t AbilityConnectManager::GetActiveUIExtensionList(
2023     const int32_t pid, std::vector<std::string> &extensionList)
2024 {
2025     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
2026     return uiExtensionAbilityRecordMgr_->GetActiveUIExtensionList(pid, extensionList);
2027 }
2028 
GetActiveUIExtensionList( const std::string &bundleName, std::vector<std::string> &extensionList)2029 int32_t AbilityConnectManager::GetActiveUIExtensionList(
2030     const std::string &bundleName, std::vector<std::string> &extensionList)
2031 {
2032     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
2033     return uiExtensionAbilityRecordMgr_->GetActiveUIExtensionList(bundleName, extensionList);
2034 }
2035 
OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)2036 void AbilityConnectManager::OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2037 {
2038     CHECK_POINTER(abilityRecord);
2039     TAG_LOGI(AAFwkTag::ABILITYMGR, "on ability died: %{public}s", abilityRecord->GetURI().c_str());
2040     if (abilityRecord->GetAbilityInfo().type != AbilityType::SERVICE &&
2041         abilityRecord->GetAbilityInfo().type != AbilityType::EXTENSION) {
2042         TAG_LOGW(AAFwkTag::ABILITYMGR, "type not service");
2043         return;
2044     }
2045     if (eventHandler_ && abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
2046         abilityRecord->RemoveLoadTimeoutTask();
2047     }
2048     if (eventHandler_ && abilityRecord->GetAbilityState() == AbilityState::FOREGROUNDING) {
2049         abilityRecord->RemoveForegroundTimeoutTask();
2050     }
2051     if (taskHandler_ && abilityRecord->GetAbilityState() == AbilityState::BACKGROUNDING) {
2052         taskHandler_->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
2053     }
2054     if (taskHandler_ && abilityRecord->GetAbilityState() == AbilityState::TERMINATING) {
2055         taskHandler_->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
2056     }
2057     if (taskHandler_) {
2058         auto task = [abilityRecord, connectManager = shared_from_this(), currentUserId]() {
2059             connectManager->HandleAbilityDiedTask(abilityRecord, currentUserId);
2060         };
2061         taskHandler_->SubmitTask(task, TASK_ON_ABILITY_DIED);
2062     }
2063 }
2064 
OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf)2065 void AbilityConnectManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf)
2066 {
2067     auto abilityRecord = GetExtensionByIdFromServiceMap(abilityRecordId);
2068     if (abilityRecord == nullptr) {
2069         TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
2070         return;
2071     }
2072     PrintTimeOutLog(abilityRecord, msgId, isHalf);
2073     if (isHalf) {
2074         return;
2075     }
2076     switch (msgId) {
2077         case AbilityManagerService::LOAD_TIMEOUT_MSG:
2078             HandleStartTimeoutTask(abilityRecord);
2079             break;
2080         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
2081             HandleInactiveTimeout(abilityRecord);
2082             break;
2083         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
2084             HandleForegroundTimeoutTask(abilityRecord);
2085             break;
2086         default:
2087             break;
2088     }
2089 }
2090 
HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)2091 void AbilityConnectManager::HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)
2092 {
2093     TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleInactiveTimeout start");
2094     CHECK_POINTER(ability);
2095     if (ability->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
2096         TAG_LOGD(AAFwkTag::ABILITYMGR, "Handle root launcher inactive timeout.");
2097         // terminate the timeout root launcher.
2098         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
2099     }
2100     if (ability->GetAbilityInfo().name == AbilityConfig::CALLUI_ABILITY_NAME && ability->GetStartId() == 0) {
2101         HandleConnectTimeoutTask(ability);
2102         EventInfo eventInfo;
2103         eventInfo.userId = userId_;
2104         eventInfo.bundleName = ability->GetAbilityInfo().bundleName;
2105         eventInfo.moduleName = ability->GetAbilityInfo().moduleName;
2106         eventInfo.abilityName = ability->GetAbilityInfo().name;
2107         eventInfo.abilityName = ability->GetAbilityInfo().name;
2108         eventInfo.errCode = CONNECTION_TIMEOUT;
2109         EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2110     }
2111 
2112     TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleInactiveTimeout end");
2113 }
2114 
IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)2115 bool AbilityConnectManager::IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)
2116 {
2117     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2118     CHECK_POINTER_AND_RETURN(abilityRecord, false);
2119     const auto &abilityInfo = abilityRecord->GetAbilityInfo();
2120     if (IsSpecialAbility(abilityInfo)) {
2121         return true;
2122     }
2123 
2124     return abilityRecord->IsKeepAliveBundle();
2125 }
2126 
ClearPreloadUIExtensionRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)2127 void AbilityConnectManager::ClearPreloadUIExtensionRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2128 {
2129     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2130     CHECK_POINTER(abilityRecord);
2131     auto extensionRecordId = abilityRecord->GetUIExtensionAbilityId();
2132     std::string hostBundleName;
2133     auto ret = uiExtensionAbilityRecordMgr_->GetHostBundleNameForExtensionId(extensionRecordId, hostBundleName);
2134     if (ret != ERR_OK) {
2135         TAG_LOGE(AAFwkTag::ABILITYMGR, "GetHostBundleNameForExtensionId fail");
2136         return;
2137     }
2138     auto extensionRecordMapKey = std::make_tuple(abilityRecord->GetWant().GetElement().GetAbilityName(),
2139         abilityRecord->GetWant().GetElement().GetBundleName(),
2140         abilityRecord->GetWant().GetElement().GetModuleName(), hostBundleName);
2141     uiExtensionAbilityRecordMgr_->RemovePreloadUIExtensionRecordById(extensionRecordMapKey, extensionRecordId);
2142 }
2143 
KeepAbilityAlive(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)2144 void AbilityConnectManager::KeepAbilityAlive(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2145 {
2146     CHECK_POINTER(abilityRecord);
2147     auto abilityInfo = abilityRecord->GetAbilityInfo();
2148     TAG_LOGI(AAFwkTag::ABILITYMGR, "restart ability, bundleName: %{public}s, abilityName: %{public}s",
2149         abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
2150     auto token = abilityRecord->GetToken();
2151     if ((IsLauncher(abilityRecord) || abilityRecord->IsSceneBoard()) && token != nullptr) {
2152         IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->ClearProcessByToken(
2153             token->AsObject()));
2154         if (abilityRecord->IsSceneBoard() && currentUserId != userId_) {
2155             TAG_LOGI(AAFwkTag::ABILITYMGR, "not current user's SCB, clear user and not restart");
2156             KillProcessesByUserId();
2157             return;
2158         }
2159     }
2160 
2161     if (userId_ != USER_ID_NO_HEAD && userId_ != currentUserId) {
2162         TAG_LOGI(AAFwkTag::ABILITYMGR, "Not current user's ability");
2163         return;
2164     }
2165 
2166     if (abilityRecord->IsSceneBoard() && AmsConfigurationParameter::GetInstance().IsSupportSCBCrashReboot()) {
2167         static int sceneBoardCrashCount = 0;
2168         static int64_t tickCount = GetTickCount();
2169         int64_t tickNow = GetTickCount();
2170         const int64_t maxTime = 240000; // 240000 4min
2171         const int maxCount = 4; // 4: crash happened 4 times during 4 mins
2172         if (tickNow - tickCount > maxTime) {
2173             sceneBoardCrashCount = 0;
2174             tickCount = tickNow;
2175         }
2176         ++sceneBoardCrashCount;
2177         if (sceneBoardCrashCount >= maxCount) {
2178             std::string reason = "SceneBoard exits " + std::to_string(sceneBoardCrashCount) +
2179                 "times in " + std::to_string(maxTime) + "ms";
2180             DoRebootExt("panic", reason.c_str());
2181         }
2182     }
2183 
2184     if (DelayedSingleton<AppScheduler>::GetInstance()->IsKilledForUpgradeWeb(abilityInfo.bundleName)) {
2185         TAG_LOGI(AAFwkTag::ABILITYMGR, "bundle killed");
2186         return;
2187     }
2188     if (DelayedSingleton<AppScheduler>::GetInstance()->IsMemorySizeSufficent() ||
2189         IsLauncher(abilityRecord) || abilityRecord->IsSceneBoard() ||
2190         AppUtils::GetInstance().IsAllowResidentInExtremeMemory(abilityInfo.bundleName, abilityInfo.name)) {
2191         RestartAbility(abilityRecord, currentUserId);
2192     }
2193 }
2194 
HandleAbilityDiedTask( const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)2195 void AbilityConnectManager::HandleAbilityDiedTask(
2196     const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2197 {
2198     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2199     std::lock_guard guard(serialMutex_);
2200     CHECK_POINTER(abilityRecord);
2201     TAG_LOGI(AAFwkTag::ABILITYMGR, "ability died: %{public}s", abilityRecord->GetURI().c_str());
2202     abilityRecord->SetConnRemoteObject(nullptr);
2203     ConnectListType connlist = abilityRecord->GetConnectRecordList();
2204     for (auto &connectRecord : connlist) {
2205         TAG_LOGW(AAFwkTag::ABILITYMGR, "record complete disconnect. recordId:%{public}d",
2206             connectRecord->GetRecordId());
2207         RemoveExtensionDelayDisconnectTask(connectRecord);
2208         connectRecord->CompleteDisconnect(ERR_OK, false, true);
2209         abilityRecord->RemoveConnectRecordFromList(connectRecord);
2210         RemoveConnectionRecordFromMap(connectRecord);
2211     }
2212 
2213     if (IsUIExtensionAbility(abilityRecord)) {
2214         HandleUIExtensionDied(abilityRecord);
2215     }
2216 
2217     std::string serviceKey = GetServiceKey(abilityRecord);
2218     if (GetServiceRecordByElementName(serviceKey) == nullptr) {
2219         TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s ability record is not exist in service map.", serviceKey.c_str());
2220         return;
2221     }
2222 
2223     bool isRemove = false;
2224     if (IsCacheExtensionAbilityType(abilityRecord) &&
2225         AbilityCacheManager::GetInstance().FindRecordByToken(abilityRecord->GetToken()) != nullptr) {
2226         AbilityCacheManager::GetInstance().Remove(abilityRecord);
2227         MoveToTerminatingMap(abilityRecord);
2228         RemoveServiceAbility(abilityRecord);
2229         isRemove = true;
2230     } else if (GetExtensionByIdFromServiceMap(abilityRecord->GetAbilityRecordId()) != nullptr) {
2231         MoveToTerminatingMap(abilityRecord);
2232         RemoveServiceAbility(abilityRecord);
2233         if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
2234             RemoveUIExtensionAbilityRecord(abilityRecord);
2235         }
2236         isRemove = true;
2237     }
2238 
2239     if (IsAbilityNeedKeepAlive(abilityRecord)) {
2240         KeepAbilityAlive(abilityRecord, currentUserId);
2241     } else {
2242         if (isRemove) {
2243             HandleNotifyAssertFaultDialogDied(abilityRecord);
2244         }
2245     }
2246 }
2247 
CheckIsNumString(const std::string &numStr)2248 static bool CheckIsNumString(const std::string &numStr)
2249 {
2250     const std::regex regexJsperf(R"(^\d*)");
2251     std::match_results<std::string::const_iterator> matchResults;
2252     if (numStr.empty() || !std::regex_match(numStr, matchResults, regexJsperf)) {
2253         TAG_LOGE(AAFwkTag::ABILITYMGR, "error, %{public}s", numStr.c_str());
2254         return false;
2255     }
2256     if (MAX_UINT64_VALUE.length() < numStr.length() ||
2257         (MAX_UINT64_VALUE.length() == numStr.length() && MAX_UINT64_VALUE.compare(numStr) < 0)) {
2258         TAG_LOGE(AAFwkTag::ABILITYMGR, "error, %{public}s", numStr.c_str());
2259         return false;
2260     }
2261 
2262     return true;
2263 }
2264 
HandleNotifyAssertFaultDialogDied(const std::shared_ptr<AbilityRecord> &abilityRecord)2265 void AbilityConnectManager::HandleNotifyAssertFaultDialogDied(const std::shared_ptr<AbilityRecord> &abilityRecord)
2266 {
2267     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2268     CHECK_POINTER(abilityRecord);
2269     if (abilityRecord->GetAbilityInfo().name != ABILITY_NAME_ASSERT_FAULT_DIALOG ||
2270         abilityRecord->GetAbilityInfo().bundleName != BUNDLE_NAME_DIALOG) {
2271         TAG_LOGE(AAFwkTag::ABILITYMGR, "not assert fault dialog");
2272         return;
2273     }
2274 
2275     auto want = abilityRecord->GetWant();
2276     auto assertSessionStr = want.GetStringParam(Want::PARAM_ASSERT_FAULT_SESSION_ID);
2277     if (!CheckIsNumString(assertSessionStr)) {
2278         TAG_LOGE(AAFwkTag::ABILITYMGR, "assertSessionStr not number");
2279         return;
2280     }
2281 
2282     auto callbackDeathMgr = DelayedSingleton<AbilityRuntime::AssertFaultCallbackDeathMgr>::GetInstance();
2283     if (callbackDeathMgr == nullptr) {
2284         TAG_LOGE(AAFwkTag::ABILITYMGR, "null callbackDeathMgr");
2285         return;
2286     }
2287     callbackDeathMgr->CallAssertFaultCallback(std::stoull(assertSessionStr));
2288 }
2289 
CloseAssertDialog(const std::string &assertSessionId)2290 void AbilityConnectManager::CloseAssertDialog(const std::string &assertSessionId)
2291 {
2292     TAG_LOGD(AAFwkTag::ABILITYMGR, "Called");
2293     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2294     {
2295         std::lock_guard lock(serviceMapMutex_);
2296         for (const auto &item : serviceMap_) {
2297             if (item.second == nullptr) {
2298                 continue;
2299             }
2300 
2301             auto assertSessionStr = item.second->GetWant().GetStringParam(Want::PARAM_ASSERT_FAULT_SESSION_ID);
2302             if (assertSessionStr == assertSessionId) {
2303                 abilityRecord = item.second;
2304                 serviceMap_.erase(item.first);
2305                 break;
2306             }
2307         }
2308     }
2309     if (abilityRecord == nullptr) {
2310         abilityRecord = AbilityCacheManager::GetInstance().FindRecordBySessionId(assertSessionId);
2311         AbilityCacheManager::GetInstance().Remove(abilityRecord);
2312     }
2313     if (abilityRecord == nullptr) {
2314         return;
2315     }
2316     TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate assert fault dialog");
2317     terminatingExtensionList_.push_back(abilityRecord);
2318     sptr<IRemoteObject> token = abilityRecord->GetToken();
2319     if (token != nullptr) {
2320         std::lock_guard lock(serialMutex_);
2321         TerminateAbilityLocked(token);
2322     }
2323 }
2324 
HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> &abilityRecord)2325 void AbilityConnectManager::HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> &abilityRecord)
2326 {
2327     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2328     CHECK_POINTER(abilityRecord);
2329     std::lock_guard guard(uiExtensionMapMutex_);
2330     for (auto it = uiExtensionMap_.begin(); it != uiExtensionMap_.end();) {
2331         std::shared_ptr<AbilityRecord> uiExtAbility = it->second.first.lock();
2332         if (uiExtAbility == nullptr) {
2333             TAG_LOGW(AAFwkTag::ABILITYMGR, "uiExtAbility null");
2334             RemoveUIExtWindowDeathRecipient(it->first);
2335             it = uiExtensionMap_.erase(it);
2336             continue;
2337         }
2338 
2339         if (abilityRecord == uiExtAbility) {
2340             sptr<Rosen::ISession> sessionProxy = iface_cast<Rosen::ISession>(it->first);
2341             if (sessionProxy) {
2342                 TAG_LOGD(AAFwkTag::ABILITYMGR, "start NotifyExtensionDied");
2343                 sessionProxy->NotifyExtensionDied();
2344             }
2345             TAG_LOGW(AAFwkTag::UI_EXT, "uiExtAbility died");
2346             RemoveUIExtWindowDeathRecipient(it->first);
2347             it = uiExtensionMap_.erase(it);
2348             continue;
2349         }
2350         ++it;
2351     }
2352 }
2353 
RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)2354 void AbilityConnectManager::RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2355 {
2356     TAG_LOGI(AAFwkTag::ABILITYMGR, "restart ability: %{public}s", abilityRecord->GetURI().c_str());
2357     AbilityRequest requestInfo;
2358     requestInfo.want = abilityRecord->GetWant();
2359     requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
2360     requestInfo.appInfo = abilityRecord->GetApplicationInfo();
2361     requestInfo.restartTime = abilityRecord->GetRestartTime();
2362     requestInfo.restart = true;
2363     requestInfo.uid = abilityRecord->GetUid();
2364     abilityRecord->SetRestarting(true);
2365     ResidentAbilityInfoGuard residentAbilityInfoGuard;
2366     if (abilityRecord->IsKeepAliveBundle()) {
2367         residentAbilityInfoGuard.SetResidentAbilityInfo(requestInfo.abilityInfo.bundleName,
2368             requestInfo.abilityInfo.name, userId_);
2369     }
2370 
2371     if (AppUtils::GetInstance().IsLauncherAbility(abilityRecord->GetAbilityInfo().name)) {
2372         if (currentUserId != userId_) {
2373             TAG_LOGW(AAFwkTag::ABILITYMGR, "delay restart root launcher until switch user");
2374             return;
2375         }
2376         if (abilityRecord->IsSceneBoard()) {
2377             requestInfo.want.SetParam("ohos.app.recovery", true);
2378             DelayedSingleton<AbilityManagerService>::GetInstance()->EnableListForSCBRecovery(userId_);
2379         }
2380         requestInfo.restartCount = abilityRecord->GetRestartCount();
2381         TAG_LOGD(AAFwkTag::ABILITYMGR, "restart root launcher, number:%{public}d", requestInfo.restartCount);
2382         StartAbilityLocked(requestInfo);
2383         return;
2384     }
2385 
2386     requestInfo.want.SetParam(WANT_PARAMS_APP_RESTART_FLAG, true);
2387 
2388     // restart other resident ability
2389     if (abilityRecord->CanRestartResident()) {
2390         requestInfo.restartCount = abilityRecord->GetRestartCount();
2391         requestInfo.restartTime = AbilityUtil::SystemTimeMillis();
2392         StartAbilityLocked(requestInfo);
2393     } else {
2394         auto findRestartResidentTask = [requestInfo](const AbilityRequest &abilityRequest) {
2395             return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
2396                 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
2397                 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
2398         };
2399         auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(),
2400             findRestartResidentTask);
2401         if (findIter != restartResidentTaskList_.end()) {
2402             TAG_LOGW(AAFwkTag::ABILITYMGR, "restart task registered");
2403             return;
2404         }
2405         restartResidentTaskList_.emplace_back(requestInfo);
2406         PostRestartResidentTask(requestInfo);
2407     }
2408 }
2409 
GetServiceKey(const std::shared_ptr<AbilityRecord> &service)2410 std::string AbilityConnectManager::GetServiceKey(const std::shared_ptr<AbilityRecord> &service)
2411 {
2412     std::string serviceKey = service->GetURI();
2413     if (FRS_BUNDLE_NAME == service->GetAbilityInfo().bundleName) {
2414         serviceKey = serviceKey + std::to_string(service->GetWant().GetIntParam(FRS_APP_INDEX, 0));
2415     }
2416     return serviceKey;
2417 }
2418 
DumpState(std::vector<std::string> &info, bool isClient, const std::string &args)2419 void AbilityConnectManager::DumpState(std::vector<std::string> &info, bool isClient, const std::string &args)
2420 {
2421     TAG_LOGI(AAFwkTag::ABILITYMGR, "args:%{public}s", args.c_str());
2422     auto serviceMapBack = GetServiceMap();
2423     auto cacheList = AbilityCacheManager::GetInstance().GetAbilityList();
2424     if (!args.empty()) {
2425         auto it = std::find_if(serviceMapBack.begin(), serviceMapBack.end(), [&args](const auto &service) {
2426             return service.first.compare(args) == 0;
2427         });
2428         if (it != serviceMapBack.end()) {
2429             info.emplace_back("uri [ " + it->first + " ]");
2430             if (it->second != nullptr) {
2431                 it->second->DumpService(info, isClient);
2432             }
2433         } else {
2434             info.emplace_back(args + ": Nothing to dump from serviceMap.");
2435         }
2436 
2437         std::string serviceKey;
2438         auto iter = std::find_if(cacheList.begin(), cacheList.end(), [&args, &serviceKey, this](const auto &service) {
2439             serviceKey = GetServiceKey(service);
2440             return serviceKey.compare(args) == 0;
2441         });
2442         if (iter != cacheList.end()) {
2443             info.emplace_back("uri [ " + serviceKey + " ]");
2444             if (*iter != nullptr) {
2445                 (*iter)->DumpService(info, isClient);
2446             }
2447         } else {
2448             info.emplace_back(args + ": Nothing to dump from lru cache.");
2449         }
2450     } else {
2451         info.emplace_back("  ExtensionRecords:");
2452         for (auto &&service : serviceMapBack) {
2453             info.emplace_back("    uri [" + service.first + "]");
2454             if (service.second != nullptr) {
2455                 service.second->DumpService(info, isClient);
2456             }
2457         }
2458         for (auto &&service : cacheList) {
2459             std::string serviceKey = GetServiceKey(service);
2460             info.emplace_back("    uri [" + serviceKey + "]");
2461             if (service != nullptr) {
2462                 service->DumpService(info, isClient);
2463             }
2464         }
2465     }
2466 }
2467 
DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args, std::vector<std::string> &params)2468 void AbilityConnectManager::DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args,
2469     std::vector<std::string> &params)
2470 {
2471     TAG_LOGI(AAFwkTag::ABILITYMGR, "args:%{public}s, params size: %{public}zu", args.c_str(), params.size());
2472     std::shared_ptr<AbilityRecord> extensionAbilityRecord = nullptr;
2473     {
2474         std::lock_guard lock(serviceMapMutex_);
2475         auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
2476             return service.first.compare(args) == 0;
2477         });
2478         if (it != serviceMap_.end()) {
2479             info.emplace_back("uri [ " + it->first + " ]");
2480             extensionAbilityRecord = it->second;
2481         } else {
2482             info.emplace_back(args + ": Nothing to dump from serviceMap.");
2483         }
2484     }
2485     if (extensionAbilityRecord != nullptr) {
2486         extensionAbilityRecord->DumpService(info, params, isClient);
2487         return;
2488     }
2489     extensionAbilityRecord = AbilityCacheManager::GetInstance().FindRecordByServiceKey(args);
2490     if (extensionAbilityRecord != nullptr) {
2491         info.emplace_back("uri [ " + args + " ]");
2492         extensionAbilityRecord->DumpService(info, params, isClient);
2493     } else {
2494         info.emplace_back(args + ": Nothing to dump from lru cache.");
2495     }
2496 }
2497 
GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info, const int32_t userId, bool isPerm)2498 void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info,
2499     const int32_t userId, bool isPerm)
2500 {
2501     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2502     auto serviceMapBack = GetServiceMap();
2503     auto queryInfo = [&](ServiceMapType::reference service) {
2504         if (static_cast<int>(info.size()) >= upperLimit) {
2505             return;
2506         }
2507         auto abilityRecord = service.second;
2508         CHECK_POINTER(abilityRecord);
2509 
2510         if (isPerm) {
2511             GetExtensionRunningInfo(abilityRecord, userId, info);
2512         } else {
2513             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2514             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2515             if (callingTokenId == tokenID) {
2516                 GetExtensionRunningInfo(abilityRecord, userId, info);
2517             }
2518         }
2519     };
2520     std::for_each(serviceMapBack.begin(), serviceMapBack.end(), queryInfo);
2521 
2522     auto cacheAbilityList = AbilityCacheManager::GetInstance().GetAbilityList();
2523     auto queryInfoForCache = [&](std::shared_ptr<AbilityRecord> &service) {
2524         if (static_cast<int>(info.size()) >= upperLimit) {
2525             return;
2526         }
2527         CHECK_POINTER(service);
2528 
2529         if (isPerm) {
2530             GetExtensionRunningInfo(service, userId, info);
2531         } else {
2532             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2533             auto tokenID = service->GetApplicationInfo().accessTokenId;
2534             if (callingTokenId == tokenID) {
2535                 GetExtensionRunningInfo(service, userId, info);
2536             }
2537         }
2538     };
2539     std::for_each(cacheAbilityList.begin(), cacheAbilityList.end(), queryInfoForCache);
2540 }
2541 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)2542 void AbilityConnectManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
2543 {
2544     auto serviceMapBack = GetServiceMap();
2545     auto queryInfo = [&info, isPerm](ServiceMapType::reference service) {
2546         auto abilityRecord = service.second;
2547         CHECK_POINTER(abilityRecord);
2548 
2549         if (isPerm) {
2550             DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2551         } else {
2552             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2553             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2554             if (callingTokenId == tokenID) {
2555                 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2556             }
2557         }
2558     };
2559 
2560     std::for_each(serviceMapBack.begin(), serviceMapBack.end(), queryInfo);
2561 }
2562 
GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord, const int32_t userId, std::vector<ExtensionRunningInfo> &info)2563 void AbilityConnectManager::GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord,
2564     const int32_t userId, std::vector<ExtensionRunningInfo> &info)
2565 {
2566     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2567     ExtensionRunningInfo extensionInfo;
2568     AppExecFwk::RunningProcessInfo processInfo;
2569     extensionInfo.extension = abilityRecord->GetElementName();
2570     extensionInfo.type = abilityRecord->GetAbilityInfo().extensionAbilityType;
2571     DelayedSingleton<AppScheduler>::GetInstance()->
2572         GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
2573     extensionInfo.pid = processInfo.pid_;
2574     extensionInfo.uid = processInfo.uid_;
2575     extensionInfo.processName = processInfo.processName_;
2576     extensionInfo.startTime = abilityRecord->GetStartTime();
2577     ConnectListType connectRecordList = abilityRecord->GetConnectRecordList();
2578     for (auto &connectRecord : connectRecordList) {
2579         if (connectRecord == nullptr) {
2580             TAG_LOGD(AAFwkTag::ABILITYMGR, "connectRecord is nullptr.");
2581             continue;
2582         }
2583         auto callerAbilityRecord = Token::GetAbilityRecordByToken(connectRecord->GetToken());
2584         if (callerAbilityRecord == nullptr) {
2585             TAG_LOGD(AAFwkTag::ABILITYMGR, "callerAbilityRecord is nullptr.");
2586             continue;
2587         }
2588         std::string package = callerAbilityRecord->GetAbilityInfo().bundleName;
2589         extensionInfo.clientPackage.emplace_back(package);
2590     }
2591     info.emplace_back(extensionInfo);
2592 }
2593 
PauseExtensions()2594 void AbilityConnectManager::PauseExtensions()
2595 {
2596     TAG_LOGD(AAFwkTag::ABILITYMGR, "begin.");
2597     std::vector<sptr<IRemoteObject>> needTerminatedTokens;
2598     {
2599         std::lock_guard lock(serviceMapMutex_);
2600         for (auto it = serviceMap_.begin(); it != serviceMap_.end();) {
2601             auto targetExtension = it->second;
2602             if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION &&
2603                 (IsLauncher(targetExtension) || targetExtension->IsSceneBoard() ||
2604                 (targetExtension->GetKeepAlive() && userId_ != USER_ID_NO_HEAD))) {
2605                 terminatingExtensionList_.push_back(it->second);
2606                 it = serviceMap_.erase(it);
2607                 TAG_LOGI(AAFwkTag::ABILITYMGR, "terminate ability:%{public}s",
2608                     targetExtension->GetAbilityInfo().name.c_str());
2609                 needTerminatedTokens.push_back(targetExtension->GetToken());
2610             } else {
2611                 ++it;
2612             }
2613         }
2614     }
2615 
2616     for (const auto &token : needTerminatedTokens) {
2617         std::lock_guard lock(serialMutex_);
2618         TerminateAbilityLocked(token);
2619     }
2620 }
2621 
RemoveLauncherDeathRecipient()2622 void AbilityConnectManager::RemoveLauncherDeathRecipient()
2623 {
2624     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
2625     {
2626         std::lock_guard lock(serviceMapMutex_);
2627         for (auto it = serviceMap_.begin(); it != serviceMap_.end(); ++it) {
2628             auto targetExtension = it->second;
2629             if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION &&
2630                 (IsLauncher(targetExtension) || targetExtension->IsSceneBoard())) {
2631                 targetExtension->RemoveAbilityDeathRecipient();
2632                 return;
2633             }
2634         }
2635     }
2636     AbilityCacheManager::GetInstance().RemoveLauncherDeathRecipient();
2637 }
2638 
IsLauncher(std::shared_ptr<AbilityRecord> serviceExtension) const2639 bool AbilityConnectManager::IsLauncher(std::shared_ptr<AbilityRecord> serviceExtension) const
2640 {
2641     if (serviceExtension == nullptr) {
2642         TAG_LOGE(AAFwkTag::ABILITYMGR, "param null");
2643         return false;
2644     }
2645     return serviceExtension->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME &&
2646         serviceExtension->GetAbilityInfo().bundleName == AbilityConfig::LAUNCHER_BUNDLE_NAME;
2647 }
2648 
KillProcessesByUserId() const2649 void AbilityConnectManager::KillProcessesByUserId() const
2650 {
2651     auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
2652     if (appScheduler == nullptr) {
2653         TAG_LOGE(AAFwkTag::ABILITYMGR, "appScheduler null");
2654         return;
2655     }
2656     IN_PROCESS_CALL_WITHOUT_RET(appScheduler->KillProcessesByUserId(userId_));
2657 }
2658 
MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)2659 void AbilityConnectManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
2660 {
2661     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2662     if (abilityRecord == nullptr) {
2663         TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
2664         return;
2665     }
2666     TAG_LOGD(AAFwkTag::ABILITYMGR, "Move the ui extension ability to background, ability:%{public}s.",
2667         abilityRecord->GetAbilityInfo().name.c_str());
2668     abilityRecord->SetIsNewWant(false);
2669 
2670     auto self(weak_from_this());
2671     auto task = [abilityRecord, self]() {
2672         auto selfObj = self.lock();
2673         if (selfObj == nullptr) {
2674             TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr invalid");
2675             return;
2676         }
2677         CHECK_POINTER(abilityRecord);
2678         if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType) &&
2679             selfObj->uiExtensionAbilityRecordMgr_ != nullptr && selfObj->IsCallerValid(abilityRecord)) {
2680             TAG_LOGD(AAFwkTag::ABILITYMGR, "Start background timeout.");
2681             selfObj->uiExtensionAbilityRecordMgr_->BackgroundTimeout(abilityRecord->GetUIExtensionAbilityId());
2682         }
2683         TAG_LOGE(AAFwkTag::ABILITYMGR, "move timeout");
2684         selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
2685         selfObj->CompleteBackground(abilityRecord);
2686     };
2687     abilityRecord->BackgroundAbility(task);
2688 }
2689 
CompleteForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)2690 void AbilityConnectManager::CompleteForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
2691 {
2692     std::lock_guard guard(serialMutex_);
2693     if (abilityRecord == nullptr) {
2694         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
2695         return;
2696     }
2697     if (abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
2698         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability state: %{public}d, not complete foreground",
2699             abilityRecord->GetAbilityState());
2700         return;
2701     }
2702 
2703     abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
2704     if (abilityRecord->BackgroundAbilityWindowDelayed()) {
2705         TAG_LOGI(AAFwkTag::ABILITYMGR, "response background request");
2706         abilityRecord->DoBackgroundAbilityWindowDelayed(false);
2707         DoBackgroundAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo());
2708     }
2709     CompleteStartServiceReq(abilityRecord->GetURI());
2710 }
2711 
HandleForegroundTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)2712 void AbilityConnectManager::HandleForegroundTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
2713 {
2714     std::lock_guard guard(serialMutex_);
2715     if (abilityRecord == nullptr) {
2716         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
2717         return;
2718     }
2719     if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType) &&
2720         uiExtensionAbilityRecordMgr_ != nullptr && IsCallerValid(abilityRecord)) {
2721         TAG_LOGW(AAFwkTag::ABILITYMGR, "start foreground timeout");
2722         uiExtensionAbilityRecordMgr_->ForegroundTimeout(abilityRecord->GetUIExtensionAbilityId());
2723     }
2724     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
2725     abilityRecord->DoBackgroundAbilityWindowDelayed(false);
2726     CompleteStartServiceReq(abilityRecord->GetURI());
2727 }
2728 
CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)2729 void AbilityConnectManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
2730 {
2731     std::lock_guard lock(serialMutex_);
2732     if (abilityRecord == nullptr) {
2733         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
2734         return;
2735     }
2736     if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
2737         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability state: %{public}d, not complete background.",
2738             abilityRecord->GetAbilityState());
2739         return;
2740     }
2741     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
2742     // send application state to AppMS.
2743     // notify AppMS to update application state.
2744     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
2745     CompleteStartServiceReq(abilityRecord->GetURI());
2746     // Abilities ahead of the one started were put in terminate list, we need to terminate them.
2747     TerminateAbilityLocked(abilityRecord->GetToken());
2748 }
2749 
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId, bool isHalf)2750 void AbilityConnectManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId, bool isHalf)
2751 {
2752     CHECK_POINTER(ability);
2753     AppExecFwk::RunningProcessInfo processInfo = {};
2754     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
2755     if (processInfo.pid_ == 0) {
2756         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability %{public}s pid invalid", ability->GetURI().c_str());
2757         return;
2758     }
2759     int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
2760     std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
2761     switch (msgId) {
2762         case AbilityManagerService::LOAD_TIMEOUT_MSG:
2763             msgContent += "load timeout";
2764             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
2765             break;
2766         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
2767             msgContent += "active timeout";
2768             break;
2769         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
2770             msgContent += "inactive timeout";
2771             break;
2772         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
2773             msgContent += "foreground timeout";
2774             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
2775             break;
2776         case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
2777             msgContent += "background timeout";
2778             break;
2779         case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
2780             msgContent += "terminate timeout";
2781             break;
2782         default:
2783             return;
2784     }
2785 
2786     TAG_LOGW(AAFwkTag::ABILITYMGR,
2787         "LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
2788         "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
2789         ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
2790     std::string eventName = isHalf ?
2791         AppExecFwk::AppFreezeType::LIFECYCLE_HALF_TIMEOUT : AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
2792     AppExecFwk::AppfreezeManager::ParamInfo info = {
2793         .typeId = typeId,
2794         .pid = processInfo.pid_,
2795         .eventName = eventName,
2796         .bundleName = ability->GetAbilityInfo().bundleName,
2797         .msg = msgContent
2798     };
2799     AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info);
2800 }
2801 
MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)2802 void AbilityConnectManager::MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)
2803 {
2804     CHECK_POINTER(abilityRecord);
2805     auto& abilityInfo = abilityRecord->GetAbilityInfo();
2806     std::lock_guard lock(serviceMapMutex_);
2807     terminatingExtensionList_.push_back(abilityRecord);
2808     std::string serviceKey = abilityRecord->GetURI();
2809     if (FRS_BUNDLE_NAME == abilityInfo.bundleName) {
2810         AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
2811             abilityInfo.moduleName);
2812         serviceKey = element.GetURI() + std::to_string(abilityRecord->GetWant().GetIntParam(FRS_APP_INDEX, 0));
2813     }
2814     if (serviceMap_.erase(serviceKey) == 0) {
2815         TAG_LOGW(AAFwkTag::ABILITYMGR, "Unknown: %{public}s", serviceKey.c_str());
2816     }
2817     AbilityCacheManager::GetInstance().Remove(abilityRecord);
2818     if (IsSpecialAbility(abilityRecord->GetAbilityInfo())) {
2819         TAG_LOGI(AAFwkTag::ABILITYMGR, "moving ability: %{public}s", abilityRecord->GetURI().c_str());
2820     }
2821 }
2822 
AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)2823 void AbilityConnectManager::AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
2824 {
2825     CHECK_POINTER(session);
2826     std::lock_guard lock(uiExtRecipientMapMutex_);
2827     auto it = uiExtRecipientMap_.find(session);
2828     if (it != uiExtRecipientMap_.end()) {
2829         TAG_LOGE(AAFwkTag::ABILITYMGR, "recipient added before");
2830         return;
2831     } else {
2832         std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
2833         sptr<IRemoteObject::DeathRecipient> deathRecipient =
2834             new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
2835                 auto abilityConnectManager = thisWeakPtr.lock();
2836                 if (abilityConnectManager) {
2837                     abilityConnectManager->OnUIExtWindowDied(remote);
2838                 }
2839             });
2840         if (!session->AddDeathRecipient(deathRecipient)) {
2841             TAG_LOGE(AAFwkTag::ABILITYMGR, "AddDeathRecipient fail");
2842         }
2843         uiExtRecipientMap_.emplace(session, deathRecipient);
2844     }
2845 }
2846 
RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)2847 void AbilityConnectManager::RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
2848 {
2849     CHECK_POINTER(session);
2850     std::lock_guard lock(uiExtRecipientMapMutex_);
2851     auto it = uiExtRecipientMap_.find(session);
2852     if (it != uiExtRecipientMap_.end() && it->first != nullptr) {
2853         it->first->RemoveDeathRecipient(it->second);
2854         uiExtRecipientMap_.erase(it);
2855         return;
2856     }
2857 }
2858 
OnUIExtWindowDied(const wptr<IRemoteObject> &remote)2859 void AbilityConnectManager::OnUIExtWindowDied(const wptr<IRemoteObject> &remote)
2860 {
2861     auto object = remote.promote();
2862     CHECK_POINTER(object);
2863     if (taskHandler_) {
2864         auto task = [object, connectManager = shared_from_this()]() {
2865             connectManager->HandleUIExtWindowDiedTask(object);
2866         };
2867         taskHandler_->SubmitTask(task);
2868     }
2869 }
2870 
HandleUIExtWindowDiedTask(const sptr<IRemoteObject> &remote)2871 void AbilityConnectManager::HandleUIExtWindowDiedTask(const sptr<IRemoteObject> &remote)
2872 {
2873     TAG_LOGD(AAFwkTag::ABILITYMGR, "call.");
2874     CHECK_POINTER(remote);
2875     std::shared_ptr<AbilityRecord> abilityRecord;
2876     sptr<SessionInfo> sessionInfo;
2877     {
2878         std::lock_guard guard(uiExtensionMapMutex_);
2879         auto it = uiExtensionMap_.find(remote);
2880         if (it != uiExtensionMap_.end()) {
2881             abilityRecord = it->second.first.lock();
2882             sessionInfo = it->second.second;
2883             TAG_LOGW(AAFwkTag::UI_EXT, "uiExtAbility caller died");
2884             uiExtensionMap_.erase(it);
2885         } else {
2886             TAG_LOGI(AAFwkTag::ABILITYMGR, "not find");
2887             return;
2888         }
2889     }
2890 
2891     if (abilityRecord) {
2892         TerminateAbilityWindowLocked(abilityRecord, sessionInfo);
2893     } else {
2894         TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityRecord null");
2895     }
2896     RemoveUIExtWindowDeathRecipient(remote);
2897 }
2898 
IsUIExtensionFocused(uint32_t uiExtensionTokenId, const sptr<IRemoteObject>& focusToken)2899 bool AbilityConnectManager::IsUIExtensionFocused(uint32_t uiExtensionTokenId, const sptr<IRemoteObject>& focusToken)
2900 {
2901     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2902     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, false);
2903     std::lock_guard guard(uiExtensionMapMutex_);
2904     for (auto& item: uiExtensionMap_) {
2905         auto uiExtension = item.second.first.lock();
2906         auto sessionInfo = item.second.second;
2907         if (uiExtension && uiExtension->GetApplicationInfo().accessTokenId == uiExtensionTokenId) {
2908             if (sessionInfo && uiExtensionAbilityRecordMgr_->IsFocused(
2909                 uiExtension->GetUIExtensionAbilityId(), sessionInfo->callerToken, focusToken)) {
2910                 TAG_LOGD(AAFwkTag::ABILITYMGR, "Focused");
2911                 return true;
2912             }
2913             if (sessionInfo && sessionInfo->callerToken == focusToken) {
2914                 return true;
2915             }
2916         }
2917     }
2918     return false;
2919 }
2920 
GetUIExtensionSourceToken(const sptr<IRemoteObject> &token)2921 sptr<IRemoteObject> AbilityConnectManager::GetUIExtensionSourceToken(const sptr<IRemoteObject> &token)
2922 {
2923     TAG_LOGD(AAFwkTag::ABILITYMGR, "Called");
2924     std::lock_guard guard(uiExtensionMapMutex_);
2925     for (auto &item : uiExtensionMap_) {
2926         auto sessionInfo = item.second.second;
2927         auto uiExtension = item.second.first.lock();
2928         if (sessionInfo != nullptr && uiExtension != nullptr && uiExtension->GetToken() != nullptr &&
2929             uiExtension->GetToken()->AsObject() == token) {
2930             TAG_LOGD(AAFwkTag::ABILITYMGR, "The source token found.");
2931             return sessionInfo->callerToken;
2932         }
2933     }
2934     return nullptr;
2935 }
2936 
GetUIExtensionCallerTokenList(const std::shared_ptr<AbilityRecord> &abilityRecord, std::list<sptr<IRemoteObject>> &callerList)2937 void AbilityConnectManager::GetUIExtensionCallerTokenList(const std::shared_ptr<AbilityRecord> &abilityRecord,
2938     std::list<sptr<IRemoteObject>> &callerList)
2939 {
2940     CHECK_POINTER(uiExtensionAbilityRecordMgr_);
2941     uiExtensionAbilityRecordMgr_->GetCallerTokenList(abilityRecord, callerList);
2942 }
2943 
IsWindowExtensionFocused(uint32_t extensionTokenId, const sptr<IRemoteObject>& focusToken)2944 bool AbilityConnectManager::IsWindowExtensionFocused(uint32_t extensionTokenId, const sptr<IRemoteObject>& focusToken)
2945 {
2946     std::lock_guard guard(windowExtensionMapMutex_);
2947     for (auto& item: windowExtensionMap_) {
2948         uint32_t windowExtTokenId = item.second.first;
2949         auto sessionInfo = item.second.second;
2950         if (windowExtTokenId == extensionTokenId && sessionInfo && sessionInfo->callerToken == focusToken) {
2951             return true;
2952         }
2953     }
2954     return false;
2955 }
2956 
HandleProcessFrozen(const std::vector<int32_t> &pidList, int32_t uid)2957 void AbilityConnectManager::HandleProcessFrozen(const std::vector<int32_t> &pidList, int32_t uid)
2958 {
2959     auto taskHandler = taskHandler_;
2960     if (!taskHandler) {
2961         TAG_LOGE(AAFwkTag::ABILITYMGR, "taskHandler null");
2962         return;
2963     }
2964     TAG_LOGI(AAFwkTag::ABILITYMGR, "uid:%{public}d", uid);
2965     std::unordered_set<int32_t> pidSet(pidList.begin(), pidList.end());
2966     std::lock_guard lock(serviceMapMutex_);
2967     auto weakThis = weak_from_this();
2968     for (auto [key, abilityRecord] : serviceMap_) {
2969         if (abilityRecord && abilityRecord->GetUid() == uid &&
2970             abilityRecord->GetAbilityInfo().extensionAbilityType == AppExecFwk::ExtensionAbilityType::SERVICE &&
2971             pidSet.count(abilityRecord->GetPid()) > 0 &&
2972             abilityRecord->GetAbilityInfo().bundleName != FROZEN_WHITE_DIALOG &&
2973             abilityRecord->IsConnectListEmpty() &&
2974             !abilityRecord->GetKeepAlive()) {
2975             taskHandler->SubmitTask([weakThis, record = abilityRecord]() {
2976                     auto connectManager = weakThis.lock();
2977                     if (record && connectManager) {
2978                         TAG_LOGI(AAFwkTag::ABILITYMGR, "terminateRecord:%{public}s",
2979                             record->GetAbilityInfo().bundleName.c_str());
2980                         connectManager->TerminateRecord(record);
2981                     } else {
2982                         TAG_LOGE(AAFwkTag::ABILITYMGR, "connectManager null");
2983                     }
2984                 });
2985         }
2986     }
2987 }
2988 
PostExtensionDelayDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)2989 void AbilityConnectManager::PostExtensionDelayDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)
2990 {
2991     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2992     CHECK_POINTER(taskHandler_);
2993     CHECK_POINTER(connectRecord);
2994     int32_t recordId = connectRecord->GetRecordId();
2995     std::string taskName = std::string("DelayDisconnectTask_") + std::to_string(recordId);
2996 
2997     auto abilityRecord = connectRecord->GetAbilityRecord();
2998     CHECK_POINTER(abilityRecord);
2999     auto typeName = abilityRecord->GetAbilityInfo().extensionTypeName;
3000     int32_t delayTime = DelayedSingleton<ExtensionConfig>::GetInstance()->GetExtensionAutoDisconnectTime(typeName);
3001     if (delayTime == AUTO_DISCONNECT_INFINITY) {
3002         TAG_LOGD(AAFwkTag::ABILITYMGR, "This extension needn't auto disconnect.");
3003         return;
3004     }
3005 
3006     auto task = [connectRecord, self = weak_from_this()]() {
3007         auto selfObj = self.lock();
3008         if (selfObj == nullptr) {
3009             TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr invalid");
3010             return;
3011         }
3012         TAG_LOGW(AAFwkTag::ABILITYMGR, "auto disconnect the Extension's connection");
3013         selfObj->HandleExtensionDisconnectTask(connectRecord);
3014     };
3015     taskHandler_->SubmitTask(task, taskName, delayTime);
3016 }
3017 
RemoveExtensionDelayDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)3018 void AbilityConnectManager::RemoveExtensionDelayDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)
3019 {
3020     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
3021     CHECK_POINTER(taskHandler_);
3022     CHECK_POINTER(connectRecord);
3023     int32_t recordId = connectRecord->GetRecordId();
3024     std::string taskName = std::string("DelayDisconnectTask_") + std::to_string(recordId);
3025     taskHandler_->CancelTask(taskName);
3026 }
3027 
HandleExtensionDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)3028 void AbilityConnectManager::HandleExtensionDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)
3029 {
3030     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
3031     std::lock_guard guard(serialMutex_);
3032     CHECK_POINTER(connectRecord);
3033     int result = connectRecord->DisconnectAbility();
3034     if (result != ERR_OK) {
3035         TAG_LOGW(AAFwkTag::ABILITYMGR, "error, ret: %{public}d", result);
3036     }
3037     if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
3038         connectRecord->CompleteDisconnect(ERR_OK, false);
3039         RemoveConnectionRecordFromMap(connectRecord);
3040     }
3041 }
3042 
IsUIExtensionAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)3043 bool AbilityConnectManager::IsUIExtensionAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
3044 {
3045     CHECK_POINTER_AND_RETURN(abilityRecord, false);
3046     return UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType);
3047 }
3048 
IsCacheExtensionAbilityType(const std::shared_ptr<AbilityRecord> &abilityRecord)3049 bool AbilityConnectManager::IsCacheExtensionAbilityType(const std::shared_ptr<AbilityRecord> &abilityRecord)
3050 {
3051     CHECK_POINTER_AND_RETURN(abilityRecord, false);
3052     return CacheExtensionUtils::IsCacheExtensionType(abilityRecord->GetAbilityInfo().extensionAbilityType);
3053 }
3054 
CheckUIExtensionAbilitySessionExist( const std::shared_ptr<AbilityRecord> &abilityRecord)3055 bool AbilityConnectManager::CheckUIExtensionAbilitySessionExist(
3056     const std::shared_ptr<AbilityRecord> &abilityRecord)
3057 {
3058     CHECK_POINTER_AND_RETURN(abilityRecord, false);
3059     std::lock_guard guard(uiExtensionMapMutex_);
3060     for (auto it = uiExtensionMap_.begin(); it != uiExtensionMap_.end(); ++it) {
3061         std::shared_ptr<AbilityRecord> uiExtAbility = it->second.first.lock();
3062         if (abilityRecord == uiExtAbility) {
3063             return true;
3064         }
3065     }
3066 
3067     return false;
3068 }
3069 
RemoveUIExtensionAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)3070 void AbilityConnectManager::RemoveUIExtensionAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
3071 {
3072     CHECK_POINTER(abilityRecord);
3073     CHECK_POINTER(uiExtensionAbilityRecordMgr_);
3074     if (abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
3075         ClearPreloadUIExtensionRecord(abilityRecord);
3076     }
3077     uiExtensionAbilityRecordMgr_->RemoveExtensionRecord(abilityRecord->GetUIExtensionAbilityId());
3078 }
3079 
AddUIExtensionAbilityRecordToTerminatedList( const std::shared_ptr<AbilityRecord> &abilityRecord)3080 void AbilityConnectManager::AddUIExtensionAbilityRecordToTerminatedList(
3081     const std::shared_ptr<AbilityRecord> &abilityRecord)
3082 {
3083     CHECK_POINTER(abilityRecord);
3084     CHECK_POINTER(uiExtensionAbilityRecordMgr_);
3085     uiExtensionAbilityRecordMgr_->AddExtensionRecordToTerminatedList(abilityRecord->GetUIExtensionAbilityId());
3086 }
3087 
IsCallerValid(const std::shared_ptr<AbilityRecord> &abilityRecord)3088 bool AbilityConnectManager::IsCallerValid(const std::shared_ptr<AbilityRecord> &abilityRecord)
3089 {
3090     CHECK_POINTER_AND_RETURN_LOG(abilityRecord, false, "Invalid caller for UIExtension");
3091     auto sessionInfo = abilityRecord->GetSessionInfo();
3092     CHECK_POINTER_AND_RETURN_LOG(sessionInfo, false, "Invalid caller for UIExtension");
3093     CHECK_POINTER_AND_RETURN_LOG(sessionInfo->sessionToken, false, "Invalid caller for UIExtension");
3094     std::lock_guard lock(uiExtRecipientMapMutex_);
3095     if (uiExtRecipientMap_.find(sessionInfo->sessionToken) == uiExtRecipientMap_.end()) {
3096         TAG_LOGW(AAFwkTag::ABILITYMGR, "invalid caller for UIExtension");
3097         return false;
3098     }
3099 
3100     TAG_LOGD(AAFwkTag::ABILITYMGR, "The caller survival.");
3101     return true;
3102 }
3103 
GetUIExtensionRootHostInfo(const sptr<IRemoteObject> token)3104 std::shared_ptr<AAFwk::AbilityRecord> AbilityConnectManager::GetUIExtensionRootHostInfo(const sptr<IRemoteObject> token)
3105 {
3106     CHECK_POINTER_AND_RETURN(token, nullptr);
3107     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, nullptr);
3108     return uiExtensionAbilityRecordMgr_->GetUIExtensionRootHostInfo(token);
3109 }
3110 
GetUIExtensionSessionInfo(const sptr<IRemoteObject> token, UIExtensionSessionInfo &uiExtensionSessionInfo)3111 int32_t AbilityConnectManager::GetUIExtensionSessionInfo(const sptr<IRemoteObject> token,
3112     UIExtensionSessionInfo &uiExtensionSessionInfo)
3113 {
3114     CHECK_POINTER_AND_RETURN(token, ERR_NULL_OBJECT);
3115     CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
3116     return uiExtensionAbilityRecordMgr_->GetUIExtensionSessionInfo(token, uiExtensionSessionInfo);
3117 }
3118 
SignRestartAppFlag(int32_t uid)3119 void AbilityConnectManager::SignRestartAppFlag(int32_t uid)
3120 {
3121     {
3122         std::lock_guard lock(serviceMapMutex_);
3123         for (auto &[key, abilityRecord] : serviceMap_) {
3124             if (abilityRecord == nullptr || abilityRecord->GetUid() != uid) {
3125                 continue;
3126             }
3127             abilityRecord->SetRestartAppFlag(true);
3128         }
3129     }
3130     AbilityCacheManager::GetInstance().SignRestartAppFlag(uid);
3131 }
3132 
AddToServiceMap(const std::string &key, std::shared_ptr<AbilityRecord> abilityRecord)3133 bool AbilityConnectManager::AddToServiceMap(const std::string &key, std::shared_ptr<AbilityRecord> abilityRecord)
3134 {
3135     std::lock_guard lock(serviceMapMutex_);
3136     if (abilityRecord == nullptr) {
3137         return false;
3138     }
3139     auto insert = serviceMap_.emplace(key, abilityRecord);
3140     if (!insert.second) {
3141         TAG_LOGW(AAFwkTag::ABILITYMGR, "record exist: %{public}s", key.c_str());
3142     }
3143     return insert.second;
3144 }
3145 
GetServiceMap()3146 AbilityConnectManager::ServiceMapType AbilityConnectManager::GetServiceMap()
3147 {
3148     std::lock_guard lock(serviceMapMutex_);
3149     return serviceMap_;
3150 }
3151 
AddConnectObjectToMap(sptr<IRemoteObject> connectObject, const ConnectListType &connectRecordList, bool updateOnly)3152 void AbilityConnectManager::AddConnectObjectToMap(sptr<IRemoteObject> connectObject,
3153     const ConnectListType &connectRecordList, bool updateOnly)
3154 {
3155     if (!updateOnly) {
3156         AddConnectDeathRecipient(connectObject);
3157     }
3158     std::lock_guard guard(connectMapMutex_);
3159     connectMap_[connectObject] = connectRecordList;
3160 }
3161 
BuildEventInfo(const std::shared_ptr<AbilityRecord> &abilityRecord)3162 EventInfo AbilityConnectManager::BuildEventInfo(const std::shared_ptr<AbilityRecord> &abilityRecord)
3163 {
3164     EventInfo eventInfo;
3165     if (abilityRecord == nullptr) {
3166         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
3167         return eventInfo;
3168     }
3169     AppExecFwk::RunningProcessInfo processInfo;
3170     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
3171     eventInfo.pid = processInfo.pid_;
3172     eventInfo.processName = processInfo.processName_;
3173     eventInfo.time = std::chrono::duration_cast<std::chrono::milliseconds>(
3174         std::chrono::system_clock::now().time_since_epoch()).count();
3175     auto callerPid = abilityRecord->GetWant().GetIntParam(Want::PARAM_RESV_CALLER_PID, -1);
3176     eventInfo.callerPid = callerPid == -1 ? IPCSkeleton::GetCallingPid() : callerPid;
3177     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByPid(eventInfo.callerPid, processInfo);
3178     eventInfo.callerPid = processInfo.pid_;
3179     eventInfo.callerProcessName = processInfo.processName_;
3180     if (!abilityRecord->IsCreateByConnect()) {
3181         auto abilityInfo = abilityRecord->GetAbilityInfo();
3182         eventInfo.extensionType = static_cast<int32_t>(abilityInfo.extensionAbilityType);
3183         eventInfo.userId = userId_;
3184         eventInfo.bundleName = abilityInfo.bundleName;
3185         eventInfo.moduleName = abilityInfo.moduleName;
3186         eventInfo.abilityName = abilityInfo.name;
3187     }
3188     return eventInfo;
3189 }
3190 
UpdateUIExtensionInfo(const std::shared_ptr<AbilityRecord> &abilityRecord)3191 void AbilityConnectManager::UpdateUIExtensionInfo(const std::shared_ptr<AbilityRecord> &abilityRecord)
3192 {
3193     if (abilityRecord == nullptr ||
3194         !UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
3195         return;
3196     }
3197 
3198     WantParams wantParams;
3199     auto uiExtensionAbilityId = abilityRecord->GetUIExtensionAbilityId();
3200     wantParams.SetParam(UIEXTENSION_ABILITY_ID, AAFwk::Integer::Box(uiExtensionAbilityId));
3201     auto rootHostRecord = GetUIExtensionRootHostInfo(abilityRecord->GetToken());
3202     if (rootHostRecord != nullptr) {
3203         auto rootHostPid = rootHostRecord->GetPid();
3204         wantParams.SetParam(UIEXTENSION_ROOT_HOST_PID, AAFwk::Integer::Box(rootHostPid));
3205     }
3206     if (abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
3207         // Applicable only to preloadUIExtension scenarios
3208         auto rootHostPid = IPCSkeleton::GetCallingPid();
3209         wantParams.SetParam(UIEXTENSION_ROOT_HOST_PID, AAFwk::Integer::Box(rootHostPid));
3210     }
3211     abilityRecord->UpdateUIExtensionInfo(wantParams);
3212 }
3213 
GenerateBundleName(const AbilityRequest &abilityRequest) const3214 std::string AbilityConnectManager::GenerateBundleName(const AbilityRequest &abilityRequest) const
3215 {
3216     auto bundleName = abilityRequest.abilityInfo.bundleName;
3217     if (MultiInstanceUtils::IsMultiInstanceApp(abilityRequest.appInfo)) {
3218         bundleName = bundleName + '-' + MultiInstanceUtils::GetValidExtensionInstanceKey(abilityRequest);
3219         return bundleName;
3220     }
3221     if (AbilityRuntime::StartupUtil::IsSupportAppClone(abilityRequest.abilityInfo.extensionAbilityType)) {
3222         auto appCloneIndex = abilityRequest.want.GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, 0);
3223         if (appCloneIndex > 0) {
3224             bundleName = std::to_string(appCloneIndex) + bundleName;
3225         }
3226     }
3227     return bundleName;
3228 }
3229 
ReportXiaoYiToRSSIfNeeded(const AppExecFwk::AbilityInfo &abilityInfo)3230 int32_t AbilityConnectManager::ReportXiaoYiToRSSIfNeeded(const AppExecFwk::AbilityInfo &abilityInfo)
3231 {
3232     if (abilityInfo.type != AppExecFwk::AbilityType::EXTENSION ||
3233         abilityInfo.bundleName != XIAOYI_BUNDLE_NAME) {
3234         return ERR_OK;
3235     }
3236     TAG_LOGI(AAFwkTag::ABILITYMGR,
3237         "bundleName is extension, abilityName:%{public}s",
3238         abilityInfo.name.c_str());
3239     auto ret = ReportAbilityStartInfoToRSS(abilityInfo);
3240     if (ret != ERR_OK) {
3241         TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, ret:%{public}d", ret);
3242         return ret;
3243     }
3244     return ERR_OK;
3245 }
3246 
ReportAbilityStartInfoToRSS(const AppExecFwk::AbilityInfo &abilityInfo)3247 int32_t AbilityConnectManager::ReportAbilityStartInfoToRSS(const AppExecFwk::AbilityInfo &abilityInfo)
3248 {
3249     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3250     std::vector<AppExecFwk::RunningProcessInfo> runningProcessInfos;
3251     auto ret = IN_PROCESS_CALL(DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfos(
3252         runningProcessInfos));
3253     if (ret != ERR_OK) {
3254         return ret;
3255     }
3256     bool isColdStart = true;
3257     int32_t pid = 0;
3258     for (auto const &info : runningProcessInfos) {
3259         if (info.uid_ == abilityInfo.applicationInfo.uid) {
3260             isColdStart = false;
3261             pid = info.pid_;
3262             break;
3263         }
3264     }
3265     TAG_LOGI(AAFwkTag::ABILITYMGR, "ReportAbilityStartInfoToRSS, abilityName:%{public}s", abilityInfo.name.c_str());
3266     ResSchedUtil::GetInstance().ReportAbilityStartInfoToRSS(abilityInfo, pid, isColdStart);
3267     return ERR_OK;
3268 }
3269 
UninstallApp(const std::string &bundleName)3270 void AbilityConnectManager::UninstallApp(const std::string &bundleName)
3271 {
3272     std::lock_guard lock(serviceMapMutex_);
3273     for (const auto &[key, abilityRecord]: serviceMap_) {
3274         if (abilityRecord && abilityRecord->GetAbilityInfo().bundleName == bundleName) {
3275             abilityRecord->SetKeepAliveBundle(false);
3276         }
3277     }
3278 }
3279 
UpdateKeepAliveEnableState(const std::string &bundleName, const std::string &moduleName, const std::string &mainElement, bool updateEnable)3280 int32_t AbilityConnectManager::UpdateKeepAliveEnableState(const std::string &bundleName,
3281     const std::string &moduleName, const std::string &mainElement, bool updateEnable)
3282 {
3283     std::lock_guard lock(serviceMapMutex_);
3284     for (const auto &[key, abilityRecord]: serviceMap_) {
3285         CHECK_POINTER_AND_RETURN(abilityRecord, ERR_NULL_OBJECT);
3286         if (abilityRecord->GetAbilityInfo().bundleName == bundleName &&
3287             abilityRecord->GetAbilityInfo().name == mainElement &&
3288             abilityRecord->GetAbilityInfo().moduleName == moduleName) {
3289             TAG_LOGI(AAFwkTag::ABILITYMGR,
3290                 "update keepAlive,bundle:%{public}s,module:%{public}s,ability:%{public}s,enable:%{public}d",
3291                 bundleName.c_str(), moduleName.c_str(), mainElement.c_str(), updateEnable);
3292             abilityRecord->SetKeepAliveBundle(updateEnable);
3293             return ERR_OK;
3294         }
3295     }
3296     return ERR_OK;
3297 }
3298 }  // namespace AAFwk
3299 }  // namespace OHOS
3300