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