From e4c12dde9653a0fb8a445e67754653d1cd96678a Mon Sep 17 00:00:00 2001 From: Luobniz21 Date: Thu, 26 Jun 2025 14:10:38 +0800 Subject: [PATCH] onnewprocess_test Signed-off-by: Luobniz21 Change-Id: Ied0771816f203cf3af792362cdc10d9f7e797db0 --- .../ui_ability_lifecycle_manager.cpp | 3 +- services/appmgr/include/app_running_manager.h | 2 +- services/appmgr/src/app_mgr_service_inner.cpp | 2 +- services/appmgr/src/app_running_manager.cpp | 5 ++- 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 +++ 11 files changed, 103 insertions(+), 4 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/include/app_running_manager.h b/services/appmgr/include/app_running_manager.h index 4ed1444c118..76d666c561f 100644 --- a/services/appmgr/include/app_running_manager.h +++ b/services/appmgr/include/app_running_manager.h @@ -88,7 +88,7 @@ public: const std::string &customProcessFlag = ""); std::shared_ptr CheckAppRunningRecordForSpecifiedProcess( - int32_t uid, const std::string &instanceKey, const std::string &customProcessFlag); + int32_t uid, const std::string &instanceKey, const std::string &customProcessFlag, BundleInfo &bundleInfo); #ifdef APP_NO_RESPONSE_DIALOG /** diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index b6f41ec950a..ea1a035c234 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -502,7 +502,7 @@ void AppMgrServiceInner::StartSpecifiedProcess(const AAFwk::Want &want, const Ap TAG_LOGI(AAFwkTag::APPMGR, "main process do not exists."); if (abilityInfo.type == AppExecFwk::AbilityType::PAGE) { appRecord = - appRunningManager_->CheckAppRunningRecordForSpecifiedProcess(appInfo->uid, instanceKey, customProcessFlag); + appRunningManager_->CheckAppRunningRecordForSpecifiedProcess(appInfo->uid, instanceKey, customProcessFlag, bundleInfo); } else { appRecord = appRunningManager_->CheckAppRunningRecordForUIExtension(appInfo->uid, instanceKey, customProcessFlag); diff --git a/services/appmgr/src/app_running_manager.cpp b/services/appmgr/src/app_running_manager.cpp index a3a46976865..37a0d82f4cc 100644 --- a/services/appmgr/src/app_running_manager.cpp +++ b/services/appmgr/src/app_running_manager.cpp @@ -187,10 +187,13 @@ std::shared_ptr AppRunningManager::CheckAppRunningRecordIsExis } std::shared_ptr AppRunningManager::CheckAppRunningRecordForSpecifiedProcess( - int32_t uid, const std::string &instanceKey, const std::string &customProcessFlag) + int32_t uid, const std::string &instanceKey, const std::string &customProcessFlag, BundleInfo &bundleInfo) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGD(AAFwkTag::APPMGR, "uid: %{public}d: customProcessFlag: %{public}s", uid, customProcessFlag.c_str()); + if (!AAFwk::AppUtils::GetInstance().InOnNewProcessEnableList(bundleInfo.name)) { + return nullptr; + } auto appRunningMap = GetAppRunningRecordMap(); for (const auto &item : appRunningMap) { const auto &appRecord = item.second; 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