diff --git a/frameworks/include/background_task_manager.h b/frameworks/include/background_task_manager.h index 9981b03e7a43aad4bf98017324131ad2e243b49f..42739cc64bd3b5156c05d646b98fdd0984c41493 100644 --- a/frameworks/include/background_task_manager.h +++ b/frameworks/include/background_task_manager.h @@ -274,6 +274,13 @@ public: */ ErrCode IsModeSupported(ContinuousTaskParam &taskParam); + /** + * @brief Set supported taskKeeping processes. + * @param processSet process set. + * @return Returns ERR_OK if success, else failure. + */ + ErrCode SetSupportedTaskKeepingProcesses(const std::set &processSet); + private: bool GetBackgroundTaskManagerProxy(); diff --git a/frameworks/src/background_task_manager.cpp b/frameworks/src/background_task_manager.cpp index 366f037f3f815009f240ded3ac61ed89bafec4e0..27022fbdccc926c7bfba1caed2d95e108b5b7dc1 100644 --- a/frameworks/src/background_task_manager.cpp +++ b/frameworks/src/background_task_manager.cpp @@ -480,6 +480,14 @@ ErrCode BackgroundTaskManager::IsModeSupported(ContinuousTaskParam &taskParam) return proxy_->IsModeSupported(taskParam); } +ErrCode BackgroundTaskManager::SetSupportedTaskKeepingProcesses(const std::set &processSet) +{ + std::lock_guard lock(mutex_); + GET_BACK_GROUND_TASK_MANAGER_PROXY_RETURN + + return proxy_->SetSupportedTaskKeepingProcesses(processSet); +} + BackgroundTaskManager::BgTaskMgrDeathRecipient::BgTaskMgrDeathRecipient(BackgroundTaskManager &backgroundTaskManager) : backgroundTaskManager_(backgroundTaskManager) {} diff --git a/interfaces/innerkits/IBackgroundTaskMgr.idl b/interfaces/innerkits/IBackgroundTaskMgr.idl index 81f848f9b84efebbaa42f9f7d54b44e2931d16b0..b0c4015aa387ebb7f5a5223b0f98317d77c227b6 100644 --- a/interfaces/innerkits/IBackgroundTaskMgr.idl +++ b/interfaces/innerkits/IBackgroundTaskMgr.idl @@ -55,4 +55,5 @@ interface OHOS.BackgroundTaskMgr.IBackgroundTaskMgr { void SetBgTaskConfig([in] String configData, [in] int sourceType); [oneway] void SuspendContinuousAudioTask([in] int uid); void IsModeSupported([in] ContinuousTaskParam taskParam); + void SetSupportedTaskKeepingProcesses([in] Set processSet); } diff --git a/interfaces/innerkits/include/background_task_mgr_helper.h b/interfaces/innerkits/include/background_task_mgr_helper.h index ea440597de4980fdb8be6aa95d9bab9c19bbc1aa..0c4a7ccd22aebd70a2081bce6e78d7c11218e9d8 100644 --- a/interfaces/innerkits/include/background_task_mgr_helper.h +++ b/interfaces/innerkits/include/background_task_mgr_helper.h @@ -217,6 +217,13 @@ public: * @return Returns ERR_OK if success, else failure. */ static ErrCode IsModeSupported(ContinuousTaskParam &taskParam); + + /** + * @brief Set supported taskKeeping processes. + * @param processSet process set. + * @return Returns ERR_OK if success, else failure. + */ + static ErrCode SetSupportedTaskKeepingProcesses(const std::set &processSet); }; } // namespace BackgroundTaskMgr } // namespace OHOS diff --git a/interfaces/innerkits/src/background_task_mgr_helper.cpp b/interfaces/innerkits/src/background_task_mgr_helper.cpp index 3e003f07ab004dff2ceeac313ad0be2d64e6c1c2..2bc74b1c6ab4c26e3bd9c18eb7c0fa5b42273ce4 100644 --- a/interfaces/innerkits/src/background_task_mgr_helper.cpp +++ b/interfaces/innerkits/src/background_task_mgr_helper.cpp @@ -144,5 +144,10 @@ ErrCode BackgroundTaskMgrHelper::IsModeSupported(ContinuousTaskParam &taskParam) { return DelayedSingleton::GetInstance()->IsModeSupported(taskParam); } + +ErrCode BackgroundTaskMgrHelper::SetSupportedTaskKeepingProcesses(const std::set &processSet) +{ + return DelayedSingleton::GetInstance()->SetSupportedTaskKeepingProcesses(processSet); +} } // namespace BackgroundTaskMgr } // namespace OHOS \ No newline at end of file diff --git a/interfaces/test/unittest/bgtask_manager_client_test/bgtask_client_unit_test.cpp b/interfaces/test/unittest/bgtask_manager_client_test/bgtask_client_unit_test.cpp index a8ce8ad327e686794d18ef772fe5fb50754471ed..ee8ccdcbae907ec9f42530919b65a3ac7c039413 100644 --- a/interfaces/test/unittest/bgtask_manager_client_test/bgtask_client_unit_test.cpp +++ b/interfaces/test/unittest/bgtask_manager_client_test/bgtask_client_unit_test.cpp @@ -1021,5 +1021,17 @@ HWTEST_F(BgTaskClientUnitTest, IsModeSupported_001, TestSize.Level1) ContinuousTaskParam taskParam = ContinuousTaskParam(); EXPECT_EQ(BackgroundTaskMgrHelper::IsModeSupported(taskParam), ERR_OK); } + +/** + * @tc.name: SetSupportedTaskKeepingProcesses_001 + * @tc.desc: test SetSupportedTaskKeepingProcesses. + * @tc.type: FUNC + * @tc.require: issueICVQZF + */ +HWTEST_F(BgTaskClientUnitTest, SetSupportedTaskKeepingProcesses_001, TestSize.Level1) +{ + std::set processSet; + EXPECT_EQ(BackgroundTaskMgrHelper::SetSupportedTaskKeepingProcesses(processSet), ERR_OK); +} } } \ No newline at end of file diff --git a/services/common/include/bgtask_config.h b/services/common/include/bgtask_config.h index 780ee84f57c2c8935d00bec0c15fbc5449d116f9..052929b1b994f71be4c3538434bb783cb9ad686b 100644 --- a/services/common/include/bgtask_config.h +++ b/services/common/include/bgtask_config.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -32,6 +32,7 @@ public: bool IsTaskKeepingExemptedQuatoApp(const std::string &bundleName); int32_t GetTransientTaskExemptedQuato(); bool AddExemptedQuatoData(const std::string &configData, int32_t sourceType); + void SetSupportedTaskKeepingProcesses(const std::set &processSet); private: void LoadConfigFile(); diff --git a/services/common/src/bgtask_config.cpp b/services/common/src/bgtask_config.cpp index 2f45999cc0eca8490348e5c07ba2de5ab509187e..bd2330b26699a5efa0e3fdbac975d136cff0668c 100644 --- a/services/common/src/bgtask_config.cpp +++ b/services/common/src/bgtask_config.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -201,5 +201,14 @@ int32_t BgtaskConfig::GetTransientTaskExemptedQuato() std::lock_guard lock(configMutex_); return transientTaskExemptedQuato_; } + +void BgtaskConfig::SetSupportedTaskKeepingProcesses(const std::set &processSet) +{ + std::lock_guard lock(configMutex_); + taskKeepingExemptedQuatoList_.insert(processSet.begin(), processSet.end()); + for (const auto &item : taskKeepingExemptedQuatoList_) { + BGTASK_LOGI("taskKeeping Exemption proc: %{public}s", item.c_str()); + } +} } } \ No newline at end of file diff --git a/services/core/include/background_task_mgr_service.h b/services/core/include/background_task_mgr_service.h index 47ff142eb063dafaca8a35a324dd785c9a8f39a8..894ee959987159dd68976bde56fa3152ce5f3116 100644 --- a/services/core/include/background_task_mgr_service.h +++ b/services/core/include/background_task_mgr_service.h @@ -95,6 +95,7 @@ public: ErrCode SetBgTaskConfig(const std::string &configData, int32_t sourceType) override; ErrCode SuspendContinuousAudioTask(int32_t uid) override; ErrCode IsModeSupported(const ContinuousTaskParam &taskParam) override; + ErrCode SetSupportedTaskKeepingProcesses(const std::set &processSet) override; int32_t Dump(int32_t fd, const std::vector &args) override; void ForceCancelSuspendDelay(int32_t requestId); diff --git a/services/core/src/background_task_mgr_service.cpp b/services/core/src/background_task_mgr_service.cpp index 2fef74843d4649ed13e21c2dde9cfc47fd5a274b..b8f560027943cffb7217f194f9e712e2d89bdff4 100644 --- a/services/core/src/background_task_mgr_service.cpp +++ b/services/core/src/background_task_mgr_service.cpp @@ -560,6 +560,15 @@ ErrCode BackgroundTaskMgrService::IsModeSupported(const ContinuousTaskParam &tas return BgContinuousTaskMgr::GetInstance()->IsModeSupported(paramPtr); } +ErrCode BackgroundTaskMgrService::SetSupportedTaskKeepingProcesses(const std::set &processSet) +{ + if (!CheckCallingToken() || !CheckCallingProcess()) { + return ERR_BGTASK_PERMISSION_DENIED; + } + DelayedSingleton::GetInstance()->SetSupportedTaskKeepingProcesses(processSet); + return ERR_OK; +} + bool BackgroundTaskMgrService::CheckAtomicService() { uint64_t tokenId = IPCSkeleton::GetCallingFullTokenID(); diff --git a/services/test/unittest/bgtask_manager_unit_test.cpp b/services/test/unittest/bgtask_manager_unit_test.cpp index 798f152fb4720c9d6168f34f6468b79d3a6e3b03..4c2560c2af3641ccf51eb10d9908c7b2e98dcb08 100644 --- a/services/test/unittest/bgtask_manager_unit_test.cpp +++ b/services/test/unittest/bgtask_manager_unit_test.cpp @@ -817,5 +817,19 @@ HWTEST_F(BgTaskManagerUnitTest, BgTaskManagerUnitTest_055, TestSize.Level0) bgTransientTaskMgr_->keyInfoMap_[1] = keyInfo; EXPECT_EQ(bgTransientTaskMgr_->GetAllTransientTasks(remainingQuota, list), ERR_OK); } + +/** + * @tc.name: BgTaskManagerUnitTest_056 + * @tc.desc: test SetSupportedTaskKeepingProcesses. + * @tc.type: FUNC + * @tc.require: issueICVQZF + */ +HWTEST_F(BgTaskManagerUnitTest, BgTaskManagerUnitTest_056, TestSize.Level1) +{ + std::set processSet; + processSet.insert("com.test.app"); + DelayedSingleton::GetInstance()->SetSupportedTaskKeepingProcesses(processSet); + EXPECT_EQ(DelayedSingleton::GetInstance()->taskKeepingExemptedQuatoList_.empty(), false); +} } }