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