From fd360ef7fab8f85d1fece73ea2aaf2a9742ffb60 Mon Sep 17 00:00:00 2001 From: zhengzhuolan Date: Mon, 23 Mar 2026 15:46:38 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8DuiextensionAbility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhengzhuolan --- .../include/app_exit_reason_helper.h | 2 +- .../src/ability_manager_service.cpp | 8 ++- .../abilitymgr/src/app_exit_reason_helper.cpp | 64 +++++-------------- .../ability_manager_service_first_test.cpp | 2 + .../app_exit_reason_helper_fourth_test.cpp | 6 +- 5 files changed, 30 insertions(+), 52 deletions(-) diff --git a/services/abilitymgr/include/app_exit_reason_helper.h b/services/abilitymgr/include/app_exit_reason_helper.h index 36d1fbd189..5feddf3254 100644 --- a/services/abilitymgr/include/app_exit_reason_helper.h +++ b/services/abilitymgr/include/app_exit_reason_helper.h @@ -88,7 +88,7 @@ private: std::vector GetRunningProcessInfos(int32_t userId, const std::string &bundleName); int32_t RecordAppWithReasonInner(const AppReasonInfo &appInfo, const ExitReasonCompability &exitReasonCompability, - const AppExecFwk::RunningProcessInfo &processInfo, const std::vector &abilityList); + const AppExecFwk::RunningProcessInfo &processInfo); std::shared_ptr subManagersHelper_; }; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 8353d25180..1577a007ee 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -3522,6 +3522,12 @@ int32_t AbilityManagerService::RecordAppWithReason( const int32_t pid, const int32_t uid, const ExitReasonCompability &exitReason) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); + if (!AAFwk::PermissionVerification::GetInstance()->IsSACall() && + !AAFwk::PermissionVerification::GetInstance()->IsShellCall() && + IPCSkeleton::GetCallingUid() != uid) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "permission verify failed"); + return ERR_PERMISSION_DENIED; + } CHECK_POINTER_AND_RETURN(appExitReasonHelper_, ERR_NULL_APP_EXIT_REASON_HELPER); if (!IsExitReasonValid(exitReason)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "exit reason is invalid"); @@ -14511,7 +14517,7 @@ void AbilityManagerService::RecordRecoveryExitReason(bool isAppRecovery, int32_t std::string killReason = HiviewDFX::ProcessKillReason::GetKillReason(killId); AAFwk::ExitReasonCompability exitReason = {REASON_JS_ERROR, "Kill Reason:" + killReason}; exitReason.killId = killId; - auto result = RecordAppWithReason(callerPid, callerUid, exitReason); + auto result = IN_PROCESS_CALL(RecordAppWithReason(callerPid, callerUid, exitReason)); TAG_LOGI(AAFwkTag::ABILITYMGR, "Record result=%{public}d, send event [FRAMEWORK,PROCESS_KILL,APP_RECOVERY], " "callerPid=%{public}d, callerUid=%{public}d, killReason=%{public}s", result, callerPid, callerUid, killReason.c_str()); diff --git a/services/abilitymgr/src/app_exit_reason_helper.cpp b/services/abilitymgr/src/app_exit_reason_helper.cpp index 77027cdfcf..c66d86d3e6 100644 --- a/services/abilitymgr/src/app_exit_reason_helper.cpp +++ b/services/abilitymgr/src/app_exit_reason_helper.cpp @@ -57,23 +57,12 @@ int32_t AppExitReasonHelper::RecordAppWithReason(int32_t pid, int32_t uid, const TAG_LOGD(AAFwkTag::ABILITYMGR, "RecordAppWithReason inPid: %{public}d, processPid: %{public}d", pid, processInfo.pid_); - std::vector abilityList; - int32_t getActiveAbilityListRet = GetActiveAbilityListWithPid(uid, abilityList, pid); - if (getActiveAbilityListRet != ERR_OK) { - return getActiveAbilityListRet; - } - if (abilityList.empty()) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityLists empty"); - return ERR_GET_ACTIVE_ABILITY_LIST_EMPTY; - } - AppReasonInfo appInfo(userId, bundleName, appIndex); - return RecordAppWithReasonInner(appInfo, exitReason, processInfo, abilityList); + return RecordAppWithReasonInner(appInfo, exitReason, processInfo); } int32_t AppExitReasonHelper::RecordAppWithReasonInner(const AppReasonInfo &appInfo, - const ExitReasonCompability &exitReasonCompability, const AppExecFwk::RunningProcessInfo &processInfo, - const std::vector &abilityList) + const ExitReasonCompability &exitReasonCompability, const AppExecFwk::RunningProcessInfo &processInfo) { if (processInfo.pid_ <= 0 && processInfo.uid_ <= 0) { TAG_LOGE(AAFwkTag::ABILITYMGR, "processInfo is invalid"); @@ -95,7 +84,15 @@ int32_t AppExitReasonHelper::RecordAppWithReasonInner(const AppReasonInfo &appIn if (ret != ERR_OK) { TAG_LOGW(AAFwkTag::ABILITYMGR, "notify failed: %{public}d", ret); } - + std::vector abilityList; + int32_t getActiveAbilityListRet = GetActiveAbilityListWithPid(processInfo.uid_, abilityList, processInfo.pid_); + if (getActiveAbilityListRet != ERR_OK) { + return getActiveAbilityListRet; + } + if (abilityList.empty()) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityLists empty"); + return ERR_GET_ACTIVE_ABILITY_LIST_EMPTY; + } uint32_t accessTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(appInfo.userId, appInfo.bundleName, appInfo.appIndex); TAG_LOGD(AAFwkTag::ABILITYMGR, @@ -118,7 +115,6 @@ void AppExitReasonHelper::RecordAppsWithReasonByUserId(int32_t userId, const Exi int32_t pid; int32_t innerResult = ERR_OK; std::string bundleName; - std::vector abilityList; for (const auto &processInfo : processInfoList) { if (processInfo.pid_ <= 0 && processInfo.uid_ <= 0) { continue; @@ -133,19 +129,8 @@ void AppExitReasonHelper::RecordAppsWithReasonByUserId(int32_t userId, const Exi continue; } - int32_t getActiveAbilityListRet = GetActiveAbilityListWithPid(uid, abilityList, pid); - if (getActiveAbilityListRet != ERR_OK) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "GetActiveAbilityListWithPid failed for uid %{public}d: %{public}d", - uid, getActiveAbilityListRet); - continue; - } - - if (abilityList.empty()) { - TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityLists empty for uid: %{public}d", uid); - continue; - } AppReasonInfo appInfo(userId, bundleName, appIndex); - innerResult = RecordAppWithReasonInner(appInfo, exitReason, processInfo, abilityList); + innerResult = RecordAppWithReasonInner(appInfo, exitReason, processInfo); if (innerResult != ERR_OK) { TAG_LOGE(AAFwkTag::ABILITYMGR, "RecordAppWithReasonInner failed for uid:%{public}d, userId:%{public}d," " ret: %{public}d", @@ -164,8 +149,6 @@ int32_t AppExitReasonHelper::RecordAppWithReasonByAccessTokenId(int32_t userId, int32_t uid; int32_t pid; int32_t innerResult = ERR_OK; - std::vector abilityList; - for (const auto &processInfo : processInfoList) { if (processInfo.pid_ <= 0 && processInfo.uid_ <= 0) { continue; @@ -189,20 +172,8 @@ int32_t AppExitReasonHelper::RecordAppWithReasonByAccessTokenId(int32_t userId, continue; } - int32_t getActiveAbilityListRet = GetActiveAbilityListWithPid(uid, abilityList, pid); - if (getActiveAbilityListRet != ERR_OK) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "GetActiveAbilityListWithPid failed for uid %{public}d: %{public}d", - uid, getActiveAbilityListRet); - continue; - } - - if (abilityList.empty()) { - TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityLists empty for uid: %{public}d", uid); - continue; - } - AppReasonInfo appInfo(userId, bundleName, appIndex); - innerResult = RecordAppWithReasonInner(appInfo, exitReasonCompability, processInfo, abilityList); + innerResult = RecordAppWithReasonInner(appInfo, exitReasonCompability, processInfo); if (innerResult != ERR_OK) { TAG_LOGE(AAFwkTag::ABILITYMGR, "RecordAppWithReasonInner failed for uid:%{public}d, userId:%{public}d, " "ret: %{public}d", uid, userId, innerResult); @@ -669,11 +640,6 @@ int32_t AppExitReasonHelper::AddProcessExitReason(const RecordExitReasonParams & } else { GetActiveAbilityList(params.uid, abilityLists, params.pid); } - - if (abilityLists.empty()) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "active abilityLists empty"); - return ERR_GET_ACTIVE_ABILITY_LIST_EMPTY; - } ExitReasonCompability exitReason = params.exitReason; auto ret = DelayedSingleton::GetInstance()->NotifyAppMgrRecordExitReasonCompability( params.pid, exitReason.killId, exitReason.killMsg, exitReason.innerMsg); @@ -682,6 +648,10 @@ int32_t AppExitReasonHelper::AddProcessExitReason(const RecordExitReasonParams & } ExitReason tmpReason(exitReason.reason, exitReason.subReason, exitReason.exitMsg); tmpReason.killId = exitReason.killId; + if (abilityLists.empty()) { + TAG_LOGD(AAFwkTag::ABILITYMGR, "ui abilityLists empty"); + return RecordProcessExtensionExitReason(params.pid, params.bundleName, tmpReason, params.processInfo, false); + } return DelayedSingleton::GetInstance()->SetAppExitReason( params.bundleName, params.accessTokenId, abilityLists, tmpReason, params.processInfo, params.fromKillWithReason); diff --git a/test/unittest/ability_manager_service_first_test/ability_manager_service_first_test.cpp b/test/unittest/ability_manager_service_first_test/ability_manager_service_first_test.cpp index 737a3c3a0f..09d8ccd9ae 100644 --- a/test/unittest/ability_manager_service_first_test/ability_manager_service_first_test.cpp +++ b/test/unittest/ability_manager_service_first_test/ability_manager_service_first_test.cpp @@ -2716,6 +2716,7 @@ HWTEST_F(AbilityManagerServiceFirstTest, RecordAppWithReason_0100, TestSize.Leve EXPECT_NE(abilityMs, nullptr); int32_t pid = 1234; int32_t uid = 1000; + MyFlag::flag_ = 1; ExitReasonCompability exitReason; abilityMs->appExitReasonHelper_ = std::make_shared(nullptr); auto res = abilityMs->RecordAppWithReason(pid, uid, exitReason); @@ -2723,6 +2724,7 @@ HWTEST_F(AbilityManagerServiceFirstTest, RecordAppWithReason_0100, TestSize.Leve exitReason.killId = 1; res = abilityMs->RecordAppWithReason(pid, uid, exitReason); EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PERMISSION_DENIED); + MyFlag::flag_ = 0; } /* diff --git a/test/unittest/app_exit_reason_helper_fourth_test/app_exit_reason_helper_fourth_test.cpp b/test/unittest/app_exit_reason_helper_fourth_test/app_exit_reason_helper_fourth_test.cpp index 9964bfdbd2..b7cd2d68c8 100644 --- a/test/unittest/app_exit_reason_helper_fourth_test/app_exit_reason_helper_fourth_test.cpp +++ b/test/unittest/app_exit_reason_helper_fourth_test/app_exit_reason_helper_fourth_test.cpp @@ -371,12 +371,12 @@ HWTEST_F(AppExitReasonHelperTest, RecordAppWithReason_0100, TestSize.Level1) auto currentUIAbilityManager = std::make_shared(0); EXPECT_NE(currentUIAbilityManager, nullptr); result = appExitReasonHelper->RecordAppWithReason(pid, uid, exitReason); - EXPECT_EQ(result, ERR_NULL_OBJECT); + EXPECT_EQ(result, ERR_INVALID_VALUE); int32_t userId = AbilityRuntime::UserController::GetInstance().GetForegroundUserId(0); appExitReasonHelper->subManagersHelper_->uiAbilityManagers_[userId] = currentUIAbilityManager; result = appExitReasonHelper->RecordAppWithReason(pid, uid, exitReason); - EXPECT_EQ(result, ERR_GET_ACTIVE_ABILITY_LIST_EMPTY); + EXPECT_EQ(result, ERR_INVALID_VALUE); Want want; AppExecFwk::AbilityInfo abilityInfo; @@ -415,7 +415,7 @@ HWTEST_F(AppExitReasonHelperTest, AddAppExitReason_0100, TestSize.Level1) EXPECT_EQ(result, MOCK_ERROR); MyStatus::GetInstance().getOsAccountRet_ = 0; result = appExitReasonHelper->AddAppExitReason(bundleName, pid, uid, appIndex, exitReason); - EXPECT_EQ(result, ERR_GET_ACTIVE_ABILITY_LIST_EMPTY); + EXPECT_EQ(result, ERR_NULL_OBJECT); } /**