From 9a21bf1a0784981b2b85aee292cd3ee98f10c1ff Mon Sep 17 00:00:00 2001 From: sty28558 Date: Sat, 23 Aug 2025 16:58:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E6=89=BE=E4=B8=BB=E6=8E=A7=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=E6=97=B6=E5=A2=9E=E5=8A=A0=E8=BF=9B=E7=A8=8B=E6=9C=89?= =?UTF-8?q?=E6=95=88=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sty28558 Change-Id: Id998d76b7bfec2d87422f5753ece3ad8db4fec6e --- services/appmgr/include/app_running_manager.h | 2 + services/appmgr/src/app_running_manager.cpp | 37 +++++++++++-------- .../app_running_manager_fourth_test.cpp | 25 +++++++++++++ 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/services/appmgr/include/app_running_manager.h b/services/appmgr/include/app_running_manager.h index 90934c52e86..3362fa077d7 100644 --- a/services/appmgr/include/app_running_manager.h +++ b/services/appmgr/include/app_running_manager.h @@ -102,6 +102,8 @@ public: bool CheckAppRunningRecordIsExist(const std::string &bundleName, const std::string &abilityName); #endif + bool IsAppRunningRecordValid(const std::shared_ptr &appRecord); + /** * CheckMasterProcessAppRunningRecordIsExist, Get master process record by application name and ability information. * diff --git a/services/appmgr/src/app_running_manager.cpp b/services/appmgr/src/app_running_manager.cpp index 707f4b13fa5..5c0c26a9af8 100644 --- a/services/appmgr/src/app_running_manager.cpp +++ b/services/appmgr/src/app_running_manager.cpp @@ -255,6 +255,18 @@ bool AppRunningManager::IsSameAbilityType(const std::shared_ptr &appRecord) +{ + if (appRecord && !(appRecord->IsTerminating()) && + !(appRecord->IsKilling()) && !(appRecord->GetRestartAppFlag()) && + !(appRecord->IsUserRequestCleaning()) && + !(appRecord->IsCaching() && appRecord->GetProcessCacheBlocked()) && + !(appRecord->IsKillPrecedeStart())) { + return true; + } + return false; +} + std::shared_ptr AppRunningManager::FindMasterProcessAppRunningRecord( const std::string &appName, const AppExecFwk::AbilityInfo &abilityInfo, const int uid) { @@ -265,6 +277,7 @@ std::shared_ptr AppRunningManager::FindMasterProcessAppRunning int64_t minAppRecordId = INT32_MAX; std::shared_ptr maxAppRecord; std::shared_ptr minAppRecord; + std::shared_ptr resMasterRecord; bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE); bool isUIExtension = (abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::SYS_COMMON_UI); for (const auto &item : appRunningMap) { @@ -272,35 +285,29 @@ std::shared_ptr AppRunningManager::FindMasterProcessAppRunning if (!(appRecord && appRecord->GetUid() == uid)) { continue; } - if (appRecord->GetIsMasterProcess() && IsSameAbilityType(appRecord, abilityInfo)) { - return appRecord; + resMasterRecord = appRecord; + break; } - if (appRecord->GetTimeStamp() != 0 && maxTimeStamp < appRecord->GetTimeStamp() && IsSameAbilityType(appRecord, abilityInfo)) { maxTimeStamp = appRecord->GetTimeStamp(); maxAppRecord = appRecord; } - if ((appRecord->GetExtensionType() == AppExecFwk::ExtensionAbilityType::SYS_COMMON_UI && isUIExtension) && appRecord->GetRecordId() < minAppRecordId) { minAppRecordId = appRecord->GetRecordId(); minAppRecord = appRecord; } } - - if (maxAppRecord != nullptr) { - maxAppRecord->SetMasterProcess(true); - maxAppRecord->SetTimeStamp(0); - return maxAppRecord; + resMasterRecord = (resMasterRecord == nullptr && maxAppRecord != nullptr) ? maxAppRecord : resMasterRecord; + resMasterRecord = (resMasterRecord == nullptr) ? minAppRecord : resMasterRecord; + if (IsAppRunningRecordValid(resMasterRecord)) { + resMasterRecord->SetMasterProcess(true); + resMasterRecord->SetTimeStamp(0); + DelayedSingleton::GetInstance()->ReuseCachedProcess(resMasterRecord); + return resMasterRecord; } - - if (minAppRecord != nullptr) { - minAppRecord->SetMasterProcess(true); - return minAppRecord; - } - return nullptr; } diff --git a/test/unittest/app_running_manager_fourth_test/app_running_manager_fourth_test.cpp b/test/unittest/app_running_manager_fourth_test/app_running_manager_fourth_test.cpp index 3e759a0ca74..01d7efc678e 100644 --- a/test/unittest/app_running_manager_fourth_test/app_running_manager_fourth_test.cpp +++ b/test/unittest/app_running_manager_fourth_test/app_running_manager_fourth_test.cpp @@ -1428,6 +1428,31 @@ HWTEST_F(AppRunningManagerFourthTest, AppRunningManager_FindMasterProcessAppRunn EXPECT_EQ(ret, nullptr); } +/** + * @tc.name: AppRunningManager_IsAppRunningRecordValid_0100 + * @tc.desc: NA + * @tc.type: FUNC + */ +HWTEST_F(AppRunningManagerFourthTest, AppRunningManager_IsAppRunningRecordValid_0100, TestSize.Level1) +{ + BundleInfo bundleInfo; + std::shared_ptr recordOne = + appRunningManager_->CreateAppRunningRecord(appInfo_, PROCESS_NAME, bundleInfo, ""); + ASSERT_NE(recordOne, nullptr); + auto ret = appRunningManager_->IsAppRunningRecordValid(recordOne); + EXPECT_EQ(ret, true); +} + +/** + * @tc.name: AppRunningManager_IsAppRunningRecordValid_0200 + * @tc.desc: NA + * @tc.type: FUNC + */ +HWTEST_F(AppRunningManagerFourthTest, AppRunningManager_IsAppRunningRecordValid_0200, TestSize.Level1) +{ + auto ret = appRunningManager_->IsAppRunningRecordValid(nullptr); + EXPECT_EQ(ret, false); +} /** * @tc.name: CheckAppRunningRecordForSpecifiedProcess_0100 -- Gitee