1 /* 2 * Copyright (c) 2023-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 "scene_board/ui_ability_lifecycle_manager.h" 17 18 #include "ability_manager_service.h" 19 #include "appfreeze_manager.h" 20 #include "app_exit_reason_data_manager.h" 21 #include "app_utils.h" 22 #include "hitrace_meter.h" 23 #include "permission_constants.h" 24 #include "process_options.h" 25 #include "start_window_option.h" 26 #include "scene_board/status_bar_delegate_manager.h" 27 #include "session_manager_lite.h" 28 #include "session/host/include/zidl/session_interface.h" 29 #include "startup_util.h" 30 #include "ui_extension_utils.h" 31 #ifdef SUPPORT_GRAPHICS 32 #include "ability_first_frame_state_observer_manager.h" 33 #endif 34 35 namespace OHOS { 36 using AbilityRuntime::FreezeUtil; 37 namespace AAFwk { 38 namespace { 39 constexpr const char* SEPARATOR = ":"; 40 constexpr int32_t PREPARE_TERMINATE_TIMEOUT_MULTIPLE = 10; 41 constexpr const char* PARAM_MISSION_AFFINITY_KEY = "ohos.anco.param.missionAffinity"; 42 constexpr const char* DMS_SRC_NETWORK_ID = "dmsSrcNetworkId"; 43 constexpr const char* DMS_MISSION_ID = "dmsMissionId"; 44 constexpr int DEFAULT_DMS_MISSION_ID = -1; 45 constexpr const char* PARAM_SPECIFIED_PROCESS_FLAG = "ohoSpecifiedProcessFlag"; 46 constexpr const char* DMS_PROCESS_NAME = "distributedsched"; 47 constexpr const char* DMS_PERSISTENT_ID = "ohos.dms.persistentId"; 48 constexpr const char* IS_SHELL_CALL = "isShellCall"; 49 #ifdef SUPPORT_ASAN 50 constexpr int KILL_TIMEOUT_MULTIPLE = 45; 51 #else 52 constexpr int KILL_TIMEOUT_MULTIPLE = 3; 53 #endif 54 constexpr int32_t DEFAULT_USER_ID = 0; 55 constexpr int32_t MAX_FIND_UIEXTENSION_CALLER_TIMES = 10; 56 MsgId2State(uint32_t msgId)57 FreezeUtil::TimeoutState MsgId2State(uint32_t msgId) 58 { 59 if (msgId == AbilityManagerService::LOAD_TIMEOUT_MSG) { 60 return FreezeUtil::TimeoutState::LOAD; 61 } else if (msgId == AbilityManagerService::FOREGROUND_TIMEOUT_MSG) { 62 return FreezeUtil::TimeoutState::FOREGROUND; 63 } else if (msgId == AbilityManagerService::BACKGROUND_TIMEOUT_MSG) { 64 return FreezeUtil::TimeoutState::BACKGROUND; 65 } 66 return FreezeUtil::TimeoutState::UNKNOWN; 67 } 68 __anon8eda10ba0202(const sptr<Token> &token, FreezeUtil::TimeoutState state) 69 auto g_deleteLifecycleEventTask = [](const sptr<Token> &token, FreezeUtil::TimeoutState state) { 70 CHECK_POINTER_LOG(token, "token is nullptr."); 71 FreezeUtil::LifecycleFlow flow = { token->AsObject(), state }; 72 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow); 73 }; 74 } 75 UIAbilityLifecycleManager(int32_t userId)76 UIAbilityLifecycleManager::UIAbilityLifecycleManager(int32_t userId): userId_(userId) {} 77 StartUIAbility(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,uint32_t sceneFlag,bool & isColdStart)78 int UIAbilityLifecycleManager::StartUIAbility(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo, 79 uint32_t sceneFlag, bool &isColdStart) 80 { 81 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 82 std::lock_guard<ffrt::mutex> guard(sessionLock_); 83 if (!CheckSessionInfo(sessionInfo)) { 84 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is invalid."); 85 return ERR_INVALID_VALUE; 86 } 87 abilityRequest.sessionInfo = sessionInfo; 88 89 TAG_LOGI(AAFwkTag::ABILITYMGR, "session id: %{public}d. bundle: %{public}s, ability: %{public}s", 90 sessionInfo->persistentId, abilityRequest.abilityInfo.bundleName.c_str(), 91 abilityRequest.abilityInfo.name.c_str()); 92 auto uiAbilityRecord = GenerateAbilityRecord(abilityRequest, sessionInfo, isColdStart); 93 CHECK_POINTER_AND_RETURN(uiAbilityRecord, ERR_INVALID_VALUE); 94 TAG_LOGD(AAFwkTag::ABILITYMGR, "StartUIAbility, specifyTokenId is %{public}u.", abilityRequest.specifyTokenId); 95 uiAbilityRecord->SetSpecifyTokenId(abilityRequest.specifyTokenId); 96 97 if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) { 98 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped."); 99 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND); 100 return ERR_OK; 101 } else { 102 TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is not FOREGROUND or BACKGROUND."); 103 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND); 104 } 105 106 UpdateAbilityRecordLaunchReason(abilityRequest, uiAbilityRecord); 107 NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest); 108 if (!uiAbilityRecord->IsReady() || sessionInfo->isNewWant) { 109 AddCallerRecord(abilityRequest, sessionInfo, uiAbilityRecord); 110 } 111 auto isShellCall = abilityRequest.want.GetBoolParam(IS_SHELL_CALL, false); 112 uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId, sceneFlag, isShellCall); 113 CheckSpecified(abilityRequest, uiAbilityRecord); 114 SendKeyEvent(abilityRequest); 115 return ERR_OK; 116 } 117 GenerateAbilityRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,bool & isColdStart)118 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GenerateAbilityRecord(AbilityRequest &abilityRequest, 119 sptr<SessionInfo> sessionInfo, bool &isColdStart) 120 { 121 std::shared_ptr<AbilityRecord> uiAbilityRecord = nullptr; 122 auto iter = sessionAbilityMap_.find(sessionInfo->persistentId); 123 if (iter != sessionAbilityMap_.end()) { 124 TAG_LOGI(AAFwkTag::ABILITYMGR, "NewWant:%{public}d", sessionInfo->isNewWant); 125 uiAbilityRecord = iter->second; 126 if (uiAbilityRecord == nullptr || uiAbilityRecord->GetSessionInfo() == nullptr) { 127 TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord invalid"); 128 return nullptr; 129 } 130 if (sessionInfo->sessionToken != uiAbilityRecord->GetSessionInfo()->sessionToken) { 131 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionToken invalid"); 132 return nullptr; 133 } 134 uiAbilityRecord->SetIsNewWant(sessionInfo->isNewWant); 135 if (sessionInfo->isNewWant) { 136 uiAbilityRecord->SetWant(abilityRequest.want); 137 uiAbilityRecord->GetSessionInfo()->want.RemoveAllFd(); 138 } else { 139 sessionInfo->want.CloseAllFd(); 140 } 141 } else { 142 uiAbilityRecord = CreateAbilityRecord(abilityRequest, sessionInfo); 143 isColdStart = true; 144 UpdateProcessName(abilityRequest, uiAbilityRecord); 145 if (isSCBRecovery_) { 146 coldStartInSCBRecovery_.insert(sessionInfo->persistentId); 147 } 148 auto abilityInfo = abilityRequest.abilityInfo; 149 MoreAbilityNumbersSendEventInfo( 150 abilityRequest.userId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName); 151 sessionAbilityMap_.emplace(sessionInfo->persistentId, uiAbilityRecord); 152 } 153 return uiAbilityRecord; 154 } 155 CheckSessionInfo(sptr<SessionInfo> sessionInfo) const156 bool UIAbilityLifecycleManager::CheckSessionInfo(sptr<SessionInfo> sessionInfo) const 157 { 158 if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) { 159 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is invalid."); 160 return false; 161 } 162 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken); 163 auto descriptor = Str16ToStr8(sessionToken->GetDescriptor()); 164 if (descriptor != "OHOS.ISession") { 165 TAG_LOGE(AAFwkTag::ABILITYMGR, "token's Descriptor: %{public}s", descriptor.c_str()); 166 return false; 167 } 168 return true; 169 } 170 CreateAbilityRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo) const171 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::CreateAbilityRecord(AbilityRequest &abilityRequest, 172 sptr<SessionInfo> sessionInfo) const 173 { 174 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 175 TAG_LOGD(AAFwkTag::ABILITYMGR, "Create ability record."); 176 if (sessionInfo->startSetting != nullptr) { 177 TAG_LOGD(AAFwkTag::ABILITYMGR, "startSetting is valid."); 178 abilityRequest.startSetting = sessionInfo->startSetting; 179 } 180 auto uiAbilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest); 181 if (uiAbilityRecord == nullptr) { 182 TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord is invalid."); 183 return nullptr; 184 } 185 TAG_LOGD(AAFwkTag::ABILITYMGR, "user id: %{public}d.", userId_); 186 uiAbilityRecord->SetOwnerMissionUserId(userId_); 187 SetRevicerInfo(abilityRequest, uiAbilityRecord); 188 return uiAbilityRecord; 189 } 190 AddCallerRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,std::shared_ptr<AbilityRecord> uiAbilityRecord) const191 void UIAbilityLifecycleManager::AddCallerRecord(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo, 192 std::shared_ptr<AbilityRecord> uiAbilityRecord) const 193 { 194 if (sessionInfo == nullptr) { 195 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is invalid."); 196 return; 197 } 198 CHECK_POINTER(uiAbilityRecord); 199 std::string srcAbilityId = ""; 200 if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) { 201 std::string srcDeviceId = abilityRequest.want.GetStringParam(DMS_SRC_NETWORK_ID); 202 int missionId = abilityRequest.want.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID); 203 TAG_LOGD(AAFwkTag::ABILITYMGR, "Get srcNetWorkId = %{public}s, missionId = %{public}d", srcDeviceId.c_str(), 204 missionId); 205 Want *newWant = const_cast<Want*>(&abilityRequest.want); 206 newWant->RemoveParam(DMS_SRC_NETWORK_ID); 207 newWant->RemoveParam(DMS_MISSION_ID); 208 newWant->RemoveParam(Want::PARAM_RESV_FOR_RESULT); 209 srcAbilityId = srcDeviceId + "_" + std::to_string(missionId); 210 } 211 uiAbilityRecord->AddCallerRecord(sessionInfo->callerToken, 212 sessionInfo->requestCode, abilityRequest.want, srcAbilityId, sessionInfo->callingTokenId); 213 } 214 CheckSpecified(AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> uiAbilityRecord)215 void UIAbilityLifecycleManager::CheckSpecified(AbilityRequest &abilityRequest, 216 std::shared_ptr<AbilityRecord> uiAbilityRecord) 217 { 218 if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED && !specifiedInfoQueue_.empty()) { 219 SpecifiedInfo specifiedInfo = specifiedInfoQueue_.front(); 220 specifiedInfoQueue_.pop(); 221 uiAbilityRecord->SetSpecifiedFlag(specifiedInfo.flag); 222 specifiedAbilityMap_.emplace(specifiedInfo, uiAbilityRecord); 223 } 224 } 225 SendKeyEvent(AbilityRequest & abilityRequest) const226 void UIAbilityLifecycleManager::SendKeyEvent(AbilityRequest &abilityRequest) const 227 { 228 if (abilityRequest.abilityInfo.visible == false) { 229 EventInfo eventInfo; 230 eventInfo.abilityName = abilityRequest.abilityInfo.name; 231 eventInfo.bundleName = abilityRequest.abilityInfo.bundleName; 232 eventInfo.moduleName = abilityRequest.abilityInfo.moduleName; 233 EventReport::SendKeyEvent(EventName::START_PRIVATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo); 234 } 235 } 236 AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)237 int UIAbilityLifecycleManager::AttachAbilityThread(const sptr<IAbilityScheduler> &scheduler, 238 const sptr<IRemoteObject> &token) 239 { 240 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 241 std::lock_guard<ffrt::mutex> guard(sessionLock_); 242 if (!IsContainsAbilityInner(token)) { 243 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not in running list"); 244 return ERR_INVALID_VALUE; 245 } 246 auto&& abilityRecord = Token::GetAbilityRecordByToken(token); 247 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 248 TAG_LOGI(AAFwkTag::ABILITYMGR, "Lifecycle: name is %{public}s.", abilityRecord->GetAbilityInfo().name.c_str()); 249 SetLastExitReason(abilityRecord); 250 251 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler(); 252 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler."); 253 handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId()); 254 abilityRecord->SetLoading(false); 255 FreezeUtil::LifecycleFlow flow = {token, FreezeUtil::TimeoutState::LOAD}; 256 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow); 257 258 abilityRecord->SetScheduler(scheduler); 259 if (DoProcessAttachment(abilityRecord) != ERR_OK) { 260 TAG_LOGE(AAFwkTag::ABILITYMGR, "do process attachment failed, close the ability."); 261 TerminateSession(abilityRecord); 262 return ERR_INVALID_VALUE; 263 } 264 if (abilityRecord->IsStartedByCall()) { 265 if (abilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) { 266 abilityRecord->SetStartToForeground(true); 267 abilityRecord->PostForegroundTimeoutTask(); 268 abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING); 269 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token); 270 } else { 271 abilityRecord->SetStartToBackground(true); 272 MoveToBackground(abilityRecord); 273 } 274 return ERR_OK; 275 } 276 if (abilityRecord->IsNeedToCallRequest()) { 277 abilityRecord->CallRequest(); 278 } 279 abilityRecord->PostForegroundTimeoutTask(); 280 abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING); 281 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token); 282 return ERR_OK; 283 } 284 OnAbilityRequestDone(const sptr<IRemoteObject> & token,int32_t state)285 void UIAbilityLifecycleManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, int32_t state) 286 { 287 TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability request state %{public}d done.", state); 288 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 289 std::lock_guard<ffrt::mutex> guard(sessionLock_); 290 AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state); 291 if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) { 292 auto abilityRecord = GetAbilityRecordByToken(token); 293 CHECK_POINTER(abilityRecord); 294 if (abilityRecord->IsTerminating()) { 295 TAG_LOGI(AAFwkTag::ABILITYMGR, "ability is on terminating"); 296 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler(); 297 CHECK_POINTER(handler); 298 handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId()); 299 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken()); 300 abilityRecord->SetPendingState(AbilityState::INITIAL); 301 CompleteTerminateLocked(abilityRecord); 302 return; 303 } 304 std::string element = abilityRecord->GetElementName().GetURI(); 305 TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is %{public}s, start to foreground.", element.c_str()); 306 abilityRecord->ForegroundAbility(abilityRecord->lifeCycleStateInfo_.sceneFlagBak); 307 } 308 } 309 AbilityTransactionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)310 int UIAbilityLifecycleManager::AbilityTransactionDone(const sptr<IRemoteObject> &token, int state, 311 const PacMap &saveData) 312 { 313 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 314 int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state)); 315 std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState)); 316 TAG_LOGD(AAFwkTag::ABILITYMGR, "AbilityTransactionDone, state: %{public}s.", abilityState.c_str()); 317 318 std::lock_guard<ffrt::mutex> guard(sessionLock_); 319 auto abilityRecord = GetAbilityRecordByToken(token); 320 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 321 abilityRecord->RemoveSignatureInfo(); 322 std::string element = abilityRecord->GetElementName().GetURI(); 323 TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str()); 324 325 if (targetState == AbilityState::BACKGROUND) { 326 abilityRecord->SaveAbilityState(saveData); 327 } 328 329 return DispatchState(abilityRecord, targetState); 330 } 331 AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> & token,const WindowConfig & windowConfig)332 int UIAbilityLifecycleManager::AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> &token, 333 const WindowConfig &windowConfig) 334 { 335 std::lock_guard<ffrt::mutex> guard(sessionLock_); 336 auto abilityRecord = GetAbilityRecordByToken(token); 337 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 338 abilityRecord->SaveAbilityWindowConfig(windowConfig); 339 return ERR_OK; 340 } 341 NotifySCBToStartUIAbility(AbilityRequest & abilityRequest)342 int UIAbilityLifecycleManager::NotifySCBToStartUIAbility(AbilityRequest &abilityRequest) 343 { 344 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 345 abilityRequest.want.SetParam(IS_SHELL_CALL, AAFwk::PermissionVerification::GetInstance()->IsShellCall()); 346 std::lock_guard<ffrt::mutex> guard(sessionLock_); 347 // start ability with persistentId by dms 348 int32_t persistentId = abilityRequest.want.GetIntParam(DMS_PERSISTENT_ID, 0); 349 TAG_LOGD(AAFwkTag::ABILITYMGR, "NotifySCBToStartUIAbility, want with persistentId: %{public}d.", persistentId); 350 if (persistentId != 0 && 351 AAFwk::PermissionVerification::GetInstance()->CheckSpecificSystemAbilityAccessPermission(DMS_PROCESS_NAME)) { 352 return StartWithPersistentIdByDistributed(abilityRequest, persistentId); 353 } 354 355 auto abilityInfo = abilityRequest.abilityInfo; 356 bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel); 357 // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'. 358 bool isNewProcessMode = abilityRequest.processOptions && 359 ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode); 360 if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess() 361 && isUIAbility) { 362 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess"); 363 specifiedRequestMap_.emplace(specifiedRequestId_, abilityRequest); 364 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedProcess(abilityRequest.want, abilityInfo, 365 specifiedRequestId_); 366 ++specifiedRequestId_; 367 return ERR_OK; 368 } 369 auto isSpecified = (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED); 370 if (isSpecified) { 371 PreCreateProcessName(abilityRequest); 372 specifiedRequestMap_.emplace(specifiedRequestId_, abilityRequest); 373 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility( 374 abilityRequest.want, abilityRequest.abilityInfo, specifiedRequestId_); 375 ++specifiedRequestId_; 376 return ERR_OK; 377 } 378 auto sessionInfo = CreateSessionInfo(abilityRequest); 379 sessionInfo->requestCode = abilityRequest.requestCode; 380 sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse); 381 sessionInfo->userId = userId_; 382 sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); 383 TAG_LOGI( 384 AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, userId_); 385 int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest); 386 sessionInfo->want.RemoveAllFd(); 387 return ret; 388 } 389 NotifySCBToRecoveryAfterInterception(const AbilityRequest & abilityRequest)390 int32_t UIAbilityLifecycleManager::NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest) 391 { 392 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 393 std::lock_guard<ffrt::mutex> guard(sessionLock_); 394 auto abilityInfo = abilityRequest.abilityInfo; 395 bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel); 396 // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'. 397 bool isNewProcessMode = abilityRequest.processOptions && 398 ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode); 399 if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess() 400 && isUIAbility) { 401 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess"); 402 specifiedRequestMap_.emplace(specifiedRequestId_, abilityRequest); 403 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedProcess(abilityRequest.want, abilityInfo, 404 specifiedRequestId_); 405 ++specifiedRequestId_; 406 return ERR_OK; 407 } 408 auto isSpecified = (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED); 409 if (isSpecified) { 410 PreCreateProcessName(const_cast<AbilityRequest &>(abilityRequest)); 411 specifiedRequestMap_.emplace(specifiedRequestId_, abilityRequest); 412 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility( 413 abilityRequest.want, abilityRequest.abilityInfo, specifiedRequestId_); 414 ++specifiedRequestId_; 415 return ERR_OK; 416 } 417 auto sessionInfo = CreateSessionInfo(abilityRequest); 418 sessionInfo->requestCode = abilityRequest.requestCode; 419 sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse); 420 sessionInfo->userId = userId_; 421 sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); 422 sessionInfo->want.SetParam("ohos.ability.param.isSkipErmsFromSCB", true); 423 TAG_LOGI( 424 AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, userId_); 425 int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest); 426 sessionInfo->want.CloseAllFd(); 427 return ret; 428 } 429 NotifySCBToPreStartUIAbility(const AbilityRequest & abilityRequest,sptr<SessionInfo> & sessionInfo)430 int UIAbilityLifecycleManager::NotifySCBToPreStartUIAbility(const AbilityRequest &abilityRequest, 431 sptr<SessionInfo> &sessionInfo) 432 { 433 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 434 435 std::lock_guard<ffrt::mutex> guard(sessionLock_); 436 sessionInfo = CreateSessionInfo(abilityRequest); 437 sessionInfo->requestCode = abilityRequest.requestCode; 438 sessionInfo->isAtomicService = true; 439 return NotifySCBPendingActivation(sessionInfo, abilityRequest); 440 } 441 DispatchState(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)442 int UIAbilityLifecycleManager::DispatchState(const std::shared_ptr<AbilityRecord> &abilityRecord, int state) 443 { 444 switch (state) { 445 case AbilityState::INITIAL: { 446 return DispatchTerminate(abilityRecord); 447 } 448 case AbilityState::BACKGROUND: 449 case AbilityState::BACKGROUND_FAILED: { 450 return DispatchBackground(abilityRecord); 451 } 452 case AbilityState::FOREGROUND: { 453 return DispatchForeground(abilityRecord, true); 454 } 455 case AbilityState::FOREGROUND_FAILED: 456 case AbilityState::FOREGROUND_INVALID_MODE: 457 case AbilityState::FOREGROUND_WINDOW_FREEZED: { 458 return DispatchForeground(abilityRecord, false, static_cast<AbilityState>(state)); 459 } 460 default: { 461 TAG_LOGW(AAFwkTag::ABILITYMGR, "Don't support transiting state: %{public}d", state); 462 return ERR_INVALID_VALUE; 463 } 464 } 465 } 466 DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord,bool success,AbilityState state)467 int UIAbilityLifecycleManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord, bool success, 468 AbilityState state) 469 { 470 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler(); 471 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler."); 472 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 473 CHECK_POINTER_AND_RETURN_LOG(taskHandler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler."); 474 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 475 476 if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) { 477 TAG_LOGE(AAFwkTag::ABILITYMGR, 478 "DispatchForeground Ability transition life state error. expect %{public}d, actual %{public}d", 479 AbilityState::FOREGROUNDING, abilityRecord->GetAbilityState()); 480 return ERR_INVALID_VALUE; 481 } 482 483 TAG_LOGD(AAFwkTag::ABILITYMGR, "ForegroundLifecycle: end."); 484 handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId()); 485 g_deleteLifecycleEventTask(abilityRecord->GetToken(), FreezeUtil::TimeoutState::FOREGROUND); 486 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid()); 487 auto self(weak_from_this()); 488 if (success) { 489 TAG_LOGD(AAFwkTag::ABILITYMGR, "foreground succeeded."); 490 auto task = [self, abilityRecord]() { 491 auto selfObj = self.lock(); 492 if (!selfObj) { 493 TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr is invalid."); 494 return; 495 } 496 selfObj->CompleteForegroundSuccess(abilityRecord); 497 }; 498 taskHandler->SubmitTask(task, TaskQoS::USER_INTERACTIVE); 499 } else { 500 auto task = [self, abilityRecord, state]() { 501 auto selfObj = self.lock(); 502 if (!selfObj) { 503 TAG_LOGW(AAFwkTag::ABILITYMGR, "Mission list mgr is invalid."); 504 return; 505 } 506 if (state == AbilityState::FOREGROUND_WINDOW_FREEZED) { 507 TAG_LOGI(AAFwkTag::ABILITYMGR, "Window was freezed."); 508 if (abilityRecord != nullptr) { 509 abilityRecord->SetAbilityState(AbilityState::BACKGROUND); 510 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken()); 511 } 512 return; 513 } 514 selfObj->HandleForegroundFailed(abilityRecord, state); 515 }; 516 taskHandler->SubmitTask(task, TaskQoS::USER_INTERACTIVE); 517 } 518 return ERR_OK; 519 } 520 DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)521 int UIAbilityLifecycleManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord) 522 { 523 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 524 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler."); 525 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 526 527 if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) { 528 TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability transition life state error. actual %{public}d", 529 abilityRecord->GetAbilityState()); 530 return ERR_INVALID_VALUE; 531 } 532 533 TAG_LOGD(AAFwkTag::ABILITYMGR, "end."); 534 // remove background timeout task. 535 handler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId())); 536 g_deleteLifecycleEventTask(abilityRecord->GetToken(), FreezeUtil::TimeoutState::BACKGROUND); 537 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid()); 538 auto self(shared_from_this()); 539 auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); }; 540 handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE); 541 542 return ERR_OK; 543 } 544 DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)545 int UIAbilityLifecycleManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord) 546 { 547 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 548 if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) { 549 TAG_LOGE(AAFwkTag::ABILITYMGR, "DispatchTerminate error, ability state is %{public}d", 550 abilityRecord->GetAbilityState()); 551 return INNER_ERR; 552 } 553 554 // remove terminate timeout task. 555 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 556 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler."); 557 handler->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId())); 558 auto self(shared_from_this()); 559 auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); }; 560 handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE); 561 562 return ERR_OK; 563 } 564 CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)565 void UIAbilityLifecycleManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord) 566 { 567 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 568 std::lock_guard<ffrt::mutex> guard(sessionLock_); 569 570 CHECK_POINTER(abilityRecord); 571 // ability do not save window mode 572 abilityRecord->RemoveWindowMode(); 573 std::string element = abilityRecord->GetElementName().GetURI(); 574 TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s", element.c_str()); 575 abilityRecord->SetAbilityState(AbilityState::FOREGROUND); 576 abilityRecord->UpdateAbilityVisibilityState(); 577 578 // new version. started by caller, scheduler call request 579 if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) { 580 TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing foreground state"); 581 abilityRecord->CallRequest(); 582 abilityRecord->SetStartToForeground(false); 583 } 584 585 if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) { 586 abilityRecord->SetMinimizeReason(true); 587 MoveToBackground(abilityRecord); 588 } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) { 589 TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup."); 590 abilityRecord->SetPendingState(AbilityState::INITIAL); 591 } 592 if (handler_ != nullptr && abilityRecord->GetSessionInfo() != nullptr) { 593 handler_->OnSessionMovedToFront(abilityRecord->GetSessionInfo()->persistentId); 594 } 595 } 596 HandleForegroundFailed(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)597 void UIAbilityLifecycleManager::HandleForegroundFailed(const std::shared_ptr<AbilityRecord> &ability, 598 AbilityState state) 599 { 600 TAG_LOGD(AAFwkTag::ABILITYMGR, "state: %{public}d.", static_cast<int32_t>(state)); 601 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 602 std::lock_guard<ffrt::mutex> guard(sessionLock_); 603 if (ability == nullptr) { 604 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is nullptr."); 605 return; 606 } 607 608 if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) { 609 TAG_LOGE(AAFwkTag::ABILITYMGR, "this ability is not foregrounding state."); 610 return; 611 } 612 613 NotifySCBToHandleException(ability, 614 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleForegroundTimeout"); 615 PrepareCloseUIAbility(ability, 0, nullptr, false); 616 CloseUIAbilityInner(ability); 617 } 618 GetAbilityRecordByToken(const sptr<IRemoteObject> & token) const619 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetAbilityRecordByToken(const sptr<IRemoteObject> &token) 620 const 621 { 622 if (token == nullptr) { 623 TAG_LOGE(AAFwkTag::ABILITYMGR, "nullptr."); 624 return nullptr; 625 } 626 627 for (auto ability : terminateAbilityList_) { 628 if (ability && token == ability->GetToken()->AsObject()) { 629 return ability; 630 } 631 } 632 633 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) { 634 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == token) { 635 return iter->second; 636 } 637 } 638 return nullptr; 639 } 640 641 #ifdef SUPPORT_GRAPHICS CompleteFirstFrameDrawing(const sptr<IRemoteObject> & token)642 void UIAbilityLifecycleManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &token) 643 { 644 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 645 if (token == nullptr) { 646 TAG_LOGE(AAFwkTag::ABILITYMGR, "nullptr."); 647 return; 648 } 649 std::lock_guard<ffrt::mutex> guard(sessionLock_); 650 if (!IsContainsAbilityInner(token)) { 651 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not in running list"); 652 return; 653 } 654 auto abilityRecord = GetAbilityRecordByToken(token); 655 CHECK_POINTER(abilityRecord); 656 if (abilityRecord->IsCompleteFirstFrameDrawing()) { 657 TAG_LOGD(AAFwkTag::ABILITYMGR, "First frame drawing has completed."); 658 return; 659 } 660 abilityRecord->ReportAtomicServiceDrawnCompleteEvent(); 661 abilityRecord->SetCompleteFirstFrameDrawing(true); 662 AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance(). 663 HandleOnFirstFrameState(abilityRecord); 664 } 665 #endif 666 IsContainsAbility(const sptr<IRemoteObject> & token) const667 bool UIAbilityLifecycleManager::IsContainsAbility(const sptr<IRemoteObject> &token) const 668 { 669 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 670 std::lock_guard<ffrt::mutex> guard(sessionLock_); 671 return IsContainsAbilityInner(token); 672 } 673 IsContainsAbilityInner(const sptr<IRemoteObject> & token) const674 bool UIAbilityLifecycleManager::IsContainsAbilityInner(const sptr<IRemoteObject> &token) const 675 { 676 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) { 677 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == token) { 678 return true; 679 } 680 } 681 return false; 682 } 683 EraseAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)684 void UIAbilityLifecycleManager::EraseAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord) 685 { 686 if (abilityRecord == nullptr) { 687 return; 688 } 689 690 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) { 691 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == abilityRecord->GetToken()->AsObject()) { 692 sessionAbilityMap_.erase(iter); 693 break; 694 } 695 } 696 } 697 EraseSpecifiedAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)698 void UIAbilityLifecycleManager::EraseSpecifiedAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord) 699 { 700 for (auto iter = specifiedAbilityMap_.begin(); iter != specifiedAbilityMap_.end(); iter++) { 701 auto abilityInfo = abilityRecord->GetAbilityInfo(); 702 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == abilityRecord->GetToken()->AsObject() && 703 iter->first.abilityName == abilityInfo.name && iter->first.bundleName == abilityInfo.bundleName && 704 iter->first.flag == abilityRecord->GetSpecifiedFlag()) { 705 specifiedAbilityMap_.erase(iter); 706 break; 707 } 708 } 709 } 710 GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo & abilityInfo)711 std::string UIAbilityLifecycleManager::GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo& abilityInfo) 712 { 713 static uint32_t index = 0; 714 std::string processName = abilityInfo.bundleName + SEPARATOR + abilityInfo.moduleName + SEPARATOR + 715 abilityInfo.name + SEPARATOR + std::to_string(index++); 716 TAG_LOGI(AAFwkTag::ABILITYMGR, "processName: %{public}s", processName.c_str()); 717 return processName; 718 } 719 PreCreateProcessName(AbilityRequest & abilityRequest)720 void UIAbilityLifecycleManager::PreCreateProcessName(AbilityRequest &abilityRequest) 721 { 722 if (abilityRequest.processOptions == nullptr || 723 !ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode)) { 724 TAG_LOGD(AAFwkTag::ABILITYMGR, "No need to pre create process name."); 725 return; 726 } 727 TAG_LOGI(AAFwkTag::ABILITYMGR, "create process name in advance."); 728 std::string processName = GenerateProcessNameForNewProcessMode(abilityRequest.abilityInfo); 729 abilityRequest.processOptions->processName = processName; 730 abilityRequest.abilityInfo.process = processName; 731 } 732 UpdateProcessName(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord)733 void UIAbilityLifecycleManager::UpdateProcessName(const AbilityRequest &abilityRequest, 734 std::shared_ptr<AbilityRecord> &abilityRecord) 735 { 736 if (abilityRecord == nullptr || abilityRequest.sessionInfo == nullptr || 737 abilityRequest.sessionInfo->processOptions == nullptr || 738 !ProcessOptions::IsNewProcessMode(abilityRequest.sessionInfo->processOptions->processMode)) { 739 TAG_LOGD(AAFwkTag::ABILITYMGR, "No need to update process name."); 740 return; 741 } 742 std::string processName; 743 if (!abilityRequest.sessionInfo->processOptions->processName.empty()) { 744 TAG_LOGD(AAFwkTag::ABILITYMGR, "The process name has been generated in advance."); 745 processName = abilityRequest.sessionInfo->processOptions->processName; 746 } else { 747 processName = GenerateProcessNameForNewProcessMode(abilityRequest.abilityInfo); 748 } 749 abilityRecord->SetProcessName(processName); 750 } 751 UpdateAbilityRecordLaunchReason(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord) const752 void UIAbilityLifecycleManager::UpdateAbilityRecordLaunchReason( 753 const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &abilityRecord) const 754 { 755 if (abilityRecord == nullptr) { 756 TAG_LOGW(AAFwkTag::ABILITYMGR, "input record is nullptr."); 757 return; 758 } 759 760 if (abilityRequest.IsAppRecovery() || abilityRecord->GetRecoveryInfo()) { 761 abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY); 762 return; 763 } 764 765 auto res = abilityRequest.IsContinuation(); 766 if (res.first) { 767 abilityRecord->SetLaunchReason(res.second); 768 return; 769 } 770 771 if (abilityRequest.IsAcquireShareData()) { 772 abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_SHARE); 773 return; 774 } 775 776 abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY); 777 return; 778 } 779 GetUIAbilityRecordBySessionInfo(const sptr<SessionInfo> & sessionInfo)780 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetUIAbilityRecordBySessionInfo( 781 const sptr<SessionInfo> &sessionInfo) 782 { 783 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 784 std::lock_guard<ffrt::mutex> guard(sessionLock_); 785 CHECK_POINTER_AND_RETURN(sessionInfo, nullptr); 786 CHECK_POINTER_AND_RETURN(sessionInfo->sessionToken, nullptr); 787 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken); 788 std::string descriptor = Str16ToStr8(sessionToken->GetDescriptor()); 789 if (descriptor != "OHOS.ISession") { 790 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, input token is not a sessionToken, token->GetDescriptor(): %{public}s", 791 descriptor.c_str()); 792 return nullptr; 793 } 794 795 auto iter = sessionAbilityMap_.find(sessionInfo->persistentId); 796 if (iter != sessionAbilityMap_.end()) { 797 return iter->second; 798 } 799 return nullptr; 800 } 801 NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token)802 int32_t UIAbilityLifecycleManager::NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token) 803 { 804 TAG_LOGI(AAFwkTag::ABILITYMGR, "NotifySCBToMinimizeUIAbility."); 805 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 806 auto sceneSessionManager = Rosen::SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy(); 807 CHECK_POINTER_AND_RETURN(sceneSessionManager, ERR_NULL_OBJECT); 808 Rosen::WSError ret = sceneSessionManager->PendingSessionToBackgroundForDelegator(token); 809 if (ret != Rosen::WSError::WS_OK) { 810 TAG_LOGE(AAFwkTag::ABILITYMGR, 811 "Call sceneSessionManager PendingSessionToBackgroundForDelegator error:%{public}d", ret); 812 } 813 return static_cast<int32_t>(ret); 814 } 815 MinimizeUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool fromUser,uint32_t sceneFlag)816 int UIAbilityLifecycleManager::MinimizeUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool fromUser, 817 uint32_t sceneFlag) 818 { 819 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 820 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 821 std::lock_guard<ffrt::mutex> guard(sessionLock_); 822 if (abilityRecord == nullptr) { 823 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null"); 824 return ERR_INVALID_VALUE; 825 } 826 TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityInfoName:%{public}s", abilityRecord->GetAbilityInfo().name.c_str()); 827 abilityRecord->SetMinimizeReason(fromUser); 828 abilityRecord->SetSceneFlag(sceneFlag); 829 if (abilityRecord->GetPendingState() != AbilityState::INITIAL) { 830 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped."); 831 abilityRecord->SetPendingState(AbilityState::BACKGROUND); 832 return ERR_OK; 833 } 834 if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) { 835 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability state is not foreground"); 836 return ERR_OK; 837 } 838 abilityRecord->SetPendingState(AbilityState::BACKGROUND); 839 MoveToBackground(abilityRecord); 840 abilityRecord->SetSceneFlag(0); 841 return ERR_OK; 842 } 843 MoveToBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)844 void UIAbilityLifecycleManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord) 845 { 846 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 847 if (abilityRecord == nullptr) { 848 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null"); 849 return; 850 } 851 abilityRecord->SetIsNewWant(false); 852 auto self(weak_from_this()); 853 auto task = [abilityRecord, self]() { 854 auto selfObj = self.lock(); 855 if (selfObj == nullptr) { 856 TAG_LOGW(AAFwkTag::ABILITYMGR, "UIAbilityLifecycleManager is invalid"); 857 return; 858 } 859 TAG_LOGE(AAFwkTag::ABILITYMGR, "UIAbilityLifecycleManager move to background timeout"); 860 selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG); 861 selfObj->CompleteBackground(abilityRecord); 862 }; 863 abilityRecord->BackgroundAbility(task); 864 } 865 ResolveLocked(const AbilityRequest & abilityRequest)866 int UIAbilityLifecycleManager::ResolveLocked(const AbilityRequest &abilityRequest) 867 { 868 TAG_LOGI(AAFwkTag::ABILITYMGR, "ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str()); 869 870 if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) { 871 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, resolve ability_name:", __func__); 872 return RESOLVE_CALL_ABILITY_INNER_ERR; 873 } 874 875 return CallAbilityLocked(abilityRequest); 876 } 877 IsAbilityStarted(AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & targetRecord)878 bool UIAbilityLifecycleManager::IsAbilityStarted(AbilityRequest &abilityRequest, 879 std::shared_ptr<AbilityRecord> &targetRecord) 880 { 881 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call."); 882 std::lock_guard<ffrt::mutex> guard(sessionLock_); 883 bool reuse = false; 884 auto persistentId = GetPersistentIdByAbilityRequest(abilityRequest, reuse); 885 if (persistentId == 0) { 886 return false; 887 } 888 targetRecord = sessionAbilityMap_.at(persistentId); 889 if (targetRecord) { 890 targetRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want); 891 targetRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL); 892 } 893 return true; 894 } 895 CallAbilityLocked(const AbilityRequest & abilityRequest)896 int UIAbilityLifecycleManager::CallAbilityLocked(const AbilityRequest &abilityRequest) 897 { 898 TAG_LOGD(AAFwkTag::ABILITYMGR, "CallAbilityLocked"); 899 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 900 std::lock_guard<ffrt::mutex> guard(sessionLock_); 901 902 // Get target uiAbility record. 903 std::shared_ptr<AbilityRecord> uiAbilityRecord; 904 bool reuse = false; 905 auto persistentId = GetPersistentIdByAbilityRequest(abilityRequest, reuse); 906 if (persistentId == 0) { 907 uiAbilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest); 908 uiAbilityRecord->SetOwnerMissionUserId(userId_); 909 SetRevicerInfo(abilityRequest, uiAbilityRecord); 910 } else { 911 uiAbilityRecord = sessionAbilityMap_.at(persistentId); 912 } 913 uiAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want); 914 uiAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL); 915 NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest); 916 917 // new version started by call type 918 const auto& abilityInfo = abilityRequest.abilityInfo; 919 auto ret = ResolveAbility(uiAbilityRecord, abilityRequest); 920 if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ) { 921 TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability has been resolved."); 922 if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) { 923 TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability needs to be switched to foreground."); 924 auto sessionInfo = CreateSessionInfo(abilityRequest); 925 sessionInfo->persistentId = persistentId; 926 sessionInfo->state = CallToState::FOREGROUND; 927 sessionInfo->reuse = reuse; 928 sessionInfo->uiAbilityId = uiAbilityRecord->GetAbilityRecordId(); 929 sessionInfo->isAtomicService = 930 (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); 931 if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) { 932 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped."); 933 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND); 934 return NotifySCBPendingActivation(sessionInfo, abilityRequest); 935 } 936 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND); 937 uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId); 938 return NotifySCBPendingActivation(sessionInfo, abilityRequest); 939 } 940 return ERR_OK; 941 } else if (ret == ResolveResultType::NG_INNER_ERROR) { 942 TAG_LOGE(AAFwkTag::ABILITYMGR, "resolve failed, error: %{public}d.", RESOLVE_CALL_ABILITY_INNER_ERR); 943 return RESOLVE_CALL_ABILITY_INNER_ERR; 944 } 945 946 auto sessionInfo = CreateSessionInfo(abilityRequest); 947 sessionInfo->persistentId = persistentId; 948 sessionInfo->reuse = reuse; 949 sessionInfo->uiAbilityId = uiAbilityRecord->GetAbilityRecordId(); 950 sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); 951 if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) { 952 sessionInfo->state = CallToState::FOREGROUND; 953 } else { 954 sessionInfo->state = CallToState::BACKGROUND; 955 sessionInfo->needClearInNotShowRecent = true; 956 } 957 TAG_LOGD(AAFwkTag::ABILITYMGR, "Notify scb's abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId); 958 tmpAbilityMap_.emplace(uiAbilityRecord->GetAbilityRecordId(), uiAbilityRecord); 959 return NotifySCBPendingActivation(sessionInfo, abilityRequest); 960 } 961 CallUIAbilityBySCB(const sptr<SessionInfo> & sessionInfo,bool & isColdStart)962 void UIAbilityLifecycleManager::CallUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo, bool &isColdStart) 963 { 964 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, CallUIAbilityBySCB"); 965 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 966 std::lock_guard<ffrt::mutex> guard(sessionLock_); 967 CHECK_POINTER_LOG(sessionInfo, "sessionInfo is invalid."); 968 CHECK_POINTER_LOG(sessionInfo->sessionToken, "sessionToken is nullptr."); 969 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken); 970 auto descriptor = Str16ToStr8(sessionToken->GetDescriptor()); 971 if (descriptor != "OHOS.ISession") { 972 TAG_LOGE(AAFwkTag::ABILITYMGR, "token's Descriptor: %{public}s", descriptor.c_str()); 973 return; 974 } 975 976 TAG_LOGD(AAFwkTag::ABILITYMGR, "SCB output abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId); 977 auto search = tmpAbilityMap_.find(sessionInfo->uiAbilityId); 978 if (search == tmpAbilityMap_.end()) { 979 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not found UIAbility."); 980 return; 981 } 982 auto uiAbilityRecord = search->second; 983 CHECK_POINTER_LOG(uiAbilityRecord, "UIAbility not exist."); 984 auto sessionSearch = sessionAbilityMap_.find(sessionInfo->persistentId); 985 if (sessionSearch != sessionAbilityMap_.end()) { 986 TAG_LOGE(AAFwkTag::ABILITYMGR, "Session already exist."); 987 return; 988 } 989 isColdStart = true; 990 991 MoreAbilityNumbersSendEventInfo(sessionInfo->userId, sessionInfo->want.GetElement().GetBundleName(), 992 sessionInfo->want.GetElement().GetAbilityName(), sessionInfo->want.GetElement().GetModuleName()); 993 994 sessionAbilityMap_.emplace(sessionInfo->persistentId, uiAbilityRecord); 995 tmpAbilityMap_.erase(search); 996 uiAbilityRecord->SetSessionInfo(sessionInfo); 997 if (sessionInfo->state == CallToState::BACKGROUND) { 998 TAG_LOGI(AAFwkTag::ABILITYMGR, "set pending BACKGROUND"); 999 uiAbilityRecord->SetPendingState(AbilityState::BACKGROUND); 1000 } else { 1001 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND); 1002 } 1003 uiAbilityRecord->LoadAbility(); 1004 } 1005 CreateSessionInfo(const AbilityRequest & abilityRequest) const1006 sptr<SessionInfo> UIAbilityLifecycleManager::CreateSessionInfo(const AbilityRequest &abilityRequest) const 1007 { 1008 TAG_LOGD(AAFwkTag::ABILITYMGR, "Create session."); 1009 sptr<SessionInfo> sessionInfo = new SessionInfo(); 1010 sessionInfo->callerToken = abilityRequest.callerToken; 1011 sessionInfo->want = abilityRequest.want; 1012 sessionInfo->processOptions = abilityRequest.processOptions; 1013 sessionInfo->startWindowOption = abilityRequest.startWindowOption; 1014 sessionInfo->supportWindowModes = abilityRequest.supportWindowModes; 1015 if (abilityRequest.startSetting != nullptr) { 1016 TAG_LOGD(AAFwkTag::ABILITYMGR, "Assign start setting to session."); 1017 sessionInfo->startSetting = abilityRequest.startSetting; 1018 } 1019 sessionInfo->callingTokenId = static_cast<uint32_t>(abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 1020 IPCSkeleton::GetCallingTokenID())); 1021 return sessionInfo; 1022 } 1023 NotifySCBPendingActivation(sptr<SessionInfo> & sessionInfo,const AbilityRequest & abilityRequest)1024 int UIAbilityLifecycleManager::NotifySCBPendingActivation(sptr<SessionInfo> &sessionInfo, 1025 const AbilityRequest &abilityRequest) 1026 { 1027 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); 1028 TAG_LOGD(AAFwkTag::ABILITYMGR, "windowLeft=%{public}d,windowTop=%{public}d," 1029 "windowHeight=%{public}d,windowWidth=%{public}d,windowMode=%{public}d," 1030 "supportWindowModes.size=%{public}zu", 1031 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0), 1032 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0), 1033 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0), 1034 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0), 1035 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_MODE, 0), 1036 (sessionInfo->supportWindowModes).size()); 1037 TAG_LOGI(AAFwkTag::ABILITYMGR, "appCloneIndex: %{public}d.", 1038 (sessionInfo->want).GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, 0)); 1039 auto abilityRecord = GetAbilityRecordByToken(abilityRequest.callerToken); 1040 if (abilityRecord != nullptr && !abilityRecord->GetRestartAppFlag()) { 1041 auto callerSessionInfo = abilityRecord->GetSessionInfo(); 1042 CHECK_POINTER_AND_RETURN(callerSessionInfo, ERR_INVALID_VALUE); 1043 CHECK_POINTER_AND_RETURN(callerSessionInfo->sessionToken, ERR_INVALID_VALUE); 1044 auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken); 1045 CheckCallerFromBackground(abilityRecord, sessionInfo); 1046 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for callerSession, target: %{public}s", 1047 sessionInfo->want.GetElement().GetAbilityName().c_str()); 1048 return static_cast<int>(callerSession->PendingSessionActivation(sessionInfo)); 1049 } 1050 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_); 1051 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE); 1052 sessionInfo->canStartAbilityFromBackground = true; 1053 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for rootSceneSession, target: %{public}s", 1054 sessionInfo->want.GetElement().GetAbilityName().c_str()); 1055 return static_cast<int>(tmpSceneSession->PendingSessionActivation(sessionInfo)); 1056 } 1057 ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest) const1058 int UIAbilityLifecycleManager::ResolveAbility( 1059 const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest) const 1060 { 1061 TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbilityRecord resolve call record."); 1062 CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR); 1063 1064 ResolveResultType result = targetAbility->Resolve(abilityRequest); 1065 switch (result) { 1066 case ResolveResultType::NG_INNER_ERROR: 1067 case ResolveResultType::OK_HAS_REMOTE_OBJ: 1068 return result; 1069 default: 1070 break; 1071 } 1072 1073 if (targetAbility->IsReady()) { 1074 TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility is ready, directly scheduler call request."); 1075 targetAbility->CallRequest(); 1076 return ResolveResultType::OK_HAS_REMOTE_OBJ; 1077 } 1078 1079 TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility need to call request after lifecycle."); 1080 return result; 1081 } 1082 NotifyAbilityToken(const sptr<IRemoteObject> & token,const AbilityRequest & abilityRequest) const1083 void UIAbilityLifecycleManager::NotifyAbilityToken(const sptr<IRemoteObject> &token, 1084 const AbilityRequest &abilityRequest) const 1085 { 1086 auto abilityInfoCallback = iface_cast<AppExecFwk::IAbilityInfoCallback>(abilityRequest.abilityInfoCallback); 1087 if (abilityInfoCallback != nullptr) { 1088 abilityInfoCallback->NotifyAbilityToken(token, abilityRequest.want); 1089 } 1090 } 1091 PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability,uint32_t msgId,bool isHalf)1092 void UIAbilityLifecycleManager::PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability, uint32_t msgId, bool isHalf) 1093 { 1094 if (ability == nullptr) { 1095 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability is nullptr"); 1096 return; 1097 } 1098 AppExecFwk::RunningProcessInfo processInfo = {}; 1099 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo); 1100 if (processInfo.pid_ == 0) { 1101 TAG_LOGE(AAFwkTag::ABILITYMGR, "the ability:%{public}s, app may fork fail or not running.", 1102 ability->GetAbilityInfo().name.data()); 1103 return; 1104 } 1105 int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT; 1106 std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " "; 1107 if (!GetContentAndTypeId(msgId, msgContent, typeId)) { 1108 TAG_LOGW(AAFwkTag::ABILITYMGR, "msgId is invalid."); 1109 return; 1110 } 1111 1112 std::string eventName = isHalf ? 1113 AppExecFwk::AppFreezeType::LIFECYCLE_HALF_TIMEOUT : AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT; 1114 TAG_LOGW(AAFwkTag::ABILITYMGR, 1115 "%{public}s: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s," 1116 "msg: %{public}s", 1117 eventName.c_str(), processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(), 1118 ability->GetAbilityInfo().name.c_str(), msgContent.c_str()); 1119 1120 AppExecFwk::AppfreezeManager::ParamInfo info = { 1121 .typeId = typeId, 1122 .pid = processInfo.pid_, 1123 .eventName = eventName, 1124 .bundleName = ability->GetAbilityInfo().bundleName, 1125 }; 1126 FreezeUtil::TimeoutState state = MsgId2State(msgId); 1127 if (state != FreezeUtil::TimeoutState::UNKNOWN) { 1128 FreezeUtil::LifecycleFlow flow; 1129 if (ability->GetToken() != nullptr) { 1130 flow.token = ability->GetToken()->AsObject(); 1131 flow.state = state; 1132 } 1133 info.msg = msgContent + "\nserver:\n" + FreezeUtil::GetInstance().GetLifecycleEvent(flow) 1134 + "\nserver app:\n" + FreezeUtil::GetInstance().GetAppLifecycleEvent(processInfo.pid_); 1135 if (!isHalf) { 1136 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow); 1137 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(processInfo.pid_); 1138 } 1139 AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info, flow); 1140 } else { 1141 info.msg = msgContent; 1142 AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info); 1143 } 1144 } 1145 GetContentAndTypeId(uint32_t msgId,std::string & msgContent,int & typeId) const1146 bool UIAbilityLifecycleManager::GetContentAndTypeId(uint32_t msgId, std::string &msgContent, int &typeId) const 1147 { 1148 switch (msgId) { 1149 case AbilityManagerService::LOAD_TIMEOUT_MSG: 1150 msgContent += "load timeout."; 1151 typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT; 1152 break; 1153 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG: 1154 msgContent += "foreground timeout."; 1155 typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT; 1156 break; 1157 case AbilityManagerService::BACKGROUND_TIMEOUT_MSG: 1158 msgContent += "background timeout."; 1159 break; 1160 case AbilityManagerService::TERMINATE_TIMEOUT_MSG: 1161 msgContent += "terminate timeout."; 1162 break; 1163 default: 1164 return false; 1165 } 1166 return true; 1167 } 1168 CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1169 void UIAbilityLifecycleManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord) 1170 { 1171 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1172 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1173 if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) { 1174 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability state is %{public}d, it can't complete background.", 1175 abilityRecord->GetAbilityState()); 1176 return; 1177 } 1178 abilityRecord->SetAbilityState(AbilityState::BACKGROUND); 1179 // notify AppMS to update application state. 1180 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken()); 1181 1182 if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) { 1183 abilityRecord->PostForegroundTimeoutTask(); 1184 abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING); 1185 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken()); 1186 } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) { 1187 TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup."); 1188 abilityRecord->SetPendingState(AbilityState::INITIAL); 1189 } 1190 1191 // new version. started by caller, scheduler call request 1192 if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) { 1193 TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing background state"); 1194 abilityRecord->CallRequest(); 1195 abilityRecord->SetStartToBackground(false); 1196 } 1197 1198 // Abilities ahead of the one started were put in terminate list, we need to terminate them. 1199 auto self(shared_from_this()); 1200 for (auto terminateAbility : terminateAbilityList_) { 1201 if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) { 1202 auto timeoutTask = [terminateAbility, self]() { 1203 TAG_LOGW(AAFwkTag::ABILITYMGR, "Terminate ability timeout after background."); 1204 self->DelayCompleteTerminate(terminateAbility); 1205 }; 1206 terminateAbility->Terminate(timeoutTask); 1207 } 1208 } 1209 } 1210 BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,int resultCode,const Want * resultWant,int64_t callerRequestCode)1211 int32_t UIAbilityLifecycleManager::BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord, 1212 int resultCode, const Want *resultWant, int64_t callerRequestCode) 1213 { 1214 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1215 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1216 if (abilityRecord == nullptr) { 1217 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord nullptr."); 1218 return ERR_INVALID_VALUE; 1219 } 1220 auto requestInfo = StartupUtil::ParseFullRequestCode(callerRequestCode); 1221 TAG_LOGI(AAFwkTag::ABILITYMGR, "pid:%{public}d, backFlag:%{public}d, requestCode:%{public}d.", 1222 requestInfo.pid, requestInfo.backFlag, requestInfo.requestCode); 1223 if (requestInfo.requestCode <= 0 || requestInfo.pid <= 0) { 1224 TAG_LOGE(AAFwkTag::ABILITYMGR, "Cant't find caller by requestCode."); 1225 return ERR_CALLER_NOT_EXISTS; 1226 } 1227 auto callerAbilityRecord = abilityRecord->GetCallerByRequestCode(requestInfo.requestCode, requestInfo.pid); 1228 if (callerAbilityRecord == nullptr) { 1229 TAG_LOGE(AAFwkTag::ABILITYMGR, "Caller not exists."); 1230 return ERR_CALLER_NOT_EXISTS; 1231 } 1232 auto abilityResult = std::make_shared<AbilityResult>(requestInfo.requestCode, resultCode, *resultWant); 1233 callerAbilityRecord->SendResultByBackToCaller(abilityResult); 1234 abilityRecord->RemoveCallerRequestCode(callerAbilityRecord, requestInfo.requestCode); 1235 if (!requestInfo.backFlag) { 1236 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not support back to caller"); 1237 return ERR_NOT_SUPPORT_BACK_TO_CALLER; 1238 } 1239 if (callerAbilityRecord == abilityRecord) { 1240 TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is self"); 1241 return ERR_OK; 1242 } 1243 auto tokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId; 1244 TAG_LOGD(AAFwkTag::ABILITYMGR, "tokenId: %{public}d.", tokenId); 1245 if (!abilityRecord->IsForeground() && !abilityRecord->GetAbilityForegroundingFlag() && 1246 !PermissionVerification::GetInstance()->VerifyPermissionByTokenId(tokenId, 1247 PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND)) { 1248 TAG_LOGW(AAFwkTag::ABILITYMGR, "can't start ability from background."); 1249 return CHECK_PERMISSION_FAILED; 1250 } 1251 // find host of UI Extension 1252 auto foundCount = 0; 1253 while (((++foundCount) <= MAX_FIND_UIEXTENSION_CALLER_TIMES) && callerAbilityRecord && 1254 UIExtensionUtils::IsUIExtension(callerAbilityRecord->GetAbilityInfo().extensionAbilityType)) { 1255 TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is uiExtension."); 1256 callerAbilityRecord = callerAbilityRecord->GetCallerRecord(); 1257 } 1258 return BackToCallerAbilityWithResultLocked(abilityRecord->GetSessionInfo(), callerAbilityRecord); 1259 } 1260 BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo,std::shared_ptr<AbilityRecord> callerAbilityRecord)1261 int32_t UIAbilityLifecycleManager::BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo, 1262 std::shared_ptr<AbilityRecord> callerAbilityRecord) 1263 { 1264 TAG_LOGI(AAFwkTag::ABILITYMGR, "called."); 1265 if (currentSessionInfo == nullptr || currentSessionInfo->sessionToken == nullptr) { 1266 TAG_LOGI(AAFwkTag::ABILITYMGR, "currentSessionInfo is invalid."); 1267 return ERR_INVALID_VALUE; 1268 } 1269 1270 if (callerAbilityRecord == nullptr) { 1271 TAG_LOGI(AAFwkTag::ABILITYMGR, "callerAbility is invalid."); 1272 return ERR_INVALID_VALUE; 1273 } 1274 1275 auto callerSessionInfo = callerAbilityRecord->GetSessionInfo(); 1276 if (callerSessionInfo == nullptr || callerSessionInfo->sessionToken == nullptr) { 1277 TAG_LOGI(AAFwkTag::ABILITYMGR, "callerSessionInfo is invalid."); 1278 return ERR_INVALID_VALUE; 1279 } 1280 1281 auto currentSession = iface_cast<Rosen::ISession>(currentSessionInfo->sessionToken); 1282 callerSessionInfo->isBackTransition = true; 1283 auto ret = static_cast<int>(currentSession->PendingSessionActivation(callerSessionInfo)); 1284 callerSessionInfo->isBackTransition = false; 1285 return ret; 1286 } 1287 CloseUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool isClearSession)1288 int UIAbilityLifecycleManager::CloseUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, 1289 int resultCode, const Want *resultWant, bool isClearSession) 1290 { 1291 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1292 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1293 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1294 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 1295 std::string element = abilityRecord->GetElementName().GetURI(); 1296 TAG_LOGI(AAFwkTag::ABILITYMGR, "CloseUIAbility call: %{public}s", element.c_str()); 1297 if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) { 1298 TAG_LOGI(AAFwkTag::ABILITYMGR, "ability is on terminating"); 1299 return ERR_OK; 1300 } 1301 PrepareCloseUIAbility(abilityRecord, resultCode, resultWant, isClearSession); 1302 if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) { 1303 if (abilityRecord->GetScheduler() == nullptr) { 1304 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler(); 1305 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler."); 1306 handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId()); 1307 } 1308 terminateAbilityList_.remove(abilityRecord); 1309 return abilityRecord->TerminateAbility(); 1310 } 1311 if (abilityRecord->IsDebug() && isClearSession) { 1312 TAG_LOGD(AAFwkTag::ABILITYMGR, "notify AppMS terminate"); 1313 terminateAbilityList_.remove(abilityRecord); 1314 return abilityRecord->TerminateAbility(); 1315 } 1316 if (abilityRecord->GetPendingState() != AbilityState::INITIAL) { 1317 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped"); 1318 abilityRecord->SetPendingState(AbilityState::BACKGROUND); 1319 return ERR_OK; 1320 } 1321 return CloseUIAbilityInner(abilityRecord); 1322 } 1323 PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord,int resultCode,const Want * resultWant,bool isClearSession)1324 void UIAbilityLifecycleManager::PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord, 1325 int resultCode, const Want *resultWant, bool isClearSession) 1326 { 1327 if (!abilityRecord) { 1328 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record null"); 1329 return; 1330 } 1331 DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken(), isClearSession); 1332 abilityRecord->SetTerminatingState(); 1333 abilityRecord->SetClearMissionFlag(isClearSession); 1334 // save result to caller AbilityRecord 1335 if (resultWant != nullptr) { 1336 Want* newWant = const_cast<Want*>(resultWant); 1337 newWant->RemoveParam(Want::PARAM_RESV_CALLER_TOKEN); 1338 abilityRecord->SaveResultToCallers(resultCode, newWant); 1339 } else { 1340 Want want; 1341 abilityRecord->SaveResultToCallers(-1, &want); 1342 } 1343 EraseAbilityRecord(abilityRecord); 1344 abilityRecord->SendResultToCallers(); 1345 terminateAbilityList_.push_back(abilityRecord); 1346 } 1347 CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord)1348 int UIAbilityLifecycleManager::CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord) 1349 { 1350 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 1351 if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) { 1352 abilityRecord->SetPendingState(AbilityState::BACKGROUND); 1353 MoveToBackground(abilityRecord); 1354 return ERR_OK; 1355 } 1356 // ability on background, schedule to terminate. 1357 if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) { 1358 auto self(shared_from_this()); 1359 auto task = [abilityRecord, self]() { 1360 TAG_LOGW(AAFwkTag::ABILITYMGR, "close ability by scb timeout"); 1361 self->DelayCompleteTerminate(abilityRecord); 1362 }; 1363 abilityRecord->Terminate(task); 1364 } 1365 return ERR_OK; 1366 } 1367 DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1368 void UIAbilityLifecycleManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord) 1369 { 1370 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 1371 CHECK_POINTER(handler); 1372 1373 PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG); 1374 1375 auto timeoutTask = [self = shared_from_this(), abilityRecord]() { 1376 TAG_LOGI(AAFwkTag::ABILITYMGR, "emit delay complete terminate task!"); 1377 self->CompleteTerminate(abilityRecord); 1378 }; 1379 int killTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * KILL_TIMEOUT_MULTIPLE; 1380 handler->SubmitTask(timeoutTask, "DELAY_KILL_PROCESS", killTimeout); 1381 } 1382 CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1383 void UIAbilityLifecycleManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord) 1384 { 1385 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1386 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1387 CompleteTerminateLocked(abilityRecord); 1388 } 1389 CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> & abilityRecord)1390 void UIAbilityLifecycleManager::CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> &abilityRecord) 1391 { 1392 CHECK_POINTER(abilityRecord); 1393 if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) { 1394 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, %{public}s, ability is not terminating.", __func__); 1395 return; 1396 } 1397 abilityRecord->RemoveAbilityDeathRecipient(); 1398 1399 // notify AppMS terminate 1400 if (abilityRecord->TerminateAbility() != ERR_OK) { 1401 // Don't return here 1402 TAG_LOGE(AAFwkTag::ABILITYMGR, "AppMS fail to terminate ability."); 1403 } 1404 abilityRecord->RevokeUriPermission(); 1405 EraseSpecifiedAbilityRecord(abilityRecord); 1406 terminateAbilityList_.remove(abilityRecord); 1407 } 1408 GetPersistentIdByAbilityRequest(const AbilityRequest & abilityRequest,bool & reuse) const1409 int32_t UIAbilityLifecycleManager::GetPersistentIdByAbilityRequest(const AbilityRequest &abilityRequest, 1410 bool &reuse) const 1411 { 1412 if (abilityRequest.collaboratorType != CollaboratorType::DEFAULT_TYPE) { 1413 return GetReusedCollaboratorPersistentId(abilityRequest, reuse); 1414 } 1415 1416 if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) { 1417 return GetReusedSpecifiedPersistentId(abilityRequest, reuse); 1418 } 1419 1420 if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD) { 1421 return GetReusedStandardPersistentId(abilityRequest, reuse); 1422 } 1423 1424 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SINGLETON) { 1425 TAG_LOGW(AAFwkTag::ABILITYMGR, "Launch mode is not singleton."); 1426 return 0; 1427 } 1428 1429 reuse = true; 1430 for (const auto& [first, second] : sessionAbilityMap_) { 1431 if (CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::SINGLETON)) { 1432 TAG_LOGD(AAFwkTag::ABILITYMGR, "SINGLETON: find."); 1433 return first; 1434 } 1435 } 1436 1437 TAG_LOGD(AAFwkTag::ABILITYMGR, "Not find existed ui ability."); 1438 return 0; 1439 } 1440 GetReusedSpecifiedPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1441 int32_t UIAbilityLifecycleManager::GetReusedSpecifiedPersistentId(const AbilityRequest &abilityRequest, 1442 bool &reuse) const 1443 { 1444 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call."); 1445 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) { 1446 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not SPECIFIED."); 1447 return 0; 1448 } 1449 1450 reuse = true; 1451 // specified ability name and bundle name and module name and appIndex format is same as singleton. 1452 for (const auto& [first, second] : sessionAbilityMap_) { 1453 if (second->GetSpecifiedFlag() == abilityRequest.specifiedFlag && 1454 CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::SPECIFIED)) { 1455 TAG_LOGD(AAFwkTag::ABILITYMGR, "SPECIFIED: find."); 1456 return first; 1457 } 1458 } 1459 return 0; 1460 } 1461 GetReusedStandardPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1462 int32_t UIAbilityLifecycleManager::GetReusedStandardPersistentId(const AbilityRequest &abilityRequest, 1463 bool &reuse) const 1464 { 1465 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call."); 1466 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD) { 1467 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not STANDARD."); 1468 return 0; 1469 } 1470 1471 if (!abilityRequest.startRecent) { 1472 TAG_LOGW(AAFwkTag::ABILITYMGR, "startRecent is false."); 1473 return 0; 1474 } 1475 1476 reuse = true; 1477 int64_t sessionTime = 0; 1478 int32_t persistentId = 0; 1479 for (const auto& [first, second] : sessionAbilityMap_) { 1480 if (CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::STANDARD) && 1481 second->GetRestartTime() >= sessionTime) { 1482 persistentId = first; 1483 sessionTime = second->GetRestartTime(); 1484 } 1485 } 1486 return persistentId; 1487 } 1488 GetReusedCollaboratorPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1489 int32_t UIAbilityLifecycleManager::GetReusedCollaboratorPersistentId(const AbilityRequest &abilityRequest, 1490 bool &reuse) const 1491 { 1492 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call."); 1493 1494 reuse = false; 1495 int64_t sessionTime = 0; 1496 int32_t persistentId = 0; 1497 for (const auto& [first, second] : sessionAbilityMap_) { 1498 if (second->GetCollaboratorType() != CollaboratorType::DEFAULT_TYPE && 1499 abilityRequest.want.GetStringParam(PARAM_MISSION_AFFINITY_KEY) == second->GetMissionAffinity() && 1500 second->GetRestartTime() >= sessionTime) { 1501 reuse = true; 1502 persistentId = first; 1503 sessionTime = second->GetRestartTime(); 1504 } 1505 } 1506 return persistentId; 1507 } 1508 CheckProperties(const std::shared_ptr<AbilityRecord> & abilityRecord,const AbilityRequest & abilityRequest,AppExecFwk::LaunchMode launchMode) const1509 bool UIAbilityLifecycleManager::CheckProperties(const std::shared_ptr<AbilityRecord> &abilityRecord, 1510 const AbilityRequest &abilityRequest, AppExecFwk::LaunchMode launchMode) const 1511 { 1512 const auto& abilityInfo = abilityRecord->GetAbilityInfo(); 1513 int32_t appIndex = 0; 1514 (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex); 1515 return abilityInfo.launchMode == launchMode && abilityRequest.abilityInfo.name == abilityInfo.name && 1516 abilityRequest.abilityInfo.bundleName == abilityInfo.bundleName && 1517 abilityRequest.abilityInfo.moduleName == abilityInfo.moduleName && 1518 appIndex == abilityRecord->GetAppIndex(); 1519 } 1520 OnTimeOut(uint32_t msgId,int64_t abilityRecordId,bool isHalf)1521 void UIAbilityLifecycleManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf) 1522 { 1523 TAG_LOGD(AAFwkTag::ABILITYMGR, "call, msgId is %{public}d", msgId); 1524 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1525 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1526 std::shared_ptr<AbilityRecord> abilityRecord; 1527 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) { 1528 if (iter->second != nullptr && iter->second->GetAbilityRecordId() == abilityRecordId) { 1529 abilityRecord = iter->second; 1530 break; 1531 } 1532 } 1533 if (abilityRecord == nullptr) { 1534 for (auto abilityIter : terminateAbilityList_) { 1535 if (abilityIter && abilityIter->GetAbilityRecordId() == abilityRecordId) { 1536 abilityRecord = abilityIter; 1537 break; 1538 } 1539 } 1540 if (abilityRecord == nullptr) { 1541 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability record is nullptr"); 1542 return; 1543 } 1544 } 1545 TAG_LOGD(AAFwkTag::ABILITYMGR, "call, msgId:%{public}d, name:%{public}s", msgId, 1546 abilityRecord->GetAbilityInfo().name.c_str()); 1547 abilityRecord->RevokeUriPermission(); 1548 PrintTimeOutLog(abilityRecord, msgId, isHalf); 1549 if (isHalf) { 1550 return; 1551 } 1552 switch (msgId) { 1553 case AbilityManagerService::LOAD_TIMEOUT_MSG: 1554 abilityRecord->SetLoading(false); 1555 HandleLoadTimeout(abilityRecord); 1556 break; 1557 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG: 1558 HandleForegroundTimeout(abilityRecord); 1559 break; 1560 default: 1561 break; 1562 } 1563 } 1564 SetRootSceneSession(const sptr<IRemoteObject> & rootSceneSession)1565 void UIAbilityLifecycleManager::SetRootSceneSession(const sptr<IRemoteObject> &rootSceneSession) 1566 { 1567 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1568 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession); 1569 if (tmpSceneSession == nullptr) { 1570 TAG_LOGE(AAFwkTag::ABILITYMGR, "rootSceneSession is invalid."); 1571 return; 1572 } 1573 rootSceneSession_ = rootSceneSession; 1574 } 1575 NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t errorCode,const std::string & errorReason)1576 void UIAbilityLifecycleManager::NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> &abilityRecord, 1577 int32_t errorCode, const std::string& errorReason) 1578 { 1579 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1580 if (abilityRecord == nullptr) { 1581 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is nullptr"); 1582 return; 1583 } 1584 auto sessionInfo = abilityRecord->GetSessionInfo(); 1585 CHECK_POINTER(sessionInfo); 1586 CHECK_POINTER(sessionInfo->sessionToken); 1587 auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken); 1588 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBToHandleException reason: %{public}s", errorReason.c_str()); 1589 sptr<SessionInfo> info = abilityRecord->GetSessionInfo(); 1590 info->errorCode = errorCode; 1591 info->errorReason = errorReason; 1592 session->NotifySessionException(info); 1593 EraseAbilityRecord(abilityRecord); 1594 } 1595 NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo,int32_t errorCode,const std::string & errorReason)1596 void UIAbilityLifecycleManager::NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo, 1597 int32_t errorCode, const std::string& errorReason) 1598 { 1599 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1600 CHECK_POINTER(sessionInfo); 1601 CHECK_POINTER(sessionInfo->sessionToken); 1602 auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken); 1603 TAG_LOGI(AAFwkTag::ABILITYMGR, "call notifySessionException"); 1604 sessionInfo->errorCode = errorCode; 1605 sessionInfo->errorReason = errorReason; 1606 session->NotifySessionException(sessionInfo); 1607 } 1608 HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & abilityRecord)1609 void UIAbilityLifecycleManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &abilityRecord) 1610 { 1611 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1612 if (abilityRecord == nullptr) { 1613 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability record is nullptr"); 1614 return; 1615 } 1616 NotifySCBToHandleException(abilityRecord, 1617 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleLoadTimeout"); 1618 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken()); 1619 } 1620 HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & abilityRecord)1621 void UIAbilityLifecycleManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &abilityRecord) 1622 { 1623 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1624 if (abilityRecord == nullptr) { 1625 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is nullptr"); 1626 return; 1627 } 1628 if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) { 1629 TAG_LOGE(AAFwkTag::ABILITYMGR, "this ability is not foregrounding state"); 1630 return; 1631 } 1632 NotifySCBToHandleException(abilityRecord, 1633 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_FOREGROUND_TIMEOUT), "handleForegroundTimeout"); 1634 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken()); 1635 EraseSpecifiedAbilityRecord(abilityRecord); 1636 } 1637 OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)1638 void UIAbilityLifecycleManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord) 1639 { 1640 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1641 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1642 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1643 if (abilityRecord == nullptr) { 1644 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability record is nullptr"); 1645 return; 1646 } 1647 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler(); 1648 CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler."); 1649 if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) { 1650 handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId()); 1651 abilityRecord->SetLoading(false); 1652 } 1653 if (abilityRecord->GetAbilityState() == AbilityState::FOREGROUNDING) { 1654 handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId()); 1655 } 1656 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 1657 CHECK_POINTER_LOG(taskHandler, "Get AbilityTaskHandler failed."); 1658 if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUNDING) { 1659 taskHandler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId())); 1660 } 1661 1662 terminateAbilityList_.push_back(abilityRecord); 1663 abilityRecord->SetAbilityState(AbilityState::TERMINATING); 1664 if (!abilityRecord->GetRestartAppFlag()) { 1665 NotifySCBToHandleException(abilityRecord, static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_DIED), 1666 "onAbilityDied"); 1667 } 1668 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken()); 1669 DispatchTerminate(abilityRecord); 1670 EraseSpecifiedAbilityRecord(abilityRecord); 1671 } 1672 OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag,int32_t requestId)1673 void UIAbilityLifecycleManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag, 1674 int32_t requestId) 1675 { 1676 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1677 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1678 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1679 auto it = specifiedRequestMap_.find(requestId); 1680 if (it == specifiedRequestMap_.end()) { 1681 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not find for %{public}s.", want.GetElement().GetURI().c_str()); 1682 return; 1683 } 1684 1685 AbilityRequest abilityRequest = it->second; 1686 specifiedRequestMap_.erase(it); 1687 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) { 1688 return; 1689 } 1690 TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s.", want.GetElement().GetURI().c_str()); 1691 auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken); 1692 if (!flag.empty()) { 1693 abilityRequest.specifiedFlag = flag; 1694 bool reuse = false; 1695 auto persistentId = GetReusedSpecifiedPersistentId(abilityRequest, reuse); 1696 if (persistentId != 0) { 1697 std::shared_ptr<AbilityRecord> abilityRecord = nullptr; 1698 auto iter = sessionAbilityMap_.find(persistentId); 1699 if (iter != sessionAbilityMap_.end()) { 1700 TAG_LOGI(AAFwkTag::ABILITYMGR, "find specified ability"); 1701 abilityRecord = iter->second; 1702 } else { 1703 TAG_LOGE(AAFwkTag::ABILITYMGR, "OnAcceptWantResponse Unexpected Error"); 1704 return; 1705 } 1706 if (!abilityRecord) { 1707 TAG_LOGE(AAFwkTag::ABILITYMGR, "OnAcceptWantResponse abilityRecord null"); 1708 return; 1709 } 1710 abilityRecord->SetWant(abilityRequest.want); 1711 abilityRecord->SetIsNewWant(true); 1712 UpdateAbilityRecordLaunchReason(abilityRequest, abilityRecord); 1713 MoveAbilityToFront(abilityRequest, abilityRecord, callerAbility); 1714 NotifyRestartSpecifiedAbility(abilityRequest, abilityRecord->GetToken()); 1715 return; 1716 } 1717 } 1718 NotifyStartSpecifiedAbility(abilityRequest, want); 1719 StartAbilityBySpecifed(abilityRequest, callerAbility); 1720 } 1721 OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want,int32_t requestId)1722 void UIAbilityLifecycleManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want, int32_t requestId) 1723 { 1724 TAG_LOGI(AAFwkTag::ABILITYMGR, "called"); 1725 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1726 specifiedRequestMap_.erase(requestId); 1727 } 1728 OnStartSpecifiedProcessResponse(const AAFwk::Want & want,const std::string & flag,int32_t requestId)1729 void UIAbilityLifecycleManager::OnStartSpecifiedProcessResponse(const AAFwk::Want &want, const std::string &flag, 1730 int32_t requestId) 1731 { 1732 TAG_LOGD(AAFwkTag::ABILITYMGR, "call."); 1733 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1734 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1735 auto it = specifiedRequestMap_.find(requestId); 1736 if (it == specifiedRequestMap_.end()) { 1737 return; 1738 } 1739 TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s.", want.GetElement().GetURI().c_str()); 1740 it->second.want.SetParam(PARAM_SPECIFIED_PROCESS_FLAG, flag); 1741 AbilityRequest abilityRequest = it->second; 1742 auto isSpecified = (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED); 1743 if (isSpecified) { 1744 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility( 1745 abilityRequest.want, abilityRequest.abilityInfo, requestId); 1746 return; 1747 } 1748 specifiedRequestMap_.erase(it); 1749 auto sessionInfo = CreateSessionInfo(abilityRequest); 1750 sessionInfo->requestCode = abilityRequest.requestCode; 1751 sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse); 1752 sessionInfo->userId = abilityRequest.userId; 1753 sessionInfo->isAtomicService = 1754 (abilityRequest.abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); 1755 TAG_LOGI(AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, 1756 abilityRequest.userId); 1757 NotifySCBPendingActivation(sessionInfo, abilityRequest); 1758 } 1759 OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want & want,int32_t requestId)1760 void UIAbilityLifecycleManager::OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want &want, int32_t requestId) 1761 { 1762 TAG_LOGI(AAFwkTag::ABILITYMGR, "called"); 1763 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1764 specifiedRequestMap_.erase(requestId); 1765 } 1766 StartSpecifiedAbilityBySCB(const Want & want)1767 void UIAbilityLifecycleManager::StartSpecifiedAbilityBySCB(const Want &want) 1768 { 1769 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1770 AbilityRequest abilityRequest; 1771 int result = DelayedSingleton<AbilityManagerService>::GetInstance()->GenerateAbilityRequest( 1772 want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_); 1773 if (result != ERR_OK) { 1774 TAG_LOGE(AAFwkTag::ABILITYMGR, "cannot find generate ability request"); 1775 return; 1776 } 1777 abilityRequest.isFromIcon = true; 1778 int32_t requestId = 0; 1779 { 1780 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1781 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1782 requestId = specifiedRequestId_++; 1783 specifiedRequestMap_.emplace(requestId, abilityRequest); 1784 } 1785 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility( 1786 abilityRequest.want, abilityRequest.abilityInfo, requestId); 1787 } 1788 GetReusedSpecifiedAbility(const AAFwk::Want & want,const std::string & flag)1789 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetReusedSpecifiedAbility(const AAFwk::Want &want, 1790 const std::string &flag) 1791 { 1792 auto element = want.GetElement(); 1793 for (const auto& [first, second] : specifiedAbilityMap_) { 1794 if (flag == first.flag && element.GetAbilityName() == first.abilityName && 1795 element.GetBundleName() == first.bundleName) { 1796 return second; 1797 } 1798 } 1799 return nullptr; 1800 } 1801 NotifyRestartSpecifiedAbility(AbilityRequest & request,const sptr<IRemoteObject> & token)1802 void UIAbilityLifecycleManager::NotifyRestartSpecifiedAbility(AbilityRequest &request, 1803 const sptr<IRemoteObject> &token) 1804 { 1805 if (request.abilityInfoCallback == nullptr) { 1806 return; 1807 } 1808 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback 1809 = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback); 1810 if (abilityInfoCallback != nullptr) { 1811 TAG_LOGD(AAFwkTag::ABILITYMGR, "called"); 1812 abilityInfoCallback->NotifyRestartSpecifiedAbility(token); 1813 } 1814 } 1815 NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)1816 void UIAbilityLifecycleManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want) 1817 { 1818 if (abilityRequest.abilityInfoCallback == nullptr) { 1819 return; 1820 } 1821 1822 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback 1823 = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback); 1824 if (abilityInfoCallback != nullptr) { 1825 Want newWant = want; 1826 int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type); 1827 newWant.SetParam("abilityType", type); 1828 sptr<Want> extraParam = new (std::nothrow) Want(); 1829 abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant, 1830 abilityRequest.requestCode, extraParam); 1831 int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0); 1832 if (procCode != 0) { 1833 abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode); 1834 } 1835 int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0); 1836 if (tokenCode != 0) { 1837 abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode); 1838 } 1839 } 1840 } 1841 MoveAbilityToFront(const AbilityRequest & abilityRequest,const std::shared_ptr<AbilityRecord> & abilityRecord,std::shared_ptr<AbilityRecord> callerAbility,std::shared_ptr<StartOptions> startOptions)1842 int UIAbilityLifecycleManager::MoveAbilityToFront(const AbilityRequest &abilityRequest, 1843 const std::shared_ptr<AbilityRecord> &abilityRecord, std::shared_ptr<AbilityRecord> callerAbility, 1844 std::shared_ptr<StartOptions> startOptions) 1845 { 1846 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1847 if (!abilityRecord) { 1848 TAG_LOGE(AAFwkTag::ABILITYMGR, "get target ability record failed"); 1849 return ERR_INVALID_VALUE; 1850 } 1851 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo(); 1852 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); 1853 sessionInfo->want = abilityRequest.want; 1854 sessionInfo->callerToken = abilityRequest.callerToken; 1855 sessionInfo->requestCode = abilityRequest.requestCode; 1856 sessionInfo->processOptions = nullptr; 1857 sessionInfo->startWindowOption = nullptr; 1858 sessionInfo->isFromIcon = abilityRequest.isFromIcon; 1859 SendSessionInfoToSCB(callerAbility, sessionInfo); 1860 abilityRecord->RemoveWindowMode(); 1861 if (startOptions != nullptr) { 1862 abilityRecord->SetWindowMode(startOptions->GetWindowMode()); 1863 } 1864 return ERR_OK; 1865 } 1866 SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> & callerAbility,sptr<SessionInfo> & sessionInfo)1867 int UIAbilityLifecycleManager::SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> &callerAbility, 1868 sptr<SessionInfo> &sessionInfo) 1869 { 1870 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); 1871 TAG_LOGD(AAFwkTag::ABILITYMGR, "call" 1872 "windowLeft=%{public}d,windowTop=%{public}d," 1873 "windowHeight=%{public}d,windowWidth=%{public}d", 1874 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0), 1875 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0), 1876 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0), 1877 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0)); 1878 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_); 1879 if (callerAbility != nullptr) { 1880 auto callerSessionInfo = callerAbility->GetSessionInfo(); 1881 if (callerSessionInfo != nullptr && callerSessionInfo->sessionToken != nullptr) { 1882 auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken); 1883 CheckCallerFromBackground(callerAbility, sessionInfo); 1884 callerSession->PendingSessionActivation(sessionInfo); 1885 } else { 1886 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE); 1887 sessionInfo->canStartAbilityFromBackground = true; 1888 tmpSceneSession->PendingSessionActivation(sessionInfo); 1889 } 1890 } else { 1891 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE); 1892 sessionInfo->canStartAbilityFromBackground = true; 1893 tmpSceneSession->PendingSessionActivation(sessionInfo); 1894 } 1895 return ERR_OK; 1896 } 1897 StartAbilityBySpecifed(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & callerAbility)1898 int UIAbilityLifecycleManager::StartAbilityBySpecifed(const AbilityRequest &abilityRequest, 1899 std::shared_ptr<AbilityRecord> &callerAbility) 1900 { 1901 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 1902 sptr<SessionInfo> sessionInfo = new SessionInfo(); 1903 sessionInfo->callerToken = abilityRequest.callerToken; 1904 sessionInfo->want = abilityRequest.want; 1905 sessionInfo->requestCode = abilityRequest.requestCode; 1906 sessionInfo->processOptions = abilityRequest.processOptions; 1907 sessionInfo->startWindowOption = abilityRequest.startWindowOption; 1908 sessionInfo->isFromIcon = abilityRequest.isFromIcon; 1909 SpecifiedInfo specifiedInfo; 1910 specifiedInfo.abilityName = abilityRequest.abilityInfo.name; 1911 specifiedInfo.bundleName = abilityRequest.abilityInfo.bundleName; 1912 specifiedInfo.flag = abilityRequest.specifiedFlag; 1913 specifiedInfoQueue_.push(specifiedInfo); 1914 1915 SendSessionInfoToSCB(callerAbility, sessionInfo); 1916 return ERR_OK; 1917 } 1918 CallRequestDone(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<IRemoteObject> & callStub)1919 void UIAbilityLifecycleManager::CallRequestDone(const std::shared_ptr<AbilityRecord> &abilityRecord, 1920 const sptr<IRemoteObject> &callStub) 1921 { 1922 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1923 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1924 if (abilityRecord == nullptr) { 1925 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null."); 1926 return; 1927 } 1928 if (callStub == nullptr) { 1929 TAG_LOGE(AAFwkTag::ABILITYMGR, "call stub is null."); 1930 return; 1931 } 1932 abilityRecord->CallRequestDone(callStub); 1933 } 1934 ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)1935 int UIAbilityLifecycleManager::ReleaseCallLocked( 1936 const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element) 1937 { 1938 TAG_LOGD(AAFwkTag::ABILITYMGR, "release call ability."); 1939 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1940 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE); 1941 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE); 1942 1943 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1944 1945 auto abilityRecords = GetAbilityRecordsByNameInner(element); 1946 auto isExist = [connect] (const std::shared_ptr<AbilityRecord> &abilityRecord) { 1947 return abilityRecord->IsExistConnection(connect); 1948 }; 1949 auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist); 1950 if (findRecord == abilityRecords.end()) { 1951 TAG_LOGE(AAFwkTag::ABILITYMGR, "not found ability record by callback."); 1952 return RELEASE_CALL_ABILITY_INNER_ERR; 1953 } 1954 auto abilityRecord = *findRecord; 1955 CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR); 1956 1957 if (!abilityRecord->ReleaseCall(connect)) { 1958 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability release call record failed."); 1959 return RELEASE_CALL_ABILITY_INNER_ERR; 1960 } 1961 return ERR_OK; 1962 } 1963 OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)1964 void UIAbilityLifecycleManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord) 1965 { 1966 TAG_LOGI(AAFwkTag::ABILITYMGR, "On callConnect died."); 1967 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 1968 CHECK_POINTER(callRecord); 1969 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1970 1971 AppExecFwk::ElementName element = callRecord->GetTargetServiceName(); 1972 auto abilityRecords = GetAbilityRecordsByNameInner(element); 1973 auto isExist = [callRecord] (const std::shared_ptr<AbilityRecord> &abilityRecord) { 1974 return abilityRecord->IsExistConnection(callRecord->GetConCallBack()); 1975 }; 1976 auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist); 1977 if (findRecord == abilityRecords.end()) { 1978 TAG_LOGE(AAFwkTag::ABILITYMGR, "not found ability record by callback"); 1979 return; 1980 } 1981 auto abilityRecord = *findRecord; 1982 CHECK_POINTER(abilityRecord); 1983 abilityRecord->ReleaseCall(callRecord->GetConCallBack()); 1984 } 1985 GetAbilityRecordsByName(const AppExecFwk::ElementName & element)1986 std::vector<std::shared_ptr<AbilityRecord>> UIAbilityLifecycleManager::GetAbilityRecordsByName( 1987 const AppExecFwk::ElementName &element) 1988 { 1989 std::lock_guard<ffrt::mutex> guard(sessionLock_); 1990 return GetAbilityRecordsByNameInner(element); 1991 } 1992 GetAbilityRecordsByNameInner(const AppExecFwk::ElementName & element)1993 std::vector<std::shared_ptr<AbilityRecord>> UIAbilityLifecycleManager::GetAbilityRecordsByNameInner( 1994 const AppExecFwk::ElementName &element) 1995 { 1996 std::vector<std::shared_ptr<AbilityRecord>> records; 1997 for (const auto& [first, second] : sessionAbilityMap_) { 1998 auto &abilityInfo = second->GetAbilityInfo(); 1999 AppExecFwk::ElementName localElement(abilityInfo.deviceId, abilityInfo.bundleName, 2000 abilityInfo.name, abilityInfo.moduleName); 2001 AppExecFwk::ElementName localElementNoModuleName(abilityInfo.deviceId, 2002 abilityInfo.bundleName, abilityInfo.name); 2003 if (localElement == element || localElementNoModuleName == element) { 2004 TAG_LOGD(AAFwkTag::ABILITYMGR, "find element %{public}s", localElement.GetURI().c_str()); 2005 records.push_back(second); 2006 } 2007 } 2008 return records; 2009 } 2010 GetSessionIdByAbilityToken(const sptr<IRemoteObject> & token)2011 int32_t UIAbilityLifecycleManager::GetSessionIdByAbilityToken(const sptr<IRemoteObject> &token) 2012 { 2013 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2014 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2015 for (const auto& [first, second] : sessionAbilityMap_) { 2016 if (second && second->GetToken()->AsObject() == token) { 2017 return first; 2018 } 2019 } 2020 TAG_LOGE(AAFwkTag::ABILITYMGR, "not find"); 2021 return 0; 2022 } 2023 SetRevicerInfo(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord) const2024 void UIAbilityLifecycleManager::SetRevicerInfo(const AbilityRequest &abilityRequest, 2025 std::shared_ptr<AbilityRecord> &abilityRecord) const 2026 { 2027 CHECK_POINTER(abilityRecord); 2028 const auto &abilityInfo = abilityRequest.abilityInfo; 2029 std::string abilityName = abilityInfo.name; 2030 auto isStandard = abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && !abilityRequest.startRecent; 2031 if (isStandard && abilityRequest.sessionInfo != nullptr) { 2032 // Support standard launch type. 2033 auto persistentId = abilityRequest.sessionInfo->persistentId; 2034 abilityName += std::to_string(abilityRequest.sessionInfo->persistentId); 2035 } 2036 2037 bool hasRecoverInfo = false; 2038 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()-> 2039 GetAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, abilityName, 2040 hasRecoverInfo); 2041 abilityRecord->UpdateRecoveryInfo(hasRecoverInfo); 2042 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()-> 2043 DeleteAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, abilityName); 2044 } 2045 SetLastExitReason(std::shared_ptr<AbilityRecord> & abilityRecord) const2046 void UIAbilityLifecycleManager::SetLastExitReason(std::shared_ptr<AbilityRecord> &abilityRecord) const 2047 { 2048 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2049 if (abilityRecord == nullptr) { 2050 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2051 return; 2052 } 2053 2054 if (abilityRecord->GetAbilityInfo().bundleName.empty()) { 2055 TAG_LOGE(AAFwkTag::ABILITYMGR, "bundleName is empty."); 2056 return; 2057 } 2058 2059 auto sessionInfo = abilityRecord->GetSessionInfo(); 2060 if (sessionInfo == nullptr) { 2061 TAG_LOGE(AAFwkTag::ABILITYMGR, "Session info invalid."); 2062 return; 2063 } 2064 2065 std::string abilityName = abilityRecord->GetAbilityInfo().name; 2066 if (abilityRecord->GetAbilityInfo().launchMode == AppExecFwk::LaunchMode::STANDARD) { 2067 abilityName += std::to_string(sessionInfo->persistentId); 2068 } 2069 2070 ExitReason exitReason; 2071 bool isSetReason; 2072 auto accessTokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId; 2073 DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->GetAppExitReason( 2074 abilityRecord->GetAbilityInfo().bundleName, accessTokenId, abilityName, isSetReason, exitReason); 2075 2076 if (isSetReason) { 2077 TAG_LOGD(AAFwkTag::ABILITYMGR, "Set last exit reason, ability: %{public}s, reason: %{public}d.", 2078 abilityName.c_str(), exitReason.reason); 2079 abilityRecord->SetLastExitReason(exitReason); 2080 } 2081 } 2082 PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)2083 bool UIAbilityLifecycleManager::PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord) 2084 { 2085 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 2086 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2087 if (abilityRecord == nullptr) { 2088 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null"); 2089 return false; 2090 } 2091 TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityInfoName:%{public}s", abilityRecord->GetAbilityInfo().name.c_str()); 2092 if (!CheckPrepareTerminateEnable(abilityRecord)) { 2093 TAG_LOGD(AAFwkTag::ABILITYMGR, "Not support prepare terminate."); 2094 return false; 2095 } 2096 // execute onPrepareToTerminate util timeout 2097 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 2098 if (taskHandler == nullptr) { 2099 TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to get AbilityTaskHandler."); 2100 return false; 2101 } 2102 auto promise = std::make_shared<std::promise<bool>>(); 2103 auto future = promise->get_future(); 2104 auto task = [promise, abilityRecord]() { 2105 promise->set_value(abilityRecord->PrepareTerminateAbility()); 2106 }; 2107 taskHandler->SubmitTask(task); 2108 int prepareTerminateTimeout = 2109 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * PREPARE_TERMINATE_TIMEOUT_MULTIPLE; 2110 std::future_status status = future.wait_for(std::chrono::milliseconds(prepareTerminateTimeout)); 2111 if (status == std::future_status::timeout) { 2112 TAG_LOGE(AAFwkTag::ABILITYMGR, "onPrepareToTerminate timeout."); 2113 return false; 2114 } 2115 return future.get(); 2116 } 2117 CheckPrepareTerminateEnable(const std::shared_ptr<AbilityRecord> & abilityRecord)2118 bool UIAbilityLifecycleManager::CheckPrepareTerminateEnable(const std::shared_ptr<AbilityRecord> &abilityRecord) 2119 { 2120 if (abilityRecord == nullptr || abilityRecord->IsTerminating()) { 2121 TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability record is not exist or is on terminating."); 2122 return false; 2123 } 2124 auto type = abilityRecord->GetAbilityInfo().type; 2125 bool isStageBasedModel = abilityRecord->GetAbilityInfo().isStageBasedModel; 2126 if (!isStageBasedModel || type != AppExecFwk::AbilityType::PAGE) { 2127 TAG_LOGD(AAFwkTag::ABILITYMGR, "ability mode not support."); 2128 return false; 2129 } 2130 auto tokenId = abilityRecord->GetApplicationInfo().accessTokenId; 2131 if (!AAFwk::PermissionVerification::GetInstance()->VerifyPrepareTerminatePermission(tokenId)) { 2132 TAG_LOGD(AAFwkTag::ABILITYMGR, "failed, please apply permission ohos.permission.PREPARE_APP_TERMINATE"); 2133 return false; 2134 } 2135 return true; 2136 } 2137 SetSessionHandler(const sptr<ISessionHandler> & handler)2138 void UIAbilityLifecycleManager::SetSessionHandler(const sptr<ISessionHandler> &handler) 2139 { 2140 handler_ = handler; 2141 } 2142 GetAbilityRecordsById(int32_t sessionId) const2143 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetAbilityRecordsById(int32_t sessionId) const 2144 { 2145 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2146 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2147 auto search = sessionAbilityMap_.find(sessionId); 2148 if (search == sessionAbilityMap_.end()) { 2149 TAG_LOGI(AAFwkTag::ABILITYMGR, "sessionId is invalid."); 2150 return nullptr; 2151 } 2152 return search->second; 2153 } 2154 GetActiveAbilityList(int32_t uid,std::vector<std::string> & abilityList,int32_t pid)2155 void UIAbilityLifecycleManager::GetActiveAbilityList(int32_t uid, std::vector<std::string> &abilityList, int32_t pid) 2156 { 2157 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2158 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2159 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call."); 2160 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) { 2161 if (abilityRecord == nullptr) { 2162 TAG_LOGW(AAFwkTag::ABILITYMGR, "second is nullptr."); 2163 continue; 2164 } 2165 if (!CheckPid(abilityRecord, pid)) { 2166 continue; 2167 } 2168 const auto &abilityInfo = abilityRecord->GetAbilityInfo(); 2169 if (abilityInfo.applicationInfo.uid == uid && !abilityInfo.name.empty()) { 2170 std::string abilityName = abilityInfo.name; 2171 if (abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && 2172 abilityRecord->GetSessionInfo() != nullptr) { 2173 abilityName += std::to_string(abilityRecord->GetSessionInfo()->persistentId); 2174 } 2175 TAG_LOGD(AAFwkTag::ABILITYMGR, "find ability name is %{public}s.", abilityName.c_str()); 2176 abilityList.push_back(abilityName); 2177 } 2178 } 2179 if (!abilityList.empty()) { 2180 sort(abilityList.begin(), abilityList.end()); 2181 abilityList.erase(unique(abilityList.begin(), abilityList.end()), abilityList.end()); 2182 } 2183 } 2184 CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord,const int32_t pid) const2185 bool UIAbilityLifecycleManager::CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord, const int32_t pid) const 2186 { 2187 CHECK_POINTER_RETURN_BOOL(abilityRecord); 2188 return pid == NO_PID || abilityRecord->GetPid() == pid; 2189 } 2190 CheckAbilityNumber(const std::string & bundleName,const std::string & abilityName,const std::string & moduleName) const2191 int32_t UIAbilityLifecycleManager::CheckAbilityNumber( 2192 const std::string &bundleName, const std::string &abilityName, const std::string &moduleName) const 2193 { 2194 int32_t checkAbilityNumber = 0; 2195 2196 for (auto [persistentId, record] : sessionAbilityMap_) { 2197 auto recordAbilityInfo = record->GetAbilityInfo(); 2198 if (bundleName == recordAbilityInfo.bundleName && abilityName == recordAbilityInfo.name && 2199 moduleName == recordAbilityInfo.moduleName) { 2200 // check ability number created previously and add new one. 2201 checkAbilityNumber += 1; 2202 } 2203 } 2204 2205 return checkAbilityNumber; 2206 } 2207 MoreAbilityNumbersSendEventInfo(int32_t userId,const std::string & bundleName,const std::string & abilityName,const std::string & moduleName)2208 void UIAbilityLifecycleManager::MoreAbilityNumbersSendEventInfo( 2209 int32_t userId, const std::string &bundleName, const std::string &abilityName, const std::string &moduleName) 2210 { 2211 int32_t checkAbilityNumber = 0; 2212 checkAbilityNumber = CheckAbilityNumber(bundleName, abilityName, moduleName); 2213 TAG_LOGD(AAFwkTag::ABILITYMGR, "Check ability number:%{public}d", checkAbilityNumber); 2214 2215 if (checkAbilityNumber >= 1) { 2216 EventInfo eventInfo; 2217 eventInfo.userId = userId; 2218 eventInfo.abilityName = abilityName; 2219 eventInfo.bundleName = bundleName; 2220 eventInfo.moduleName = moduleName; 2221 // get ability number created previously and add new one. 2222 eventInfo.abilityNumber = checkAbilityNumber + 1; 2223 EventReport::SendAbilityEvent(EventName::START_STANDARD_ABILITIES, HiSysEventType::BEHAVIOR, eventInfo); 2224 } 2225 } 2226 OnAppStateChanged(const AppInfo & info)2227 void UIAbilityLifecycleManager::OnAppStateChanged(const AppInfo &info) 2228 { 2229 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2230 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2231 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call."); 2232 if (info.state == AppState::TERMINATED || info.state == AppState::END) { 2233 for (const auto& abilityRecord : terminateAbilityList_) { 2234 if (abilityRecord == nullptr) { 2235 TAG_LOGW(AAFwkTag::ABILITYMGR, "the abilityRecord is nullptr."); 2236 continue; 2237 } 2238 if (info.processName == abilityRecord->GetAbilityInfo().process || 2239 info.processName == abilityRecord->GetApplicationInfo().bundleName) { 2240 abilityRecord->SetAppState(info.state); 2241 } 2242 } 2243 return; 2244 } 2245 if (info.state == AppState::COLD_START) { 2246 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) { 2247 if (abilityRecord == nullptr) { 2248 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2249 continue; 2250 } 2251 if (info.processName == abilityRecord->GetAbilityInfo().process || 2252 info.processName == abilityRecord->GetApplicationInfo().bundleName) { 2253 abilityRecord->SetColdStartFlag(true); 2254 break; 2255 } 2256 } 2257 return; 2258 } 2259 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) { 2260 if (abilityRecord == nullptr) { 2261 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2262 continue; 2263 } 2264 if (info.processName == abilityRecord->GetAbilityInfo().process || 2265 info.processName == abilityRecord->GetApplicationInfo().bundleName) { 2266 abilityRecord->SetAppState(info.state); 2267 } 2268 } 2269 } 2270 UninstallApp(const std::string & bundleName,int32_t uid)2271 void UIAbilityLifecycleManager::UninstallApp(const std::string &bundleName, int32_t uid) 2272 { 2273 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2274 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2275 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call."); 2276 for (auto it = sessionAbilityMap_.begin(); it != sessionAbilityMap_.end();) { 2277 if (it->second == nullptr) { 2278 it++; 2279 continue; 2280 } 2281 auto &abilityInfo = it->second->GetAbilityInfo(); 2282 if (abilityInfo.bundleName == bundleName && it->second->GetUid() == uid) { 2283 std::string abilityName = abilityInfo.name; 2284 auto sessionInfo = it->second->GetSessionInfo(); 2285 if (abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && sessionInfo != nullptr) { 2286 abilityName += std::to_string(sessionInfo->persistentId); 2287 } 2288 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()-> 2289 DeleteAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, 2290 abilityName); 2291 } 2292 it++; 2293 } 2294 } 2295 GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm) const2296 void UIAbilityLifecycleManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm) const 2297 { 2298 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2299 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2300 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call."); 2301 for (auto [sessionId, abilityRecord] : sessionAbilityMap_) { 2302 if (abilityRecord == nullptr) { 2303 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2304 continue; 2305 } 2306 if (isPerm) { 2307 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord); 2308 } else { 2309 auto callingTokenId = IPCSkeleton::GetCallingTokenID(); 2310 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId; 2311 if (callingTokenId == tokenID) { 2312 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord); 2313 } 2314 } 2315 } 2316 } 2317 Dump(std::vector<std::string> & info)2318 void UIAbilityLifecycleManager::Dump(std::vector<std::string> &info) 2319 { 2320 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call begin."); 2321 std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked; 2322 { 2323 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2324 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2325 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) { 2326 sessionAbilityMapLocked[sessionId] = abilityRecord; 2327 } 2328 } 2329 2330 std::string dumpInfo = "User ID #" + std::to_string(userId_); 2331 info.push_back(dumpInfo); 2332 dumpInfo = " current mission lists:{"; 2333 info.push_back(dumpInfo); 2334 2335 for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) { 2336 if (abilityRecord == nullptr) { 2337 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2338 continue; 2339 } 2340 2341 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo(); 2342 dumpInfo = " Mission ID #" + std::to_string(sessionId); 2343 if (sessionInfo) { 2344 dumpInfo += " mission name #[" + sessionInfo->sessionName + "]"; 2345 } 2346 dumpInfo += " lockedState #" + std::to_string(abilityRecord->GetLockedState()); 2347 dumpInfo += " mission affinity #[" + abilityRecord->GetMissionAffinity() + "]"; 2348 info.push_back(dumpInfo); 2349 2350 abilityRecord->Dump(info); 2351 2352 dumpInfo = " }"; 2353 info.push_back(dumpInfo); 2354 } 2355 } 2356 DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)2357 void UIAbilityLifecycleManager::DumpMissionList( 2358 std::vector<std::string> &info, bool isClient, const std::string &args) 2359 { 2360 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call start."); 2361 std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked; 2362 { 2363 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2364 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2365 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) { 2366 sessionAbilityMapLocked[sessionId] = abilityRecord; 2367 } 2368 } 2369 std::string dumpInfo = "User ID #" + std::to_string(userId_); 2370 info.push_back(dumpInfo); 2371 dumpInfo = " current mission lists:{"; 2372 info.push_back(dumpInfo); 2373 2374 for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) { 2375 if (abilityRecord == nullptr) { 2376 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2377 continue; 2378 } 2379 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo(); 2380 dumpInfo = " Mission ID #" + std::to_string(sessionId); 2381 if (sessionInfo) { 2382 dumpInfo += " mission name #[" + sessionInfo->sessionName + "]"; 2383 } 2384 dumpInfo += " lockedState #" + std::to_string(abilityRecord->GetLockedState()); 2385 dumpInfo += " mission affinity #[" + abilityRecord->GetMissionAffinity() + "]"; 2386 info.push_back(dumpInfo); 2387 2388 std::vector<std::string> params; 2389 abilityRecord->DumpAbilityState(info, isClient, params); 2390 2391 dumpInfo = " }"; 2392 info.push_back(dumpInfo); 2393 } 2394 } 2395 DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)2396 void UIAbilityLifecycleManager::DumpMissionListByRecordId(std::vector<std::string> &info, bool isClient, 2397 int32_t abilityRecordId, const std::vector<std::string> ¶ms) 2398 { 2399 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call."); 2400 std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked; 2401 { 2402 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2403 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2404 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) { 2405 sessionAbilityMapLocked[sessionId] = abilityRecord; 2406 } 2407 } 2408 std::string dumpInfo = "User ID #" + std::to_string(userId_); 2409 info.push_back(dumpInfo); 2410 dumpInfo = " current mission lists:{"; 2411 info.push_back(dumpInfo); 2412 2413 for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) { 2414 if (abilityRecord == nullptr) { 2415 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr."); 2416 continue; 2417 } 2418 if (abilityRecord->GetAbilityRecordId() != abilityRecordId) { 2419 continue; 2420 } 2421 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo(); 2422 dumpInfo = " Mission ID #" + std::to_string(sessionId); 2423 if (sessionInfo) { 2424 dumpInfo += " mission name #[" + sessionInfo->sessionName + "]"; 2425 } 2426 dumpInfo += " lockedState #" + std::to_string(abilityRecord->GetLockedState()); 2427 dumpInfo += " mission affinity #[" + abilityRecord->GetMissionAffinity() + "]"; 2428 info.push_back(dumpInfo); 2429 2430 abilityRecord->DumpAbilityState(info, isClient, params); 2431 2432 dumpInfo = " }"; 2433 info.push_back(dumpInfo); 2434 } 2435 } 2436 MoveMissionToFront(int32_t sessionId,std::shared_ptr<StartOptions> startOptions)2437 int UIAbilityLifecycleManager::MoveMissionToFront(int32_t sessionId, std::shared_ptr<StartOptions> startOptions) 2438 { 2439 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2440 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_); 2441 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE); 2442 std::shared_ptr<AbilityRecord> abilityRecord = GetAbilityRecordsById(sessionId); 2443 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 2444 if (startOptions != nullptr) { 2445 abilityRecord->SetWindowMode(startOptions->GetWindowMode()); 2446 } 2447 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo(); 2448 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); 2449 sessionInfo->processOptions = nullptr; 2450 sessionInfo->startWindowOption = nullptr; 2451 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call PendingSessionActivation by rootSceneSession." 2452 "windowLeft=%{public}d,windowTop=%{public}d," 2453 "windowHeight=%{public}d,windowWidth=%{public}d", 2454 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0), 2455 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0), 2456 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0), 2457 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0)); 2458 sessionInfo->canStartAbilityFromBackground = true; 2459 return static_cast<int>(tmpSceneSession->PendingSessionActivation(sessionInfo)); 2460 } 2461 GetStatusBarDelegateManager()2462 std::shared_ptr<StatusBarDelegateManager> UIAbilityLifecycleManager::GetStatusBarDelegateManager() 2463 { 2464 std::lock_guard<ffrt::mutex> lock(statusBarDelegateManagerLock_); 2465 if (statusBarDelegateManager_ == nullptr) { 2466 statusBarDelegateManager_ = std::make_shared<StatusBarDelegateManager>(); 2467 } 2468 return statusBarDelegateManager_; 2469 } 2470 RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)2471 int32_t UIAbilityLifecycleManager::RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate) 2472 { 2473 auto statusBarDelegateManager = GetStatusBarDelegateManager(); 2474 CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE); 2475 return statusBarDelegateManager->RegisterStatusBarDelegate(delegate); 2476 } 2477 IsCallerInStatusBar()2478 bool UIAbilityLifecycleManager::IsCallerInStatusBar() 2479 { 2480 auto statusBarDelegateManager = GetStatusBarDelegateManager(); 2481 CHECK_POINTER_AND_RETURN(statusBarDelegateManager, false); 2482 return statusBarDelegateManager->IsCallerInStatusBar(); 2483 } 2484 DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)2485 int32_t UIAbilityLifecycleManager::DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord) 2486 { 2487 auto statusBarDelegateManager = GetStatusBarDelegateManager(); 2488 CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE); 2489 return statusBarDelegateManager->DoProcessAttachment(abilityRecord); 2490 } 2491 TryPrepareTerminateByPids(const std::vector<int32_t> & pids)2492 int32_t UIAbilityLifecycleManager::TryPrepareTerminateByPids(const std::vector<int32_t>& pids) 2493 { 2494 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2495 TAG_LOGI(AAFwkTag::ABILITYMGR, "do prepare terminate."); 2496 IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->BlockProcessCacheByPids(pids)); 2497 for (const auto& pid: pids) { 2498 std::unordered_set<std::shared_ptr<AbilityRecord>> abilitysToTerminate; 2499 std::vector<sptr<IRemoteObject>> tokens; 2500 IN_PROCESS_CALL_WITHOUT_RET( 2501 DelayedSingleton<AppScheduler>::GetInstance()->GetAbilityRecordsByProcessID(pid, tokens)); 2502 for (const auto& token: tokens) { 2503 auto abilityRecord = Token::GetAbilityRecordByToken(token); 2504 if (PrepareTerminateAbility(abilityRecord)) { 2505 TAG_LOGI(AAFwkTag::ABILITYMGR, "Terminate is blocked."); 2506 continue; 2507 } 2508 abilitysToTerminate.emplace(abilityRecord); 2509 } 2510 for (const auto& abilityRecord: abilitysToTerminate) { 2511 TerminateSession(abilityRecord); 2512 } 2513 } 2514 TAG_LOGI(AAFwkTag::ABILITYMGR, "end."); 2515 return ERR_OK; 2516 } 2517 BatchCloseUIAbility(const std::unordered_set<std::shared_ptr<AbilityRecord>> & abilitySet)2518 void UIAbilityLifecycleManager::BatchCloseUIAbility( 2519 const std::unordered_set<std::shared_ptr<AbilityRecord>>& abilitySet) 2520 { 2521 auto closeTask = [ self = shared_from_this(), abilitySet]() { 2522 TAG_LOGI(AAFwkTag::ABILITYMGR, "The abilities need to be closed."); 2523 if (self == nullptr) { 2524 TAG_LOGE(AAFwkTag::ABILITYMGR, "The manager is nullptr."); 2525 return; 2526 } 2527 for (const auto& ability : abilitySet) { 2528 self->CloseUIAbility(ability, -1, nullptr, false); 2529 } 2530 }; 2531 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler(); 2532 if (taskHandler != nullptr) { 2533 taskHandler->SubmitTask(closeTask, TaskQoS::USER_INTERACTIVE); 2534 } 2535 } 2536 TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord)2537 void UIAbilityLifecycleManager::TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord) 2538 { 2539 CHECK_POINTER(abilityRecord); 2540 auto sessionInfo = abilityRecord->GetSessionInfo(); 2541 CHECK_POINTER(sessionInfo); 2542 CHECK_POINTER(sessionInfo->sessionToken); 2543 auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken); 2544 CHECK_POINTER(session); 2545 TAG_LOGI(AAFwkTag::ABILITYMGR, "call TerminateSession, session id: %{public}d", sessionInfo->persistentId); 2546 session->TerminateSession(sessionInfo); 2547 } 2548 ChangeAbilityVisibility(sptr<IRemoteObject> token,bool isShow)2549 int UIAbilityLifecycleManager::ChangeAbilityVisibility(sptr<IRemoteObject> token, bool isShow) 2550 { 2551 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2552 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2553 auto abilityRecord = GetAbilityRecordByToken(token); 2554 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 2555 auto callingTokenId = IPCSkeleton::GetCallingTokenID(); 2556 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId; 2557 if (callingTokenId != tokenID) { 2558 TAG_LOGE(AAFwkTag::ABILITYMGR, "Is not self."); 2559 return ERR_NATIVE_NOT_SELF_APPLICATION; 2560 } 2561 auto sessionInfo = abilityRecord->GetSessionInfo(); 2562 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); 2563 if (sessionInfo->processOptions == nullptr || 2564 !ProcessOptions::IsAttachToStatusBarMode(sessionInfo->processOptions->processMode)) { 2565 TAG_LOGE(AAFwkTag::ABILITYMGR, "Process options check failed."); 2566 return ERR_START_OPTIONS_CHECK_FAILED; 2567 } 2568 auto callerSessionInfo = abilityRecord->GetSessionInfo(); 2569 CHECK_POINTER_AND_RETURN(callerSessionInfo, ERR_INVALID_VALUE); 2570 CHECK_POINTER_AND_RETURN(callerSessionInfo->sessionToken, ERR_INVALID_VALUE); 2571 auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken); 2572 return static_cast<int>(callerSession->ChangeSessionVisibilityWithStatusBar(callerSessionInfo, isShow)); 2573 } 2574 ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo,bool isShow)2575 int UIAbilityLifecycleManager::ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo, bool isShow) 2576 { 2577 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2578 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2579 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); 2580 auto iter = sessionAbilityMap_.find(sessionInfo->persistentId); 2581 if (iter == sessionAbilityMap_.end()) { 2582 TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability not found."); 2583 return ERR_NATIVE_ABILITY_NOT_FOUND; 2584 } 2585 std::shared_ptr<AbilityRecord> uiAbilityRecord = iter->second; 2586 CHECK_POINTER_AND_RETURN(uiAbilityRecord, ERR_INVALID_VALUE); 2587 auto state = uiAbilityRecord->GetAbilityVisibilityState(); 2588 if (state == AbilityVisibilityState::UNSPECIFIED || state == AbilityVisibilityState::INITIAL) { 2589 TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability visibility state check failed."); 2590 return ERR_NATIVE_ABILITY_STATE_CHECK_FAILED; 2591 } 2592 TAG_LOGI(AAFwkTag::ABILITYMGR, "Change ability visibility state to: %{public}d", isShow); 2593 if (isShow) { 2594 uiAbilityRecord->SetAbilityVisibilityState(AbilityVisibilityState::FOREGROUND_SHOW); 2595 uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId); 2596 } else { 2597 uiAbilityRecord->SetAbilityVisibilityState(AbilityVisibilityState::FOREGROUND_HIDE); 2598 } 2599 return ERR_OK; 2600 } 2601 UpdateSessionInfoBySCB(std::list<SessionInfo> & sessionInfos,std::vector<int32_t> & sessionIds)2602 int32_t UIAbilityLifecycleManager::UpdateSessionInfoBySCB(std::list<SessionInfo> &sessionInfos, 2603 std::vector<int32_t> &sessionIds) 2604 { 2605 std::unordered_set<std::shared_ptr<AbilityRecord>> abilitySet; 2606 { 2607 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2608 isSCBRecovery_ = false; 2609 for (auto [sessionId, abilityRecord] : sessionAbilityMap_) { 2610 bool isFind = false; 2611 for (auto iter = sessionInfos.begin(); iter != sessionInfos.end(); iter++) { 2612 if (iter->persistentId == sessionId) { 2613 abilityRecord->UpdateSessionInfo(iter->sessionToken); 2614 sessionInfos.erase(iter); 2615 isFind = true; 2616 break; 2617 } 2618 } 2619 if (!isFind && coldStartInSCBRecovery_.count(sessionId) == 0) { 2620 abilitySet.emplace(abilityRecord); 2621 } 2622 } 2623 coldStartInSCBRecovery_.clear(); 2624 } 2625 for (const auto &info : sessionInfos) { 2626 sessionIds.emplace_back(info.persistentId); 2627 } 2628 2629 BatchCloseUIAbility(abilitySet); 2630 TAG_LOGI(AAFwkTag::ABILITYMGR, "The end of updating session info."); 2631 return ERR_OK; 2632 } 2633 SignRestartAppFlag(int32_t uid,bool isAppRecovery)2634 void UIAbilityLifecycleManager::SignRestartAppFlag(int32_t uid, bool isAppRecovery) 2635 { 2636 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2637 auto tempSessionAbilityMap = sessionAbilityMap_; 2638 for (auto &[sessionId, abilityRecord] : tempSessionAbilityMap) { 2639 if (abilityRecord == nullptr || abilityRecord->GetUid() != uid) { 2640 continue; 2641 } 2642 abilityRecord->SetRestartAppFlag(true); 2643 std::string reason = "onAbilityDied"; 2644 if (isAppRecovery) { 2645 reason = "appRecovery"; 2646 } 2647 NotifySCBToHandleException(abilityRecord, static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_DIED), 2648 reason); 2649 } 2650 } 2651 CompleteFirstFrameDrawing(int32_t sessionId) const2652 void UIAbilityLifecycleManager::CompleteFirstFrameDrawing(int32_t sessionId) const 2653 { 2654 TAG_LOGD(AAFwkTag::ABILITYMGR, "called"); 2655 #ifdef SUPPORT_GRAPHICS 2656 auto abilityRecord = GetAbilityRecordsById(sessionId); 2657 if (abilityRecord == nullptr) { 2658 TAG_LOGW(AAFwkTag::ABILITYMGR, "CompleteFirstFrameDrawing, get AbilityRecord by sessionId failed."); 2659 return; 2660 } 2661 abilityRecord->ReportAtomicServiceDrawnCompleteEvent(); 2662 abilityRecord->SetCompleteFirstFrameDrawing(true); 2663 AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance(). 2664 HandleOnFirstFrameState(abilityRecord); 2665 #endif 2666 } 2667 StartWithPersistentIdByDistributed(const AbilityRequest & abilityRequest,int32_t persistentId)2668 int UIAbilityLifecycleManager::StartWithPersistentIdByDistributed(const AbilityRequest &abilityRequest, 2669 int32_t persistentId) 2670 { 2671 TAG_LOGD(AAFwkTag::ABILITYMGR, "StartWithPersistentIdByDistributed, called"); 2672 auto sessionInfo = CreateSessionInfo(abilityRequest); 2673 sessionInfo->requestCode = abilityRequest.requestCode; 2674 sessionInfo->persistentId = persistentId; 2675 sessionInfo->userId = userId_; 2676 sessionInfo->isAtomicService = 2677 (abilityRequest.abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); 2678 return NotifySCBPendingActivation(sessionInfo, abilityRequest); 2679 } 2680 GetAbilityStateByPersistentId(int32_t persistentId,bool & state)2681 int32_t UIAbilityLifecycleManager::GetAbilityStateByPersistentId(int32_t persistentId, bool &state) 2682 { 2683 TAG_LOGD(AAFwkTag::ABILITYMGR, "called"); 2684 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2685 auto iter = sessionAbilityMap_.find(persistentId); 2686 if (iter != sessionAbilityMap_.end()) { 2687 std::shared_ptr<AbilityRecord> uiAbilityRecord = iter->second; 2688 if (uiAbilityRecord && uiAbilityRecord->GetPendingState() == AbilityState::INITIAL) { 2689 state = true; 2690 return ERR_OK; 2691 } 2692 } 2693 state = false; 2694 return ERR_INVALID_VALUE; 2695 } 2696 CleanUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)2697 int32_t UIAbilityLifecycleManager::CleanUIAbility( 2698 const std::shared_ptr<AbilityRecord> &abilityRecord) 2699 { 2700 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"); 2701 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); 2702 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); 2703 std::string element = abilityRecord->GetElementName().GetURI(); 2704 if (DelayedSingleton<AppScheduler>::GetInstance()->CleanAbilityByUserRequest(abilityRecord->GetToken())) { 2705 TAG_LOGI(AAFwkTag::ABILITYMGR, "user clean ability: %{public}s success", element.c_str()); 2706 return ERR_OK; 2707 } 2708 TAG_LOGI(AAFwkTag::ABILITYMGR, 2709 "can not force kill when user request clean ability, schedule lifecycle:%{public}s", element.c_str()); 2710 return CloseUIAbility(abilityRecord, -1, nullptr, true); 2711 } 2712 CheckCallerFromBackground(std::shared_ptr<AbilityRecord> callerAbility,sptr<SessionInfo> & sessionInfo)2713 void UIAbilityLifecycleManager::CheckCallerFromBackground( 2714 std::shared_ptr<AbilityRecord> callerAbility, sptr<SessionInfo> &sessionInfo) 2715 { 2716 CHECK_POINTER(callerAbility); 2717 CHECK_POINTER(sessionInfo); 2718 TAG_LOGD(AAFwkTag::ABILITYMGR, "called"); 2719 auto permission = AAFwk::PermissionVerification::GetInstance(); 2720 bool hasPermission = 2721 permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND) || 2722 permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILIIES_FROM_BACKGROUND); 2723 2724 sessionInfo->canStartAbilityFromBackground = hasPermission; 2725 TAG_LOGD(AAFwkTag::ABILITYMGR, "CheckCallerFromBackground: %{public}d", sessionInfo->canStartAbilityFromBackground); 2726 } 2727 EnableListForSCBRecovery()2728 void UIAbilityLifecycleManager::EnableListForSCBRecovery() 2729 { 2730 std::lock_guard<ffrt::mutex> guard(sessionLock_); 2731 isSCBRecovery_ = true; 2732 coldStartInSCBRecovery_.clear(); 2733 } 2734 } // namespace AAFwk 2735 } // namespace OHOS