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