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