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