From cb0be575fb6a4331d42a80b292c5c56223530ac6 Mon Sep 17 00:00:00 2001 From: lidongrui Date: Sun, 22 Jun 2025 16:45:55 +0800 Subject: [PATCH] 25-6-22_submit Signed-off-by: lidongrui Change-Id: I37b4cefee8a440b85265596f874fe3d53b66b6cc --- .../ability_manager/include/ability_manager_errors.h | 5 +++++ .../inner_api/ability_manager/include/exit_reason.h | 1 + .../scene_board/ui_ability_lifecycle_manager.h | 2 ++ services/abilitymgr/src/ability_manager_service.cpp | 8 ++++++++ services/abilitymgr/src/exit_reason.cpp | 2 ++ .../src/scene_board/ui_ability_lifecycle_manager.cpp | 11 +++++++++++ 6 files changed, 29 insertions(+) diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_errors.h b/interfaces/inner_api/ability_manager/include/ability_manager_errors.h index 104287ca8c1..669a77fe3c9 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_errors.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_errors.h @@ -802,6 +802,11 @@ enum { * Result (2097334) for app selector not exists. */ ERR_APP_SELECTOR_NOT_EXISTS = 2097334, + + /** + * Result (2097335) for kill foreground apps. + */ + ERR_KILL_APP_WHILE_FOREGROUND = 2097335, /** * Native error(3000000) for target bundle not exist. diff --git a/interfaces/inner_api/ability_manager/include/exit_reason.h b/interfaces/inner_api/ability_manager/include/exit_reason.h index 25de51bc8b3..54edf454148 100644 --- a/interfaces/inner_api/ability_manager/include/exit_reason.h +++ b/interfaces/inner_api/ability_manager/include/exit_reason.h @@ -31,6 +31,7 @@ struct ExitReason : public Parcelable { Reason reason = Reason::REASON_UNKNOWN; int32_t subReason = -1; std::string exitMsg = ""; + bool shouldKillForeground = true; bool ReadFromParcel(Parcel &parcel); virtual bool Marshalling(Parcel &parcel) const override; 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 13a9571b142..ebd5322b5fb 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -395,6 +395,8 @@ public: void RecordPidKilling(pid_t pid, const std::string &reason); + void CheckPidAbilityForeground(pid_t pid); + private: void AddStartingPid(pid_t pid); void RemoveStartingPid(pid_t pid); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index c5e3ccdc9ba..02191ec31d4 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -11453,6 +11453,14 @@ int32_t AbilityManagerService::KillProcessWithReason(int32_t pid, const ExitReas return ERR_PERMISSION_DENIED; } + if (!reason.shouldKillForeground) { + auto uiAbilityManager = GetUIAbilityManagerByUid(IPCSkeleton::GetCallingUid()); + if (uiAbilityManager != nullptr && uiAbilityManager->CheckPidAbilityForeground(pid)) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "do no kill foreground apps, pid = %{public}d", pid); + return ERR_KILL_APP_WHILE_FOREGROUND; + } + } + if (ProcessLowMemoryKill(pid, reason)) { // if app is already starting, return TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}d is starting", pid); diff --git a/services/abilitymgr/src/exit_reason.cpp b/services/abilitymgr/src/exit_reason.cpp index 4efad91b4e8..4c352712318 100644 --- a/services/abilitymgr/src/exit_reason.cpp +++ b/services/abilitymgr/src/exit_reason.cpp @@ -42,6 +42,7 @@ bool ExitReason::ReadFromParcel(Parcel &parcel) READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, reasonData); subReason = reasonData; exitMsg = Str16ToStr8(parcel.ReadString16()); + READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, shouldKillForeground); return true; } @@ -65,6 +66,7 @@ bool ExitReason::Marshalling(Parcel &parcel) const WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast(reason)); WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, subReason); WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(exitMsg)); + WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, shouldKillForeground); return true; } } // namespace AppExecFwk 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 effb97b1341..6737c327dfd 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -172,6 +172,17 @@ void UIAbilityLifecycleManager::RecordPidKilling(pid_t pid, const std::string &r } } +void UIAbilityLifecycleManager::CheckPidAbilityForeground(pid_t pid) +{ + std::lock_guard guard(sessionLock_); + for (const auto& [first, second] : sessionAbilityMap_) { + if (second && pid == second->GetPid() && second->IsForeground) { + return true; + } + } + return false; +} + void UIAbilityLifecycleManager::MarkStartingFlag(const AbilityRequest &abilityRequest) { for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) { -- Gitee