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