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