• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "background_task_mgr_service.h"
17 #include "background_mode.h"
18 #include "bgtask_config.h"
19 #include "bgtask_hitrace_chain.h"
20 #include "bundle_manager_helper.h"
21 #include <functional>
22 #include "ability_manager_client.h"
23 #include "accesstoken_kit.h"
24 #include "bgtaskmgr_inner_errors.h"
25 #include "bundle_constants.h"
26 #include "common_event_manager.h"
27 #include "common_event_support.h"
28 #include "file_ex.h"
29 #include "ipc_skeleton.h"
30 #include "string_ex.h"
31 
32 #include "bgtaskmgr_log_wrapper.h"
33 #include <parameters.h>
34 
35 namespace OHOS {
36 namespace BackgroundTaskMgr {
37 namespace {
38 static constexpr int32_t NO_DUMP_PARAM_NUMS = 0;
39 static constexpr int32_t RESOURCE_SCHEDULE_SERVICE_UID = 1096;
40 static constexpr char BGMODE_PERMISSION[] = "ohos.permission.KEEP_BACKGROUND_RUNNING";
41 const int32_t ENG_MODE = OHOS::system::GetIntParameter("const.debuggable", 0);
42 const std::string BGTASK_SERVICE_NAME = "BgtaskMgrService";
43 const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(
44     DelayedSingleton<BackgroundTaskMgrService>::GetInstance().get());
45 }
46 
BackgroundTaskMgrService()47 BackgroundTaskMgrService::BackgroundTaskMgrService()
48     : SystemAbility(BACKGROUND_TASK_MANAGER_SERVICE_ID, true) {}
49 
~BackgroundTaskMgrService()50 BackgroundTaskMgrService::~BackgroundTaskMgrService() {}
51 
OnStart()52 void BackgroundTaskMgrService::OnStart()
53 {
54     BgTaskHiTraceChain traceChain(__func__);
55     BGTASK_LOGI("BackgroundTaskMgrService service onStart.");
56     if (state_ == ServiceRunningState::STATE_RUNNING) {
57         BGTASK_LOGW("Service has already started.");
58         return;
59     }
60     Init();
61     AddSystemAbilityListener(APP_MGR_SERVICE_ID);
62     AddSystemAbilityListener(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
63     AddSystemAbilityListener(SA_ID_VOIP_CALL_MANAGER);
64     AddSystemAbilityListener(SA_ID_HEALTH_SPORT);
65     AddSystemAbilityListener(SUSPEND_MANAGER_SYSTEM_ABILITY_ID);
66 }
67 
SetReady(uint32_t flag)68 void BackgroundTaskMgrService::SetReady(uint32_t flag)
69 {
70     BgTaskHiTraceChain traceChain(__func__);
71     BGTASK_LOGI("BackgroundTaskMgrService service SetReady.");
72     {
73         std::lock_guard<std::mutex> lock(readyMutex_);
74         if (dependsReady_ == ServiceReadyState::ALL_READY) {
75             return;
76         }
77         dependsReady_ |= flag;
78         if (dependsReady_ != ServiceReadyState::ALL_READY) {
79             return;
80         }
81     }
82     DelayedSingleton<BgtaskConfig>::GetInstance()->Init();
83     BGTASK_LOGI("BackgroundTaskMgrService service Publish.");
84     if (!Publish(DelayedSingleton<BackgroundTaskMgrService>::GetInstance().get())) {
85         BGTASK_LOGE("Service start failed!");
86         return;
87     }
88     state_ = ServiceRunningState::STATE_RUNNING;
89     BGTASK_LOGI("background task manager service start succeed!");
90 }
91 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)92 void BackgroundTaskMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
93 {
94     BgTaskHiTraceChain traceChain(__func__);
95     DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->OnAddSystemAbility(systemAbilityId, deviceId);
96 }
97 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)98 void BackgroundTaskMgrService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
99 {
100     BgTaskHiTraceChain traceChain(__func__);
101     DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->OnRemoveSystemAbility(systemAbilityId, deviceId);
102     BgContinuousTaskMgr::GetInstance()->OnRemoveSystemAbility(systemAbilityId, deviceId);
103     DelayedSingleton<BgTransientTaskMgr>::GetInstance()->OnRemoveSystemAbility(systemAbilityId, deviceId);
104 }
105 
Init()106 void BackgroundTaskMgrService::Init()
107 {
108     BgTaskHiTraceChain traceChain(__func__);
109     runner_ = AppExecFwk::EventRunner::Create(BGTASK_SERVICE_NAME);
110     DelayedSingleton<BgTransientTaskMgr>::GetInstance()->Init(runner_);
111     DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->Init(runner_);
112     BgContinuousTaskMgr::GetInstance()->Init(runner_);
113 }
114 
OnStop()115 void BackgroundTaskMgrService::OnStop()
116 {
117     BgTaskHiTraceChain traceChain(__func__);
118     BgContinuousTaskMgr::GetInstance()->Clear();
119     DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->Clear();
120     state_ = ServiceRunningState::STATE_NOT_START;
121     BGTASK_LOGI("background task manager stop");
122 }
123 
CheckCallingToken()124 bool BackgroundTaskMgrService::CheckCallingToken()
125 {
126     Security::AccessToken::AccessTokenID tokenId = IPCSkeleton::GetCallingTokenID();
127     auto tokenFlag = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
128     if (tokenFlag == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE ||
129         tokenFlag == Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL) {
130         return true;
131     }
132     return false;
133 }
134 
CheckHapCalling(bool & isHap)135 bool BackgroundTaskMgrService::CheckHapCalling(bool &isHap)
136 {
137     Security::AccessToken::AccessTokenID tokenId = IPCSkeleton::GetCallingTokenID();
138     auto tokenFlag = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
139     if (tokenFlag == Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) {
140         isHap = true;
141         return BundleManagerHelper::GetInstance()->CheckPermission(BGMODE_PERMISSION);
142     }
143     return false;
144 }
145 
CheckCallingProcess()146 bool BackgroundTaskMgrService::CheckCallingProcess()
147 {
148     pid_t callingPid = IPCSkeleton::GetCallingPid();
149     pid_t callingUid = IPCSkeleton::GetCallingUid();
150     // only rss is allowed to call
151     if (callingUid != RESOURCE_SCHEDULE_SERVICE_UID) {
152         BGTASK_LOGW("uid %{public}d pid %{public}d not allowed to call", callingUid, callingPid);
153         return false;
154     }
155     return true;
156 }
157 
RequestSuspendDelay(const std::string & reason,const sptr<IExpiredCallback> & callback,DelaySuspendInfo & delayInfo)158 ErrCode BackgroundTaskMgrService::RequestSuspendDelay(const std::string& reason,
159     const sptr<IExpiredCallback>& callback, DelaySuspendInfo &delayInfo)
160 {
161     if (CheckAtomicService()) {
162         pid_t callingPid = IPCSkeleton::GetCallingPid();
163         pid_t callingUid = IPCSkeleton::GetCallingUid();
164         BGTASK_LOGE("uid %{public}d pid %{public}d Check atomisc service fail, apply transienttask not allowed",
165             callingUid, callingPid);
166         return ERR_BGTASK_PERMISSION_DENIED;
167     }
168     std::u16string reasonu16 = Str8ToStr16(reason);
169     std::shared_ptr<DelaySuspendInfo> delayInfoPtr = std::make_shared<DelaySuspendInfo>(delayInfo);
170     ErrCode result = DelayedSingleton<BgTransientTaskMgr>::GetInstance()->RequestSuspendDelay(
171         reasonu16, callback, delayInfoPtr);
172     if (result == ERR_OK) {
173         delayInfo = *delayInfoPtr;
174     }
175     return result;
176 }
177 
CancelSuspendDelay(int32_t requestId)178 ErrCode BackgroundTaskMgrService::CancelSuspendDelay(int32_t requestId)
179 {
180     return DelayedSingleton<BgTransientTaskMgr>::GetInstance()->CancelSuspendDelay(requestId);
181 }
182 
GetRemainingDelayTime(int32_t requestId,int32_t & delayTime)183 ErrCode BackgroundTaskMgrService::GetRemainingDelayTime(int32_t requestId, int32_t &delayTime)
184 {
185     return DelayedSingleton<BgTransientTaskMgr>::GetInstance()->GetRemainingDelayTime(requestId, delayTime);
186 }
187 
GetAllTransientTasks(int32_t & remainingQuota,std::vector<std::shared_ptr<DelaySuspendInfo>> & list)188 ErrCode BackgroundTaskMgrService::GetAllTransientTasks(int32_t &remainingQuota,
189     std::vector<std::shared_ptr<DelaySuspendInfo>> &list)
190 {
191     return DelayedSingleton<BgTransientTaskMgr>::GetInstance()->GetAllTransientTasks(remainingQuota, list);
192 }
193 
ForceCancelSuspendDelay(int32_t requestId)194 void BackgroundTaskMgrService::ForceCancelSuspendDelay(int32_t requestId)
195 {
196     DelayedSingleton<BgTransientTaskMgr>::GetInstance()->ForceCancelSuspendDelay(requestId);
197 }
198 
StartBackgroundRunning(const ContinuousTaskParam & taskParam,int32_t & notificationId,int32_t & continuousTaskId)199 ErrCode BackgroundTaskMgrService::StartBackgroundRunning(const ContinuousTaskParam &taskParam,
200     int32_t& notificationId, int32_t& continuousTaskId)
201 {
202     if (CheckAtomicService()) {
203         for (const auto mode : taskParam.bgModeIds_) {
204             if (mode != BackgroundMode::AUDIO_PLAYBACK && mode != BackgroundMode::MULTI_DEVICE_CONNECTION) {
205                 pid_t callingPid = IPCSkeleton::GetCallingPid();
206                 pid_t callingUid = IPCSkeleton::GetCallingUid();
207                 BGTASK_LOGE("uid %{public}d pid %{public}d Check atomisc service fail,"
208                     " apply continuoustask not allowed", callingUid, callingPid);
209                 return ERR_BGTASK_PERMISSION_DENIED;
210             }
211         }
212     }
213     auto paramPtr = sptr<ContinuousTaskParam>(new ContinuousTaskParam(taskParam));
214     ErrCode result = BgContinuousTaskMgr::GetInstance()->StartBackgroundRunning(paramPtr);
215     if (result == ERR_OK) {
216         notificationId = paramPtr->notificationId_;
217         continuousTaskId = paramPtr->continuousTaskId_;
218     }
219     return result;
220 }
221 
UpdateBackgroundRunning(const ContinuousTaskParam & taskParam,int32_t & notificationId,int32_t & continuousTaskId)222 ErrCode BackgroundTaskMgrService::UpdateBackgroundRunning(const ContinuousTaskParam &taskParam,
223     int32_t& notificationId, int32_t& continuousTaskId)
224 {
225     if (CheckAtomicService()) {
226         for (const auto mode : taskParam.bgModeIds_) {
227             if (mode != BackgroundMode::AUDIO_PLAYBACK && mode != BackgroundMode::MULTI_DEVICE_CONNECTION) {
228                 pid_t callingPid = IPCSkeleton::GetCallingPid();
229                 pid_t callingUid = IPCSkeleton::GetCallingUid();
230                 BGTASK_LOGE("uid %{public}d pid %{public}d Check atomisc service fail,"
231                     " update continuoustask not allowed", callingUid, callingPid);
232                 return ERR_BGTASK_PERMISSION_DENIED;
233             }
234         }
235     }
236     auto paramPtr = sptr<ContinuousTaskParam>(new ContinuousTaskParam(taskParam));
237     ErrCode result = BgContinuousTaskMgr::GetInstance()->UpdateBackgroundRunning(paramPtr);
238     if (result == ERR_OK) {
239         notificationId = paramPtr->notificationId_;
240         continuousTaskId = paramPtr->continuousTaskId_;
241     }
242     return result;
243 }
244 
RequestBackgroundRunningForInner(const ContinuousTaskParamForInner & taskParam)245 ErrCode BackgroundTaskMgrService::RequestBackgroundRunningForInner(const ContinuousTaskParamForInner &taskParam)
246 {
247     BgTaskHiTraceChain traceChain(__func__);
248     auto paramPtr = sptr<ContinuousTaskParamForInner>(new ContinuousTaskParamForInner(taskParam));
249     return BgContinuousTaskMgr::GetInstance()->RequestBackgroundRunningForInner(paramPtr);
250 }
251 
RequestGetContinuousTasksByUidForInner(int32_t uid,std::vector<ContinuousTaskInfo> & list)252 ErrCode BackgroundTaskMgrService::RequestGetContinuousTasksByUidForInner(int32_t uid,
253     std::vector<ContinuousTaskInfo> &list)
254 {
255     BgTaskHiTraceChain traceChain(__func__);
256     pid_t callingUid = IPCSkeleton::GetCallingUid();
257     if (!CheckCallingToken() && uid != callingUid) {
258         BGTASK_LOGW("RequestGetContinuousTasksByUidForInner not allowed");
259         return ERR_BGTASK_PERMISSION_DENIED;
260     }
261     std::vector<std::shared_ptr<ContinuousTaskInfo>> tasksList;
262     ErrCode result = BgContinuousTaskMgr::GetInstance()->RequestGetContinuousTasksByUidForInner(uid, tasksList);
263     if (result == ERR_OK) {
264         for (const auto& ptr : tasksList) {
265             if (ptr != nullptr) {
266                 list.push_back(*ptr);
267             }
268         }
269     }
270     return result;
271 }
272 
StopBackgroundRunning(const std::string & abilityName,const sptr<IRemoteObject> & abilityToken,int32_t abilityId)273 ErrCode BackgroundTaskMgrService::StopBackgroundRunning(const std::string &abilityName,
274     const sptr<IRemoteObject> &abilityToken, int32_t abilityId)
275 {
276     return BgContinuousTaskMgr::GetInstance()->StopBackgroundRunning(abilityName, abilityId);
277 }
278 
GetAllContinuousTasks(std::vector<ContinuousTaskInfo> & list)279 ErrCode BackgroundTaskMgrService::GetAllContinuousTasks(std::vector<ContinuousTaskInfo> &list)
280 {
281     std::vector<std::shared_ptr<ContinuousTaskInfo>> tasksList;
282     ErrCode result = BgContinuousTaskMgr::GetInstance()->GetAllContinuousTasks(tasksList);
283     if (result == ERR_OK) {
284         for (const auto& ptr : tasksList) {
285             if (ptr != nullptr) {
286                 list.push_back(*ptr);
287             }
288         }
289     }
290     return result;
291 }
292 
GetAllContinuousTasks(std::vector<std::shared_ptr<ContinuousTaskInfo>> & list,bool includeSuspended)293 ErrCode BackgroundTaskMgrService::GetAllContinuousTasks(
294     std::vector<std::shared_ptr<ContinuousTaskInfo>> &list, bool includeSuspended)
295 {
296     return BgContinuousTaskMgr::GetInstance()->GetAllContinuousTasks(list, includeSuspended);
297 }
298 
GetTransientTaskApps(std::vector<TransientTaskAppInfo> & list)299 ErrCode BackgroundTaskMgrService::GetTransientTaskApps(std::vector<TransientTaskAppInfo> &list)
300 {
301     BgTaskHiTraceChain traceChain(__func__);
302     if (!CheckCallingToken()) {
303         BGTASK_LOGW("GetTransientTaskApps not allowed");
304         return ERR_BGTASK_PERMISSION_DENIED;
305     }
306     std::vector<std::shared_ptr<TransientTaskAppInfo>> resultList;
307     ErrCode result = DelayedSingleton<BgTransientTaskMgr>::GetInstance()->GetTransientTaskApps(resultList);
308     if (result == ERR_OK) {
309         for (const auto& ptr : resultList) {
310             if (ptr != nullptr) {
311                 list.push_back(*ptr);
312             }
313         }
314     }
315 
316     return result;
317 }
318 
PauseTransientTaskTimeForInner(int32_t uid)319 ErrCode BackgroundTaskMgrService::PauseTransientTaskTimeForInner(int32_t uid)
320 {
321     BgTaskHiTraceChain traceChain(__func__);
322     return DelayedSingleton<BgTransientTaskMgr>::GetInstance()->PauseTransientTaskTimeForInner(uid);
323 }
324 
StartTransientTaskTimeForInner(int32_t uid)325 ErrCode BackgroundTaskMgrService::StartTransientTaskTimeForInner(int32_t uid)
326 {
327     BgTaskHiTraceChain traceChain(__func__);
328     return DelayedSingleton<BgTransientTaskMgr>::GetInstance()->StartTransientTaskTimeForInner(uid);
329 }
330 
GetContinuousTaskApps(std::vector<ContinuousTaskCallbackInfo> & list)331 ErrCode BackgroundTaskMgrService::GetContinuousTaskApps(std::vector<ContinuousTaskCallbackInfo> &list)
332 {
333     BgTaskHiTraceChain traceChain(__func__);
334     pid_t callingPid = IPCSkeleton::GetCallingPid();
335     pid_t callingUid = IPCSkeleton::GetCallingUid();
336     std::vector<std::shared_ptr<ContinuousTaskCallbackInfo>> resultList;
337     if (!CheckCallingToken()) {
338         BGTASK_LOGW("uid %{public}d pid %{public}d GetContinuousTaskApps not allowed", callingUid, callingPid);
339         ErrCode state = BgContinuousTaskMgr::GetInstance()->GetContinuousTaskApps(resultList, callingUid);
340         if (state != ERR_OK) {
341             return state;
342         }
343         for (const auto& ptr : resultList) {
344             if (ptr != nullptr) {
345                 list.push_back(*ptr);
346             }
347         }
348         return ERR_OK;
349     }
350     ErrCode result = BgContinuousTaskMgr::GetInstance()->GetContinuousTaskApps(resultList);
351     if (result == ERR_OK) {
352         for (const auto& ptr : resultList) {
353             if (ptr != nullptr) {
354                 list.push_back(*ptr);
355             }
356         }
357     }
358 
359     return result;
360 }
361 
SubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber> & subscriber,uint32_t flag)362 ErrCode BackgroundTaskMgrService::SubscribeBackgroundTask(
363     const sptr<IBackgroundTaskSubscriber>& subscriber, uint32_t flag)
364 {
365     BgTaskHiTraceChain traceChain(__func__);
366     bool isHap = false;
367     if (!CheckCallingToken() && !CheckHapCalling(isHap)) {
368         BGTASK_LOGW("SubscribeBackgroundTask not allowed");
369         return ERR_BGTASK_PERMISSION_DENIED;
370     }
371     pid_t callingPid = IPCSkeleton::GetCallingPid();
372     pid_t callingUid = IPCSkeleton::GetCallingUid();
373     BGTASK_LOGI("uid %{public}d pid %{public}d isHap %{public}d flag %{public}d subscribe",
374         callingUid, callingPid, isHap, flag);
375     auto subscriberInfo = std::make_shared<SubscriberInfo>(subscriber, callingUid, callingPid, isHap, flag);
376     if (BgContinuousTaskMgr::GetInstance()->AddSubscriber(subscriberInfo) != ERR_OK) {
377         BGTASK_LOGE("continuous task subscribe background task failed");
378         return ERR_BGTASK_SYS_NOT_READY;
379     }
380     if (!isHap) {
381         if (DelayedSingleton<BgTransientTaskMgr>::GetInstance()->SubscribeBackgroundTask(subscriber) != ERR_OK
382             || DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->AddSubscriber(subscriber) != ERR_OK) {
383             BGTASK_LOGE("transient task or efficiency resource subscribe background task failed");
384             return ERR_BGTASK_SYS_NOT_READY;
385         }
386     }
387     BGTASK_LOGW("subscribe background task success");
388     return ERR_OK;
389 }
390 
UnsubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber> & subscriber)391 ErrCode BackgroundTaskMgrService::UnsubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber>& subscriber)
392 {
393     BgTaskHiTraceChain traceChain(__func__);
394     bool isHap = false;
395     if (!CheckCallingToken() && !CheckHapCalling(isHap)) {
396         BGTASK_LOGW("UnsubscribeBackgroundTask not allowed");
397         return ERR_BGTASK_PERMISSION_DENIED;
398     }
399     if (BgContinuousTaskMgr::GetInstance()->RemoveSubscriber(subscriber) != ERR_OK) {
400         BGTASK_LOGE("continuous task unsubscribe background task failed");
401         return ERR_BGTASK_SYS_NOT_READY;
402     }
403     if (!isHap) {
404         if (DelayedSingleton<BgTransientTaskMgr>::GetInstance()->UnsubscribeBackgroundTask(subscriber) != ERR_OK
405             || DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->RemoveSubscriber(subscriber) != ERR_OK) {
406             BGTASK_LOGE("transient task or efficiency resource unsubscribe background task failed");
407             return ERR_BGTASK_SYS_NOT_READY;
408         }
409     }
410     BGTASK_LOGW("unsubscribe background task success");
411     return ERR_OK;
412 }
413 
HandleRequestExpired(const int32_t requestId)414 void BackgroundTaskMgrService::HandleRequestExpired(const int32_t requestId)
415 {
416     DelayedSingleton<BgTransientTaskMgr>::GetInstance()->HandleRequestExpired(requestId);
417 }
418 
HandleExpiredCallbackDeath(const wptr<IRemoteObject> & remote)419 void BackgroundTaskMgrService::HandleExpiredCallbackDeath(const wptr<IRemoteObject>& remote)
420 {
421     DelayedSingleton<BgTransientTaskMgr>::GetInstance()->HandleExpiredCallbackDeath(remote);
422 }
423 
HandleSubscriberDeath(const wptr<IRemoteObject> & remote)424 void BackgroundTaskMgrService::HandleSubscriberDeath(const wptr<IRemoteObject>& remote)
425 {
426     DelayedSingleton<BgTransientTaskMgr>::GetInstance()->HandleSubscriberDeath(remote);
427 }
428 
ApplyEfficiencyResources(const EfficiencyResourceInfo & resourceInfo)429 ErrCode BackgroundTaskMgrService::ApplyEfficiencyResources(const EfficiencyResourceInfo &resourceInfo)
430 {
431     auto resourcePtr = sptr<EfficiencyResourceInfo>(new EfficiencyResourceInfo(resourceInfo));
432     return DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->ApplyEfficiencyResources(resourcePtr);
433 }
434 
ResetAllEfficiencyResources()435 ErrCode BackgroundTaskMgrService::ResetAllEfficiencyResources()
436 {
437     return DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->ResetAllEfficiencyResources();
438 }
439 
GetAllEfficiencyResources(std::vector<EfficiencyResourceInfo> & resourceInfoList)440 ErrCode BackgroundTaskMgrService::GetAllEfficiencyResources(std::vector<EfficiencyResourceInfo> &resourceInfoList)
441 {
442     BgTaskHiTraceChain traceChain(__func__);
443     std::vector<std::shared_ptr<EfficiencyResourceInfo>> list {};
444     ErrCode result = DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->GetAllEfficiencyResources(list);
445     if (result == ERR_OK) {
446         for (const auto& ptr : list) {
447             if (ptr != nullptr) {
448                 resourceInfoList.push_back(*ptr);
449             }
450         }
451     }
452     return result;
453 }
454 
GetEfficiencyResourcesInfos(std::vector<ResourceCallbackInfo> & appList,std::vector<ResourceCallbackInfo> & procList)455 ErrCode BackgroundTaskMgrService::GetEfficiencyResourcesInfos(
456     std::vector<ResourceCallbackInfo> &appList,
457     std::vector<ResourceCallbackInfo> &procList)
458 {
459     if (!CheckCallingToken()) {
460         BGTASK_LOGW("GetEfficiencyResourcesInfos not allowed");
461         return ERR_BGTASK_PERMISSION_DENIED;
462     }
463     std::vector<std::shared_ptr<ResourceCallbackInfo>> resultAppList;
464     std::vector<std::shared_ptr<ResourceCallbackInfo>> resultProcList;
465     ErrCode result = DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->
466         GetEfficiencyResourcesInfos(resultAppList, resultProcList);
467     if (result == ERR_OK) {
468         for (const auto& ptr : resultAppList) {
469             if (ptr != nullptr) {
470                 appList.push_back(*ptr);
471             }
472         }
473         for (const auto& ptr : resultProcList) {
474             if (ptr != nullptr) {
475                 procList.push_back(*ptr);
476             }
477         }
478     }
479     return result;
480 }
481 
StopContinuousTask(int32_t uid,int32_t pid,uint32_t taskType,const std::string & key)482 ErrCode BackgroundTaskMgrService::StopContinuousTask(int32_t uid, int32_t pid, uint32_t taskType,
483     const std::string &key)
484 {
485     BgTaskHiTraceChain traceChain(__func__);
486     if (!CheckCallingToken() || !CheckCallingProcess()) {
487         BGTASK_LOGW("StopContinuousTask not allowed");
488         return ERR_BGTASK_PERMISSION_DENIED;
489     }
490     BgContinuousTaskMgr::GetInstance()->StopContinuousTask(uid, pid, taskType, key);
491     return ERR_OK;
492 }
493 
SuspendContinuousTask(int32_t uid,int32_t pid,int32_t reason,const std::string & key)494 ErrCode BackgroundTaskMgrService::SuspendContinuousTask(
495     int32_t uid, int32_t pid, int32_t reason, const std::string &key)
496 {
497     if (!CheckCallingToken() || !CheckCallingProcess()) {
498         BGTASK_LOGW("SuspendContinuousTask not allowed");
499         return ERR_BGTASK_PERMISSION_DENIED;
500     }
501     BgContinuousTaskMgr::GetInstance()->SuspendContinuousTask(uid, pid, reason, key);
502     return ERR_OK;
503 }
504 
ActiveContinuousTask(int32_t uid,int32_t pid,const std::string & key)505 ErrCode BackgroundTaskMgrService::ActiveContinuousTask(int32_t uid, int32_t pid, const std::string &key)
506 {
507     if (!CheckCallingToken() || !CheckCallingProcess()) {
508         BGTASK_LOGW("ActiveContinuousTask not allowed");
509         return ERR_BGTASK_PERMISSION_DENIED;
510     }
511     BgContinuousTaskMgr::GetInstance()->ActiveContinuousTask(uid, pid, key);
512     return ERR_OK;
513 }
514 
AVSessionNotifyUpdateNotification(int32_t uid,int32_t pid,bool isPublish)515 ErrCode BackgroundTaskMgrService::AVSessionNotifyUpdateNotification(int32_t uid, int32_t pid, bool isPublish)
516 {
517     if (!CheckCallingToken()) {
518         BGTASK_LOGW("AVSessionNotifyUpdateNotification not allowed");
519         return ERR_BGTASK_PERMISSION_DENIED;
520     }
521     return BgContinuousTaskMgr::GetInstance()->AVSessionNotifyUpdateNotification(uid, pid, isPublish);
522 }
523 
SetBgTaskConfig(const std::string & configData,int32_t sourceType)524 ErrCode BackgroundTaskMgrService::SetBgTaskConfig(const std::string &configData, int32_t sourceType)
525 {
526     BgTaskHiTraceChain traceChain(__func__);
527     if (!CheckCallingToken()) {
528         BGTASK_LOGW("SetBgTaskConfig not allowed");
529         return ERR_BGTASK_PERMISSION_DENIED;
530     }
531     return DelayedSingleton<BgTransientTaskMgr>::GetInstance()->SetBgTaskConfig(configData, sourceType);
532 }
533 
CheckAtomicService()534 bool BackgroundTaskMgrService::CheckAtomicService()
535 {
536     uint64_t tokenId = IPCSkeleton::GetCallingFullTokenID();
537     return Security::AccessToken::AccessTokenKit::IsAtomicServiceByFullTokenID(tokenId);
538 }
539 
AllowDump()540 bool BackgroundTaskMgrService::AllowDump()
541 {
542     if (ENG_MODE == 0) {
543         BGTASK_LOGE("Not eng mode");
544         return false;
545     }
546     Security::AccessToken::AccessTokenID tokenId = IPCSkeleton::GetFirstTokenID();
547     int32_t ret = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, "ohos.permission.DUMP");
548     if (ret != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
549         BGTASK_LOGE("CheckPermission failed");
550         return false;
551     }
552     return true;
553 }
554 
Dump(int32_t fd,const std::vector<std::u16string> & args)555 int32_t BackgroundTaskMgrService::Dump(int32_t fd, const std::vector<std::u16string> &args)
556 {
557     if (!AllowDump()) {
558         return ERR_BGTASK_PERMISSION_DENIED;
559     }
560     std::vector<std::string> argsInStr;
561     std::transform(args.begin(), args.end(), std::back_inserter(argsInStr),
562         [](const std::u16string &arg) {
563         return Str16ToStr8(arg);
564     });
565     std::string result;
566 
567     int32_t ret = ERR_OK;
568 
569     if (argsInStr.size() == NO_DUMP_PARAM_NUMS) {
570         DumpUsage(result);
571     } else {
572         std::vector<std::string> infos;
573         if (argsInStr[0] == "-h") {
574             DumpUsage(result);
575         } else if (argsInStr[0] == "-T") {
576             ret = DelayedSingleton<BgTransientTaskMgr>::GetInstance()->ShellDump(argsInStr, infos);
577         } else if (argsInStr[0] == "-C") {
578             ret = BgContinuousTaskMgr::GetInstance()->ShellDump(argsInStr, infos);
579         } else if (argsInStr[0] == "-E") {
580             ret = DelayedSingleton<BgEfficiencyResourcesMgr>::GetInstance()->ShellDump(argsInStr, infos);
581         } else {
582             infos.emplace_back("Error params.\n");
583             ret = ERR_BGTASK_INVALID_PARAM;
584         }
585         for (auto info : infos) {
586             result.append(info);
587         }
588     }
589 
590     if (!SaveStringToFd(fd, result)) {
591         BGTASK_LOGE("BackgroundTaskMgrService dump save string to fd failed!");
592         ret = ERR_BGTASK_METHOD_CALLED_FAILED;
593     }
594     return ret;
595 }
596 
DumpUsage(std::string & result)597 void BackgroundTaskMgrService::DumpUsage(std::string &result)
598 {
599     std::string dumpHelpMsg =
600     "usage: bgtask dump [<options>]\n"
601     "options list:\n"
602     "    -h                                   help menu\n"
603     "    -T                                   transient task commands:\n"
604     "        BATTARY_LOW                          battary low mode\n"
605     "        BATTARY_OKAY                         battary okay mode\n"
606     "        DUMP_CANCEL                          cancel dump mode\n"
607     "        All                                  list all request\n"
608     "    -C                                   continuous task commands:\n"
609     "        --all                                list all running continuous task infos\n"
610     "        --cancel_all                         cancel all running continuous task\n"
611     "        --cancel {continuous task key}       cancel one task by specifying task key\n"
612     "    -E                                   efficiency resources commands;\n"
613     "        --all                                list all efficiency resource aplications\n"
614     "        --reset_all                          reset all efficiency resource aplications\n"
615     "        --resetapp {uid} {resources}          reset one application of uid by specifying \n"
616     "        --resetproc {pid} {resources}         reset one application of pid by specifying \n";
617 
618     result.append(dumpHelpMsg);
619 }  // namespace
620 }  // namespace BackgroundTaskMgr
621 }  // namespace OHOS
622