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 104287ca8c1beaff243259d2ae20fa05d866e38c..669a77fe3c9ed4cf3f953a02d41614be212e82db 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 25de51bc8b37684c25abf4a7d9dad0c3e5aced35..54edf454148c18af50a525ddd465e80abc245b62 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 13a9571b14208ea240d37459d97408669ae3001f..ebd5322b5fbacbcaed711f047682fb39e0dedc55 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 c5e3ccdc9ba15788d51d76d8e7d446170798a0d8..02191ec31d4e890c345af959a2d56b95f724996b 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 4efad91b4e892e17c37eca2ea8fe8a6d574b37ae..4c3527123184710328bf26c8876c73358dbad3db 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 effb97b13411599c9d46965a8519b7439d394ca1..6737c327dfdebff5e7b9c66491b1982a155537e9 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++) {