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