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