From 2405898f6c106399c9d3bd41df46604cf894050c Mon Sep 17 00:00:00 2001 From: caochunlei Date: Mon, 28 Feb 2022 13:23:51 +0000 Subject: [PATCH 1/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- .../kits/appkit/native/ability_runtime/context/context_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp index 732cd457655..6be853a6fe6 100644 --- a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp +++ b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp @@ -70,7 +70,7 @@ std::string ContextImpl::GetBundleCodeDir() if (IsCreateBySystemApp()) { dir = std::regex_replace(appInfo->codePath, std::regex(ABS_CODE_PATH), LOCAL_BUNDLES); } else { - dir = CONTEXT_DATA_STORAGE + CONTEXT_ELS[0] + CONTEXT_BUNDLE; + dir = LOCAL_CODE_PATH; } CreateDirIfNotExist(dir); HILOG_DEBUG("ContextImpl::GetBundleCodeDir:%{public}s", dir.c_str()); -- Gitee From aa44593416109af56c82b8d60dd4635fdd9c6bbd Mon Sep 17 00:00:00 2001 From: caochunlei Date: Sat, 5 Mar 2022 16:50:24 +0800 Subject: [PATCH 2/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- .../include/mock_ability_manager_service.cpp | 2 +- .../include/mock_ability_manager_service.h | 2 +- .../Mock/include/mock_ability_mgr_service.h | 2 +- .../mock/AMS/mock_ability_manager_service.h | 2 +- .../AMS/mock_serviceability_manager_service.h | 2 +- .../include/ability_manager_interface.h | 5 +- .../include/ability_manager_proxy.h | 5 +- .../include/ability_manager_service.h | 5 +- services/abilitymgr/include/app_scheduler.h | 9 ++ .../abilitymgr/include/inner_mission_info.h | 2 + .../abilitymgr/include/mission_info_mgr.h | 5 + services/abilitymgr/include/mission_list.h | 9 ++ .../abilitymgr/include/mission_list_manager.h | 4 + .../include/mission_listener_controller.h | 2 + .../abilitymgr/include/pending_want_manager.h | 4 +- .../abilitymgr/src/ability_manager_proxy.cpp | 6 +- .../src/ability_manager_service.cpp | 15 +-- .../abilitymgr/src/ability_manager_stub.cpp | 3 +- services/abilitymgr/src/app_scheduler.cpp | 13 +++ .../abilitymgr/src/inner_mission_info.cpp | 92 ++++++++++++------- services/abilitymgr/src/mission_info_mgr.cpp | 28 +++++- services/abilitymgr/src/mission_list.cpp | 35 +++++++ .../abilitymgr/src/mission_list_manager.cpp | 53 +++++++++-- .../src/mission_listener_controller.cpp | 25 +++++ .../abilitymgr/src/pending_want_manager.cpp | 8 +- .../ability_manager_stub_mock.h | 2 +- .../ability_manager_service_test.cpp | 2 +- .../ability_manager_stub_impl_mock.h | 2 +- .../ability_manager_stub_mock.h | 2 +- .../pending_want_manager_test.cpp | 6 +- .../test/mock/include/mock_ability_manager.h | 4 +- .../include/appmgr/mock_ability_mgr_host.h | 2 +- .../mock/include/mock_ability_manager_proxy.h | 2 +- .../mock/include/mock_ability_mgr_service.h | 2 +- .../ability_mgr_module_test.cpp | 8 +- 35 files changed, 289 insertions(+), 81 deletions(-) diff --git a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.cpp b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.cpp index afac3de2feb..311935a2468 100644 --- a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.cpp +++ b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.cpp @@ -173,7 +173,7 @@ int MockAbilityManagerService::KillProcess(const std::string &bundleName) return 0; } -int MockAbilityManagerService::UninstallApp(const std::string &bundleName) +int MockAbilityManagerService::UninstallApp(const std::string &bundleName, int32_t uid) { return 0; } diff --git a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h index 21f571f8d06..6507c54c277 100644 --- a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h +++ b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h @@ -198,7 +198,7 @@ public: int KillProcess(const std::string &bundleName) override; - int UninstallApp(const std::string &bundleName) override; + int UninstallApp(const std::string &bundleName, int32_t uid) override; int TerminateAbilityByCaller(const sptr &callerToken, int requestCode) override { diff --git a/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h b/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h index 936f084101c..e42934ca350 100644 --- a/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h +++ b/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h @@ -60,7 +60,7 @@ public: MOCK_METHOD1(MoveMissionToTop, int(int32_t)); MOCK_METHOD1(KillProcess, int(const std::string &bundleName)); - MOCK_METHOD2(UninstallApp, int(const std::string &bundleName, const int userId)); + MOCK_METHOD2(UninstallApp, int(const std::string &bundleName, int32_t uid)); MOCK_METHOD1(TerminateAbilityByRecordId, int(const int64_t recordId)); MOCK_METHOD1(LockMissionForCleanup, int(int32_t missionId)); diff --git a/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h b/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h index 5f7106cf5b4..4ffd856bb52 100644 --- a/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h +++ b/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h @@ -91,7 +91,7 @@ public: MOCK_METHOD1(MoveMissionToTop, int(int32_t missionId)); MOCK_METHOD1(KillProcess, int(const std::string &bundleName)); - MOCK_METHOD1(UninstallApp, int(const std::string &bundleName)); + MOCK_METHOD2(UninstallApp, int(const std::string &bundleName, int32_t uid)); MOCK_METHOD2( GetWantSender, sptr(const WantSenderInfo &wantSenderInfo, const sptr &callerToken)); MOCK_METHOD2(SendWantSender, int(const sptr &target, const SenderInfo &senderInfo)); diff --git a/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h b/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h index 5101d21735a..cb5bac1fb71 100644 --- a/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h +++ b/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h @@ -91,7 +91,7 @@ public: MOCK_METHOD1(GetAllStackInfo, int(StackInfo &stackInfo)); MOCK_METHOD1(MoveMissionToTop, int(int32_t missionId)); MOCK_METHOD1(KillProcess, int(const std::string &bundleName)); - MOCK_METHOD1(UninstallApp, int(const std::string &bundleName)); + MOCK_METHOD2(UninstallApp, int(const std::string &bundleName, int32_t uid)); MOCK_METHOD2( GetWantSender, sptr(const WantSenderInfo &wantSenderInfo, const sptr &callerToken)); MOCK_METHOD2(SendWantSender, int(const sptr &target, const SenderInfo &senderInfo)); diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index 82b3b7035b6..d9bfadc8674 100644 --- a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h @@ -394,10 +394,11 @@ public: /** * Uninstall app * - * @param bundleName. + * @param bundleName bundle name of uninstalling app. + * @param uid uid of bundle. * @return Returns ERR_OK on success, others on failure. */ - virtual int UninstallApp(const std::string &bundleName) = 0; + virtual int UninstallApp(const std::string &bundleName, int32_t uid) = 0; /** * Moving mission to the specified stack by mission option(Enter floating window mode). diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index 9de5f09d6f9..f7223ac3434 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -357,10 +357,11 @@ public: /** * Uninstall app * - * @param bundleName. + * @param bundleName bundle name of uninstalling app. + * @param uid uid of bundle. * @return Returns ERR_OK on success, others on failure. */ - virtual int UninstallApp(const std::string &bundleName) override; + virtual int UninstallApp(const std::string &bundleName, int32_t uid) override; /** * Moving mission to the specified stack by mission option(Enter floating window mode). diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 3117878227e..da54a0d8f27 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -475,10 +475,11 @@ public: /** * Uninstall app * - * @param bundleName. + * @param bundleName bundle name of uninstalling app. + * @param uid uid of bundle. * @return Returns ERR_OK on success, others on failure. */ - virtual int UninstallApp(const std::string &bundleName) override; + virtual int UninstallApp(const std::string &bundleName, int32_t uid) override; /** * Moving mission to the specified stack by mission option(Enter floating window mode). diff --git a/services/abilitymgr/include/app_scheduler.h b/services/abilitymgr/include/app_scheduler.h index dbf3c483d02..f4e99b41711 100644 --- a/services/abilitymgr/include/app_scheduler.h +++ b/services/abilitymgr/include/app_scheduler.h @@ -210,6 +210,15 @@ public: */ int KillApplication(const std::string &bundleName); + /** + * kill the application by uid + * + * @param bundleName name of bundle. + * @param uid uid of bundle. + * @return 0 if success. + */ + int KillApplicationByUid(const std::string &bundleName, int32_t uid); + /** * clear the application data * diff --git a/services/abilitymgr/include/inner_mission_info.h b/services/abilitymgr/include/inner_mission_info.h index af13a48e350..0b811ec6bd3 100644 --- a/services/abilitymgr/include/inner_mission_info.h +++ b/services/abilitymgr/include/inner_mission_info.h @@ -45,6 +45,8 @@ struct InnerMissionInfo { std::string missionName; bool isSingletonMode; int32_t startMethod; + std::string bundleName; + int32_t uid; std::string ToJsonStr() const; bool FromJsonStr(const std::string &jsonStr); diff --git a/services/abilitymgr/include/mission_info_mgr.h b/services/abilitymgr/include/mission_info_mgr.h index f3757a4e462..5289421796e 100644 --- a/services/abilitymgr/include/mission_info_mgr.h +++ b/services/abilitymgr/include/mission_info_mgr.h @@ -157,6 +157,8 @@ public: * @param handler the snapshotHandler */ void RegisterSnapshotHandler(const sptr& handler); + + void HandleUnInstallApp(const std::string &bundleName, int32_t uid, std::list &missions); private: /** * @brief Boot query mission info. @@ -164,7 +166,10 @@ private: */ bool LoadAllMissionInfo(); + void GetMatchedMission(const std::string &bundleName, int32_t uid, std::list &missions); + private: + int32_t currentMisionId_ = MIN_MISSION_ID; std::unordered_map missionIdMap_; // key:distributed misisonid, vaule: has been saved std::list missionInfoList_; std::shared_ptr taskDataPersistenceMgr_; diff --git a/services/abilitymgr/include/mission_list.h b/services/abilitymgr/include/mission_list.h index 30b4140bdcc..1f78d3d0452 100644 --- a/services/abilitymgr/include/mission_list.h +++ b/services/abilitymgr/include/mission_list.h @@ -161,6 +161,14 @@ public: */ sptr GetAbilityTokenByMissionId(int32_t missionId); + /** + * Handle uninstall bundle. + * + * @param bundleName name of bundle. + * @param uid the uid of bundle. + */ + void HandleUnInstallApp(const std::string &bundleName, int32_t uid); + /** * @brief dump mission * @@ -181,6 +189,7 @@ public: std::shared_ptr GetMissionBySpecifiedFlag(const std::string &flag) const; private: std::string GetTypeName(); + bool MatchedInitialMission(const std::shared_ptr& mission, const std::string &bundleName, int32_t uid); MissionListType type_; std::list> missions_ {}; diff --git a/services/abilitymgr/include/mission_list_manager.h b/services/abilitymgr/include/mission_list_manager.h index 9c224d7a8eb..5e60dc091b7 100644 --- a/services/abilitymgr/include/mission_list_manager.h +++ b/services/abilitymgr/include/mission_list_manager.h @@ -339,6 +339,8 @@ public: */ std::shared_ptr GetCurrentTopAbility(const std::string &bundleName); + void UninstallApp(const std::string &bundleName, int32_t uid); + bool IsStarted(); void PauseManager(); void ResumeManager(); @@ -407,6 +409,8 @@ private: int CallAbilityLocked(const AbilityRequest &abilityRequest); void UpdateMissionSnapshot(const std::shared_ptr& abilityRecord); + void AddUninstallTags(const std::string &bundleName, int32_t uid); + private: int userId_; std::recursive_mutex managerLock_; diff --git a/services/abilitymgr/include/mission_listener_controller.h b/services/abilitymgr/include/mission_listener_controller.h index 7a20272afc1..1d8bc11f530 100644 --- a/services/abilitymgr/include/mission_listener_controller.h +++ b/services/abilitymgr/include/mission_listener_controller.h @@ -82,6 +82,8 @@ public: */ void NotifyMissionMovedToFront(int32_t missionId); + void HandleUnInstallApp(std::list missions); + private: void NotifyListeners(int32_t missionId, IMissionListener::MissionListenerCmd cmd); void OnListenerDied(const wptr &remote); diff --git a/services/abilitymgr/include/pending_want_manager.h b/services/abilitymgr/include/pending_want_manager.h index 55852046f41..7c5d2c38bed 100644 --- a/services/abilitymgr/include/pending_want_manager.h +++ b/services/abilitymgr/include/pending_want_manager.h @@ -156,7 +156,7 @@ public: int32_t DeviceIdDetermine( const Want &want, const sptr &callerToken, int32_t requestCode, const int32_t callerUid); int32_t PendingWantPublishCommonEvent(const Want &want, const SenderInfo &senderInfo, int32_t callerUid); - void ClearPendingWantRecord(const std::string &bundleName); + void ClearPendingWantRecord(const std::string &bundleName, int32_t uid); void Dump(std::vector &info); void DumpByRecordId(std::vector &info, const std::string &args); @@ -172,7 +172,7 @@ private: sptr GetPendingWantRecordByCode(int32_t code); static int32_t PendingRecordIdCreate(); - void ClearPendingWantRecordTask(const std::string &bundleName); + void ClearPendingWantRecordTask(const std::string &bundleName, int32_t uid); private: std::map, sptr> wantRecords_; diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index f713cac88f2..dd27b84d444 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -931,7 +931,7 @@ int AbilityManagerProxy::ClearUpApplicationData(const std::string &bundleName) return reply.ReadInt32(); } -int AbilityManagerProxy::UninstallApp(const std::string &bundleName) +int AbilityManagerProxy::UninstallApp(const std::string &bundleName, int32_t uid) { MessageParcel data; MessageParcel reply; @@ -944,6 +944,10 @@ int AbilityManagerProxy::UninstallApp(const std::string &bundleName) HILOG_ERROR("bundleName write failed."); return ERR_INVALID_VALUE; } + if (!data.WriteInt32(uid)) { + HILOG_ERROR("uid write failed."); + return ERR_INVALID_VALUE; + } int error = Remote()->SendRequest(IAbilityManager::UNINSTALL_APP, data, reply, option); if (error != NO_ERROR) { HILOG_ERROR("Send request error: %{public}d", error); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index efa93805959..d320fb72a95 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -61,6 +61,7 @@ namespace OHOS { namespace AAFwk { using namespace std::chrono; const bool CONCURRENCY_MODE_FALSE = false; +const int32_t BASE_USER_RANGE = 200000; const int32_t MAIN_USER_ID = 100; const int32_t U0_USER_ID = 0; constexpr int32_t INVALID_USER_ID = -1; @@ -2685,21 +2686,23 @@ int AbilityManagerService::ClearUpApplicationData(const std::string &bundleName) return ERR_OK; } -int AbilityManagerService::UninstallApp(const std::string &bundleName) +int AbilityManagerService::UninstallApp(const std::string &bundleName, int32_t uid) { HILOG_DEBUG("Uninstall app, bundleName: %{public}s", bundleName.c_str()); pid_t callingPid = IPCSkeleton::GetCallingPid(); pid_t pid = getpid(); - if (callingPid != pid) { + if (callingPid != pid) { HILOG_ERROR("%{public}s: Not bundleMgr call.", __func__); return CHECK_PERMISSION_FAILED; } - CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT); - currentStackManager_->UninstallApp(bundleName); + int32_t targetUserId = uid / BASE_USER_RANGE; + auto listManager = GetListManagerByUserId(targetUserId); + CHECK_POINTER_AND_RETURN(listManager, ERR_NO_INIT); + listManager->UninstallApp(bundleName, uid); CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_NO_INIT); - pendingWantManager_->ClearPendingWantRecord(bundleName); - int ret = DelayedSingleton::GetInstance()->KillApplication(bundleName); + pendingWantManager_->ClearPendingWantRecord(bundleName, uid); + int ret = DelayedSingleton::GetInstance()->KillApplicationByUid(bundleName, uid); if (ret != ERR_OK) { return UNINSTALL_APP_FAILED; } diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index 54580c6b32b..b4c62ee5de9 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -422,7 +422,8 @@ int AbilityManagerStub::ClearUpApplicationDataInner(MessageParcel &data, Message int AbilityManagerStub::UninstallAppInner(MessageParcel &data, MessageParcel &reply) { std::string bundleName = Str16ToStr8(data.ReadString16()); - int result = UninstallApp(bundleName); + int32_t uid = data.ReadInt32(); + int result = UninstallApp(bundleName, uid); if (!reply.WriteInt32(result)) { HILOG_ERROR("remove stack error"); return ERR_INVALID_VALUE; diff --git a/services/abilitymgr/src/app_scheduler.cpp b/services/abilitymgr/src/app_scheduler.cpp index 6cd186b67c9..ed3d0ad8e09 100644 --- a/services/abilitymgr/src/app_scheduler.cpp +++ b/services/abilitymgr/src/app_scheduler.cpp @@ -198,6 +198,19 @@ int AppScheduler::KillApplication(const std::string &bundleName) return ERR_OK; } +int AppScheduler::KillApplicationByUid(const std::string &bundleName, int32_t uid) +{ + HILOG_INFO("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__); + CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR); + int ret = (int)appMgrClient_->KillApplicationByUid(bundleName, uid); + if (ret != ERR_OK) { + HILOG_ERROR("Fail to kill application by uid."); + return INNER_ERR; + } + + return ERR_OK; +} + int AppScheduler::ClearUpApplicationData(const std::string &bundleName) { CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR); diff --git a/services/abilitymgr/src/inner_mission_info.cpp b/services/abilitymgr/src/inner_mission_info.cpp index 2198f0df7ed..f8f596f1a94 100644 --- a/services/abilitymgr/src/inner_mission_info.cpp +++ b/services/abilitymgr/src/inner_mission_info.cpp @@ -20,20 +20,36 @@ namespace OHOS { namespace AAFwk { +namespace { +const std::string KEY_MISSION_NAME = "MissionName"; +const std::string KEY_IS_SINGLETON = "IsSingleton"; +const std::string KEY_MISSION_ID = "MissionId"; +const std::string KEY_RUNNING_STATE = "RunningState"; +const std::string KEY_LOCKED_STATE = "LockedState"; +const std::string KEY_CONTINUABLE = "Continuable"; +const std::string KEY_TIME = "Time"; +const std::string KEY_LABEL = "Label"; +const std::string KEY_ICON_PATH = "IconPath"; +const std::string KEY_WANT = "Want"; +const std::string KEY_START_METHOD = "StartMethod"; +const std::string KEY_BUNDLE_NAME = "BundleName"; +const std::string KEY_UID = "Uid"; +} std::string InnerMissionInfo::ToJsonStr() const { nlohmann::json value; - value["MissionName"] = missionName; - value["IsSingleton"] = isSingletonMode; - value["StartMethod"] = startMethod; - value["MissionId"] = missionInfo.id; - value["RunningState"] = missionInfo.runningState; - value["LockedState"] = missionInfo.lockedState; - value["Continuable"] = missionInfo.continuable; - value["Time"] = missionInfo.time; - value["Label"] = missionInfo.label; - value["IconPath"] = missionInfo.iconPath; - value["Want"] = missionInfo.want.ToUri(); + value[KEY_MISSION_NAME] = missionName; + value[KEY_IS_SINGLETON] = isSingletonMode; + value[KEY_BUNDLE_NAME] = bundleName; + value[KEY_UID] = uid; + value[KEY_MISSION_ID] = missionInfo.id; + value[KEY_RUNNING_STATE] = missionInfo.runningState; + value[KEY_LOCKED_STATE] = missionInfo.lockedState; + value[KEY_CONTINUABLE] = missionInfo.continuable; + value[KEY_TIME] = missionInfo.time; + value[KEY_LABEL] = missionInfo.label; + value[KEY_ICON_PATH] = missionInfo.iconPath; + value[KEY_WANT] = missionInfo.want.ToUri(); return value.dump(); } @@ -64,50 +80,60 @@ bool InnerMissionInfo::FromJsonStr(const std::string &jsonStr) } return false; }; - if (!CheckJsonNode("MissionName", JsonType::STRING)) { + if (!CheckJsonNode(KEY_MISSION_NAME, JsonType::STRING)) { + return false; + } + missionName = value[KEY_MISSION_NAME].get(); + if (!CheckJsonNode(KEY_IS_SINGLETON, JsonType::BOOLEAN)) { return false; } - missionName = value["MissionName"].get(); - if (!CheckJsonNode("IsSingleton", JsonType::BOOLEAN)) { + isSingletonMode = value[KEY_IS_SINGLETON].get(); + if (!CheckJsonNode(KEY_START_METHOD, JsonType::NUMBER)) { return false; } - isSingletonMode = value["IsSingleton"].get(); - if (!CheckJsonNode("StartMethod", JsonType::NUMBER)) { + startMethod = value[KEY_START_METHOD].get(); + if (!CheckJsonNode(KEY_BUNDLE_NAME, JsonType::STRING)) { return false; } - startMethod = value["StartMethod"].get(); - if (!CheckJsonNode("MissionId", JsonType::NUMBER)) { + bundleName = value[KEY_BUNDLE_NAME].get(); + if (!CheckJsonNode(KEY_UID, JsonType::NUMBER)) { + return false; + } + uid = value[KEY_UID].get(); + + + if (!CheckJsonNode(KEY_MISSION_ID, JsonType::NUMBER)) { return false; } - missionInfo.id = value["MissionId"].get(); - if (!CheckJsonNode("RunningState", JsonType::NUMBER)) { + missionInfo.id = value[KEY_MISSION_ID].get(); + if (!CheckJsonNode(KEY_RUNNING_STATE, JsonType::NUMBER)) { return false; } - missionInfo.runningState = value["RunningState"].get(); - if (!CheckJsonNode("LockedState", JsonType::BOOLEAN)) { + missionInfo.runningState = value[KEY_RUNNING_STATE].get(); + if (!CheckJsonNode(KEY_LOCKED_STATE, JsonType::BOOLEAN)) { return false; } - missionInfo.lockedState = value["LockedState"].get(); - if (!CheckJsonNode("Continuable", JsonType::BOOLEAN)) { + missionInfo.lockedState = value[KEY_LOCKED_STATE].get(); + if (!CheckJsonNode(KEY_CONTINUABLE, JsonType::BOOLEAN)) { return false; } - missionInfo.continuable = value["Continuable"].get(); - if (!CheckJsonNode("Time", JsonType::STRING)) { + missionInfo.continuable = value[KEY_CONTINUABLE].get(); + if (!CheckJsonNode(KEY_TIME, JsonType::STRING)) { return false; } - missionInfo.time = value["Time"].get(); - if (!CheckJsonNode("Label", JsonType::STRING)) { + missionInfo.time = value[KEY_TIME].get(); + if (!CheckJsonNode(KEY_LABEL, JsonType::STRING)) { return false; } - missionInfo.label = value["Label"].get(); - if (!CheckJsonNode("IconPath", JsonType::STRING)) { + missionInfo.label = value[KEY_LABEL].get(); + if (!CheckJsonNode(KEY_ICON_PATH, JsonType::STRING)) { return false; } - missionInfo.iconPath = value["IconPath"].get(); - if (!CheckJsonNode("Want", JsonType::STRING)) { + missionInfo.iconPath = value[KEY_ICON_PATH].get(); + if (!CheckJsonNode(KEY_WANT, JsonType::STRING)) { return false; } - Want* want = Want::ParseUri(value["Want"].get()); + Want* want = Want::ParseUri(value[KEY_WANT].get()); if (want) { missionInfo.want = *want; } diff --git a/services/abilitymgr/src/mission_info_mgr.cpp b/services/abilitymgr/src/mission_info_mgr.cpp index 224364b1b2c..780546dd3db 100644 --- a/services/abilitymgr/src/mission_info_mgr.cpp +++ b/services/abilitymgr/src/mission_info_mgr.cpp @@ -31,10 +31,15 @@ MissionInfoMgr::~MissionInfoMgr() bool MissionInfoMgr::GenerateMissionId(int32_t &misisonId) { - for (int32_t index = MIN_MISSION_ID; index <= MAX_MISSION_ID; index++) { + if (currentMisionId_ == MAX_MISSION_ID) { + currentMisionId_ = MIN_MISSION_ID; + } + + for (int32_t index = currentMisionId_; index < MAX_MISSION_ID; index++) { if (missionIdMap_.find(index) == missionIdMap_.end()) { misisonId = index; missionIdMap_[misisonId] = false; + currentMisionId_ = missionId + 1; return true; } } @@ -351,6 +356,27 @@ bool MissionInfoMgr::LoadAllMissionInfo() return true; } +void MissionInfoMgr::HandleUnInstallApp(const std::string &bundleName, int32_t uid, std::list &missions) +{ + HILOG_INFO("HandleUnInstallApp, bundleName:%{public}s, uid:%{public}d", bundleName.c_str(), missionId); + if (missions.empty()) { + return; + } + + for (auto missionId : missions) { + DeleteMissionInfo(missionId); + } +} + +void MissionInfoMgr::GetMatchedMission(const std::string &bundleName, int32_t uid, std::list &missions) +{ + for (const auto& innerMissionInfo : missionInfoList_) { + if (innerMissionInfo.bundleName == bundleName && innerMissionInfo.uid == uid) { + missions.push_back(innerMissionInfo.missionInfo.id); + } + } +} + void MissionInfoMgr::Dump(std::vector &info) { for (const auto& innerMissionInfo : missionInfoList_) { diff --git a/services/abilitymgr/src/mission_list.cpp b/services/abilitymgr/src/mission_list.cpp index 3771dc7c029..68c82b26a41 100644 --- a/services/abilitymgr/src/mission_list.cpp +++ b/services/abilitymgr/src/mission_list.cpp @@ -253,6 +253,41 @@ std::string MissionList::GetTypeName() } } +void MissionList::HandleUnInstallApp(const std::string &bundleName, int32_t uid) +{ + for (auto it = missions_.begain(); it != missions_.end();) { + auto mission = *it; + if (MatchedInitialMission(mission, bundleName, uid)) { + missions_.erase(it++); + } else { + it++; + } + } +} + +bool MissionList::MatchedInitialMission(const std::shared_ptr& mission, + const std::string &bundleName, int32_t uid) +{ + if (!mission) { + return false; + } + + auto abilityRecord = mission->GetAbilityRecord(); + if (!abilityRecord) { + return false; + } + + if (abilityRecord->GetAbilityInfo().bundleName == bundleName && abilityRecord->GetUid() == uid) { + abilityRecord->SetIsUninstallAbility(); + if (abilityRecord->IsAbilityState(AbilityState::INITIAL)) { + return true; + } + } + + return false; +} + + void MissionList::Dump(std::vector& info) { std::string dumpInfo = " MissionList Type #" + GetTypeName(); diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index b220cab9868..17ae08127f9 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -352,6 +352,8 @@ void MissionListManager::GetTargetMissionAndAbility(const AbilityRequest &abilit info.missionName = missionName; info.isSingletonMode = isSingleton; info.startMethod = startMethod; + info.bundleName = abilityRequest.abilityInfo.bundleName; + info.uid = abilityRequest.uid; info.missionInfo.runningState = 0; info.missionInfo.continuable = abilityRequest.abilityInfo.continuable; info.missionInfo.time = Time2str(time(0)); @@ -1751,7 +1753,6 @@ void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptrGetMission(); CHECK_POINTER_LOG(mission, "Fail to get mission."); auto missionList = mission->GetMissionList(); @@ -1760,7 +1761,7 @@ void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr launcherRoot = launcherList_->GetLauncherRoot(); bool isLauncherActive = (launcherRoot && (launcherRoot->IsAbilityState(FOREGROUND_NEW) || launcherRoot->IsAbilityState(FOREGROUNDING_NEW))); - bool isForeground = ability->IsAbilityState(FOREGROUND_NEW) || ability->IsAbilityState(FOREGROUNDING_NEW); + bool isForeground = ability->IsAbilityState(FOREGROUND_NEW) || ability->IsAbilityState(FOREGROUNDING_NEW); // remove from mission list. missionList->RemoveMission(mission); @@ -1769,10 +1770,12 @@ void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr::GetInstance()->GetInnerMissionInfoById(mission->GetMissionId(), info) == 0) { - info.missionInfo.runningState = -1; - DelayedSingleton::GetInstance()->UpdateMissionInfo(info); + if (!abilityRecord->IsUninstallAbility()) { + InnerMissionInfo info; + if (DelayedSingleton::GetInstance()->GetInnerMissionInfoById(mission->GetMissionId(), info) == 0) { + info.missionInfo.runningState = -1; + DelayedSingleton::GetInstance()->UpdateMissionInfo(info); + } } // start launcher @@ -2283,6 +2286,44 @@ std::shared_ptr MissionListManager::GetCurrentTopAbility(const st return {}; } +void MissionListManager::UninstallApp(const std::string &bundleName, int32_t uid) +{ + HILOG_INFO("Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid); + auto abilityManagerService = DelayedSingleton::GetInstance(); + CHECK_POINTER(abilityManagerService); + auto handler = abilityManagerService->GetEventHandler(); + CHECK_POINTER(handler); + std::weak_ptr wpMgr = shared_from_this(); + auto task = [wpMgr, bundleName, uid]() { + HILOG_INFO("Handle Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid); + auto mgr = wpMgr.lock(); + if (mgr) { + mgr->AddUninstallTags(bundleName, uid); + } + }; + handler->PostTask(task); +} + +void MissionListManager::AddUninstallTags(const std::string &bundleName, int32_t uid) +{ + HILOG_INFO("AddUninstallTags, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid); + for (auto& missionList : currentMissionLists_) { + if (missionList) { + missionList->HandleUnInstallApp(bundleName, uid); // add tag here. + if (missionList->IsEmpty()) { + currentMissionLists_.remove(missionList); + } + } + } + defaultSingleList_->HandleUnInstallApp(bundleName, uid); + defaultStandardList->HandleUnInstallApp(bundleName, uid); + std::list matchedMissions; + DelayedSingleton::GetInstance()->HandleUnInstallApp(bundleName, uid, matchedMissions); + if (listenerController_) { + listenerController_->HandleUnInstallApp(matchedMissions); + } +} + bool MissionListManager::IsStarted() { std::lock_guard guard(managerLock_); diff --git a/services/abilitymgr/src/mission_listener_controller.cpp b/services/abilitymgr/src/mission_listener_controller.cpp index fc3b6753b82..f13a7d1a709 100644 --- a/services/abilitymgr/src/mission_listener_controller.cpp +++ b/services/abilitymgr/src/mission_listener_controller.cpp @@ -133,6 +133,31 @@ void MissionListenerController::NotifyMissionDestroyed(int32_t missionId) handler_->PostTask(task); } +void MissionListenerController::HandleUnInstallApp(std::list missions) +{ + if (!handler_) { + HILOG_ERROR("handler not init"); + return; + } + + if (missions.empty()) { + return; + } + + auto task = [weak = weak_from_this(), missions]() { + auto self = weak.lock(); + if (self == nullptr) { + HILOG_ERROR("self is nullptr, NotifyMissionDestroyed failed."); + return; + } + for (auto id : missions) { + self->NotifyListeners(id, Cmd::ON_MISSION_DESTROYED); + } + }; + handler_->PostTask(task); + +} + void MissionListenerController::NotifyMissionSnapshotChanged(int32_t missionId) { if (!handler_) { diff --git a/services/abilitymgr/src/pending_want_manager.cpp b/services/abilitymgr/src/pending_want_manager.cpp index 0f4c522e1bf..665e4dcafc0 100644 --- a/services/abilitymgr/src/pending_want_manager.cpp +++ b/services/abilitymgr/src/pending_want_manager.cpp @@ -481,18 +481,18 @@ int32_t PendingWantManager::GetWantSenderInfo(const sptr &target, s return NO_ERROR; } -void PendingWantManager::ClearPendingWantRecord(const std::string &bundleName) +void PendingWantManager::ClearPendingWantRecord(const std::string &bundleName, int32_t uid) { HILOG_INFO("ClearPendingWantRecord, bundleName: %{public}s", bundleName.c_str()); auto abilityManagerService = DelayedSingleton::GetInstance(); CHECK_POINTER(abilityManagerService); auto handler = abilityManagerService->GetEventHandler(); CHECK_POINTER(handler); - auto task = [bundleName, self = shared_from_this()]() { self->ClearPendingWantRecordTask(bundleName); }; + auto task = [bundleName, uid, self = shared_from_this()]() { self->ClearPendingWantRecordTask(bundleName, uid); }; handler->PostTask(task); } -void PendingWantManager::ClearPendingWantRecordTask(const std::string &bundleName) +void PendingWantManager::ClearPendingWantRecordTask(const std::string &bundleName, int32_t uid) { HILOG_INFO("ClearPendingWantRecordTask, bundleName: %{public}s", bundleName.c_str()); std::lock_guard locker(mutex_); @@ -503,7 +503,7 @@ void PendingWantManager::ClearPendingWantRecordTask(const std::string &bundleNam if ((pendingRecord != nullptr)) { auto wantInfos = pendingRecord->GetKey()->GetAllWantsInfos(); for (const auto &wantInfo: wantInfos) { - if (wantInfo.want.GetBundle() == bundleName) { + if (wantInfo.want.GetBundle() == bundleName && uid == pendingRecord->GetUid()) { hasBundle = true; break; } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h index 3c2a6b1714f..7b42f112271 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h @@ -212,7 +212,7 @@ public: return 0; } - virtual int UninstallApp(const std::string &bundleName) + virtual int UninstallApp(const std::string &bundleName, int32_t uid) { return 0; } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_service_test/ability_manager_service_test.cpp b/services/abilitymgr/test/unittest/phone/ability_manager_service_test/ability_manager_service_test.cpp index c75b01ef44c..bb85e1dfd8a 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_service_test/ability_manager_service_test.cpp +++ b/services/abilitymgr/test/unittest/phone/ability_manager_service_test/ability_manager_service_test.cpp @@ -1262,7 +1262,7 @@ HWTEST_F(AbilityManagerServiceTest, Interface_029, TestSize.Level1) HWTEST_F(AbilityManagerServiceTest, Interface_030, TestSize.Level1) { abilityMs_->currentStackManager_ = nullptr; - auto result = abilityMs_->UninstallApp("bundle"); + auto result = abilityMs_->UninstallApp("bundle", -1); EXPECT_EQ(ERR_NO_INIT, result); } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h index 9a128f97072..5aab9e935fc 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h @@ -225,7 +225,7 @@ public: return 0; } - virtual int UninstallApp(const std::string &bundleName) + virtual int UninstallApp(const std::string &bundleName, int32_t uid) { return 0; } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h index 86e8505154f..b311541fe55 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h @@ -65,7 +65,7 @@ public: MOCK_METHOD1(RemoveStack, int(int)); MOCK_METHOD1(MoveMissionToTop, int(int32_t)); MOCK_METHOD1(KillProcess, int(const std::string &)); - MOCK_METHOD1(UninstallApp, int(const std::string &)); + MOCK_METHOD2(UninstallApp, int(const std::string &, int32_t)); MOCK_METHOD2(TerminateAbilityByCaller, int(const sptr &callerToken, int requestCode)); MOCK_METHOD3(StartAbility, int(const Want &want, const sptr &callerToken, int requestCode)); MOCK_METHOD2(MoveMissionToEnd, int(const sptr &token, const bool nonFirst)); diff --git a/services/abilitymgr/test/unittest/phone/pending_want_manager_test/pending_want_manager_test.cpp b/services/abilitymgr/test/unittest/phone/pending_want_manager_test/pending_want_manager_test.cpp index 3007f1aed71..38d97defaae 100644 --- a/services/abilitymgr/test/unittest/phone/pending_want_manager_test/pending_want_manager_test.cpp +++ b/services/abilitymgr/test/unittest/phone/pending_want_manager_test/pending_want_manager_test.cpp @@ -928,7 +928,7 @@ HWTEST_F(PendingWantManagerTest, PendingWantManagerTest_3500, TestSize.Level1) pendingManager_->GetWantSenderLocked(1, 1, wantSenderInfo1.userId, wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)pendingManager_->wantRecords_.size(), 2); - pendingManager_->ClearPendingWantRecordTask("bundleName2"); + pendingManager_->ClearPendingWantRecordTask("bundleName2", 1); EXPECT_EQ((int)pendingManager_->wantRecords_.size(), 0); } @@ -965,7 +965,7 @@ HWTEST_F(PendingWantManagerTest, PendingWantManagerTest_3600, TestSize.Level1) pendingManager_->GetWantSenderLocked(1, 1, wantSenderInfo1.userId, wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)pendingManager_->wantRecords_.size(), 2); - pendingManager_->ClearPendingWantRecordTask("bundleName1"); + pendingManager_->ClearPendingWantRecordTask("bundleName1", 1); EXPECT_EQ((int)pendingManager_->wantRecords_.size(), 1); } @@ -1002,7 +1002,7 @@ HWTEST_F(PendingWantManagerTest, PendingWantManagerTest_3700, TestSize.Level1) pendingManager_->GetWantSenderLocked(1, 1, wantSenderInfo1.userId, wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)pendingManager_->wantRecords_.size(), 2); - pendingManager_->ClearPendingWantRecordTask("bundleName3"); + pendingManager_->ClearPendingWantRecordTask("bundleName3", 1); EXPECT_EQ((int)pendingManager_->wantRecords_.size(), 2); } diff --git a/services/formmgr/test/mock/include/mock_ability_manager.h b/services/formmgr/test/mock/include/mock_ability_manager.h index 1f8ee784e80..7ac8b5e28e2 100644 --- a/services/formmgr/test/mock/include/mock_ability_manager.h +++ b/services/formmgr/test/mock/include/mock_ability_manager.h @@ -225,7 +225,7 @@ public: { return 0; } - virtual int UninstallApp(const std::string &bundleName) + virtual int UninstallApp(const std::string &bundleName, int32_t uid) { return 0; } @@ -616,7 +616,7 @@ public: { return 0; } - virtual int UninstallApp(const std::string &bundleName) + virtual int UninstallApp(const std::string &bundleName, int32_t uid) { return 0; } diff --git a/services/test/mock/include/appmgr/mock_ability_mgr_host.h b/services/test/mock/include/appmgr/mock_ability_mgr_host.h index f0f005064d2..8cfefb75165 100644 --- a/services/test/mock/include/appmgr/mock_ability_mgr_host.h +++ b/services/test/mock/include/appmgr/mock_ability_mgr_host.h @@ -150,7 +150,7 @@ public: { return 0; } - virtual int UninstallApp(const std::string &bundleName) override + virtual int UninstallApp(const std::string &bundleName, int32_t uid) override { return 0; } diff --git a/services/test/mock/include/mock_ability_manager_proxy.h b/services/test/mock/include/mock_ability_manager_proxy.h index c65309aabf5..35d3dcaec0c 100644 --- a/services/test/mock/include/mock_ability_manager_proxy.h +++ b/services/test/mock/include/mock_ability_manager_proxy.h @@ -56,7 +56,7 @@ public: MOCK_METHOD1(RemoveStack, int(int)); MOCK_METHOD1(MoveMissionToTop, int(int32_t)); MOCK_METHOD1(KillProcess, int(const std::string &)); - MOCK_METHOD1(UninstallApp, int(const std::string &)); + MOCK_METHOD2(UninstallApp, int(const std::string &, int32_t)); MOCK_METHOD4(OnRemoteRequest, int(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)); MOCK_METHOD2(TerminateAbilityByCaller, int(const sptr &callerToken, int requestCode)); MOCK_METHOD3(StartAbility, int(const Want &want, const sptr &callerToken, int requestCode)); diff --git a/services/test/mock/include/mock_ability_mgr_service.h b/services/test/mock/include/mock_ability_mgr_service.h index ad54fb74ae0..9b0460bed84 100644 --- a/services/test/mock/include/mock_ability_mgr_service.h +++ b/services/test/mock/include/mock_ability_mgr_service.h @@ -64,7 +64,7 @@ public: MOCK_METHOD1(RemoveStack, int(int)); MOCK_METHOD1(MoveMissionToTop, int(int32_t)); MOCK_METHOD1(KillProcess, int(const std::string &)); - MOCK_METHOD1(UninstallApp, int(const std::string &)); + MOCK_METHOD2(UninstallApp, int(const std::string &, int32_t)); MOCK_METHOD4(OnRemoteRequest, int(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)); MOCK_METHOD2(MoveMissionToEnd, int(const sptr &token, const bool nonFirst)); MOCK_METHOD1(IsFirstInMission, bool(const sptr &token)); diff --git a/services/test/moduletest/ability_mgr_service_test/ability_mgr_module_test.cpp b/services/test/moduletest/ability_mgr_service_test/ability_mgr_module_test.cpp index 12e14d6aecf..9d030f31fcf 100644 --- a/services/test/moduletest/ability_mgr_service_test/ability_mgr_module_test.cpp +++ b/services/test/moduletest/ability_mgr_service_test/ability_mgr_module_test.cpp @@ -1245,7 +1245,7 @@ HWTEST_F(AbilityMgrModuleTest, UninstallApp_001, TestSize.Level1) wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 2); - abilityMgrServ_->UninstallApp("bundleName3"); + abilityMgrServ_->UninstallApp("bundleName3", 1); WaitAMS(); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 2); } @@ -1288,7 +1288,7 @@ HWTEST_F(AbilityMgrModuleTest, UninstallApp_002, TestSize.Level1) wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 2); - abilityMgrServ_->UninstallApp("bundleName2"); + abilityMgrServ_->UninstallApp("bundleName2", 1); WaitAMS(); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 0); } @@ -1331,7 +1331,7 @@ HWTEST_F(AbilityMgrModuleTest, UninstallApp_003, TestSize.Level1) wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 2); - abilityMgrServ_->UninstallApp("bundleName1"); + abilityMgrServ_->UninstallApp("bundleName1", 1); WaitAMS(); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 1); } @@ -1374,7 +1374,7 @@ HWTEST_F(AbilityMgrModuleTest, UninstallApp_004, TestSize.Level1) wantSenderInfo1, nullptr)->AsObject()); EXPECT_NE(pendingRecord1, nullptr); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 2); - abilityMgrServ_->UninstallApp("bundleName3"); + abilityMgrServ_->UninstallApp("bundleName3", 1); WaitAMS(); EXPECT_EQ((int)abilityMgrServ_->pendingWantManager_->wantRecords_.size(), 1); } -- Gitee From ccbdd5e251ceddaab56b00091afa5b20115fd663 Mon Sep 17 00:00:00 2001 From: caochunlei Date: Sat, 5 Mar 2022 17:20:35 +0800 Subject: [PATCH 3/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- services/abilitymgr/include/mission_listener_controller.h | 2 +- services/abilitymgr/src/mission_info_mgr.cpp | 1 + services/abilitymgr/src/mission_list_manager.cpp | 3 ++- services/abilitymgr/src/mission_listener_controller.cpp | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/services/abilitymgr/include/mission_listener_controller.h b/services/abilitymgr/include/mission_listener_controller.h index 1d8bc11f530..ee003f2b378 100644 --- a/services/abilitymgr/include/mission_listener_controller.h +++ b/services/abilitymgr/include/mission_listener_controller.h @@ -82,7 +82,7 @@ public: */ void NotifyMissionMovedToFront(int32_t missionId); - void HandleUnInstallApp(std::list missions); + void HandleUnInstallApp(const std::list &missions); private: void NotifyListeners(int32_t missionId, IMissionListener::MissionListenerCmd cmd); diff --git a/services/abilitymgr/src/mission_info_mgr.cpp b/services/abilitymgr/src/mission_info_mgr.cpp index 780546dd3db..17627f83e70 100644 --- a/services/abilitymgr/src/mission_info_mgr.cpp +++ b/services/abilitymgr/src/mission_info_mgr.cpp @@ -359,6 +359,7 @@ bool MissionInfoMgr::LoadAllMissionInfo() void MissionInfoMgr::HandleUnInstallApp(const std::string &bundleName, int32_t uid, std::list &missions) { HILOG_INFO("HandleUnInstallApp, bundleName:%{public}s, uid:%{public}d", bundleName.c_str(), missionId); + GetMatchedMission(bundleName, uid, missions); if (missions.empty()) { return; } diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index 17ae08127f9..f58dfe697c5 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -1753,6 +1753,7 @@ void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptrGetMission(); CHECK_POINTER_LOG(mission, "Fail to get mission."); auto missionList = mission->GetMissionList(); @@ -1761,7 +1762,7 @@ void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr launcherRoot = launcherList_->GetLauncherRoot(); bool isLauncherActive = (launcherRoot && (launcherRoot->IsAbilityState(FOREGROUND_NEW) || launcherRoot->IsAbilityState(FOREGROUNDING_NEW))); - bool isForeground = ability->IsAbilityState(FOREGROUND_NEW) || ability->IsAbilityState(FOREGROUNDING_NEW); + bool isForeground = ability->IsAbilityState(FOREGROUND_NEW) || ability->IsAbilityState(FOREGROUNDING_NEW); // remove from mission list. missionList->RemoveMission(mission); diff --git a/services/abilitymgr/src/mission_listener_controller.cpp b/services/abilitymgr/src/mission_listener_controller.cpp index f13a7d1a709..c53591d8e05 100644 --- a/services/abilitymgr/src/mission_listener_controller.cpp +++ b/services/abilitymgr/src/mission_listener_controller.cpp @@ -133,7 +133,7 @@ void MissionListenerController::NotifyMissionDestroyed(int32_t missionId) handler_->PostTask(task); } -void MissionListenerController::HandleUnInstallApp(std::list missions) +void MissionListenerController::HandleUnInstallApp(const std::list &missions) { if (!handler_) { HILOG_ERROR("handler not init"); -- Gitee From 203a034b722160cbe90c62ea55e1dca4c3768e65 Mon Sep 17 00:00:00 2001 From: caochunlei Date: Sat, 5 Mar 2022 18:49:07 +0800 Subject: [PATCH 4/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- services/abilitymgr/src/ability_manager_service.cpp | 3 +-- services/abilitymgr/src/inner_mission_info.cpp | 3 +++ services/abilitymgr/src/mission_info_mgr.cpp | 8 ++++---- services/abilitymgr/src/mission_list.cpp | 2 +- services/abilitymgr/src/mission_list_manager.cpp | 7 ++++--- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index d320fb72a95..88d95881bfd 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -61,7 +61,6 @@ namespace OHOS { namespace AAFwk { using namespace std::chrono; const bool CONCURRENCY_MODE_FALSE = false; -const int32_t BASE_USER_RANGE = 200000; const int32_t MAIN_USER_ID = 100; const int32_t U0_USER_ID = 0; constexpr int32_t INVALID_USER_ID = -1; @@ -2691,7 +2690,7 @@ int AbilityManagerService::UninstallApp(const std::string &bundleName, int32_t u HILOG_DEBUG("Uninstall app, bundleName: %{public}s", bundleName.c_str()); pid_t callingPid = IPCSkeleton::GetCallingPid(); pid_t pid = getpid(); - if (callingPid != pid) { + if (callingPid != pid) { HILOG_ERROR("%{public}s: Not bundleMgr call.", __func__); return CHECK_PERMISSION_FAILED; } diff --git a/services/abilitymgr/src/inner_mission_info.cpp b/services/abilitymgr/src/inner_mission_info.cpp index f8f596f1a94..528036242c6 100644 --- a/services/abilitymgr/src/inner_mission_info.cpp +++ b/services/abilitymgr/src/inner_mission_info.cpp @@ -100,8 +100,11 @@ bool InnerMissionInfo::FromJsonStr(const std::string &jsonStr) return false; } uid = value[KEY_UID].get(); +<<<<<<< HEAD +======= +>>>>>>> caochunlei1@huawei.com if (!CheckJsonNode(KEY_MISSION_ID, JsonType::NUMBER)) { return false; } diff --git a/services/abilitymgr/src/mission_info_mgr.cpp b/services/abilitymgr/src/mission_info_mgr.cpp index 17627f83e70..aeaa0e3207a 100644 --- a/services/abilitymgr/src/mission_info_mgr.cpp +++ b/services/abilitymgr/src/mission_info_mgr.cpp @@ -29,7 +29,7 @@ MissionInfoMgr::~MissionInfoMgr() HILOG_INFO("MissionInfoMgr instance is destroyed"); } -bool MissionInfoMgr::GenerateMissionId(int32_t &misisonId) +bool MissionInfoMgr::GenerateMissionId(int32_t &missionId) { if (currentMisionId_ == MAX_MISSION_ID) { currentMisionId_ = MIN_MISSION_ID; @@ -37,8 +37,8 @@ bool MissionInfoMgr::GenerateMissionId(int32_t &misisonId) for (int32_t index = currentMisionId_; index < MAX_MISSION_ID; index++) { if (missionIdMap_.find(index) == missionIdMap_.end()) { - misisonId = index; - missionIdMap_[misisonId] = false; + missionId = index; + missionIdMap_[missionId] = false; currentMisionId_ = missionId + 1; return true; } @@ -358,7 +358,7 @@ bool MissionInfoMgr::LoadAllMissionInfo() void MissionInfoMgr::HandleUnInstallApp(const std::string &bundleName, int32_t uid, std::list &missions) { - HILOG_INFO("HandleUnInstallApp, bundleName:%{public}s, uid:%{public}d", bundleName.c_str(), missionId); + HILOG_INFO("HandleUnInstallApp, bundleName:%{public}s, uid:%{public}d", bundleName.c_str(), uid); GetMatchedMission(bundleName, uid, missions); if (missions.empty()) { return; diff --git a/services/abilitymgr/src/mission_list.cpp b/services/abilitymgr/src/mission_list.cpp index 68c82b26a41..cf0b32ad728 100644 --- a/services/abilitymgr/src/mission_list.cpp +++ b/services/abilitymgr/src/mission_list.cpp @@ -255,7 +255,7 @@ std::string MissionList::GetTypeName() void MissionList::HandleUnInstallApp(const std::string &bundleName, int32_t uid) { - for (auto it = missions_.begain(); it != missions_.end();) { + for (auto it = missions_.begin(); it != missions_.end();) { auto mission = *it; if (MatchedInitialMission(mission, bundleName, uid)) { missions_.erase(it++); diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index f58dfe697c5..534c7fac38d 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -1771,9 +1771,10 @@ void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptrIsUninstallAbility()) { + if (!ability->IsUninstallAbility()) { InnerMissionInfo info; - if (DelayedSingleton::GetInstance()->GetInnerMissionInfoById(mission->GetMissionId(), info) == 0) { + if (DelayedSingleton::GetInstance()->GetInnerMissionInfoById( + mission->GetMissionId(), info) == 0) { info.missionInfo.runningState = -1; DelayedSingleton::GetInstance()->UpdateMissionInfo(info); } @@ -2317,7 +2318,7 @@ void MissionListManager::AddUninstallTags(const std::string &bundleName, int32_t } } defaultSingleList_->HandleUnInstallApp(bundleName, uid); - defaultStandardList->HandleUnInstallApp(bundleName, uid); + defaultStandardList_->HandleUnInstallApp(bundleName, uid); std::list matchedMissions; DelayedSingleton::GetInstance()->HandleUnInstallApp(bundleName, uid, matchedMissions); if (listenerController_) { -- Gitee From bcb7cedb91530379eaf8a53e4107e9b871ad7658 Mon Sep 17 00:00:00 2001 From: caochunlei Date: Mon, 7 Mar 2022 09:25:49 +0800 Subject: [PATCH 5/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- .../test/mock/AMS/mock_serviceability_manager_service.h | 2 +- tools/test/mock/mock_ability_manager_stub.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h b/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h index a5ad2966ef4..96a117d8f56 100644 --- a/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h +++ b/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h @@ -95,7 +95,7 @@ public: MOCK_METHOD1(GetAllStackInfo, int(StackInfo &stackInfo)); MOCK_METHOD1(MoveMissionToTop, int(int32_t missionId)); MOCK_METHOD1(KillProcess, int(const std::string &bundleName)); - MOCK_METHOD1(UninstallApp, int(const std::string &bundleName)); + MOCK_METHOD2(UninstallApp, int(const std::string &bundleName, int32_t uid)); MOCK_METHOD2( GetWantSender, sptr(const WantSenderInfo &wantSenderInfo, const sptr &callerToken)); MOCK_METHOD2(SendWantSender, int(const sptr &target, const SenderInfo &senderInfo)); diff --git a/tools/test/mock/mock_ability_manager_stub.h b/tools/test/mock/mock_ability_manager_stub.h index 6e99eac731d..045f75333cf 100644 --- a/tools/test/mock/mock_ability_manager_stub.h +++ b/tools/test/mock/mock_ability_manager_stub.h @@ -85,7 +85,7 @@ public: MOCK_METHOD1(RemoveMission, int(int id)); MOCK_METHOD1(RemoveStack, int(int id)); MOCK_METHOD1(KillProcess, int(const std::string &bundleName)); - MOCK_METHOD1(UninstallApp, int(const std::string &bundleName)); + MOCK_METHOD2(UninstallApp, int(const std::string &bundleName, int32_t uid)); MOCK_METHOD2(MoveMissionToEnd, int(const sptr &token, const bool nonFirst)); MOCK_METHOD1(IsFirstInMission, bool(const sptr &token)); -- Gitee From dc467d40c11537f848cb2a11893e8bc305e1837e Mon Sep 17 00:00:00 2001 From: caochunlei Date: Mon, 7 Mar 2022 11:16:25 +0800 Subject: [PATCH 6/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- services/abilitymgr/src/inner_mission_info.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/services/abilitymgr/src/inner_mission_info.cpp b/services/abilitymgr/src/inner_mission_info.cpp index 528036242c6..9902f6d3c4f 100644 --- a/services/abilitymgr/src/inner_mission_info.cpp +++ b/services/abilitymgr/src/inner_mission_info.cpp @@ -100,11 +100,6 @@ bool InnerMissionInfo::FromJsonStr(const std::string &jsonStr) return false; } uid = value[KEY_UID].get(); -<<<<<<< HEAD - - -======= ->>>>>>> caochunlei1@huawei.com if (!CheckJsonNode(KEY_MISSION_ID, JsonType::NUMBER)) { return false; } -- Gitee From 560748b2515856c3d8abbae07e2b1f701b4cd7f7 Mon Sep 17 00:00:00 2001 From: caochunlei Date: Mon, 7 Mar 2022 14:23:30 +0800 Subject: [PATCH 7/7] caochunlei1@huawei.com Signed-off-by: caochunlei --- .../ability_manager_stub_mock_test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h b/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h index 2d4167321ee..15f7db62acf 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h @@ -212,7 +212,7 @@ public: return 0; } - virtual int UninstallApp(const std::string &bundleName) + virtual int UninstallApp(const std::string &bundleName, int32_t uid) { return 0; } -- Gitee