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,const bool clearPageStack)297 int32_t AmsMgrScheduler::KillProcessWithAccount(
298     const std::string &bundleName, const int accountId, const bool clearPageStack)
299 {
300     TAG_LOGI(AAFwkTag::APPMGR, "bundleName = %{public}s, accountId = %{public}d, clearPageStack = %{public}d",
301         bundleName.c_str(), accountId, clearPageStack);
302     if (!IsReady()) {
303         return ERR_INVALID_OPERATION;
304     }
305     return amsMgrServiceInner_->KillApplicationByUserId(bundleName, 0, accountId, clearPageStack,
306         "KillProcessWithAccount");
307 }
308 
KillProcessesInBatch(const std::vector<int32_t> & pids)309 int32_t AmsMgrScheduler::KillProcessesInBatch(const std::vector<int32_t> &pids)
310 {
311     TAG_LOGI(AAFwkTag::APPMGR, "pids.size=%{public}zu", pids.size());
312     if (!IsReady()) {
313         return ERR_INVALID_OPERATION;
314     }
315     return amsMgrServiceInner_->KillProcessesInBatch(pids);
316 }
317 
AbilityAttachTimeOut(const sptr<IRemoteObject> & token)318 void AmsMgrScheduler::AbilityAttachTimeOut(const sptr<IRemoteObject> &token)
319 {
320     TAG_LOGI(AAFwkTag::APPMGR, "AmsMgrScheduler AttachTimeOut begin");
321     if (!IsReady()) {
322         return;
323     }
324 
325     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
326         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
327         return;
328     }
329     auto task = [amsMgrServiceInner = amsMgrServiceInner_, token]() {
330         amsMgrServiceInner->HandleAbilityAttachTimeOut(token);
331     };
332     amsHandler_->SubmitTask(task, "AbilityAttachTimeOut");
333 }
334 
PrepareTerminate(const sptr<IRemoteObject> & token,bool clearMissionFlag)335 void AmsMgrScheduler::PrepareTerminate(const sptr<IRemoteObject> &token, bool clearMissionFlag)
336 {
337     TAG_LOGD(AAFwkTag::APPMGR, "Notify AppMgrService to prepare to terminate the ability.");
338     if (!IsReady()) {
339         return;
340     }
341 
342     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
343         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
344         return;
345     }
346     auto task = [=]() { amsMgrServiceInner_->PrepareTerminate(token, clearMissionFlag); };
347     amsHandler_->SubmitTask(task, {
348         .taskName_ = "PrepareTerminate",
349         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
350     });
351 }
352 
UpdateApplicationInfoInstalled(const std::string & bundleName,const int uid)353 int32_t AmsMgrScheduler::UpdateApplicationInfoInstalled(const std::string &bundleName, const int uid)
354 {
355     if (!IsReady()) {
356         return ERR_INVALID_OPERATION;
357     }
358 
359     return amsMgrServiceInner_->UpdateApplicationInfoInstalled(bundleName, uid);
360 }
361 
KillApplication(const std::string & bundleName,const bool clearPageStack)362 int32_t AmsMgrScheduler::KillApplication(const std::string &bundleName, const bool clearPageStack)
363 {
364     TAG_LOGI(AAFwkTag::APPMGR, "bundleName = %{public}s, clearPageStack = %{public}d",
365         bundleName.c_str(), clearPageStack);
366     if (!IsReady()) {
367         return ERR_INVALID_OPERATION;
368     }
369 
370     return amsMgrServiceInner_->KillApplication(bundleName, clearPageStack);
371 }
372 
ForceKillApplication(const std::string & bundleName,const int userId,const int appIndex)373 int32_t AmsMgrScheduler::ForceKillApplication(const std::string &bundleName,
374     const int userId, const int appIndex)
375 {
376     TAG_LOGI(AAFwkTag::APPMGR, "bundleName=%{public}s,userId=%{public}d,apIndex=%{public}d",
377         bundleName.c_str(), userId, appIndex);
378     if (!IsReady()) {
379         return ERR_INVALID_OPERATION;
380     }
381 
382     return amsMgrServiceInner_->ForceKillApplication(bundleName, userId, appIndex);
383 }
384 
KillProcessesByAccessTokenId(const uint32_t accessTokenId)385 int32_t AmsMgrScheduler::KillProcessesByAccessTokenId(const uint32_t accessTokenId)
386 {
387     TAG_LOGI(AAFwkTag::APPMGR, "accessTokenId=%{public}d", accessTokenId);
388     if (!IsReady()) {
389         return ERR_INVALID_OPERATION;
390     }
391 
392     return amsMgrServiceInner_->KillProcessesByAccessTokenId(accessTokenId);
393 }
394 
KillApplicationByUid(const std::string & bundleName,const int uid,const std::string & reason)395 int32_t AmsMgrScheduler::KillApplicationByUid(const std::string &bundleName, const int uid,
396     const std::string& reason)
397 {
398     TAG_LOGI(AAFwkTag::APPMGR, "bundleName = %{public}s, uid = %{public}d", bundleName.c_str(), uid);
399     if (!IsReady()) {
400         return ERR_INVALID_OPERATION;
401     }
402     return amsMgrServiceInner_->KillApplicationByUid(bundleName, uid, reason);
403 }
404 
KillApplicationSelf(const bool clearPageStack,const std::string & reason)405 int32_t AmsMgrScheduler::KillApplicationSelf(const bool clearPageStack, const std::string& reason)
406 {
407     if (!IsReady()) {
408         return ERR_INVALID_OPERATION;
409     }
410     return amsMgrServiceInner_->KillApplicationSelf(clearPageStack, reason);
411 }
412 
IsReady() const413 bool AmsMgrScheduler::IsReady() const
414 {
415     if (!amsMgrServiceInner_) {
416         TAG_LOGE(AAFwkTag::APPMGR, "amsMgrServiceInner_ is null");
417         return false;
418     }
419     if (!amsHandler_) {
420         TAG_LOGE(AAFwkTag::APPMGR, "amsHandler_ is null");
421         return false;
422     }
423     return true;
424 }
425 
GetRunningProcessInfoByToken(const sptr<IRemoteObject> & token,AppExecFwk::RunningProcessInfo & info)426 void AmsMgrScheduler::GetRunningProcessInfoByToken(
427     const sptr<IRemoteObject> &token, AppExecFwk::RunningProcessInfo &info)
428 {
429     if (!IsReady()) {
430         return;
431     }
432 
433     amsMgrServiceInner_->GetRunningProcessInfoByToken(token, info);
434 }
435 
SetAbilityForegroundingFlagToAppRecord(const pid_t pid)436 void AmsMgrScheduler::SetAbilityForegroundingFlagToAppRecord(const pid_t pid)
437 {
438     if (!IsReady()) {
439         return;
440     }
441     amsMgrServiceInner_->SetAbilityForegroundingFlagToAppRecord(pid);
442 }
443 
StartSpecifiedAbility(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo,int32_t requestId)444 void AmsMgrScheduler::StartSpecifiedAbility(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
445     int32_t requestId)
446 {
447     if (!IsReady()) {
448         return;
449     }
450 
451     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
452         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
453         return;
454     }
455     auto task = [=]() { amsMgrServiceInner_->StartSpecifiedAbility(want, abilityInfo, requestId); };
456     amsHandler_->SubmitTask(task, {
457         .taskName_ = "StartSpecifiedAbility",
458         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
459     });
460 }
461 
StartSpecifiedProcess(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo,int32_t requestId)462 void AmsMgrScheduler::StartSpecifiedProcess(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
463     int32_t requestId)
464 {
465     if (!IsReady()) {
466         TAG_LOGW(AAFwkTag::APPMGR, "not ready.");
467         return;
468     }
469 
470     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
471         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
472         return;
473     }
474     auto task = [=]() { amsMgrServiceInner_->StartSpecifiedProcess(want, abilityInfo, requestId); };
475     amsHandler_->SubmitTask(task, {
476         .taskName_ = "StartSpecifiedProcess",
477         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
478     });
479 }
480 
RegisterStartSpecifiedAbilityResponse(const sptr<IStartSpecifiedAbilityResponse> & response)481 void AmsMgrScheduler::RegisterStartSpecifiedAbilityResponse(const sptr<IStartSpecifiedAbilityResponse> &response)
482 {
483     if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
484         TAG_LOGE(AAFwkTag::APPMGR, "caller is not SA");
485         return;
486     }
487     if (!IsReady()) {
488         return;
489     }
490     auto task = [=]() { amsMgrServiceInner_->RegisterStartSpecifiedAbilityResponse(response); };
491     amsHandler_->SubmitTask(task, "RegisterStartSpecifiedAbilityResponse");
492 }
493 
GetApplicationInfoByProcessID(const int pid,AppExecFwk::ApplicationInfo & application,bool & debug)494 int AmsMgrScheduler::GetApplicationInfoByProcessID(const int pid, AppExecFwk::ApplicationInfo &application, bool &debug)
495 {
496     if (!IsReady()) {
497         return ERR_INVALID_OPERATION;
498     }
499     return amsMgrServiceInner_->GetApplicationInfoByProcessID(pid, application, debug);
500 }
501 
NotifyAppMgrRecordExitReason(int32_t pid,int32_t reason,const std::string & exitMsg)502 int32_t AmsMgrScheduler::NotifyAppMgrRecordExitReason(int32_t pid, int32_t reason, const std::string &exitMsg)
503 {
504     if (!IsReady()) {
505         return ERR_INVALID_OPERATION;
506     }
507     return amsMgrServiceInner_->NotifyAppMgrRecordExitReason(pid, reason, exitMsg);
508 }
509 
SetCurrentUserId(const int32_t userId)510 void AmsMgrScheduler::SetCurrentUserId(const int32_t userId)
511 {
512     if (!IsReady()) {
513         return;
514     }
515     amsMgrServiceInner_->SetCurrentUserId(userId);
516 }
517 
SetEnableStartProcessFlagByUserId(int32_t userId,bool enableStartProcess)518 void AmsMgrScheduler::SetEnableStartProcessFlagByUserId(int32_t userId, bool enableStartProcess)
519 {
520     if (!IsReady()) {
521         return;
522     }
523     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
524         TAG_LOGE(AAFwkTag::APPMGR, "verification failed");
525         return;
526     }
527     amsMgrServiceInner_->SetEnableStartProcessFlagByUserId(userId, enableStartProcess);
528 }
529 
GetBundleNameByPid(const int pid,std::string & bundleName,int32_t & uid)530 int32_t AmsMgrScheduler::GetBundleNameByPid(const int pid, std::string &bundleName, int32_t &uid)
531 {
532     if (!IsReady()) {
533         return ERR_INVALID_OPERATION;
534     }
535     return amsMgrServiceInner_->GetBundleNameByPid(pid, bundleName, uid);
536 }
537 
RegisterAppDebugListener(const sptr<IAppDebugListener> & listener)538 int32_t AmsMgrScheduler::RegisterAppDebugListener(const sptr<IAppDebugListener> &listener)
539 {
540     if (!IsReady()) {
541         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
542         return ERR_INVALID_OPERATION;
543     }
544     return amsMgrServiceInner_->RegisterAppDebugListener(listener);
545 }
546 
UnregisterAppDebugListener(const sptr<IAppDebugListener> & listener)547 int32_t AmsMgrScheduler::UnregisterAppDebugListener(const sptr<IAppDebugListener> &listener)
548 {
549     if (!IsReady()) {
550         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
551         return ERR_INVALID_OPERATION;
552     }
553     return amsMgrServiceInner_->UnregisterAppDebugListener(listener);
554 }
555 
AttachAppDebug(const std::string & bundleName)556 int32_t AmsMgrScheduler::AttachAppDebug(const std::string &bundleName)
557 {
558     if (!IsReady()) {
559         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
560         return ERR_INVALID_OPERATION;
561     }
562     return amsMgrServiceInner_->AttachAppDebug(bundleName);
563 }
564 
DetachAppDebug(const std::string & bundleName)565 int32_t AmsMgrScheduler::DetachAppDebug(const std::string &bundleName)
566 {
567     if (!IsReady()) {
568         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
569         return ERR_INVALID_OPERATION;
570     }
571     return amsMgrServiceInner_->DetachAppDebug(bundleName);
572 }
573 
SetAppWaitingDebug(const std::string & bundleName,bool isPersist)574 int32_t AmsMgrScheduler::SetAppWaitingDebug(const std::string &bundleName, bool isPersist)
575 {
576     if (!IsReady()) {
577         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
578         return ERR_INVALID_OPERATION;
579     }
580     return amsMgrServiceInner_->SetAppWaitingDebug(bundleName, isPersist);
581 }
582 
CancelAppWaitingDebug()583 int32_t AmsMgrScheduler::CancelAppWaitingDebug()
584 {
585     if (!IsReady()) {
586         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
587         return ERR_INVALID_OPERATION;
588     }
589     return amsMgrServiceInner_->CancelAppWaitingDebug();
590 }
591 
GetWaitingDebugApp(std::vector<std::string> & debugInfoList)592 int32_t AmsMgrScheduler::GetWaitingDebugApp(std::vector<std::string> &debugInfoList)
593 {
594     if (!IsReady()) {
595         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
596         return ERR_INVALID_OPERATION;
597     }
598     return amsMgrServiceInner_->GetWaitingDebugApp(debugInfoList);
599 }
600 
IsWaitingDebugApp(const std::string & bundleName)601 bool AmsMgrScheduler::IsWaitingDebugApp(const std::string &bundleName)
602 {
603     if (!IsReady()) {
604         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
605         return false;
606     }
607     return amsMgrServiceInner_->IsWaitingDebugApp(bundleName);
608 }
609 
ClearNonPersistWaitingDebugFlag()610 void AmsMgrScheduler::ClearNonPersistWaitingDebugFlag()
611 {
612     if (!IsReady()) {
613         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
614         return;
615     }
616     amsMgrServiceInner_->ClearNonPersistWaitingDebugFlag();
617 }
618 
RegisterAbilityDebugResponse(const sptr<IAbilityDebugResponse> & response)619 int32_t AmsMgrScheduler::RegisterAbilityDebugResponse(const sptr<IAbilityDebugResponse> &response)
620 {
621     if (!IsReady()) {
622         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
623         return ERR_INVALID_OPERATION;
624     }
625     return amsMgrServiceInner_->RegisterAbilityDebugResponse(response);
626 }
627 
IsAttachDebug(const std::string & bundleName)628 bool AmsMgrScheduler::IsAttachDebug(const std::string &bundleName)
629 {
630     if (!IsReady()) {
631         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
632         return false;
633     }
634     return amsMgrServiceInner_->IsAttachDebug(bundleName);
635 }
636 
SetKeepAliveEnableState(const std::string & bundleName,bool enable,int32_t uid)637 void AmsMgrScheduler::SetKeepAliveEnableState(const std::string &bundleName, bool enable, int32_t uid)
638 {
639     if (!IsReady()) {
640         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
641         return;
642     }
643     amsMgrServiceInner_->SetKeepAliveEnableState(bundleName, enable, uid);
644 }
645 
ClearProcessByToken(sptr<IRemoteObject> token)646 void AmsMgrScheduler::ClearProcessByToken(sptr<IRemoteObject> token)
647 {
648     if (!IsReady()) {
649         return;
650     }
651 
652     auto callerTokenId = IPCSkeleton::GetCallingTokenID();
653     Security::AccessToken::NativeTokenInfo nativeInfo;
654     Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
655     if (nativeInfo.processName != "foundation") {
656         TAG_LOGE(AAFwkTag::APPMGR, "caller is not foundation.");
657         return;
658     }
659 
660     std::function<void()> clearProcessByTokenFunc = [amsMgrServiceInner = amsMgrServiceInner_, token]() {
661         amsMgrServiceInner->ClearProcessByToken(token);
662     };
663     amsHandler_->SubmitTask(clearProcessByTokenFunc, TASK_CLEAR_PROCESS_BY_ABILITY_TOKEN);
664 }
665 
IsMemorySizeSufficent()666 bool AmsMgrScheduler::IsMemorySizeSufficent()
667 {
668     if (!IsReady()) {
669         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
670         return true;
671     }
672     if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
673         TAG_LOGE(AAFwkTag::APPMGR, "Permission verification failed.");
674         return true;
675     }
676     return amsMgrServiceInner_->IsMemorySizeSufficent();
677 }
678 
AttachedToStatusBar(const sptr<IRemoteObject> & token)679 void AmsMgrScheduler::AttachedToStatusBar(const sptr<IRemoteObject> &token)
680 {
681     if (!IsReady()) {
682         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
683         return;
684     }
685     auto callerTokenId = IPCSkeleton::GetCallingTokenID();
686     Security::AccessToken::NativeTokenInfo nativeInfo;
687     Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
688     if (nativeInfo.processName != "foundation") {
689         TAG_LOGE(AAFwkTag::APPMGR, "caller is not foundation.");
690         return;
691     }
692     std::function<void()> attachedToStatusBarFunc =
693         std::bind(&AppMgrServiceInner::AttachedToStatusBar, amsMgrServiceInner_, token);
694     amsHandler_->SubmitTask(attachedToStatusBarFunc, TASK_ATTACHED_TO_STATUS_BAR);
695 }
696 
BlockProcessCacheByPids(const std::vector<int32_t> & pids)697 void AmsMgrScheduler::BlockProcessCacheByPids(const std::vector<int32_t> &pids)
698 {
699     if (!IsReady()) {
700         return;
701     }
702 
703     pid_t callingPid = IPCSkeleton::GetCallingPid();
704     pid_t pid = getprocpid();
705     if (callingPid != pid) {
706         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
707         return;
708     }
709 
710     std::function<void()> blockProcCacheFunc = [amsMgrServiceInner = amsMgrServiceInner_, pids]() mutable {
711         amsMgrServiceInner->BlockProcessCacheByPids(pids);
712     };
713     amsHandler_->SubmitTask(blockProcCacheFunc, TASK_BLOCK_PROCESS_CACHE_BY_PIDS);
714 }
715 
IsKilledForUpgradeWeb(const std::string & bundleName)716 bool AmsMgrScheduler::IsKilledForUpgradeWeb(const std::string &bundleName)
717 {
718     if (!IsReady()) {
719         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
720         return false;
721     }
722     return amsMgrServiceInner_->IsKilledForUpgradeWeb(bundleName);
723 }
724 
CleanAbilityByUserRequest(const sptr<IRemoteObject> & token)725 bool AmsMgrScheduler::CleanAbilityByUserRequest(const sptr<IRemoteObject> &token)
726 {
727     if (!IsReady()) {
728         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
729         return false;
730     }
731 
732     if (IPCSkeleton::GetCallingPid() != getprocpid()) {
733         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
734         return false;
735     }
736     return amsMgrServiceInner_->CleanAbilityByUserRequest(token);
737 }
IsProcessContainsOnlyUIAbility(const pid_t pid)738 bool AmsMgrScheduler::IsProcessContainsOnlyUIAbility(const pid_t pid)
739 {
740     if (!IsReady()) {
741         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
742         return false;
743     }
744     pid_t callingPid = IPCSkeleton::GetCallingPid();
745     pid_t procPid = getprocpid();
746     if (callingPid != procPid) {
747         TAG_LOGE(AAFwkTag::APPMGR, "Not allow other process to call.");
748         return false;
749     }
750     return amsMgrServiceInner_->IsProcessContainsOnlyUIAbility(pid);
751 }
752 
IsProcessAttached(sptr<IRemoteObject> token)753 bool AmsMgrScheduler::IsProcessAttached(sptr<IRemoteObject> token)
754 {
755     if (!IsReady()) {
756         TAG_LOGE(AAFwkTag::APPMGR, "AmsMgrService is not ready.");
757         return false;
758     }
759     return amsMgrServiceInner_->IsProcessAttached(token);
760 }
761 } // namespace AppExecFwk
762 }  // namespace OHOS
763