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