• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 "app_mgr_service.h"
17 
18 #include <chrono>
19 #include <nlohmann/json.hpp>
20 #include <sys/types.h>
21 #include <thread>
22 
23 #include "app_death_recipient.h"
24 #include "app_mgr_constants.h"
25 #include "datetime_ex.h"
26 #include "hilog_wrapper.h"
27 #include "in_process_call_wrapper.h"
28 #include "ipc_skeleton.h"
29 #include "perf_profile.h"
30 #include "permission_constants.h"
31 #include "permission_verification.h"
32 #include "system_ability_definition.h"
33 
34 namespace OHOS {
35 namespace AppExecFwk {
36 namespace {
37 using namespace std::chrono_literals;
38 #ifdef ABILITY_COMMAND_FOR_TEST
39 static const int APP_MS_BLOCK = 65;
40 #endif
41 const std::string TASK_INIT_APPMGRSERVICEINNER = "InitAppMgrServiceInnerTask";
42 const std::string TASK_ATTACH_APPLICATION = "AttachApplicationTask";
43 const std::string TASK_APPLICATION_FOREGROUNDED = "ApplicationForegroundedTask";
44 const std::string TASK_APPLICATION_BACKGROUNDED = "ApplicationBackgroundedTask";
45 const std::string TASK_APPLICATION_TERMINATED = "ApplicationTerminatedTask";
46 const std::string TASK_ABILITY_CLEANED = "AbilityCleanedTask";
47 const std::string TASK_ADD_APP_DEATH_RECIPIENT = "AddAppRecipientTask";
48 const std::string TASK_CLEAR_UP_APPLICATION_DATA = "ClearUpApplicationDataTask";
49 const std::string TASK_STARTUP_RESIDENT_PROCESS = "StartupResidentProcess";
50 const std::string TASK_ADD_ABILITY_STAGE_DONE = "AddAbilityStageDone";
51 const std::string TASK_START_USER_TEST_PROCESS = "StartUserTestProcess";
52 const std::string TASK_FINISH_USER_TEST = "FinishUserTest";
53 const std::string TASK_ATTACH_RENDER_PROCESS = "AttachRenderTask";
54 const std::string TASK_ATTACH_CHILD_PROCESS = "AttachChildProcessTask";
55 const std::string TASK_EXIT_CHILD_PROCESS_SAFELY = "ExitChildProcessSafelyTask";
56 }  // namespace
57 
58 REGISTER_SYSTEM_ABILITY_BY_ID(AppMgrService, APP_MGR_SERVICE_ID, true);
59 
AppMgrService()60 AppMgrService::AppMgrService()
61 {
62     appMgrServiceInner_ = std::make_shared<AppMgrServiceInner>();
63     HILOG_INFO("instance created with no para");
64     PerfProfile::GetInstance().SetAmsLoadStartTime(GetTickCount());
65 }
66 
AppMgrService(const int32_t serviceId,bool runOnCreate)67 AppMgrService::AppMgrService(const int32_t serviceId, bool runOnCreate) : SystemAbility(serviceId, runOnCreate)
68 {
69     appMgrServiceInner_ = std::make_shared<AppMgrServiceInner>();
70     HILOG_INFO("instance created");
71     PerfProfile::GetInstance().SetAmsLoadStartTime(GetTickCount());
72 }
73 
~AppMgrService()74 AppMgrService::~AppMgrService()
75 {
76     HILOG_INFO("instance destroyed");
77 }
78 
OnStart()79 void AppMgrService::OnStart()
80 {
81     HILOG_INFO("ready to start service");
82     if (appMgrServiceState_.serviceRunningState == ServiceRunningState::STATE_RUNNING) {
83         HILOG_WARN("failed to start service since it's already running");
84         return;
85     }
86 
87     ErrCode errCode = Init();
88     if (FAILED(errCode)) {
89         HILOG_ERROR("init failed, errCode: %{public}08x", errCode);
90         return;
91     }
92     appMgrServiceState_.serviceRunningState = ServiceRunningState::STATE_RUNNING;
93     AddSystemAbilityListener(WINDOW_MANAGER_SERVICE_ID);
94     HILOG_INFO("start service success");
95     PerfProfile::GetInstance().SetAmsLoadEndTime(GetTickCount());
96     PerfProfile::GetInstance().Dump();
97 }
98 
OnStop()99 void AppMgrService::OnStop()
100 {
101     HILOG_INFO("ready to stop service");
102     appMgrServiceState_.serviceRunningState = ServiceRunningState::STATE_NOT_START;
103     eventHandler_.reset();
104     taskHandler_.reset();
105     if (appMgrServiceInner_) {
106         appMgrServiceInner_->OnStop();
107     }
108     HILOG_INFO("stop service success");
109 }
110 
SetInnerService(const std::shared_ptr<AppMgrServiceInner> & innerService)111 void AppMgrService::SetInnerService(const std::shared_ptr<AppMgrServiceInner> &innerService)
112 {
113     appMgrServiceInner_ = innerService;
114 }
115 
QueryServiceState()116 AppMgrServiceState AppMgrService::QueryServiceState()
117 {
118     if (appMgrServiceInner_) {
119         appMgrServiceState_.connectionState = appMgrServiceInner_->QueryAppSpawnConnectionState();
120     }
121     return appMgrServiceState_;
122 }
123 
Init()124 ErrCode AppMgrService::Init()
125 {
126     HILOG_INFO("ready to init");
127     if (!appMgrServiceInner_) {
128         HILOG_ERROR("init failed without inner service");
129         return ERR_INVALID_OPERATION;
130     }
131 
132     taskHandler_ = AAFwk::TaskHandlerWrap::CreateQueueHandler("app_mgr_task_queue");
133     eventHandler_ = std::make_shared<AMSEventHandler>(taskHandler_, appMgrServiceInner_);
134     appMgrServiceInner_->SetTaskHandler(taskHandler_);
135     appMgrServiceInner_->SetEventHandler(eventHandler_);
136     std::function<void()> initAppMgrServiceInnerTask =
137         std::bind(&AppMgrServiceInner::Init, appMgrServiceInner_);
138     taskHandler_->SubmitTask(initAppMgrServiceInnerTask, TASK_INIT_APPMGRSERVICEINNER);
139 
140     ErrCode openErr = appMgrServiceInner_->OpenAppSpawnConnection();
141     if (FAILED(openErr)) {
142         HILOG_WARN("failed to connect to AppSpawnDaemon! errCode: %{public}08x", openErr);
143     }
144     if (!Publish(this)) {
145         HILOG_ERROR("failed to publish app mgr service to systemAbilityMgr");
146         return ERR_APPEXECFWK_SERVICE_NOT_CONNECTED;
147     }
148     amsMgrScheduler_ = new (std::nothrow) AmsMgrScheduler(appMgrServiceInner_, taskHandler_);
149     if (!amsMgrScheduler_) {
150         HILOG_ERROR("init failed without ams scheduler");
151         return ERR_INVALID_OPERATION;
152     }
153     HILOG_INFO("init success");
154     return ERR_OK;
155 }
156 
CheckPermission(const int32_t recordId,const std::string & permission)157 int32_t AppMgrService::CheckPermission([[maybe_unused]]
158     const int32_t recordId, [[maybe_unused]] const std::string &permission)
159 {
160     HILOG_INFO("check application's permission");
161 
162     return ERR_OK;
163 }
164 
AttachApplication(const sptr<IRemoteObject> & app)165 void AppMgrService::AttachApplication(const sptr<IRemoteObject> &app)
166 {
167     HILOG_DEBUG("called");
168     if (!IsReady()) {
169         HILOG_ERROR("AttachApplication failed, not ready.");
170         return;
171     }
172 
173     pid_t pid = IPCSkeleton::GetCallingPid();
174     std::function<void()> attachApplicationFunc =
175         std::bind(&AppMgrServiceInner::AttachApplication, appMgrServiceInner_, pid, iface_cast<IAppScheduler>(app));
176     taskHandler_->SubmitTask(attachApplicationFunc, AAFwk::TaskAttribute{
177         .taskName_ = TASK_ATTACH_APPLICATION,
178         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
179     });
180 }
181 
ApplicationForegrounded(const int32_t recordId)182 void AppMgrService::ApplicationForegrounded(const int32_t recordId)
183 {
184     if (!IsReady()) {
185         return;
186     }
187     if (!JudgeAppSelfCalled(recordId)) {
188         return;
189     }
190     std::function<void()> applicationForegroundedFunc =
191         std::bind(&AppMgrServiceInner::ApplicationForegrounded, appMgrServiceInner_, recordId);
192     taskHandler_->SubmitTask(applicationForegroundedFunc, AAFwk::TaskAttribute{
193         .taskName_ = TASK_APPLICATION_FOREGROUNDED,
194         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
195     });
196 }
197 
ApplicationBackgrounded(const int32_t recordId)198 void AppMgrService::ApplicationBackgrounded(const int32_t recordId)
199 {
200     if (!IsReady()) {
201         return;
202     }
203     if (!JudgeAppSelfCalled(recordId)) {
204         return;
205     }
206     std::function<void()> applicationBackgroundedFunc =
207         std::bind(&AppMgrServiceInner::ApplicationBackgrounded, appMgrServiceInner_, recordId);
208     taskHandler_->SubmitTask(applicationBackgroundedFunc, AAFwk::TaskAttribute{
209         .taskName_ = TASK_APPLICATION_BACKGROUNDED,
210         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
211     });
212 }
213 
ApplicationTerminated(const int32_t recordId)214 void AppMgrService::ApplicationTerminated(const int32_t recordId)
215 {
216     if (!IsReady()) {
217         return;
218     }
219     if (!JudgeAppSelfCalled(recordId)) {
220         return;
221     }
222     std::function<void()> applicationTerminatedFunc =
223         std::bind(&AppMgrServiceInner::ApplicationTerminated, appMgrServiceInner_, recordId);
224     taskHandler_->SubmitTask(applicationTerminatedFunc, AAFwk::TaskAttribute{
225         .taskName_ = TASK_APPLICATION_TERMINATED,
226         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
227     });
228 }
229 
AbilityCleaned(const sptr<IRemoteObject> & token)230 void AppMgrService::AbilityCleaned(const sptr<IRemoteObject> &token)
231 {
232     if (!IsReady()) {
233         return;
234     }
235 
236     auto callerUid = IPCSkeleton::GetCallingUid();
237     auto appRecord = appMgrServiceInner_->GetTerminatingAppRunningRecord(token);
238     if (!appRecord || appRecord->GetUid() != callerUid) {
239         HILOG_ERROR("Permission verification failed.");
240         return;
241     }
242 
243     std::function<void()> abilityCleanedFunc =
244         std::bind(&AppMgrServiceInner::AbilityTerminated, appMgrServiceInner_, token);
245     taskHandler_->SubmitTask(abilityCleanedFunc, AAFwk::TaskAttribute{
246         .taskName_ = TASK_ABILITY_CLEANED,
247         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
248     });
249 }
250 
IsReady() const251 bool AppMgrService::IsReady() const
252 {
253     if (appMgrServiceInner_ && taskHandler_ && eventHandler_) {
254         return true;
255     }
256 
257     HILOG_WARN("Not ready");
258     return false;
259 }
260 
StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> & bundleInfos)261 void AppMgrService::StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> &bundleInfos)
262 {
263     if (!IsReady()) {
264         return;
265     }
266     pid_t callingPid = IPCSkeleton::GetCallingPid();
267     pid_t pid = getpid();
268     if (callingPid != pid) {
269         HILOG_ERROR("Not this process call.");
270         return;
271     }
272     HILOG_INFO("Notify start resident process");
273     std::function <void()> startupResidentProcess =
274         std::bind(&AppMgrServiceInner::LoadResidentProcess, appMgrServiceInner_, bundleInfos);
275     taskHandler_->SubmitTask(startupResidentProcess, AAFwk::TaskAttribute{
276         .taskName_ = TASK_STARTUP_RESIDENT_PROCESS,
277         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
278     });
279 }
280 
GetAmsMgr()281 sptr<IAmsMgr> AppMgrService::GetAmsMgr()
282 {
283     return amsMgrScheduler_;
284 }
285 
ClearUpApplicationData(const std::string & bundleName,const int32_t userId)286 int32_t AppMgrService::ClearUpApplicationData(const std::string &bundleName, const int32_t userId)
287 {
288     if (!IsReady()) {
289         return ERR_INVALID_OPERATION;
290     }
291     std::shared_ptr<RemoteClientManager> remoteClientManager = std::make_shared<RemoteClientManager>();
292     if (remoteClientManager == nullptr) {
293         HILOG_ERROR("The remoteClientManager is nullptr.");
294         return ERR_INVALID_OPERATION;
295     }
296     auto bundleMgrHelper = remoteClientManager->GetBundleManagerHelper();
297     if (bundleMgrHelper == nullptr) {
298         HILOG_ERROR("The bundleMgrHelper is nullptr.");
299         return ERR_INVALID_OPERATION;
300     }
301     int32_t callingUid = IPCSkeleton::GetCallingUid();
302     if (callingUid != 0 || userId < 0) {
303         std::string callerBundleName;
304         auto result = IN_PROCESS_CALL(bundleMgrHelper->GetNameForUid(callingUid, callerBundleName));
305         if (result != ERR_OK) {
306             HILOG_ERROR("GetBundleName failed: %{public}d.", result);
307             return ERR_INVALID_OPERATION;
308         }
309         auto isCallingPerm = AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(
310             AAFwk::PermissionConstants::PERMISSION_CLEAN_APPLICATION_DATA);
311         if (!isCallingPerm) {
312             HILOG_ERROR("Permission verification failed");
313             return ERR_PERMISSION_DENIED;
314         }
315     }
316     int32_t uid = IPCSkeleton::GetCallingUid();
317     pid_t pid = IPCSkeleton::GetCallingPid();
318     appMgrServiceInner_->ClearUpApplicationData(bundleName, uid, pid, userId);
319     return ERR_OK;
320 }
321 
ClearUpApplicationDataBySelf(int32_t userId)322 int32_t AppMgrService::ClearUpApplicationDataBySelf(int32_t userId)
323 {
324     if (!IsReady()) {
325         return ERR_INVALID_OPERATION;
326     }
327     int32_t uid = IPCSkeleton::GetCallingUid();
328     pid_t pid = IPCSkeleton::GetCallingPid();
329     return appMgrServiceInner_->ClearUpApplicationDataBySelf(uid, pid, userId);
330 }
331 
GetAllRunningProcesses(std::vector<RunningProcessInfo> & info)332 int32_t AppMgrService::GetAllRunningProcesses(std::vector<RunningProcessInfo> &info)
333 {
334     if (!IsReady()) {
335         return ERR_INVALID_OPERATION;
336     }
337     return appMgrServiceInner_->GetAllRunningProcesses(info);
338 }
339 
GetAllRenderProcesses(std::vector<RenderProcessInfo> & info)340 int32_t AppMgrService::GetAllRenderProcesses(std::vector<RenderProcessInfo> &info)
341 {
342     if (!IsReady()) {
343         return ERR_INVALID_OPERATION;
344     }
345     return appMgrServiceInner_->GetAllRenderProcesses(info);
346 }
347 
JudgeSandboxByPid(pid_t pid,bool & isSandbox)348 int32_t AppMgrService::JudgeSandboxByPid(pid_t pid, bool &isSandbox)
349 {
350     if (!IsReady()) {
351         HILOG_ERROR("AppMgrService is not ready.");
352         return ERR_INVALID_OPERATION;
353     }
354     auto appRunningRecord = appMgrServiceInner_->GetAppRunningRecordByPid(pid);
355     if (appRunningRecord && appRunningRecord->GetAppIndex() > 0) {
356         isSandbox = true;
357         HILOG_DEBUG("current app is a sandbox.");
358         return ERR_OK;
359     }
360     HILOG_DEBUG("current app is not a sandbox.");
361     return ERR_OK;
362 }
363 
GetProcessRunningInfosByUserId(std::vector<RunningProcessInfo> & info,int32_t userId)364 int32_t AppMgrService::GetProcessRunningInfosByUserId(std::vector<RunningProcessInfo> &info, int32_t userId)
365 {
366     if (!IsReady()) {
367         return ERR_INVALID_OPERATION;
368     }
369     return appMgrServiceInner_->GetProcessRunningInfosByUserId(info, userId);
370 }
371 
GetProcessRunningInformation(RunningProcessInfo & info)372 int32_t AppMgrService::GetProcessRunningInformation(RunningProcessInfo &info)
373 {
374     if (!IsReady()) {
375         return ERR_INVALID_OPERATION;
376     }
377     return appMgrServiceInner_->GetProcessRunningInformation(info);
378 }
379 
NotifyMemoryLevel(int32_t level)380 int32_t AppMgrService::NotifyMemoryLevel(int32_t level)
381 {
382     if (!IsReady()) {
383         return ERR_INVALID_OPERATION;
384     }
385     return appMgrServiceInner_->NotifyMemoryLevel(level);
386 }
387 
DumpHeapMemory(const int32_t pid,OHOS::AppExecFwk::MallocInfo & mallocInfo)388 int32_t AppMgrService::DumpHeapMemory(const int32_t pid, OHOS::AppExecFwk::MallocInfo &mallocInfo)
389 {
390     if (!IsReady()) {
391         return ERR_INVALID_OPERATION;
392     }
393     return appMgrServiceInner_->DumpHeapMemory(pid, mallocInfo);
394 }
395 
AddAbilityStageDone(const int32_t recordId)396 void AppMgrService::AddAbilityStageDone(const int32_t recordId)
397 {
398     if (!IsReady()) {
399         return;
400     }
401     if (!JudgeAppSelfCalled(recordId)) {
402         return;
403     }
404     std::function <void()> addAbilityStageDone =
405         std::bind(&AppMgrServiceInner::AddAbilityStageDone, appMgrServiceInner_, recordId);
406     taskHandler_->SubmitTask(addAbilityStageDone, AAFwk::TaskAttribute{
407         .taskName_ = TASK_ADD_ABILITY_STAGE_DONE,
408         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
409     });
410 }
411 
RegisterApplicationStateObserver(const sptr<IApplicationStateObserver> & observer,const std::vector<std::string> & bundleNameList)412 int32_t AppMgrService::RegisterApplicationStateObserver(const sptr<IApplicationStateObserver> &observer,
413     const std::vector<std::string> &bundleNameList)
414 {
415     HILOG_DEBUG("begin");
416     if (!IsReady()) {
417         HILOG_ERROR("not ready");
418         return ERR_INVALID_OPERATION;
419     }
420     return appMgrServiceInner_->RegisterApplicationStateObserver(observer, bundleNameList);
421 }
422 
UnregisterApplicationStateObserver(const sptr<IApplicationStateObserver> & observer)423 int32_t AppMgrService::UnregisterApplicationStateObserver(const sptr<IApplicationStateObserver> &observer)
424 {
425     HILOG_DEBUG("begin");
426     if (!IsReady()) {
427         HILOG_ERROR("not ready");
428         return ERR_INVALID_OPERATION;
429     }
430     return appMgrServiceInner_->UnregisterApplicationStateObserver(observer);
431 }
432 
RegisterAbilityForegroundStateObserver(const sptr<IAbilityForegroundStateObserver> & observer)433 int32_t AppMgrService::RegisterAbilityForegroundStateObserver(const sptr<IAbilityForegroundStateObserver> &observer)
434 {
435     HILOG_DEBUG("Called.");
436     if (!IsReady()) {
437         HILOG_ERROR("Not ready.");
438         return ERR_INVALID_OPERATION;
439     }
440     return appMgrServiceInner_->RegisterAbilityForegroundStateObserver(observer);
441 }
442 
UnregisterAbilityForegroundStateObserver(const sptr<IAbilityForegroundStateObserver> & observer)443 int32_t AppMgrService::UnregisterAbilityForegroundStateObserver(const sptr<IAbilityForegroundStateObserver> &observer)
444 {
445     HILOG_DEBUG("Called.");
446     if (!IsReady()) {
447         HILOG_ERROR("Not ready.");
448         return ERR_INVALID_OPERATION;
449     }
450     return appMgrServiceInner_->UnregisterAbilityForegroundStateObserver(observer);
451 }
452 
GetForegroundApplications(std::vector<AppStateData> & list)453 int32_t AppMgrService::GetForegroundApplications(std::vector<AppStateData> &list)
454 {
455     HILOG_DEBUG("begin");
456     if (!IsReady()) {
457         HILOG_ERROR("not ready");
458         return ERR_INVALID_OPERATION;
459     }
460     return appMgrServiceInner_->GetForegroundApplications(list);
461 }
462 
StartUserTestProcess(const AAFwk::Want & want,const sptr<IRemoteObject> & observer,const AppExecFwk::BundleInfo & bundleInfo,int32_t userId)463 int AppMgrService::StartUserTestProcess(const AAFwk::Want &want, const sptr<IRemoteObject> &observer,
464     const AppExecFwk::BundleInfo &bundleInfo, int32_t userId)
465 {
466     if (!IsReady()) {
467         HILOG_ERROR("not ready");
468         return ERR_INVALID_OPERATION;
469     }
470     if (!AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
471         HILOG_ERROR("StartUserTestProcess is not shell call.");
472         return ERR_INVALID_OPERATION;
473     }
474     std::function<void()> startUserTestProcessFunc =
475         std::bind(&AppMgrServiceInner::StartUserTestProcess, appMgrServiceInner_, want, observer, bundleInfo, userId);
476     taskHandler_->SubmitTask(startUserTestProcessFunc, TASK_START_USER_TEST_PROCESS);
477     return ERR_OK;
478 }
479 
FinishUserTest(const std::string & msg,const int64_t & resultCode,const std::string & bundleName)480 int AppMgrService::FinishUserTest(const std::string &msg, const int64_t &resultCode, const std::string &bundleName)
481 {
482     if (!IsReady()) {
483         HILOG_ERROR("Not ready");
484         return ERR_INVALID_OPERATION;
485     }
486     std::shared_ptr<RemoteClientManager> remoteClientManager = std::make_shared<RemoteClientManager>();
487     if (remoteClientManager == nullptr) {
488         HILOG_ERROR("The remoteClientManager is nullptr.");
489         return ERR_INVALID_OPERATION;
490     }
491     auto bundleMgrHelper = remoteClientManager->GetBundleManagerHelper();
492     if (bundleMgrHelper == nullptr) {
493         HILOG_ERROR("The bundleMgrHelper is nullptr.");
494         return ERR_INVALID_OPERATION;
495     }
496     int32_t callingUid = IPCSkeleton::GetCallingUid();
497     std::string callerBundleName;
498     auto result = IN_PROCESS_CALL(bundleMgrHelper->GetNameForUid(callingUid, callerBundleName));
499     if (result == ERR_OK) {
500         HILOG_INFO("The callingPid_ is %{public}s.", callerBundleName.c_str());
501         if (bundleName != callerBundleName) {
502             HILOG_ERROR("Not this process call.");
503             return ERR_INVALID_OPERATION;
504         }
505     } else {
506         HILOG_ERROR("GetBundleName failed: %{public}d.", result);
507         return ERR_INVALID_OPERATION;
508     }
509     pid_t callingPid = IPCSkeleton::GetCallingPid();
510     std::function<void()> finishUserTestProcessFunc =
511         std::bind(&AppMgrServiceInner::FinishUserTest, appMgrServiceInner_, msg, resultCode, bundleName, callingPid);
512     taskHandler_->SubmitTask(finishUserTestProcessFunc, TASK_FINISH_USER_TEST);
513     return ERR_OK;
514 }
515 
Dump(int fd,const std::vector<std::u16string> & args)516 int AppMgrService::Dump(int fd, const std::vector<std::u16string>& args)
517 {
518     if (!IsReady()) {
519         HILOG_ERROR("not ready.");
520         return ERR_APPEXECFWK_HIDUMP_ERROR;
521     }
522 
523     std::string result;
524     Dump(args, result);
525     int ret = dprintf(fd, "%s\n", result.c_str());
526     if (ret < 0) {
527         HILOG_ERROR("dprintf error.");
528         return ERR_APPEXECFWK_HIDUMP_ERROR;
529     }
530     return ERR_OK;
531 }
532 
Dump(const std::vector<std::u16string> & args,std::string & result) const533 void AppMgrService::Dump(const std::vector<std::u16string>& args, std::string& result) const
534 {
535     auto size = args.size();
536     if (size == 0) {
537         ShowHelp(result);
538         return;
539     }
540 
541     std::string optionKey = Str16ToStr8(args[0]);
542     if (optionKey != "-h") {
543         result.append("error: unkown option.\n");
544     }
545     ShowHelp(result);
546 }
547 
ShowHelp(std::string & result) const548 void AppMgrService::ShowHelp(std::string& result) const
549 {
550     result.append("Usage:\n")
551         .append("-h                          ")
552         .append("help text for the tool\n");
553 }
554 
ScheduleAcceptWantDone(const int32_t recordId,const AAFwk::Want & want,const std::string & flag)555 void AppMgrService::ScheduleAcceptWantDone(const int32_t recordId, const AAFwk::Want &want, const std::string &flag)
556 {
557     if (!IsReady()) {
558         HILOG_ERROR("not ready");
559         return;
560     }
561     if (!JudgeAppSelfCalled(recordId)) {
562         return;
563     }
564     auto task = [=]() { appMgrServiceInner_->ScheduleAcceptWantDone(recordId, want, flag); };
565     taskHandler_->SubmitTask(task);
566 }
567 
ScheduleNewProcessRequestDone(const int32_t recordId,const AAFwk::Want & want,const std::string & flag)568 void AppMgrService::ScheduleNewProcessRequestDone(const int32_t recordId, const AAFwk::Want &want,
569     const std::string &flag)
570 {
571     if (!IsReady()) {
572         HILOG_ERROR("not ready");
573         return;
574     }
575     if (!JudgeAppSelfCalled(recordId)) {
576         return;
577     }
578     auto task = [=]() { appMgrServiceInner_->ScheduleNewProcessRequestDone(recordId, want, flag); };
579     taskHandler_->SubmitTask(task, AAFwk::TaskQoS::USER_INTERACTIVE);
580 }
581 
GetAbilityRecordsByProcessID(const int pid,std::vector<sptr<IRemoteObject>> & tokens)582 int AppMgrService::GetAbilityRecordsByProcessID(const int pid, std::vector<sptr<IRemoteObject>> &tokens)
583 {
584     if (!IsReady()) {
585         HILOG_ERROR("not ready");
586         return ERR_INVALID_OPERATION;
587     }
588     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
589     if (!isSaCall) {
590         HILOG_ERROR("Not SA call.");
591         return ERR_INVALID_OPERATION;
592     }
593     return appMgrServiceInner_->GetAbilityRecordsByProcessID(pid, tokens);
594 }
595 
PreStartNWebSpawnProcess()596 int32_t AppMgrService::PreStartNWebSpawnProcess()
597 {
598     HILOG_INFO("PreStartNWebSpawnProcess");
599     if (!IsReady()) {
600         HILOG_ERROR("PreStartNWebSpawnProcess failed, AppMgrService not ready.");
601         return ERR_INVALID_OPERATION;
602     }
603 
604     return appMgrServiceInner_->PreStartNWebSpawnProcess(IPCSkeleton::GetCallingPid());
605 }
606 
StartRenderProcess(const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,int32_t crashFd,pid_t & renderPid)607 int32_t AppMgrService::StartRenderProcess(const std::string &renderParam, int32_t ipcFd,
608     int32_t sharedFd, int32_t crashFd, pid_t &renderPid)
609 {
610     if (!IsReady()) {
611         HILOG_ERROR("StartRenderProcess failed, AppMgrService not ready.");
612         return ERR_INVALID_OPERATION;
613     }
614 
615     return appMgrServiceInner_->StartRenderProcess(IPCSkeleton::GetCallingPid(),
616         renderParam, ipcFd, sharedFd, crashFd, renderPid);
617 }
618 
AttachRenderProcess(const sptr<IRemoteObject> & scheduler)619 void AppMgrService::AttachRenderProcess(const sptr<IRemoteObject> &scheduler)
620 {
621     HILOG_DEBUG("AttachRenderProcess called.");
622     if (!IsReady()) {
623         HILOG_ERROR("AttachRenderProcess failed, not ready.");
624         return;
625     }
626 
627     auto pid = IPCSkeleton::GetCallingPid();
628     auto fun = std::bind(&AppMgrServiceInner::AttachRenderProcess,
629         appMgrServiceInner_, pid, iface_cast<IRenderScheduler>(scheduler));
630     taskHandler_->SubmitTask(fun, AAFwk::TaskAttribute{
631         .taskName_ = TASK_ATTACH_RENDER_PROCESS,
632         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
633     });
634 }
635 
GetRenderProcessTerminationStatus(pid_t renderPid,int & status)636 int32_t AppMgrService::GetRenderProcessTerminationStatus(pid_t renderPid, int &status)
637 {
638     if (!IsReady()) {
639         HILOG_ERROR("GetRenderProcessTerminationStatus failed, AppMgrService not ready.");
640         return ERR_INVALID_OPERATION;
641     }
642 
643     return appMgrServiceInner_->GetRenderProcessTerminationStatus(renderPid, status);
644 }
645 
GetConfiguration(Configuration & config)646 int32_t AppMgrService::GetConfiguration(Configuration& config)
647 {
648     if (!IsReady()) {
649         HILOG_ERROR("GetConfiguration failed, AppMgrService not ready.");
650         return ERR_INVALID_OPERATION;
651     }
652     config = *(appMgrServiceInner_->GetConfiguration());
653     return ERR_OK;
654 }
655 
UpdateConfiguration(const Configuration & config)656 int32_t AppMgrService::UpdateConfiguration(const Configuration& config)
657 {
658     if (!IsReady()) {
659         HILOG_ERROR("UpdateConfiguration failed, AppMgrService not ready.");
660         return ERR_INVALID_OPERATION;
661     }
662     return appMgrServiceInner_->UpdateConfiguration(config);
663 }
664 
RegisterConfigurationObserver(const sptr<IConfigurationObserver> & observer)665 int32_t AppMgrService::RegisterConfigurationObserver(const sptr<IConfigurationObserver> &observer)
666 {
667     if (!IsReady()) {
668         HILOG_ERROR("RegisterConfigurationObserver failed, AppMgrService not ready.");
669         return ERR_INVALID_OPERATION;
670     }
671     return appMgrServiceInner_->RegisterConfigurationObserver(observer);
672 }
673 
UnregisterConfigurationObserver(const sptr<IConfigurationObserver> & observer)674 int32_t AppMgrService::UnregisterConfigurationObserver(const sptr<IConfigurationObserver> &observer)
675 {
676     if (!IsReady()) {
677         HILOG_ERROR("UnregisterConfigurationObserver failed, AppMgrService not ready.");
678         return ERR_INVALID_OPERATION;
679     }
680     return appMgrServiceInner_->UnregisterConfigurationObserver(observer);
681 }
682 
683 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAppService()684 int AppMgrService::BlockAppService()
685 {
686     HILOG_DEBUG("begin");
687     if (!IsReady()) {
688         return ERR_INVALID_OPERATION;
689     }
690     auto task = [=]() {
691         while (1) {
692             HILOG_DEBUG("begin block app service");
693             std::this_thread::sleep_for(APP_MS_BLOCK*1s);
694         }
695     };
696     taskHandler_->SubmitTask(task);
697     return ERR_OK;
698 }
699 #endif
700 
GetAppRunningStateByBundleName(const std::string & bundleName)701 bool AppMgrService::GetAppRunningStateByBundleName(const std::string &bundleName)
702 {
703     if (!IsReady()) {
704         HILOG_ERROR("AppMgrService is not ready.");
705         return false;
706     }
707 
708     return appMgrServiceInner_->GetAppRunningStateByBundleName(bundleName);
709 }
710 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)711 int32_t AppMgrService::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
712 {
713     if (!IsReady()) {
714         HILOG_ERROR("AppMgrService is not ready.");
715         return ERR_INVALID_OPERATION;
716     }
717     return appMgrServiceInner_->NotifyLoadRepairPatch(bundleName, callback);
718 }
719 
NotifyHotReloadPage(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)720 int32_t AppMgrService::NotifyHotReloadPage(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
721 {
722     if (!IsReady()) {
723         HILOG_ERROR("AppMgrService is not ready.");
724         return ERR_INVALID_OPERATION;
725     }
726     return appMgrServiceInner_->NotifyHotReloadPage(bundleName, callback);
727 }
728 
729 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
SetContinuousTaskProcess(int32_t pid,bool isContinuousTask)730 int32_t AppMgrService::SetContinuousTaskProcess(int32_t pid, bool isContinuousTask)
731 {
732     if (!IsReady()) {
733         HILOG_ERROR("AppMgrService is not ready.");
734         return ERR_INVALID_OPERATION;
735     }
736 
737     return appMgrServiceInner_->SetContinuousTaskProcess(pid, isContinuousTask);
738 }
739 #endif
740 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)741 int32_t AppMgrService::NotifyUnLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
742 {
743     if (!IsReady()) {
744         HILOG_ERROR("AppMgrService is not ready.");
745         return ERR_INVALID_OPERATION;
746     }
747     return appMgrServiceInner_->NotifyUnLoadRepairPatch(bundleName, callback);
748 }
749 
JudgeAppSelfCalled(int32_t recordId)750 bool AppMgrService::JudgeAppSelfCalled(int32_t recordId)
751 {
752     if (appMgrServiceInner_ == nullptr) {
753         return false;
754     }
755 
756     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
757     std::shared_ptr<AppRunningRecord> appRecord = appMgrServiceInner_->GetAppRunningRecordByAppRecordId(recordId);
758     if (appRecord == nullptr || ((appRecord->GetApplicationInfo())->accessTokenId) != callingTokenId) {
759         HILOG_ERROR("Is not self, not enabled");
760         return false;
761     }
762 
763     return true;
764 }
765 
IsSharedBundleRunning(const std::string & bundleName,uint32_t versionCode)766 bool AppMgrService::IsSharedBundleRunning(const std::string &bundleName, uint32_t versionCode)
767 {
768     if (!IsReady()) {
769         return ERR_INVALID_OPERATION;
770     }
771     return appMgrServiceInner_->IsSharedBundleRunning(bundleName, versionCode);
772 }
773 
StartNativeProcessForDebugger(const AAFwk::Want & want)774 int32_t AppMgrService::StartNativeProcessForDebugger(const AAFwk::Want &want)
775 {
776     if (!IsReady()) {
777         HILOG_ERROR("AppMgrService is not ready.");
778         return ERR_INVALID_OPERATION;
779     }
780     auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
781     if (!isShellCall) {
782         HILOG_ERROR("permission denied, only called by shell.");
783         return ERR_INVALID_OPERATION;
784     }
785     auto ret = appMgrServiceInner_->StartNativeProcessForDebugger(want);
786     if (ret != ERR_OK) {
787         HILOG_ERROR("debuggablePipe fail to start native process.");
788     }
789     return ret;
790 }
791 
GetBundleNameByPid(const int32_t pid,std::string & bundleName,int32_t & uid)792 int32_t AppMgrService::GetBundleNameByPid(const int32_t pid, std::string &bundleName, int32_t &uid)
793 {
794     if (!IsReady()) {
795         HILOG_ERROR("AppMgrService is not ready.");
796         return ERR_INVALID_OPERATION;
797     }
798     return appMgrServiceInner_->GetBundleNameByPid(pid, bundleName, uid);
799 }
800 
NotifyAppFault(const FaultData & faultData)801 int32_t AppMgrService::NotifyAppFault(const FaultData &faultData)
802 {
803     if (!IsReady()) {
804         HILOG_ERROR("AppMgrService is not ready.");
805         return ERR_INVALID_OPERATION;
806     }
807 
808     auto ret = appMgrServiceInner_->NotifyAppFault(faultData);
809     if (ret != ERR_OK) {
810         HILOG_ERROR("Notify fault data fail.");
811     }
812     return ret;
813 }
814 
NotifyAppFaultBySA(const AppFaultDataBySA & faultData)815 int32_t AppMgrService::NotifyAppFaultBySA(const AppFaultDataBySA &faultData)
816 {
817     if (!IsReady()) {
818         HILOG_ERROR("AppMgrService is not ready.");
819         return ERR_INVALID_OPERATION;
820     }
821 
822     auto ret = appMgrServiceInner_->NotifyAppFaultBySA(faultData);
823     if (ret != ERR_OK) {
824         HILOG_ERROR("Notify fault data fail.");
825     }
826     return ret;
827 }
828 
GetProcessMemoryByPid(const int32_t pid,int32_t & memorySize)829 int32_t AppMgrService::GetProcessMemoryByPid(const int32_t pid, int32_t &memorySize)
830 {
831     if (!IsReady()) {
832         HILOG_ERROR("AppMgrService is not ready.");
833         return ERR_INVALID_OPERATION;
834     }
835 
836     return appMgrServiceInner_->GetProcessMemoryByPid(pid, memorySize);
837 }
838 
GetRunningProcessInformation(const std::string & bundleName,int32_t userId,std::vector<RunningProcessInfo> & info)839 int32_t AppMgrService::GetRunningProcessInformation(const std::string &bundleName, int32_t userId,
840     std::vector<RunningProcessInfo> &info)
841 {
842     if (!IsReady()) {
843         HILOG_ERROR("AppMgrService is not ready.");
844         return ERR_INVALID_OPERATION;
845     }
846 
847     return appMgrServiceInner_->GetRunningProcessInformation(bundleName, userId, info);
848 }
849 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)850 void AppMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
851 {
852     HILOG_INFO("systemAbilityId: %{public}d add", systemAbilityId);
853     if (!IsReady()) {
854         HILOG_ERROR("AppMgrService is not ready.");
855         return;
856     }
857 
858     if (systemAbilityId != WINDOW_MANAGER_SERVICE_ID) {
859         return;
860     }
861 
862     appMgrServiceInner_->InitFocusListener();
863     appMgrServiceInner_->InitWindowVisibilityChangedListener();
864 }
865 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)866 void AppMgrService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
867 {
868     HILOG_INFO("systemAbilityId: %{public}d remove", systemAbilityId);
869     if (!IsReady()) {
870         HILOG_ERROR("AppMgrService is not ready.");
871         return;
872     }
873 
874     if (systemAbilityId != WINDOW_MANAGER_SERVICE_ID) {
875         return;
876     }
877 
878     appMgrServiceInner_->FreeFocusListener();
879     appMgrServiceInner_->FreeWindowVisibilityChangedListener();
880 }
881 
ChangeAppGcState(pid_t pid,int32_t state)882 int32_t AppMgrService::ChangeAppGcState(pid_t pid, int32_t state)
883 {
884     HILOG_DEBUG("called.");
885     if (!appMgrServiceInner_) {
886         return ERR_INVALID_VALUE;
887     }
888     return appMgrServiceInner_->ChangeAppGcState(pid, state);
889 }
890 
NotifyPageShow(const sptr<IRemoteObject> & token,const PageStateData & pageStateData)891 int32_t AppMgrService::NotifyPageShow(const sptr<IRemoteObject> &token, const PageStateData &pageStateData)
892 {
893     HILOG_DEBUG("bundleName: %{public}s, moduelName: %{public}s, abilityName: %{public}s, pageName: %{public}s",
894         pageStateData.bundleName.c_str(), pageStateData.moduleName.c_str(), pageStateData.abilityName.c_str(),
895         pageStateData.pageName.c_str());
896     if (!IsReady()) {
897         HILOG_ERROR("AppMgrService is not ready.");
898         return ERR_INVALID_OPERATION;
899     }
900     return appMgrServiceInner_->NotifyPageShow(token, pageStateData);
901 }
902 
NotifyPageHide(const sptr<IRemoteObject> & token,const PageStateData & pageStateData)903 int32_t AppMgrService::NotifyPageHide(const sptr<IRemoteObject> &token, const PageStateData &pageStateData)
904 {
905     HILOG_DEBUG("bundleName: %{public}s, moduelName: %{public}s, abilityName: %{public}s, pageName: %{public}s",
906         pageStateData.bundleName.c_str(), pageStateData.moduleName.c_str(), pageStateData.abilityName.c_str(),
907         pageStateData.pageName.c_str());
908     if (!IsReady()) {
909         HILOG_ERROR("AppMgrService is not ready.");
910         return ERR_INVALID_OPERATION;
911     }
912     return appMgrServiceInner_->NotifyPageHide(token, pageStateData);
913 }
914 
RegisterAppRunningStatusListener(const sptr<IRemoteObject> & listener)915 int32_t AppMgrService::RegisterAppRunningStatusListener(const sptr<IRemoteObject> &listener)
916 {
917     HILOG_DEBUG("Called.");
918     if (!IsReady()) {
919         HILOG_ERROR("Not ready");
920         return ERR_INVALID_OPERATION;
921     }
922     return appMgrServiceInner_->RegisterAppRunningStatusListener(listener);
923 }
924 
UnregisterAppRunningStatusListener(const sptr<IRemoteObject> & listener)925 int32_t AppMgrService::UnregisterAppRunningStatusListener(const sptr<IRemoteObject> &listener)
926 {
927     HILOG_DEBUG("Called.");
928     if (!IsReady()) {
929         HILOG_ERROR("Not ready.");
930         return ERR_INVALID_OPERATION;
931     }
932     return appMgrServiceInner_->UnregisterAppRunningStatusListener(listener);
933 }
934 
RegisterAppForegroundStateObserver(const sptr<IAppForegroundStateObserver> & observer)935 int32_t AppMgrService::RegisterAppForegroundStateObserver(const sptr<IAppForegroundStateObserver> &observer)
936 {
937     HILOG_DEBUG("Called.");
938     if (!IsReady()) {
939         HILOG_ERROR("Not ready.");
940         return ERR_INVALID_OPERATION;
941     }
942     return appMgrServiceInner_->RegisterAppForegroundStateObserver(observer);
943 }
944 
UnregisterAppForegroundStateObserver(const sptr<IAppForegroundStateObserver> & observer)945 int32_t AppMgrService::UnregisterAppForegroundStateObserver(const sptr<IAppForegroundStateObserver> &observer)
946 {
947     HILOG_DEBUG("Called.");
948     if (!IsReady()) {
949         HILOG_ERROR("Not ready.");
950         return ERR_INVALID_OPERATION;
951     }
952     return appMgrServiceInner_->UnregisterAppForegroundStateObserver(observer);
953 }
954 
IsApplicationRunning(const std::string & bundleName,bool & isRunning)955 int32_t AppMgrService::IsApplicationRunning(const std::string &bundleName, bool &isRunning)
956 {
957     if (!IsReady()) {
958         return ERR_INVALID_OPERATION;
959     }
960     return appMgrServiceInner_->IsApplicationRunning(bundleName, isRunning);
961 }
962 
StartChildProcess(const std::string & srcEntry,pid_t & childPid)963 int32_t AppMgrService::StartChildProcess(const std::string &srcEntry, pid_t &childPid)
964 {
965     HILOG_DEBUG("Called.");
966     if (!IsReady()) {
967         HILOG_ERROR("StartChildProcess failed, AppMgrService not ready.");
968         return ERR_INVALID_OPERATION;
969     }
970     return appMgrServiceInner_->StartChildProcess(IPCSkeleton::GetCallingPid(), srcEntry, childPid);
971 }
972 
GetChildProcessInfoForSelf(ChildProcessInfo & info)973 int32_t AppMgrService::GetChildProcessInfoForSelf(ChildProcessInfo &info)
974 {
975     if (!IsReady()) {
976         HILOG_ERROR("StartChildProcess failed, AppMgrService not ready.");
977         return ERR_INVALID_OPERATION;
978     }
979     return appMgrServiceInner_->GetChildProcessInfoForSelf(info);
980 }
981 
AttachChildProcess(const sptr<IRemoteObject> & childScheduler)982 void AppMgrService::AttachChildProcess(const sptr<IRemoteObject> &childScheduler)
983 {
984     HILOG_DEBUG("AttachChildProcess.");
985     if (!IsReady()) {
986         HILOG_ERROR("AttachChildProcess failed, not ready.");
987         return;
988     }
989     if (!taskHandler_) {
990         HILOG_ERROR("taskHandler_ is null.");
991         return;
992     }
993     pid_t pid = IPCSkeleton::GetCallingPid();
994     std::function<void()> task = std::bind(&AppMgrServiceInner::AttachChildProcess,
995         appMgrServiceInner_, pid, iface_cast<IChildScheduler>(childScheduler));
996     taskHandler_->SubmitTask(task, AAFwk::TaskAttribute{
997         .taskName_ = TASK_ATTACH_CHILD_PROCESS,
998         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
999     });
1000 }
1001 
ExitChildProcessSafely()1002 void AppMgrService::ExitChildProcessSafely()
1003 {
1004     if (!IsReady()) {
1005         HILOG_ERROR("ExitChildProcessSafely failed, AppMgrService not ready.");
1006         return;
1007     }
1008     if (!taskHandler_) {
1009         HILOG_ERROR("taskHandler_ is null.");
1010         return;
1011     }
1012     pid_t pid = IPCSkeleton::GetCallingPid();
1013     std::function<void()> task = std::bind(&AppMgrServiceInner::ExitChildProcessSafelyByChildPid,
1014         appMgrServiceInner_, pid);
1015     taskHandler_->SubmitTask(task, AAFwk::TaskAttribute{
1016         .taskName_ = TASK_EXIT_CHILD_PROCESS_SAFELY,
1017         .taskQos_ = AAFwk::TaskQoS::USER_INTERACTIVE
1018     });
1019 }
1020 
IsFinalAppProcess()1021 bool AppMgrService::IsFinalAppProcess()
1022 {
1023     if (!IsReady()) {
1024         HILOG_ERROR("Not ready.");
1025         return false;
1026     }
1027     return appMgrServiceInner_->IsFinalAppProcessByBundleName("");
1028 }
1029 }  // namespace AppExecFwk
1030 }  // namespace OHOS
1031