• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 "ams_mgr_scheduler.h"
17 #include <sys/types.h>
18 
19 #include "datetime_ex.h"
20 #include "ipc_skeleton.h"
21 #include "system_ability_definition.h"
22 
23 #include "accesstoken_kit.h"
24 #include "app_death_recipient.h"
25 #include "app_mgr_constants.h"
26 #include "hilog_tag_wrapper.h"
27 #include "perf_profile.h"
28 #include "permission_constants.h"
29 #include "permission_verification.h"
30 
31 namespace OHOS {
32 namespace AppExecFwk {
33 namespace {
34 constexpr const char* TASK_TERMINATE_ABILITY = "TerminateAbilityTask";
35 constexpr const char* TASK_UPDATE_ABILITY_STATE = "UpdateAbilityStateTask";
36 constexpr const char* TASK_UPDATE_EXTENSION_STATE = "UpdateExtensionStateTask";
37 constexpr const char* TASK_REGISTER_APP_STATE_CALLBACK = "RegisterAppStateCallbackTask";
38 constexpr const char* TASK_STOP_ALL_PROCESS = "StopAllProcessTask";
39 constexpr const char* TASK_ABILITY_BEHAVIOR_ANALYSIS = "AbilityBehaviorAnalysisTask";
40 constexpr const char* TASK_KILL_PROCESS_BY_ABILITY_TOKEN = "KillProcessByAbilityTokenTask";
41 constexpr const char* TASK_KILL_PROCESSES_BY_USERID = "KillProcessesByUserIdTask";
42 constexpr const char* TASK_KILL_PROCESSES_BY_PIDS = "KillProcessesByPids";
43 constexpr const char* TASK_ATTACH_PID_TO_PARENT = "AttachPidToParent";
44 constexpr const char* TASK_KILL_APPLICATION = "KillApplicationTask";
45 constexpr const char* TASK_CLEAR_PROCESS_BY_ABILITY_TOKEN = "ClearProcessByAbilityTokenTask";
46 constexpr const char* FOUNDATION_NAME = "foundation";
47 constexpr const char* SCENE_BOARD_BUNDLE_NAME = "com.ohos.sceneboard";
48 constexpr const char* SCENEBOARD_ABILITY_NAME = "com.ohos.sceneboard.MainAbility";
49 constexpr const char* TASK_SCENE_BOARD_ATTACH_TIMEOUT = "sceneBoardAttachTimeoutTask";
50 constexpr const char* TASK_ATTACHED_TO_STATUS_BAR = "AttachedToStatusBar";
51 constexpr const char* TASK_BLOCK_PROCESS_CACHE_BY_PIDS = "BlockProcessCacheByPids";
52 constexpr const char* POWER_OFF_ABILITY = "PoweroffAbility";
53 constexpr int32_t SCENE_BOARD_ATTACH_TIMEOUT_TASK_TIME = 1000;
54 constexpr int32_t LOAD_TASK_TIMEOUT = 30000000; // us
55 };  // namespace
56 
AmsMgrScheduler(const std::shared_ptr<AppMgrServiceInner> & mgrServiceInner_,const std::shared_ptr<AAFwk::TaskHandlerWrap> & handler_)57 AmsMgrScheduler::AmsMgrScheduler(
58     const std::shared_ptr<AppMgrServiceInner> &mgrServiceInner_,
59     const std::shared_ptr<AAFwk::TaskHandlerWrap> &handler_)
60     : amsMgrServiceInner_(mgrServiceInner_), amsHandler_(handler_)
61 {}
62 
~AmsMgrScheduler()63 AmsMgrScheduler::~AmsMgrScheduler()
64 {
65     TAG_LOGI(AAFwkTag::APPMGR, "AmsMgrScheduler instance destroyed");
66 }
67 
LoadAbility(const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<ApplicationInfo> & appInfo,const std::shared_ptr<AAFwk::Want> & want,std::shared_ptr<AbilityRuntime::LoadParam> loadParam)68 void AmsMgrScheduler::LoadAbility(const std::shared_ptr<AbilityInfo> &abilityInfo,
69     const std::shared_ptr<ApplicationInfo> &appInfo,
70     const std::shared_ptr<AAFwk::Want> &want, std::shared_ptr<AbilityRuntime::LoadParam> loadParam)
71 {
72     if (!abilityInfo || !appInfo) {
73         TAG_LOGE(AAFwkTag::APPMGR, "param error");
74         return;
75     }
76 
77     if (!IsReady()) {
78         return;
79     }
80 
81     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
82         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed");
83         return;
84     }
85     PerfProfile::GetInstance().SetAbilityLoadStartTime(GetTickCount());
86     TAG_LOGI(AAFwkTag::APPMGR, "SubmitLoadTask: %{public}s-%{public}s", abilityInfo->bundleName.c_str(),
87         abilityInfo->name.c_str());
88     std::function<void()> loadAbilityFunc = [amsMgrServiceInner = amsMgrServiceInner_,
89         abilityInfo, appInfo, want, loadParam]() {
90         amsMgrServiceInner->LoadAbility(abilityInfo, appInfo, want, loadParam);
91     };
92 
93     // cache other application load ability task before scene board attach
94     if (!amsMgrServiceInner_->GetSceneBoardAttachFlag() && abilityInfo->bundleName != SCENE_BOARD_BUNDLE_NAME) {
95         amsMgrServiceInner_->CacheLoadAbilityTask(loadAbilityFunc);
96         return;
97     }
98     if (abilityInfo->bundleName == SCENE_BOARD_BUNDLE_NAME && abilityInfo->name == SCENEBOARD_ABILITY_NAME) {
99         amsMgrServiceInner_->SetSceneBoardAttachFlag(false);
100         // set scene board attach timeout task
101         std::weak_ptr<AppMgrServiceInner> amsMgrServiceInner = amsMgrServiceInner_;
102         auto timeoutTask = [amsMgrServiceInner]() {
103             auto inner = amsMgrServiceInner.lock();
104             if (inner != nullptr) {
105                 inner->SetSceneBoardAttachFlag(true);
106             }
107         };
108         amsHandler_->SubmitTask(timeoutTask, TASK_SCENE_BOARD_ATTACH_TIMEOUT, SCENE_BOARD_ATTACH_TIMEOUT_TASK_TIME);
109     }
110 
111     AAFwk::TaskAttribute taskAttr{
112         .taskName_ = "LoadAbilityTask",
113         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE,
114         .timeout_ = LOAD_TASK_TIMEOUT
115     };
116 
117     if (abilityInfo->bundleName == SCENE_BOARD_BUNDLE_NAME && abilityInfo->name == POWER_OFF_ABILITY) {
118         TAG_LOGI(AAFwkTag::APPMGR, "poweroff insert");
119         taskAttr.insertHead_ = true;
120     }
121 
122     amsHandler_->SubmitTask(loadAbilityFunc, taskAttr);
123 }
124 
UpdateAbilityState(const sptr<IRemoteObject> & token,const AbilityState state)125 void AmsMgrScheduler::UpdateAbilityState(const sptr<IRemoteObject> &token, const AbilityState state)
126 {
127     if (!IsReady()) {
128         return;
129     }
130 
131     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
132         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
133         return;
134     }
135     std::function<void()> updateAbilityStateFunc = [amsMgrServiceInner = amsMgrServiceInner_, token, state] () {
136         amsMgrServiceInner->UpdateAbilityState(token, state);
137     };
138     amsHandler_->SubmitTask(updateAbilityStateFunc, AAFwk::TaskAttribute{
139         .taskName_ = TASK_UPDATE_ABILITY_STATE,
140         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
141     });
142 }
143 
UpdateExtensionState(const sptr<IRemoteObject> & token,const ExtensionState state)144 void AmsMgrScheduler::UpdateExtensionState(const sptr<IRemoteObject> &token, const ExtensionState state)
145 {
146     if (!IsReady()) {
147         return;
148     }
149 
150     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
151         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
152         return;
153     }
154     std::function<void()> updateExtensionStateFunc = [amsMgrServiceInner = amsMgrServiceInner_, token, state]() {
155         amsMgrServiceInner->UpdateExtensionState(token, state);
156     };
157     amsHandler_->SubmitTask(updateExtensionStateFunc, AAFwk::TaskAttribute{
158         .taskName_ = TASK_UPDATE_EXTENSION_STATE,
159         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
160     });
161 }
162 
TerminateAbility(const sptr<IRemoteObject> & token,bool clearMissionFlag)163 void AmsMgrScheduler::TerminateAbility(const sptr<IRemoteObject> &token, bool clearMissionFlag)
164 {
165     if (!IsReady()) {
166         return;
167     }
168 
169     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
170         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
171         return;
172     }
173     std::function<void()> terminateAbilityFunc = [amsMgrServiceInner = amsMgrServiceInner_, token, clearMissionFlag]() {
174         amsMgrServiceInner->TerminateAbility(token, clearMissionFlag);
175     };
176     amsHandler_->SubmitTask(terminateAbilityFunc, AAFwk::TaskAttribute{
177         .taskName_ = TASK_TERMINATE_ABILITY,
178         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
179     });
180 }
181 
RegisterAppStateCallback(const sptr<IAppStateCallback> & callback)182 void AmsMgrScheduler::RegisterAppStateCallback(const sptr<IAppStateCallback> &callback)
183 {
184     if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
185         TAG_LOGE(AAFwkTag::APPMGR, "caller is not SA");
186         return;
187     }
188     if (!IsReady()) {
189         return;
190     }
191     std::function<void()> registerAppStateCallbackFunc = [amsMgrServiceInner = amsMgrServiceInner_, callback]() {
192         amsMgrServiceInner->RegisterAppStateCallback(callback);
193     };
194     amsHandler_->SubmitTask(registerAppStateCallbackFunc, TASK_REGISTER_APP_STATE_CALLBACK);
195 }
196 
AbilityBehaviorAnalysis(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const int32_t visibility,const int32_t perceptibility,const int32_t connectionState)197 void AmsMgrScheduler::AbilityBehaviorAnalysis(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
198     const int32_t visibility, const int32_t perceptibility, const int32_t connectionState)
199 {
200     if (!IsReady()) {
201         return;
202     }
203 
204     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
205         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
206         return;
207     }
208     std::function<void()> abilityBehaviorAnalysisFunc = [amsMgrServiceInner = amsMgrServiceInner_, token, preToken,
209         visibility, perceptibility, connectionState]() {
210         amsMgrServiceInner->AbilityBehaviorAnalysis(token, preToken,
211             visibility, perceptibility, connectionState);
212     };
213     amsHandler_->SubmitTask(abilityBehaviorAnalysisFunc, TASK_ABILITY_BEHAVIOR_ANALYSIS);
214 }
215 
KillProcessByAbilityToken(const sptr<IRemoteObject> & token)216 void AmsMgrScheduler::KillProcessByAbilityToken(const sptr<IRemoteObject> &token)
217 {
218     if (!IsReady()) {
219         return;
220     }
221 
222     if (amsMgrServiceInner_->VerifyKillProcessPermission(token) != ERR_OK) {
223         TAG_LOGE(AAFwkTag::APPMGR, "Permission verify failed");
224         return;
225     }
226 
227     std::function<void()> killProcessByAbilityTokenFunc = [amsMgrServiceInner = amsMgrServiceInner_, token]() {
228         amsMgrServiceInner->KillProcessByAbilityToken(token);
229     };
230     amsHandler_->SubmitTask(killProcessByAbilityTokenFunc, TASK_KILL_PROCESS_BY_ABILITY_TOKEN);
231 }
232 
KillProcessesByUserId(int32_t userId)233 void AmsMgrScheduler::KillProcessesByUserId(int32_t userId)
234 {
235     if (!IsReady()) {
236         return;
237     }
238 
239     if (!AAFwk::PermissionVerification::GetInstance()->JudgeCallerIsAllowedToUseSystemAPI()) {
240         TAG_LOGE(AAFwkTag::APPMGR, "The caller is not system-app, can not use system-api");
241         return;
242     }
243 
244     bool isCallingFromFoundation =
245         AAFwk::PermissionVerification::GetInstance()->CheckSpecificSystemAbilityAccessPermission(FOUNDATION_NAME);
246     auto permission = AAFwk::PermissionConstants::PERMISSION_CLEAN_BACKGROUND_PROCESSES;
247     if (!isCallingFromFoundation &&
248         amsMgrServiceInner_->VerifyAccountPermission(permission, userId) == ERR_PERMISSION_DENIED) {
249         TAG_LOGE(AAFwkTag::APPMGR, "Permission verify failed");
250         return;
251     }
252 
253     std::function<void()> killProcessesByUserIdFunc = [amsMgrServiceInner = amsMgrServiceInner_, userId]() {
254         amsMgrServiceInner->KillProcessesByUserId(userId);
255     };
256     amsHandler_->SubmitTask(killProcessesByUserIdFunc, TASK_KILL_PROCESSES_BY_USERID);
257 }
258 
KillProcessesByPids(std::vector<int32_t> & pids)259 void AmsMgrScheduler::KillProcessesByPids(std::vector<int32_t> &pids)
260 {
261     if (!IsReady()) {
262         return;
263     }
264 
265     pid_t callingPid = IPCSkeleton::GetCallingPid();
266     pid_t pid = getprocpid();
267     if (callingPid != pid) {
268         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
269         return;
270     }
271 
272     std::function<void()> killProcessesByPidsFunc = [amsMgrServiceInner = amsMgrServiceInner_, pids]() mutable {
273         amsMgrServiceInner->KillProcessesByPids(pids);
274     };
275     amsHandler_->SubmitTask(killProcessesByPidsFunc, TASK_KILL_PROCESSES_BY_PIDS);
276 }
277 
AttachPidToParent(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & callerToken)278 void AmsMgrScheduler::AttachPidToParent(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &callerToken)
279 {
280     if (!IsReady()) {
281         return;
282     }
283 
284     pid_t callingPid = IPCSkeleton::GetCallingPid();
285     pid_t pid = getprocpid();
286     if (callingPid != pid) {
287         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
288         return;
289     }
290 
291     std::function<void()> attachPidToParentFunc = [amsMgrServiceInner = amsMgrServiceInner_, token, callerToken]() {
292         amsMgrServiceInner->AttachPidToParent(token, callerToken);
293     };
294     amsHandler_->SubmitTask(attachPidToParentFunc, TASK_ATTACH_PID_TO_PARENT);
295 }
296 
KillProcessWithAccount(const std::string & bundleName,const int accountId)297 int32_t AmsMgrScheduler::KillProcessWithAccount(const std::string &bundleName, const int accountId)
298 {
299     TAG_LOGI(AAFwkTag::APPMGR, "bundleName = %{public}s, accountId = %{public}d", bundleName.c_str(), accountId);
300     if (!IsReady()) {
301         return ERR_INVALID_OPERATION;
302     }
303     return amsMgrServiceInner_->KillApplicationByUserId(bundleName, 0, accountId,
304         "KillProcessWithAccount");
305 }
306 
AbilityAttachTimeOut(const sptr<IRemoteObject> & token)307 void AmsMgrScheduler::AbilityAttachTimeOut(const sptr<IRemoteObject> &token)
308 {
309     TAG_LOGI(AAFwkTag::APPMGR, "AmsMgrScheduler AttachTimeOut begin");
310     if (!IsReady()) {
311         return;
312     }
313 
314     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
315         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
316         return;
317     }
318     auto task = [amsMgrServiceInner = amsMgrServiceInner_, token]() {
319         amsMgrServiceInner->HandleAbilityAttachTimeOut(token);
320     };
321     amsHandler_->SubmitTask(task, "AbilityAttachTimeOut");
322 }
323 
PrepareTerminate(const sptr<IRemoteObject> & token,bool clearMissionFlag)324 void AmsMgrScheduler::PrepareTerminate(const sptr<IRemoteObject> &token, bool clearMissionFlag)
325 {
326     TAG_LOGD(AAFwkTag::APPMGR, "Notify AppMgrService to prepare to terminate the ability.");
327     if (!IsReady()) {
328         return;
329     }
330 
331     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
332         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
333         return;
334     }
335     auto task = [=]() { amsMgrServiceInner_->PrepareTerminate(token, clearMissionFlag); };
336     amsHandler_->SubmitTask(task, {
337         .taskName_ = "PrepareTerminate",
338         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
339     });
340 }
341 
UpdateApplicationInfoInstalled(const std::string & bundleName,const int uid)342 int32_t AmsMgrScheduler::UpdateApplicationInfoInstalled(const std::string &bundleName, const int uid)
343 {
344     if (!IsReady()) {
345         return ERR_INVALID_OPERATION;
346     }
347 
348     return amsMgrServiceInner_->UpdateApplicationInfoInstalled(bundleName, uid);
349 }
350 
KillApplication(const std::string & bundleName)351 int32_t AmsMgrScheduler::KillApplication(const std::string &bundleName)
352 {
353     TAG_LOGI(AAFwkTag::APPMGR, "bundleName = %{public}s", bundleName.c_str());
354     if (!IsReady()) {
355         return ERR_INVALID_OPERATION;
356     }
357 
358     return amsMgrServiceInner_->KillApplication(bundleName);
359 }
360 
ForceKillApplication(const std::string & bundleName,const int userId,const int appIndex)361 int32_t AmsMgrScheduler::ForceKillApplication(const std::string &bundleName,
362     const int userId, const int appIndex)
363 {
364     TAG_LOGI(AAFwkTag::APPMGR, "bundleName=%{public}s,userId=%{public}d,apIndex=%{public}d",
365         bundleName.c_str(), userId, appIndex);
366     if (!IsReady()) {
367         return ERR_INVALID_OPERATION;
368     }
369 
370     return amsMgrServiceInner_->ForceKillApplication(bundleName, userId, appIndex);
371 }
372 
KillProcessesByAccessTokenId(const uint32_t accessTokenId)373 int32_t AmsMgrScheduler::KillProcessesByAccessTokenId(const uint32_t accessTokenId)
374 {
375     TAG_LOGI(AAFwkTag::APPMGR, "accessTokenId=%{public}d", accessTokenId);
376     if (!IsReady()) {
377         return ERR_INVALID_OPERATION;
378     }
379 
380     return amsMgrServiceInner_->KillProcessesByAccessTokenId(accessTokenId);
381 }
382 
KillApplicationByUid(const std::string & bundleName,const int uid,const std::string & reason)383 int32_t AmsMgrScheduler::KillApplicationByUid(const std::string &bundleName, const int uid,
384     const std::string& reason)
385 {
386     TAG_LOGI(AAFwkTag::APPMGR, "bundleName = %{public}s, uid = %{public}d", bundleName.c_str(), uid);
387     if (!IsReady()) {
388         return ERR_INVALID_OPERATION;
389     }
390     return amsMgrServiceInner_->KillApplicationByUid(bundleName, uid, reason);
391 }
392 
KillApplicationSelf(const std::string & reason)393 int32_t AmsMgrScheduler::KillApplicationSelf(const std::string& reason)
394 {
395     if (!IsReady()) {
396         return ERR_INVALID_OPERATION;
397     }
398     return amsMgrServiceInner_->KillApplicationSelf(reason);
399 }
400 
IsReady() const401 bool AmsMgrScheduler::IsReady() const
402 {
403     if (!amsMgrServiceInner_) {
404         TAG_LOGE(AAFwkTag::APPMGR, "amsMgrServiceInner_ is null");
405         return false;
406     }
407     if (!amsHandler_) {
408         TAG_LOGE(AAFwkTag::APPMGR, "amsHandler_ is null");
409         return false;
410     }
411     return true;
412 }
413 
GetRunningProcessInfoByToken(const sptr<IRemoteObject> & token,AppExecFwk::RunningProcessInfo & info)414 void AmsMgrScheduler::GetRunningProcessInfoByToken(
415     const sptr<IRemoteObject> &token, AppExecFwk::RunningProcessInfo &info)
416 {
417     if (!IsReady()) {
418         return;
419     }
420 
421     amsMgrServiceInner_->GetRunningProcessInfoByToken(token, info);
422 }
423 
SetAbilityForegroundingFlagToAppRecord(const pid_t pid)424 void AmsMgrScheduler::SetAbilityForegroundingFlagToAppRecord(const pid_t pid)
425 {
426     if (!IsReady()) {
427         return;
428     }
429     amsMgrServiceInner_->SetAbilityForegroundingFlagToAppRecord(pid);
430 }
431 
StartSpecifiedAbility(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo,int32_t requestId)432 void AmsMgrScheduler::StartSpecifiedAbility(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
433     int32_t requestId)
434 {
435     if (!IsReady()) {
436         return;
437     }
438 
439     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
440         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
441         return;
442     }
443     auto task = [=]() { amsMgrServiceInner_->StartSpecifiedAbility(want, abilityInfo, requestId); };
444     amsHandler_->SubmitTask(task, {
445         .taskName_ = "StartSpecifiedAbility",
446         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
447     });
448 }
449 
StartSpecifiedProcess(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo,int32_t requestId)450 void AmsMgrScheduler::StartSpecifiedProcess(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
451     int32_t requestId)
452 {
453     if (!IsReady()) {
454         TAG_LOGW(AAFwkTag::APPMGR, "not ready.");
455         return;
456     }
457 
458     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
459         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
460         return;
461     }
462     auto task = [=]() { amsMgrServiceInner_->StartSpecifiedProcess(want, abilityInfo, requestId); };
463     amsHandler_->SubmitTask(task, {
464         .taskName_ = "StartSpecifiedProcess",
465         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
466     });
467 }
468 
RegisterStartSpecifiedAbilityResponse(const sptr<IStartSpecifiedAbilityResponse> & response)469 void AmsMgrScheduler::RegisterStartSpecifiedAbilityResponse(const sptr<IStartSpecifiedAbilityResponse> &response)
470 {
471     if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
472         TAG_LOGE(AAFwkTag::APPMGR, "caller is not SA");
473         return;
474     }
475     if (!IsReady()) {
476         return;
477     }
478     auto task = [=]() { amsMgrServiceInner_->RegisterStartSpecifiedAbilityResponse(response); };
479     amsHandler_->SubmitTask(task, "RegisterStartSpecifiedAbilityResponse");
480 }
481 
GetApplicationInfoByProcessID(const int pid,AppExecFwk::ApplicationInfo & application,bool & debug)482 int AmsMgrScheduler::GetApplicationInfoByProcessID(const int pid, AppExecFwk::ApplicationInfo &application, bool &debug)
483 {
484     if (!IsReady()) {
485         return ERR_INVALID_OPERATION;
486     }
487     return amsMgrServiceInner_->GetApplicationInfoByProcessID(pid, application, debug);
488 }
489 
NotifyAppMgrRecordExitReason(int32_t pid,int32_t reason,const std::string & exitMsg)490 int32_t AmsMgrScheduler::NotifyAppMgrRecordExitReason(int32_t pid, int32_t reason, const std::string &exitMsg)
491 {
492     if (!IsReady()) {
493         return ERR_INVALID_OPERATION;
494     }
495     return amsMgrServiceInner_->NotifyAppMgrRecordExitReason(pid, reason, exitMsg);
496 }
497 
SetCurrentUserId(const int32_t userId)498 void AmsMgrScheduler::SetCurrentUserId(const int32_t userId)
499 {
500     if (!IsReady()) {
501         return;
502     }
503     amsMgrServiceInner_->SetCurrentUserId(userId);
504 }
505 
SetEnableStartProcessFlagByUserId(int32_t userId,bool enableStartProcess)506 void AmsMgrScheduler::SetEnableStartProcessFlagByUserId(int32_t userId, bool enableStartProcess)
507 {
508     if (!IsReady()) {
509         return;
510     }
511     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
512         TAG_LOGE(AAFwkTag::APPMGR, "verification failed");
513         return;
514     }
515     amsMgrServiceInner_->SetEnableStartProcessFlagByUserId(userId, enableStartProcess);
516 }
517 
GetBundleNameByPid(const int pid,std::string & bundleName,int32_t & uid)518 int32_t AmsMgrScheduler::GetBundleNameByPid(const int pid, std::string &bundleName, int32_t &uid)
519 {
520     if (!IsReady()) {
521         return ERR_INVALID_OPERATION;
522     }
523     return amsMgrServiceInner_->GetBundleNameByPid(pid, bundleName, uid);
524 }
525 
RegisterAppDebugListener(const sptr<IAppDebugListener> & listener)526 int32_t AmsMgrScheduler::RegisterAppDebugListener(const sptr<IAppDebugListener> &listener)
527 {
528     if (!IsReady()) {
529         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
530         return ERR_INVALID_OPERATION;
531     }
532     return amsMgrServiceInner_->RegisterAppDebugListener(listener);
533 }
534 
UnregisterAppDebugListener(const sptr<IAppDebugListener> & listener)535 int32_t AmsMgrScheduler::UnregisterAppDebugListener(const sptr<IAppDebugListener> &listener)
536 {
537     if (!IsReady()) {
538         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
539         return ERR_INVALID_OPERATION;
540     }
541     return amsMgrServiceInner_->UnregisterAppDebugListener(listener);
542 }
543 
AttachAppDebug(const std::string & bundleName)544 int32_t AmsMgrScheduler::AttachAppDebug(const std::string &bundleName)
545 {
546     if (!IsReady()) {
547         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
548         return ERR_INVALID_OPERATION;
549     }
550     return amsMgrServiceInner_->AttachAppDebug(bundleName);
551 }
552 
DetachAppDebug(const std::string & bundleName)553 int32_t AmsMgrScheduler::DetachAppDebug(const std::string &bundleName)
554 {
555     if (!IsReady()) {
556         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
557         return ERR_INVALID_OPERATION;
558     }
559     return amsMgrServiceInner_->DetachAppDebug(bundleName);
560 }
561 
SetAppWaitingDebug(const std::string & bundleName,bool isPersist)562 int32_t AmsMgrScheduler::SetAppWaitingDebug(const std::string &bundleName, bool isPersist)
563 {
564     if (!IsReady()) {
565         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
566         return ERR_INVALID_OPERATION;
567     }
568     return amsMgrServiceInner_->SetAppWaitingDebug(bundleName, isPersist);
569 }
570 
CancelAppWaitingDebug()571 int32_t AmsMgrScheduler::CancelAppWaitingDebug()
572 {
573     if (!IsReady()) {
574         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
575         return ERR_INVALID_OPERATION;
576     }
577     return amsMgrServiceInner_->CancelAppWaitingDebug();
578 }
579 
GetWaitingDebugApp(std::vector<std::string> & debugInfoList)580 int32_t AmsMgrScheduler::GetWaitingDebugApp(std::vector<std::string> &debugInfoList)
581 {
582     if (!IsReady()) {
583         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
584         return ERR_INVALID_OPERATION;
585     }
586     return amsMgrServiceInner_->GetWaitingDebugApp(debugInfoList);
587 }
588 
IsWaitingDebugApp(const std::string & bundleName)589 bool AmsMgrScheduler::IsWaitingDebugApp(const std::string &bundleName)
590 {
591     if (!IsReady()) {
592         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
593         return false;
594     }
595     return amsMgrServiceInner_->IsWaitingDebugApp(bundleName);
596 }
597 
ClearNonPersistWaitingDebugFlag()598 void AmsMgrScheduler::ClearNonPersistWaitingDebugFlag()
599 {
600     if (!IsReady()) {
601         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
602         return;
603     }
604     amsMgrServiceInner_->ClearNonPersistWaitingDebugFlag();
605 }
606 
RegisterAbilityDebugResponse(const sptr<IAbilityDebugResponse> & response)607 int32_t AmsMgrScheduler::RegisterAbilityDebugResponse(const sptr<IAbilityDebugResponse> &response)
608 {
609     if (!IsReady()) {
610         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
611         return ERR_INVALID_OPERATION;
612     }
613     return amsMgrServiceInner_->RegisterAbilityDebugResponse(response);
614 }
615 
IsAttachDebug(const std::string & bundleName)616 bool AmsMgrScheduler::IsAttachDebug(const std::string &bundleName)
617 {
618     if (!IsReady()) {
619         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
620         return false;
621     }
622     return amsMgrServiceInner_->IsAttachDebug(bundleName);
623 }
624 
SetKeepAliveEnableState(const std::string & bundleName,bool enable,int32_t uid)625 void AmsMgrScheduler::SetKeepAliveEnableState(const std::string &bundleName, bool enable, int32_t uid)
626 {
627     if (!IsReady()) {
628         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
629         return;
630     }
631     amsMgrServiceInner_->SetKeepAliveEnableState(bundleName, enable, uid);
632 }
633 
ClearProcessByToken(sptr<IRemoteObject> token)634 void AmsMgrScheduler::ClearProcessByToken(sptr<IRemoteObject> token)
635 {
636     if (!IsReady()) {
637         return;
638     }
639 
640     auto callerTokenId = IPCSkeleton::GetCallingTokenID();
641     Security::AccessToken::NativeTokenInfo nativeInfo;
642     Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
643     if (nativeInfo.processName != "foundation") {
644         TAG_LOGE(AAFwkTag::APPMGR, "caller is not foundation.");
645         return;
646     }
647 
648     std::function<void()> clearProcessByTokenFunc = [amsMgrServiceInner = amsMgrServiceInner_, token]() {
649         amsMgrServiceInner->ClearProcessByToken(token);
650     };
651     amsHandler_->SubmitTask(clearProcessByTokenFunc, TASK_CLEAR_PROCESS_BY_ABILITY_TOKEN);
652 }
653 
IsMemorySizeSufficent()654 bool AmsMgrScheduler::IsMemorySizeSufficent()
655 {
656     if (!IsReady()) {
657         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
658         return true;
659     }
660     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
661         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
662         return true;
663     }
664     return amsMgrServiceInner_->IsMemorySizeSufficent();
665 }
666 
AttachedToStatusBar(const sptr<IRemoteObject> & token)667 void AmsMgrScheduler::AttachedToStatusBar(const sptr<IRemoteObject> &token)
668 {
669     if (!IsReady()) {
670         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
671         return;
672     }
673     auto callerTokenId = IPCSkeleton::GetCallingTokenID();
674     Security::AccessToken::NativeTokenInfo nativeInfo;
675     Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
676     if (nativeInfo.processName != "foundation") {
677         TAG_LOGE(AAFwkTag::APPMGR, "caller is not foundation.");
678         return;
679     }
680     std::function<void()> attachedToStatusBarFunc =
681         std::bind(&AppMgrServiceInner::AttachedToStatusBar, amsMgrServiceInner_, token);
682     amsHandler_->SubmitTask(attachedToStatusBarFunc, TASK_ATTACHED_TO_STATUS_BAR);
683 }
684 
BlockProcessCacheByPids(const std::vector<int32_t> & pids)685 void AmsMgrScheduler::BlockProcessCacheByPids(const std::vector<int32_t> &pids)
686 {
687     if (!IsReady()) {
688         return;
689     }
690 
691     pid_t callingPid = IPCSkeleton::GetCallingPid();
692     pid_t pid = getprocpid();
693     if (callingPid != pid) {
694         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
695         return;
696     }
697 
698     std::function<void()> blockProcCacheFunc = [amsMgrServiceInner = amsMgrServiceInner_, pids]() mutable {
699         amsMgrServiceInner->BlockProcessCacheByPids(pids);
700     };
701     amsHandler_->SubmitTask(blockProcCacheFunc, TASK_BLOCK_PROCESS_CACHE_BY_PIDS);
702 }
703 
IsKilledForUpgradeWeb(const std::string & bundleName)704 bool AmsMgrScheduler::IsKilledForUpgradeWeb(const std::string &bundleName)
705 {
706     if (!IsReady()) {
707         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
708         return false;
709     }
710     return amsMgrServiceInner_->IsKilledForUpgradeWeb(bundleName);
711 }
712 
CleanAbilityByUserRequest(const sptr<IRemoteObject> & token)713 bool AmsMgrScheduler::CleanAbilityByUserRequest(const sptr<IRemoteObject> &token)
714 {
715     if (!IsReady()) {
716         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
717         return false;
718     }
719 
720     if (IPCSkeleton::GetCallingPid() != getprocpid()) {
721         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
722         return false;
723     }
724     return amsMgrServiceInner_->CleanAbilityByUserRequest(token);
725 }
IsProcessContainsOnlyUIAbility(const pid_t pid)726 bool AmsMgrScheduler::IsProcessContainsOnlyUIAbility(const pid_t pid)
727 {
728     if (!IsReady()) {
729         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
730         return false;
731     }
732     pid_t callingPid = IPCSkeleton::GetCallingPid();
733     pid_t procPid = getprocpid();
734     if (callingPid != procPid) {
735         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
736         return false;
737     }
738     return amsMgrServiceInner_->IsProcessContainsOnlyUIAbility(pid);
739 }
740 
IsProcessAttached(sptr<IRemoteObject> token)741 bool AmsMgrScheduler::IsProcessAttached(sptr<IRemoteObject> token)
742 {
743     if (!IsReady()) {
744         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
745         return false;
746     }
747     return amsMgrServiceInner_->IsProcessAttached(token);
748 }
749 } // namespace AppExecFwk
750 }  // namespace OHOS
751