From b1052c2839d45b5e274acc0d98ac181ea4d00e18 Mon Sep 17 00:00:00 2001 From: wendel Date: Thu, 31 Jul 2025 16:54:45 +0800 Subject: [PATCH] add timeout Signed-off-by: wendel Change-Id: I69c5a20404a1bee0133e009d78bdd92db9c68af4 --- .../ui_ability_lifecycle_manager.h | 7 +++-- .../src/ability_manager_service.cpp | 3 +- .../ui_ability_lifecycle_manager.cpp | 31 +++++++++++++++---- .../mock_ui_ability_lifecycle_manager.h | 2 +- .../src/mock_ui_ability_lifecycle_manager.cpp | 2 +- .../mock_ui_ability_lifecycle_manager.h | 2 +- .../src/mock_ui_ability_lifecycle_manager.cpp | 2 +- ...i_ability_lifecycle_manager_third_test.cpp | 19 ++++++++++-- 8 files changed, 52 insertions(+), 16 deletions(-) diff --git a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h index 98b0ebbae75..bc756ebdd27 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -393,7 +393,7 @@ public: void RecordPidKilling(pid_t pid, const std::string &reason); - int32_t NotifyStartupExceptionBySCB(int32_t requestId); + int32_t NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason); private: void AddStartingPid(pid_t pid); @@ -472,7 +472,7 @@ private: int32_t pid, const std::vector> &tokens); bool GetContentAndTypeId(uint32_t msgId, std::string &msgContent, int &typeId) const; - void SendAbilityEvent(const AppExecFwk::AbilityInfo &abilityInfo) const; + void SendAbilityEvent(const AppExecFwk::AbilityInfo &abilityInfo, const std::string &reason) const; bool CheckSessionInfo(sptr sessionInfo) const; std::shared_ptr CreateAbilityRecord(AbilityRequest &abilityRequest, @@ -492,6 +492,7 @@ private: std::shared_ptr GenerateAbilityRecord(AbilityRequest &abilityRequest, sptr sessionInfo, bool &isColdStart); std::shared_ptr FindRecordFromTmpMap(const AbilityRequest &abilityRequest); + void PostCallTimeoutTask(int32_t requestId); bool AddStartCallerTimestamp(int32_t callerUid); std::shared_ptr FindRecordFromSessionMap(const AbilityRequest &abilityRequest); void AddSpecifiedRequest(std::shared_ptr request); @@ -527,7 +528,7 @@ private: mutable ffrt::mutex sessionLock_; std::unordered_map> sessionAbilityMap_; std::unordered_map> lowMemKillAbilityMap_; - std::unordered_map> tmpAbilityMap_; + std::unordered_map> tmpAbilityMap_; std::unordered_map, std::list> callRequestCache_; std::list> terminateAbilityList_; sptr rootSceneSession_; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index f8612a2753b..adf5b3744de 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -15044,7 +15044,8 @@ int32_t AbilityManagerService::NotifyStartupExceptionBySCB(int32_t requestId) } auto uiAbilityManager = GetUIAbilityManagerByUid(IPCSkeleton::GetCallingUid()); CHECK_POINTER_AND_RETURN_LOG(uiAbilityManager, ERR_NULL_OBJECT, "uiAbilityLifecycleManager nullptr"); - return uiAbilityManager->NotifyStartupExceptionBySCB(requestId); + std::string reason = "SCB intercepted this startup attempt"; + return uiAbilityManager->NotifyStartupExceptionBySCB(requestId, reason); } int32_t AbilityManagerService::PreloadApplication(const std::string &bundleName, int32_t userId, int32_t appIndex) diff --git a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp index f81ef7ae1f3..467dafa3568 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -357,7 +357,7 @@ std::shared_ptr UIAbilityLifecycleManager::FindRecordFromTmpMap( int32_t appIndex = 0; (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex); auto instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY); - for (const auto &[recordId, abilityRecord] : tmpAbilityMap_) { + for (const auto &[requestId, abilityRecord] : tmpAbilityMap_) { if (abilityRecord) { const auto &info = abilityRecord->GetAbilityInfo(); if (info.name == abilityRequest.abilityInfo.name && @@ -1455,9 +1455,26 @@ int UIAbilityLifecycleManager::CallAbilityLocked(const AbilityRequest &abilityRe } TAG_LOGD(AAFwkTag::ABILITYMGR, "Notify scb's abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId); tmpAbilityMap_.emplace(sessionInfo->requestId, uiAbilityRecord); + PostCallTimeoutTask(sessionInfo->requestId); return NotifySCBPendingActivation(sessionInfo, abilityRequest, errMsg); } +void UIAbilityLifecycleManager::PostCallTimeoutTask(int32_t requestId) +{ + auto timeoutTask = [wThis = weak_from_this(), requestId]() { + auto pThis = wThis.lock(); + if (pThis != nullptr) { + std::string reason = "Timeout cleanup"; + pThis->NotifyStartupExceptionBySCB(requestId, reason); + } + }; + + int timeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * + GlobalConstant::COLDSTART_TIMEOUT_MULTIPLE * GlobalConstant::TIMEOUT_UNIT_TIME; + ffrt::submit(std::move(timeoutTask), ffrt::task_attr().delay(timeout) + .timeout(GlobalConstant::DEFAULT_FFRT_TASK_TIMEOUT)); +} + void UIAbilityLifecycleManager::CallUIAbilityBySCB(const sptr &sessionInfo, bool &isColdStart) { TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, CallUIAbilityBySCB"); @@ -4037,7 +4054,7 @@ int32_t UIAbilityLifecycleManager::RevokeDelegator(sptr token) } } -int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId) +int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason) { TAG_LOGI(AAFwkTag::ABILITYMGR, "scb notify exception:%{public}d", requestId); std::lock_guard guard(sessionLock_); @@ -4046,7 +4063,7 @@ int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId auto abilityRecord = it->second; if (abilityRecord != nullptr) { TAG_LOGW(AAFwkTag::ABILITYMGR, "startup exception: %{public}s", abilityRecord->GetURI().c_str()); - SendAbilityEvent(abilityRecord->GetAbilityInfo()); + SendAbilityEvent(abilityRecord->GetAbilityInfo(), reason); } tmpAbilityMap_.erase(it); callRequestCache_.erase(abilityRecord); @@ -4056,7 +4073,8 @@ int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId auto request = GetSpecifiedRequest(requestId); if (request != nullptr) { - SendAbilityEvent(request->abilityRequest.abilityInfo); + std::string reasonFromSCB = "SCB intercepted this startup attempt"; + SendAbilityEvent(request->abilityRequest.abilityInfo, reasonFromSCB); } auto nextRequest = PopAndGetNextSpecified(requestId); @@ -4069,7 +4087,8 @@ int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId return ERR_OK; } -void UIAbilityLifecycleManager::SendAbilityEvent(const AppExecFwk::AbilityInfo &abilityInfo) const +void UIAbilityLifecycleManager::SendAbilityEvent(const AppExecFwk::AbilityInfo &abilityInfo, + const std::string &reason) const { EventInfo eventInfo; eventInfo.userId = userId_; @@ -4077,7 +4096,7 @@ void UIAbilityLifecycleManager::SendAbilityEvent(const AppExecFwk::AbilityInfo & eventInfo.bundleName = abilityInfo.bundleName; eventInfo.moduleName = abilityInfo.moduleName; eventInfo.errCode = ERR_SCB_INTERCEPTION; - eventInfo.errMsg = "SCB intercepted this startup attempt"; + eventInfo.errMsg = reason; ffrt::submit([eventInfo]() { EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo); }, ffrt::task_attr().timeout(AbilityRuntime::GlobalConstant::FFRT_TASK_TIMEOUT)); diff --git a/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h b/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h index 9369ce3204c..3cfde80cc15 100644 --- a/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h +++ b/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h @@ -391,7 +391,7 @@ public: void RecordPidKilling(pid_t pid, const std::string &reason); - int32_t NotifyStartupExceptionBySCB(int32_t requestId); + int32_t NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason); private: void AddStartingPid(pid_t pid); diff --git a/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp b/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp index 86dc0720917..c443a5f7533 100644 --- a/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp +++ b/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp @@ -760,7 +760,7 @@ int32_t UIAbilityLifecycleManager::RevokeDelegator(sptr token) return ERR_OK; } -int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId) +int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason) { return ERR_OK; } diff --git a/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h b/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h index a14f46d98e3..0585523d2a2 100644 --- a/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h +++ b/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h @@ -393,7 +393,7 @@ public: void RecordPidKilling(pid_t pid, const std::string &reason); - int32_t NotifyStartupExceptionBySCB(int32_t requestId); + int32_t NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason); private: void AddStartingPid(pid_t pid); diff --git a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp index faa96e4d3e7..958c2d71cd4 100644 --- a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp +++ b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp @@ -768,7 +768,7 @@ int32_t UIAbilityLifecycleManager::RevokeDelegator(sptr token) return ERR_OK; } -int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId) +int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason) { return ERR_OK; } diff --git a/test/unittest/ui_ability_lifecycle_manager_third_test/ui_ability_lifecycle_manager_third_test.cpp b/test/unittest/ui_ability_lifecycle_manager_third_test/ui_ability_lifecycle_manager_third_test.cpp index 3f035d107f8..112441f9a9f 100644 --- a/test/unittest/ui_ability_lifecycle_manager_third_test/ui_ability_lifecycle_manager_third_test.cpp +++ b/test/unittest/ui_ability_lifecycle_manager_third_test/ui_ability_lifecycle_manager_third_test.cpp @@ -349,6 +349,19 @@ HWTEST_F(UIAbilityLifecycleManagerThirdTest, NotifySCBToStartUIAbility_004, Test EXPECT_EQ(ret, ERR_OK); } +/** + * @tc.name: UIAbilityLifecycleManager_PostCallTimeoutTask_001 + * @tc.desc: PostCallTimeoutTask + * @tc.type: FUNC + */ +HWTEST_F(UIAbilityLifecycleManagerThirdTest, PostCallTimeoutTask_001, TestSize.Level1) +{ + auto mgr = std::make_shared(); + int32_t requestId = 1; + mgr->PostCallTimeoutTask(requestId); + EXPECT_NE(mgr, nullptr); +} + /** * @tc.name: UIAbilityLifecycleManager_StartSpecifiedRequest_001 * @tc.desc: StartSpecifiedRequest @@ -1524,7 +1537,8 @@ HWTEST_F(UIAbilityLifecycleManagerThirdTest, NotifyStartupExceptionBySCB_001, Te int32_t requestId = 1; mgr->tmpAbilityMap_ = {{requestId, callerAbilityRecord}}; - auto ret = mgr->NotifyStartupExceptionBySCB(requestId); + std::string reason = "SCB intercepted this startup attempt"; + auto ret = mgr->NotifyStartupExceptionBySCB(requestId, reason); EXPECT_EQ(ret, ERR_OK); EXPECT_EQ(mgr->tmpAbilityMap_.size(), 0); } @@ -1555,7 +1569,8 @@ HWTEST_F(UIAbilityLifecycleManagerThirdTest, NotifyStartupExceptionBySCB_002, Te {"NewKawasaki", {specifiedRequestPtr, specifiedRequest2Ptr}} }; int32_t requestId = 1; - auto ret = uiAbilityLifecycleManager->NotifyStartupExceptionBySCB(requestId); + std::string reason = "SCB intercepted this startup attempt"; + auto ret = uiAbilityLifecycleManager->NotifyStartupExceptionBySCB(requestId, reason); EXPECT_EQ(ret, ERR_OK); } } // namespace AAFwk -- Gitee