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