From 695d4e6f9891d66016d85a3f9e08781fedd590a8 Mon Sep 17 00:00:00 2001 From: Luobniz21 Date: Tue, 24 Jun 2025 11:32:14 +0800 Subject: [PATCH] xon_new_process Signed-off-by: Luobniz21 Change-Id: I0ef50d0a793bd6de1781f774b42ccf25ff7e7c7b --- .../ui_ability_lifecycle_manager.cpp | 3 +- services/appmgr/src/app_mgr_service_inner.cpp | 2 +- services/common/include/app_utils.h | 10 +++++ services/common/src/app_utils.cpp | 41 +++++++++++++++++++ .../app_utils_test/app_utils_test.cpp | 30 ++++++++++++++ .../mock/include/app_utils.h | 2 + .../mock/src/app_utils.cpp | 5 +++ .../mock/include/app_utils.h | 2 + .../mock/src/app_utils.cpp | 5 +++ 9 files changed, 98 insertions(+), 2 deletions(-) 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 ff330f7903c..43c1db2d30a 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -2266,7 +2266,8 @@ int32_t UIAbilityLifecycleManager::StartSpecifiedProcessRequest(const AbilityReq auto isCreating = abilityRequest.want.GetBoolParam(Want::CREATE_APP_INSTANCE_KEY, false); const auto &abilityInfo = abilityRequest.abilityInfo; auto sceneSessionManager = Rosen::SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy(); - if (abilityInfo.applicationInfo.multiAppMode.multiAppModeType == AppExecFwk::MultiAppModeType::MULTI_INSTANCE && + if (AppUtils::GetInstance().InOnNewProcessEnableList(abilityRequest.abilityInfo.bundleName) && + abilityInfo.applicationInfo.multiAppMode.multiAppModeType == AppExecFwk::MultiAppModeType::MULTI_INSTANCE && isCreating && sceneSessionManager != nullptr) { std::string instanceKey; Rosen::WMError ret = sceneSessionManager->CreateNewInstanceKey(abilityRequest.want.GetBundle(), instanceKey); diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index d096db2f29a..060a538ee82 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -501,7 +501,7 @@ void AppMgrServiceInner::StartSpecifiedProcess(const AAFwk::Want &want, const Ap std::shared_ptr appRecord = nullptr; TAG_LOGI(AAFwkTag::APPMGR, "main process do not exists."); if (abilityInfo.type == AppExecFwk::AbilityType::PAGE) { - appRecord = + appRecord = !AAFwk::AppUtils::GetInstance().InOnNewProcessEnableList(bundleInfo.name) ? nullptr : appRunningManager_->CheckAppRunningRecordForSpecifiedProcess(appInfo->uid, instanceKey, customProcessFlag); } else { appRecord = diff --git a/services/common/include/app_utils.h b/services/common/include/app_utils.h index d89cfbafc69..e488a9148ac 100644 --- a/services/common/include/app_utils.h +++ b/services/common/include/app_utils.h @@ -340,6 +340,8 @@ public: const std::vector &GetResidentWhiteList(); + bool InOnNewProcessEnableList(const std::string &bundleName); + private: /** * LoadResidentProcessInExtremeMemory, load resident process in extreme low memory. @@ -389,6 +391,12 @@ private: */ void LoadResidentWhiteList(); + /** + * LoadOnNewProcessEnableList, load on new process enable list. + * + */ + void LoadOnNewProcessEnableList(); + /** * AppUtils, private constructor. * @@ -441,6 +449,8 @@ private: cacheAbilityList_ = {false, {}}; DeviceConfiguration> residentWhiteList_ = {false, {}}; std::mutex residentWhiteListMutex_; + DeviceConfiguration> onNewProcessEnableList_ = {false, {}}; + std::mutex onNewProcessEnableListMutex_; DISALLOW_COPY_AND_MOVE(AppUtils); }; } // namespace AAFwk diff --git a/services/common/src/app_utils.cpp b/services/common/src/app_utils.cpp index 144dc9cd005..3028dd4af2a 100644 --- a/services/common/src/app_utils.cpp +++ b/services/common/src/app_utils.cpp @@ -90,6 +90,8 @@ constexpr const char* CACHE_ABILITY_LIST_PATH = "etc/ability/abilityms_cache_abi constexpr const char* CACHE_PROCESS_NAME = "cache_list"; constexpr const char* RESIDENT_WHITE_LIST_PATH = "etc/ability_runtime/resident_process.json"; constexpr const char* NORMAL_RESIDENT_APPS = "normal_resident_apps"; +constexpr const char* ON_NEW_PROCESS_ENABLE_LIST_PATH = "etc/ability_runtime/on_new_process_enable_list.json"; +constexpr const char* ON_NEW_PROCESS_ENABLE_LIST = "onNewProcessEnableList"; } AppUtils::~AppUtils() {} @@ -838,6 +840,45 @@ bool AppUtils::InResidentWhiteList(const std::string &bundleName) return false; } +void AppUtils::LoadOnNewProcessEnableList() +{ + cJSON *object = nullptr; + if (!JsonUtils::GetInstance().LoadConfiguration(ON_NEW_PROCESS_ENABLE_LIST_PATH, object)) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "load onNewProcessEnableList file failed"); + return; + } + cJSON *onNewProcessEnableListItem = cJSON_GetObjectItem(object, ON_NEW_PROCESS_ENABLE_LIST); + if (onNewProcessEnableListItem == nullptr || !cJSON_IsArray(onNewProcessEnableListItem)) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "onNewProcessEnableList file invalid"); + return; + } + int size = cJSON_GetArraySize(onNewProcessEnableListItem); + for (int i = 0; i < size; i++) { + cJSON *jsonObject = cJSON_GetArrayItem(onNewProcessEnableListItem, i); + if (jsonObject == nullptr || !cJSON_IsString(jsonObject)) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "load onNewProcessEnableList bundleName failed"); + return; + } + std::string jsonStr = jsonObject->valuestring; + onNewProcessEnableList_.value.emplace_back(jsonStr); + } +} + +bool AppUtils::InOnNewProcessEnableList(const std::string &bundleName) +{ + std::lock_guard lock(onNewProcessEnableListMutex_); + if (!onNewProcessEnableList_.isLoaded) { + LoadOnNewProcessEnableList(); + onNewProcessEnableList_.isLoaded = true; + } + for (const auto &item: onNewProcessEnableList_.value) { + if (bundleName == item) { + return true; + } + } + return false; +} + bool AppUtils::IsSupportAppServiceExtension() { if (!isSupportAppServiceExtension_.isLoaded) { diff --git a/test/unittest/app_utils_test/app_utils_test.cpp b/test/unittest/app_utils_test/app_utils_test.cpp index 07cde8bd39b..9d9e5a0f2c1 100644 --- a/test/unittest/app_utils_test/app_utils_test.cpp +++ b/test/unittest/app_utils_test/app_utils_test.cpp @@ -932,5 +932,35 @@ HWTEST_F(AppUtilsTest, AppUtilsTest_4100, TestSize.Level2) auto isSupportNativeChildProcess = appUtils.IsSupportNativeChildProcess(); EXPECT_TRUE(isSupportNativeChildProcess); } + +/** + * @tc.number: InOnNewProcessEnableList_0100 + * @tc.desc: Test InOnNewProcessEnableList works + * @tc.type: FUNC + */ +HWTEST_F(AppUtilsTest, InOnNewProcessEnableList_0100, TestSize.Level2) +{ + TAG_LOGI(AAFwkTag::TEST, "InOnNewProcessEnableList_0100 called."); + std::string bundleName = "cn.wps.office.hap"; + auto &appUtils = AAFwk::AppUtils::GetInstance(); + bool result = appUtils.InOnNewProcessEnableList(bundleName); + EXPECT_FALSE(result); +} + +/** + * @tc.number: InOnNewProcessEnableList_0200 + * @tc.desc: Test InOnNewProcessEnableList works + * @tc.type: FUNC + */ +HWTEST_F(AppUtilsTest, InOnNewProcessEnableList_0200, TestSize.Level2) +{ + TAG_LOGI(AAFwkTag::TEST, "InOnNewProcessEnableList_0200 called."); + std::string bundleName = "cn.wps.office.hap"; + auto &appUtils = AAFwk::AppUtils::GetInstance(); + appUtils.onNewProcessEnableList_.isLoaded = true; + appUtils.onNewProcessEnableList_.value.emplace_back("cn.wps.office.hap"); + bool result = appUtils.InOnNewProcessEnableList(bundleName); + EXPECT_TRUE(result); +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/test/unittest/ui_ability_lifecycle_manager_second_test/mock/include/app_utils.h b/test/unittest/ui_ability_lifecycle_manager_second_test/mock/include/app_utils.h index 98846872ac4..25b2e9ae244 100644 --- a/test/unittest/ui_ability_lifecycle_manager_second_test/mock/include/app_utils.h +++ b/test/unittest/ui_ability_lifecycle_manager_second_test/mock/include/app_utils.h @@ -17,6 +17,7 @@ #define OHOS_ABILITY_RUNTIME_APP_UTILS_H #include "nocopyable.h" +#include namespace OHOS { namespace AAFwk { @@ -29,6 +30,7 @@ public: bool IsStartOptionsWithAnimation(); bool IsStartSpecifiedProcess(); bool IsStartOptionsWithProcessOptions(); + bool InOnNewProcessEnableList(const std::string &bundleName); private: AppUtils(); diff --git a/test/unittest/ui_ability_lifecycle_manager_second_test/mock/src/app_utils.cpp b/test/unittest/ui_ability_lifecycle_manager_second_test/mock/src/app_utils.cpp index 8be13999b17..32a9458d7d4 100644 --- a/test/unittest/ui_ability_lifecycle_manager_second_test/mock/src/app_utils.cpp +++ b/test/unittest/ui_ability_lifecycle_manager_second_test/mock/src/app_utils.cpp @@ -48,5 +48,10 @@ bool AppUtils::IsStartOptionsWithAnimation() TAG_LOGD(AAFwkTag::DEFAULT, "called %{public}d", AppUtils::isStartOptionsWithAnimation_); return AppUtils::isStartOptionsWithAnimation_; } + +bool InOnNewProcessEnableList(const std::string &bundleName) +{ + return false; +} } // namespace AAFwk } // namespace OHOS diff --git a/test/unittest/ui_ability_lifecycle_manager_third_test/mock/include/app_utils.h b/test/unittest/ui_ability_lifecycle_manager_third_test/mock/include/app_utils.h index 98846872ac4..25b2e9ae244 100644 --- a/test/unittest/ui_ability_lifecycle_manager_third_test/mock/include/app_utils.h +++ b/test/unittest/ui_ability_lifecycle_manager_third_test/mock/include/app_utils.h @@ -17,6 +17,7 @@ #define OHOS_ABILITY_RUNTIME_APP_UTILS_H #include "nocopyable.h" +#include namespace OHOS { namespace AAFwk { @@ -29,6 +30,7 @@ public: bool IsStartOptionsWithAnimation(); bool IsStartSpecifiedProcess(); bool IsStartOptionsWithProcessOptions(); + bool InOnNewProcessEnableList(const std::string &bundleName); private: AppUtils(); diff --git a/test/unittest/ui_ability_lifecycle_manager_third_test/mock/src/app_utils.cpp b/test/unittest/ui_ability_lifecycle_manager_third_test/mock/src/app_utils.cpp index 8be13999b17..32a9458d7d4 100644 --- a/test/unittest/ui_ability_lifecycle_manager_third_test/mock/src/app_utils.cpp +++ b/test/unittest/ui_ability_lifecycle_manager_third_test/mock/src/app_utils.cpp @@ -48,5 +48,10 @@ bool AppUtils::IsStartOptionsWithAnimation() TAG_LOGD(AAFwkTag::DEFAULT, "called %{public}d", AppUtils::isStartOptionsWithAnimation_); return AppUtils::isStartOptionsWithAnimation_; } + +bool InOnNewProcessEnableList(const std::string &bundleName) +{ + return false; +} } // namespace AAFwk } // namespace OHOS -- Gitee