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