From d8aebcd4d3cf4deac2f3eb6028713b029cf1be8d Mon Sep 17 00:00:00 2001 From: l00814634 Date: Fri, 13 Mar 2026 10:31:41 +0800 Subject: [PATCH] =?UTF-8?q?cpp=5Fcrash=E5=9C=BA=E6=99=AF=E4=BD=BF=E8=83=BD?= =?UTF-8?q?APPrecover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I8c9bea6bc4077ff44359e525c676a9b03c2e9fd9 Signed-off-by: tsuk1ii --- .../ets/ets/@ohos.app.ability.appRecovery.ets | 2 +- .../ability/native/recovery/app_recovery.cpp | 1 + .../ability_manager/include/recovery_param.h | 2 +- .../ability/native/recovery/recovery_param.h | 4 ++-- .../include/ability_manager_service.h | 2 +- .../include/app_exit_reason_data_manager.h | 4 +++- .../abilitymgr/src/ability_manager_service.cpp | 16 ++++++++-------- .../src/app_exit_reason_data_manager.cpp | 17 ++++++++++++++--- services/appmgr/src/app_mgr_service_inner.cpp | 2 -- 9 files changed, 31 insertions(+), 19 deletions(-) diff --git a/frameworks/ets/ets/@ohos.app.ability.appRecovery.ets b/frameworks/ets/ets/@ohos.app.ability.appRecovery.ets index 33c59c686b..0b0f04685e 100644 --- a/frameworks/ets/ets/@ohos.app.ability.appRecovery.ets +++ b/frameworks/ets/ets/@ohos.app.ability.appRecovery.ets @@ -22,7 +22,7 @@ export default namespace appRecovery { ALWAYS_RESTART = 0, RESTART_WHEN_JS_CRASH = 0x0001, RESTART_WHEN_APP_FREEZE = 0x0002, - RESTART_WHEN_CPP_CRASH = 0x0008, + RESTART_WHEN_CPP_CRASH = 0x0004, NO_RESTART = 0xFFFF } diff --git a/frameworks/native/ability/native/recovery/app_recovery.cpp b/frameworks/native/ability/native/recovery/app_recovery.cpp index be595c769e..88030793d6 100644 --- a/frameworks/native/ability/native/recovery/app_recovery.cpp +++ b/frameworks/native/ability/native/recovery/app_recovery.cpp @@ -398,6 +398,7 @@ void AppRecovery::EnableAppRecovery(uint16_t restartFlag, uint16_t saveFlag, uin { isEnable_ = true; restartFlag_ = restartFlag; + crashFlag_ = restartFlag; saveOccasion_ = saveFlag; saveMode_ = saveMode; useAppSettedValue_.store(true); diff --git a/interfaces/inner_api/ability_manager/include/recovery_param.h b/interfaces/inner_api/ability_manager/include/recovery_param.h index c5d33667b5..58b59e699a 100644 --- a/interfaces/inner_api/ability_manager/include/recovery_param.h +++ b/interfaces/inner_api/ability_manager/include/recovery_param.h @@ -44,7 +44,7 @@ enum RestartFlag { ALWAYS_RESTART = 0, RESTART_WHEN_JS_CRASH = 0x0001, RESTART_WHEN_APP_FREEZE = 0x0002, - RESTART_WHEN_CPP_CRASH = 0x0008, + RESTART_WHEN_CPP_CRASH = 0x0004, NO_RESTART = 0xFFFF, }; diff --git a/interfaces/kits/native/ability/native/recovery/recovery_param.h b/interfaces/kits/native/ability/native/recovery/recovery_param.h index 38093fff78..f426cffe18 100644 --- a/interfaces/kits/native/ability/native/recovery/recovery_param.h +++ b/interfaces/kits/native/ability/native/recovery/recovery_param.h @@ -44,8 +44,8 @@ enum RestartFlag { ALWAYS_RESTART = 0x0000, RESTART_WHEN_JS_CRASH = 0x0001, RESTART_WHEN_APP_FREEZE = 0x0002, - RESTART_WHEN_CJ_CRASH = 0x0004, - RESTART_WHEN_CPP_CRASH = 0x0008, + RESTART_WHEN_CPP_CRASH = 0x0004, + RESTART_WHEN_CJ_CRASH = 0x0008, NO_RESTART = 0xFFFF, }; diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 86e02f51f1..91bfe09ac9 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -3370,7 +3370,7 @@ private: void RecordRecoveryExitReason(bool isAppRecovery, int32_t callerPid, int32_t callerUid); void SetAppDeathRecipient(const sptr& abilityToken); void HandleAppDiedForRecovery(const sptr& remote, const AbilityInfo& abilityInfo, - int32_t pid, int32_t uid); + int32_t pid, int32_t uid, int32_t userId); void startRecoveryMgr(); int getAppRecoveryFlag(const sptr &token); void HandleRecoveryRecipient(const std::shared_ptr& abilityRecord, diff --git a/services/abilitymgr/include/app_exit_reason_data_manager.h b/services/abilitymgr/include/app_exit_reason_data_manager.h index a8db14ebe8..2ad590c013 100644 --- a/services/abilitymgr/include/app_exit_reason_data_manager.h +++ b/services/abilitymgr/include/app_exit_reason_data_manager.h @@ -40,7 +40,7 @@ public: int32_t GetAppExitReason(const std::string &bundleName, uint32_t accessTokenId, const std::string &abilityName, bool &isSetReason, AAFwk::ExitReason &exitReason, AppExecFwk::RunningProcessInfo &processInfo, - int64_t &time_stamp, bool &withKillMsg); + int64_t &time_stamp, bool &withKillMsg, bool cleanFlag = true); int32_t DeleteAppExitReason(const std::string &bundleName, int32_t uid, int32_t appIndex); @@ -74,6 +74,8 @@ public: void UpdateAppExitReason(uint32_t accessTokenId, const std::vector &abilityList, const AAFwk::ExitReason &exitReason, const AppExecFwk::RunningProcessInfo &processInfo, bool withKillMsg); + void HandleAbilityMatchAndCleanup(const std::string& abilityName, std::vector& abilityList, + bool& isSetReason, bool cleanFlag); private: DistributedKv::Status GetKvStore(); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 8c70fe49ee..585267c7bc 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -16861,17 +16861,17 @@ void AbilityManagerService::SetAppDeathRecipient(const sptr &toke const auto &abilityInfo = abilityRecord->GetAbilityInfo(); int32_t pid = abilityRecord->GetPid(); int32_t uid = abilityRecord->GetUid(); - auto callback = [this,abilityInfo,pid,uid](const sptr& remote) { - this->HandleAppDiedForRecovery(remote,abilityInfo,pid,uid); + int32_t userId = abilityRecord->GetOwnerMissionUserId(); + auto callback = [this,abilityInfo,pid,uid,userId](const sptr& remote) { + this->HandleAppDiedForRecovery(remote,abilityInfo,pid,uid,userId); }; AppRecoveryMgr::AppRecoveryMgr::GetInstance().SetOnRemoteDieCallback(token, callback); } void AbilityManagerService::HandleAppDiedForRecovery(const sptr& remote, - const AbilityInfo& abilityInfo, - int32_t pid, - int32_t uid) + const AbilityInfo& abilityInfo, int32_t pid, + int32_t uid, int32_t userId) { if (remote == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "remote is null, cannot recover app"); @@ -16893,7 +16893,7 @@ void AbilityManagerService::HandleAppDiedForRecovery(const sptr& auto accessTokenId = abilityInfo.applicationInfo.accessTokenId; AAFwk::ExitReason exitReason = {AAFwk::REASON_JS_ERROR, "Js Error."}; auto result = DelayedSingleton::GetInstance()->GetAppExitReason(abilityInfo.bundleName, accessTokenId, - abilityInfo.name, isSetReason, exitReason, processInfo, stamp, withKillMsg); + abilityInfo.name, isSetReason, exitReason, processInfo, stamp, withKillMsg, false); if(exitReason.reason!= AAFwk::REASON_CPP_CRASH) { TAG_LOGI(AAFwkTag::APPMGR, "app exit reason is not REASON_CPP_CRASH"); return; @@ -16914,8 +16914,8 @@ void AbilityManagerService::HandleAppDiedForRecovery(const sptr& AAFwk::Want *newWant=new AAFwk::Want(); newWant->SetElementName(abilityInfo.bundleName, abilityInfo.name); newWant->SetParam(AAFwk::Want::PARAM_ABILITY_RECOVERY_RESTART, true); - StartAbility(*newWant,MAIN_USER_ID); - TAG_LOGW(AAFwkTag::ABILITYMGR,"now is %{public}lld,timestamp is %{public}lld",static_cast(now),static_cast(stamp)); + StartAbility(*newWant,userId); + TAG_LOGI(AAFwkTag::ABILITYMGR,"CPP_CRASH recovery. bundleName is %{public}s",abilityInfo.bundleName.c_str()); } if (remote != nullptr) { AppRecoveryMgr::AppRecoveryMgr::GetInstance().RemoveOnRemoteDieCallback(remote); diff --git a/services/abilitymgr/src/app_exit_reason_data_manager.cpp b/services/abilitymgr/src/app_exit_reason_data_manager.cpp index 92fea15c0c..df7b0bd8b2 100644 --- a/services/abilitymgr/src/app_exit_reason_data_manager.cpp +++ b/services/abilitymgr/src/app_exit_reason_data_manager.cpp @@ -190,7 +190,8 @@ int32_t AppExitReasonDataManager::DeleteAppExitReason(const std::string &bundleN int32_t AppExitReasonDataManager::GetAppExitReason(const std::string &bundleName, uint32_t accessTokenId, const std::string &abilityName, bool &isSetReason, AAFwk::ExitReason &exitReason, - AppExecFwk::RunningProcessInfo &processInfo, int64_t &time_stamp, bool &withKillMsg) + AppExecFwk::RunningProcessInfo &processInfo, int64_t &time_stamp, bool &withKillMsg, + bool cleanFlag) { auto accessTokenIdStr = std::to_string(accessTokenId); if (bundleName.empty() || accessTokenId == Security::AccessToken::INVALID_TOKENID) { @@ -219,8 +220,7 @@ int32_t AppExitReasonDataManager::GetAppExitReason(const std::string &bundleName withKillMsg); auto pos = std::find(abilityList.begin(), abilityList.end(), abilityName); if (pos != abilityList.end()) { - isSetReason = true; - abilityList.erase(std::remove(abilityList.begin(), abilityList.end(), abilityName), abilityList.end()); + HandleAbilityMatchAndCleanup(abilityName, abilityList, isSetReason, cleanFlag); UpdateAppExitReason(accessTokenId, abilityList, exitReason, processInfo, withKillMsg); } TAG_LOGD(AAFwkTag::ABILITYMGR, "current bundle name: %{public}s, tokenId:%{private}u, reason: %{public}d," @@ -237,6 +237,17 @@ int32_t AppExitReasonDataManager::GetAppExitReason(const std::string &bundleName return ERR_OK; } +void AppExitReasonDataManager::HandleAbilityMatchAndCleanup( + const std::string& abilityName, std::vector& abilityList, + bool& isSetReason, bool cleanFlag) +{ + isSetReason = true; + if (cleanFlag) { + auto newEnd = std::remove(abilityList.begin(), abilityList.end(), abilityName); + abilityList.erase(newEnd, abilityList.end()); + } +} + void AppExitReasonDataManager::UpdateAppExitReason(uint32_t accessTokenId, const std::vector &abilityList, const AAFwk::ExitReason &exitReason, const AppExecFwk::RunningProcessInfo &processInfo, bool withKillMsg) { diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index 3d25d92492..ef6fe563d2 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -11579,8 +11579,6 @@ void AppMgrServiceInner::HandleForegroundAbilityDied( continue; } AppRecoveryMgr::AppRecoveryMgr::GetInstance().HandleAppDied(token); - TAG_LOGI(AAFwkTag::APPMGR, "Notified AppRecoveryMgr for ability token: %{public}p", - token.GetRefPtr()); } } } // namespace AppExecFwk