• 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 <thread>
20 
21 #include <nlohmann/json.hpp>
22 #include <sys/types.h>
23 
24 #include "datetime_ex.h"
25 #include "ipc_skeleton.h"
26 #include "system_ability_definition.h"
27 
28 #include "app_death_recipient.h"
29 #include "app_mgr_constants.h"
30 #include "hilog_wrapper.h"
31 #include "in_process_call_wrapper.h"
32 #include "perf_profile.h"
33 
34 #include "permission_constants.h"
35 #include "permission_verification.h"
36 
37 namespace OHOS {
38 namespace AppExecFwk {
39 namespace {
40 using namespace std::chrono_literals;
41 #ifdef ABILITY_COMMAND_FOR_TEST
42 static const int APP_MS_BLOCK = 65;
43 #endif
44 const std::string TASK_INIT_APPMGRSERVICEINNER = "InitAppMgrServiceInnerTask";
45 const std::string TASK_ATTACH_APPLICATION = "AttachApplicationTask";
46 const std::string TASK_APPLICATION_FOREGROUNDED = "ApplicationForegroundedTask";
47 const std::string TASK_APPLICATION_BACKGROUNDED = "ApplicationBackgroundedTask";
48 const std::string TASK_APPLICATION_TERMINATED = "ApplicationTerminatedTask";
49 const std::string TASK_ABILITY_CLEANED = "AbilityCleanedTask";
50 const std::string TASK_ADD_APP_DEATH_RECIPIENT = "AddAppRecipientTask";
51 const std::string TASK_CLEAR_UP_APPLICATION_DATA = "ClearUpApplicationDataTask";
52 const std::string TASK_STARTUP_RESIDENT_PROCESS = "StartupResidentProcess";
53 const std::string TASK_ADD_ABILITY_STAGE_DONE = "AddAbilityStageDone";
54 const std::string TASK_START_USER_TEST_PROCESS = "StartUserTestProcess";
55 const std::string TASK_FINISH_USER_TEST = "FinishUserTest";
56 const std::string TASK_ATTACH_RENDER_PROCESS = "AttachRenderTask";
57 }  // namespace
58 
59 REGISTER_SYSTEM_ABILITY_BY_ID(AppMgrService, APP_MGR_SERVICE_ID, true);
60 
AppMgrService()61 AppMgrService::AppMgrService()
62 {
63     appMgrServiceInner_ = std::make_shared<AppMgrServiceInner>();
64     HILOG_INFO("instance created with no para");
65     PerfProfile::GetInstance().SetAmsLoadStartTime(GetTickCount());
66 }
67 
AppMgrService(const int32_t serviceId,bool runOnCreate)68 AppMgrService::AppMgrService(const int32_t serviceId, bool runOnCreate) : SystemAbility(serviceId, runOnCreate)
69 {
70     appMgrServiceInner_ = std::make_shared<AppMgrServiceInner>();
71     HILOG_INFO("instance created");
72     PerfProfile::GetInstance().SetAmsLoadStartTime(GetTickCount());
73 }
74 
~AppMgrService()75 AppMgrService::~AppMgrService()
76 {
77     HILOG_INFO("instance destroyed");
78 }
79 
OnStart()80 void AppMgrService::OnStart()
81 {
82     HILOG_INFO("ready to start service");
83     if (appMgrServiceState_.serviceRunningState == ServiceRunningState::STATE_RUNNING) {
84         HILOG_WARN("failed to start service since it's already running");
85         return;
86     }
87 
88     ErrCode errCode = Init();
89     if (FAILED(errCode)) {
90         HILOG_ERROR("init failed, errCode: %{public}08x", errCode);
91         return;
92     }
93     appMgrServiceState_.serviceRunningState = ServiceRunningState::STATE_RUNNING;
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(
158     [[maybe_unused]] 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     if (!IsReady()) {
168         HILOG_ERROR("AttachApplication failed, not ready.");
169         return;
170     }
171 
172     pid_t pid = IPCSkeleton::GetCallingPid();
173     AddAppDeathRecipient(pid);
174     std::function<void()> attachApplicationFunc =
175         std::bind(&AppMgrServiceInner::AttachApplication, appMgrServiceInner_, pid, iface_cast<IAppScheduler>(app));
176     taskHandler_->SubmitTask(attachApplicationFunc, TASK_ATTACH_APPLICATION);
177 }
178 
ApplicationForegrounded(const int32_t recordId)179 void AppMgrService::ApplicationForegrounded(const int32_t recordId)
180 {
181     if (!IsReady()) {
182         return;
183     }
184     if (!JudgeSelfCalledByRecordId(recordId)) {
185         return;
186     }
187     std::function<void()> applicationForegroundedFunc =
188         std::bind(&AppMgrServiceInner::ApplicationForegrounded, appMgrServiceInner_, recordId);
189     taskHandler_->SubmitTask(applicationForegroundedFunc, TASK_APPLICATION_FOREGROUNDED);
190 }
191 
ApplicationBackgrounded(const int32_t recordId)192 void AppMgrService::ApplicationBackgrounded(const int32_t recordId)
193 {
194     if (!IsReady()) {
195         return;
196     }
197     if (!JudgeSelfCalledByRecordId(recordId)) {
198         return;
199     }
200     std::function<void()> applicationBackgroundedFunc =
201         std::bind(&AppMgrServiceInner::ApplicationBackgrounded, appMgrServiceInner_, recordId);
202     taskHandler_->SubmitTask(applicationBackgroundedFunc, TASK_APPLICATION_BACKGROUNDED);
203 }
204 
ApplicationTerminated(const int32_t recordId)205 void AppMgrService::ApplicationTerminated(const int32_t recordId)
206 {
207     if (!IsReady()) {
208         return;
209     }
210     if (!JudgeSelfCalledByRecordId(recordId)) {
211         return;
212     }
213     std::function<void()> applicationTerminatedFunc =
214         std::bind(&AppMgrServiceInner::ApplicationTerminated, appMgrServiceInner_, recordId);
215     taskHandler_->SubmitTask(applicationTerminatedFunc, TASK_APPLICATION_TERMINATED);
216 }
217 
AbilityCleaned(const sptr<IRemoteObject> & token)218 void AppMgrService::AbilityCleaned(const sptr<IRemoteObject> &token)
219 {
220     if (!IsReady()) {
221         return;
222     }
223 
224     auto callerUid = IPCSkeleton::GetCallingUid();
225     auto appRecord = appMgrServiceInner_->GetTerminatingAppRunningRecord(token);
226     if (!appRecord || appRecord->GetUid() != callerUid) {
227         HILOG_ERROR("Permission verification failed.");
228         return;
229     }
230 
231     std::function<void()> abilityCleanedFunc =
232         std::bind(&AppMgrServiceInner::AbilityTerminated, appMgrServiceInner_, token);
233     taskHandler_->SubmitTask(abilityCleanedFunc, TASK_ABILITY_CLEANED);
234 }
235 
IsReady() const236 bool AppMgrService::IsReady() const
237 {
238     if (appMgrServiceInner_ && taskHandler_ && eventHandler_) {
239         return true;
240     }
241 
242     HILOG_WARN("Not ready");
243     return false;
244 }
245 
AddAppDeathRecipient(const pid_t pid) const246 void AppMgrService::AddAppDeathRecipient(const pid_t pid) const
247 {
248     if (!IsReady()) {
249         return;
250     }
251     sptr<AppDeathRecipient> appDeathRecipient = new AppDeathRecipient();
252     appDeathRecipient->SetTaskHandler(taskHandler_);
253     appDeathRecipient->SetAppMgrServiceInner(appMgrServiceInner_);
254     std::function<void()> addAppRecipientFunc =
255         std::bind(&AppMgrServiceInner::AddAppDeathRecipient, appMgrServiceInner_, pid, appDeathRecipient);
256     taskHandler_->SubmitTask(addAppRecipientFunc, TASK_ADD_APP_DEATH_RECIPIENT);
257 }
258 
StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> & bundleInfos)259 void AppMgrService::StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> &bundleInfos)
260 {
261     if (!IsReady()) {
262         return;
263     }
264     pid_t callingPid = IPCSkeleton::GetCallingPid();
265     pid_t pid = getpid();
266     if (callingPid != pid) {
267         HILOG_ERROR("Not this process call.");
268         return;
269     }
270     HILOG_INFO("Notify start resident process");
271     std::function <void()> startupResidentProcess =
272         std::bind(&AppMgrServiceInner::LoadResidentProcess, appMgrServiceInner_, bundleInfos);
273     taskHandler_->SubmitTask(startupResidentProcess, TASK_STARTUP_RESIDENT_PROCESS);
274 }
275 
GetAmsMgr()276 sptr<IAmsMgr> AppMgrService::GetAmsMgr()
277 {
278     return amsMgrScheduler_;
279 }
280 
ClearUpApplicationData(const std::string & bundleName)281 int32_t AppMgrService::ClearUpApplicationData(const std::string &bundleName)
282 {
283     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
284     if (!isSaCall) {
285         auto isCallingPerm = AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(
286             AAFwk::PermissionConstants::PERMISSION_CLEAN_APPLICATION_DATA);
287         if (!isCallingPerm) {
288             HILOG_ERROR("Permission verification failed");
289             return ERR_PERMISSION_DENIED;
290         }
291     }
292 
293     if (!IsReady()) {
294         return ERR_INVALID_OPERATION;
295     }
296     int32_t uid = IPCSkeleton::GetCallingUid();
297     pid_t pid = IPCSkeleton::GetCallingPid();
298     std::function<void()> clearUpApplicationDataFunc =
299         std::bind(&AppMgrServiceInner::ClearUpApplicationData, appMgrServiceInner_, bundleName, uid, pid);
300     taskHandler_->SubmitTask(clearUpApplicationDataFunc, TASK_CLEAR_UP_APPLICATION_DATA);
301     return ERR_OK;
302 }
303 
GetAllRunningProcesses(std::vector<RunningProcessInfo> & info)304 int32_t AppMgrService::GetAllRunningProcesses(std::vector<RunningProcessInfo> &info)
305 {
306     if (!IsReady()) {
307         return ERR_INVALID_OPERATION;
308     }
309     return appMgrServiceInner_->GetAllRunningProcesses(info);
310 }
311 
GetAllRenderProcesses(std::vector<RenderProcessInfo> & info)312 int32_t AppMgrService::GetAllRenderProcesses(std::vector<RenderProcessInfo> &info)
313 {
314     if (!IsReady()) {
315         return ERR_INVALID_OPERATION;
316     }
317     return appMgrServiceInner_->GetAllRenderProcesses(info);
318 }
319 
JudgeSandboxByPid(pid_t pid,bool & isSandbox)320 int32_t AppMgrService::JudgeSandboxByPid(pid_t pid, bool &isSandbox)
321 {
322     if (!IsReady()) {
323         HILOG_ERROR("AppMgrService is not ready.");
324         return ERR_INVALID_OPERATION;
325     }
326     auto appRunningRecord = appMgrServiceInner_->GetAppRunningRecordByPid(pid);
327     if (appRunningRecord && appRunningRecord->GetAppIndex() > 0) {
328         isSandbox = true;
329         HILOG_DEBUG("current app is a sandbox.");
330         return ERR_OK;
331     }
332     HILOG_DEBUG("current app is not a sandbox.");
333     return ERR_OK;
334 }
335 
GetProcessRunningInfosByUserId(std::vector<RunningProcessInfo> & info,int32_t userId)336 int32_t AppMgrService::GetProcessRunningInfosByUserId(std::vector<RunningProcessInfo> &info, int32_t userId)
337 {
338     if (!IsReady()) {
339         return ERR_INVALID_OPERATION;
340     }
341     return appMgrServiceInner_->GetProcessRunningInfosByUserId(info, userId);
342 }
343 
GetProcessRunningInformation(RunningProcessInfo & info)344 int32_t AppMgrService::GetProcessRunningInformation(RunningProcessInfo &info)
345 {
346     if (!IsReady()) {
347         return ERR_INVALID_OPERATION;
348     }
349     return appMgrServiceInner_->GetProcessRunningInformation(info);
350 }
351 
NotifyMemoryLevel(int32_t level)352 int32_t AppMgrService::NotifyMemoryLevel(int32_t level)
353 {
354     if (!IsReady()) {
355         return ERR_INVALID_OPERATION;
356     }
357     return appMgrServiceInner_->NotifyMemoryLevel(level);
358 }
359 
DumpHeapMemory(const int32_t pid,OHOS::AppExecFwk::MallocInfo & mallocInfo)360 int32_t AppMgrService::DumpHeapMemory(const int32_t pid, OHOS::AppExecFwk::MallocInfo &mallocInfo)
361 {
362     if (!IsReady()) {
363         return ERR_INVALID_OPERATION;
364     }
365     return appMgrServiceInner_->DumpHeapMemory(pid, mallocInfo);
366 }
367 
AddAbilityStageDone(const int32_t recordId)368 void AppMgrService::AddAbilityStageDone(const int32_t recordId)
369 {
370     if (!IsReady()) {
371         return;
372     }
373     if (!JudgeSelfCalledByRecordId(recordId)) {
374         return;
375     }
376     std::function <void()> addAbilityStageDone =
377         std::bind(&AppMgrServiceInner::AddAbilityStageDone, appMgrServiceInner_, recordId);
378     taskHandler_->SubmitTask(addAbilityStageDone, TASK_ADD_ABILITY_STAGE_DONE);
379 }
380 
RegisterApplicationStateObserver(const sptr<IApplicationStateObserver> & observer,const std::vector<std::string> & bundleNameList)381 int32_t AppMgrService::RegisterApplicationStateObserver(const sptr<IApplicationStateObserver> &observer,
382     const std::vector<std::string> &bundleNameList)
383 {
384     HILOG_DEBUG("begin");
385     if (!IsReady()) {
386         HILOG_ERROR("not ready");
387         return ERR_INVALID_OPERATION;
388     }
389     return appMgrServiceInner_->RegisterApplicationStateObserver(observer, bundleNameList);
390 }
391 
UnregisterApplicationStateObserver(const sptr<IApplicationStateObserver> & observer)392 int32_t AppMgrService::UnregisterApplicationStateObserver(const sptr<IApplicationStateObserver> &observer)
393 {
394     HILOG_DEBUG("begin");
395     if (!IsReady()) {
396         HILOG_ERROR("not ready");
397         return ERR_INVALID_OPERATION;
398     }
399     return appMgrServiceInner_->UnregisterApplicationStateObserver(observer);
400 }
401 
GetForegroundApplications(std::vector<AppStateData> & list)402 int32_t AppMgrService::GetForegroundApplications(std::vector<AppStateData> &list)
403 {
404     HILOG_DEBUG("begin");
405     if (!IsReady()) {
406         HILOG_ERROR("not ready");
407         return ERR_INVALID_OPERATION;
408     }
409     return appMgrServiceInner_->GetForegroundApplications(list);
410 }
411 
StartUserTestProcess(const AAFwk::Want & want,const sptr<IRemoteObject> & observer,const AppExecFwk::BundleInfo & bundleInfo,int32_t userId)412 int AppMgrService::StartUserTestProcess(const AAFwk::Want &want, const sptr<IRemoteObject> &observer,
413     const AppExecFwk::BundleInfo &bundleInfo, int32_t userId)
414 {
415     if (!IsReady()) {
416         HILOG_ERROR("not ready");
417         return ERR_INVALID_OPERATION;
418     }
419     if (!AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
420         HILOG_ERROR("StartUserTestProcess is not shell call.");
421         return ERR_INVALID_OPERATION;
422     }
423     std::function<void()> startUserTestProcessFunc =
424         std::bind(&AppMgrServiceInner::StartUserTestProcess, appMgrServiceInner_, want, observer, bundleInfo, userId);
425     taskHandler_->SubmitTask(startUserTestProcessFunc, TASK_START_USER_TEST_PROCESS);
426     return ERR_OK;
427 }
428 
FinishUserTest(const std::string & msg,const int64_t & resultCode,const std::string & bundleName)429 int AppMgrService::FinishUserTest(const std::string &msg, const int64_t &resultCode, const std::string &bundleName)
430 {
431     if (!IsReady()) {
432         HILOG_ERROR("not ready");
433         return ERR_INVALID_OPERATION;
434     }
435     std::shared_ptr<RemoteClientManager> remoteClientManager = std::make_shared<RemoteClientManager>();
436     auto bundleMgr = remoteClientManager->GetBundleManager();
437     if (bundleMgr == nullptr) {
438         HILOG_ERROR("AppMgrService::FinishUserTest GetBundleManager is nullptr");
439         return ERR_INVALID_OPERATION;
440     }
441     int32_t callingUid = IPCSkeleton::GetCallingUid();
442     std::string callerBundleName;
443     auto result = IN_PROCESS_CALL(bundleMgr->GetNameForUid(callingUid, callerBundleName));
444     if (result == ERR_OK) {
445         HILOG_INFO("FinishUserTest callingPid_ is %{public}s", callerBundleName.c_str());
446         if (bundleName != callerBundleName) {
447             HILOG_ERROR("AppMgrService::FinishUserTest Not this process call.");
448             return ERR_INVALID_OPERATION;
449         }
450     } else {
451         HILOG_ERROR("GetBundleName failed: %{public}d", result);
452         return ERR_INVALID_OPERATION;
453     }
454     pid_t callingPid = IPCSkeleton::GetCallingPid();
455     std::function<void()> finishUserTestProcessFunc =
456         std::bind(&AppMgrServiceInner::FinishUserTest, appMgrServiceInner_, msg, resultCode, bundleName, callingPid);
457     taskHandler_->SubmitTask(finishUserTestProcessFunc, TASK_FINISH_USER_TEST);
458     return ERR_OK;
459 }
460 
Dump(int fd,const std::vector<std::u16string> & args)461 int AppMgrService::Dump(int fd, const std::vector<std::u16string>& args)
462 {
463     if (!IsReady()) {
464         HILOG_ERROR("not ready.");
465         return ERR_APPEXECFWK_HIDUMP_ERROR;
466     }
467 
468     std::string result;
469     Dump(args, result);
470     int ret = dprintf(fd, "%s\n", result.c_str());
471     if (ret < 0) {
472         HILOG_ERROR("dprintf error.");
473         return ERR_APPEXECFWK_HIDUMP_ERROR;
474     }
475     return ERR_OK;
476 }
477 
Dump(const std::vector<std::u16string> & args,std::string & result) const478 void AppMgrService::Dump(const std::vector<std::u16string>& args, std::string& result) const
479 {
480     auto size = args.size();
481     if (size == 0) {
482         ShowHelp(result);
483         return;
484     }
485 
486     std::string optionKey = Str16ToStr8(args[0]);
487     if (optionKey != "-h") {
488         result.append("error: unkown option.\n");
489     }
490     ShowHelp(result);
491 }
492 
ShowHelp(std::string & result) const493 void AppMgrService::ShowHelp(std::string& result) const
494 {
495     result.append("Usage:\n")
496         .append("-h                          ")
497         .append("help text for the tool\n");
498 }
499 
ScheduleAcceptWantDone(const int32_t recordId,const AAFwk::Want & want,const std::string & flag)500 void AppMgrService::ScheduleAcceptWantDone(const int32_t recordId, const AAFwk::Want &want, const std::string &flag)
501 {
502     if (!IsReady()) {
503         HILOG_ERROR("not ready");
504         return;
505     }
506     if (!JudgeSelfCalledByRecordId(recordId)) {
507         return;
508     }
509     auto task = [=]() { appMgrServiceInner_->ScheduleAcceptWantDone(recordId, want, flag); };
510     taskHandler_->SubmitTask(task);
511 }
512 
GetAbilityRecordsByProcessID(const int pid,std::vector<sptr<IRemoteObject>> & tokens)513 int AppMgrService::GetAbilityRecordsByProcessID(const int pid, std::vector<sptr<IRemoteObject>> &tokens)
514 {
515     if (!IsReady()) {
516         HILOG_ERROR("not ready");
517         return ERR_INVALID_OPERATION;
518     }
519     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
520     if (!isSaCall) {
521         HILOG_ERROR("Not SA call.");
522         return ERR_INVALID_OPERATION;
523     }
524     return appMgrServiceInner_->GetAbilityRecordsByProcessID(pid, tokens);
525 }
526 
PreStartNWebSpawnProcess()527 int32_t AppMgrService::PreStartNWebSpawnProcess()
528 {
529     HILOG_INFO("PreStartNWebSpawnProcess");
530     if (!IsReady()) {
531         HILOG_ERROR("PreStartNWebSpawnProcess failed, AppMgrService not ready.");
532         return ERR_INVALID_OPERATION;
533     }
534 
535     return appMgrServiceInner_->PreStartNWebSpawnProcess(IPCSkeleton::GetCallingPid());
536 }
537 
StartRenderProcess(const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,int32_t crashFd,pid_t & renderPid)538 int32_t AppMgrService::StartRenderProcess(const std::string &renderParam, int32_t ipcFd,
539     int32_t sharedFd, int32_t crashFd, pid_t &renderPid)
540 {
541     if (!IsReady()) {
542         HILOG_ERROR("StartRenderProcess failed, AppMgrService not ready.");
543         return ERR_INVALID_OPERATION;
544     }
545 
546     return appMgrServiceInner_->StartRenderProcess(IPCSkeleton::GetCallingPid(),
547         renderParam, ipcFd, sharedFd, crashFd, renderPid);
548 }
549 
AttachRenderProcess(const sptr<IRemoteObject> & scheduler)550 void AppMgrService::AttachRenderProcess(const sptr<IRemoteObject> &scheduler)
551 {
552     HILOG_DEBUG("AttachRenderProcess called.");
553     if (!IsReady()) {
554         HILOG_ERROR("AttachRenderProcess failed, not ready.");
555         return;
556     }
557 
558     auto pid = IPCSkeleton::GetCallingPid();
559     auto fun = std::bind(&AppMgrServiceInner::AttachRenderProcess,
560         appMgrServiceInner_, pid, iface_cast<IRenderScheduler>(scheduler));
561     taskHandler_->SubmitTask(fun, TASK_ATTACH_RENDER_PROCESS);
562 }
563 
GetRenderProcessTerminationStatus(pid_t renderPid,int & status)564 int32_t AppMgrService::GetRenderProcessTerminationStatus(pid_t renderPid, int &status)
565 {
566     if (!IsReady()) {
567         HILOG_ERROR("GetRenderProcessTerminationStatus failed, AppMgrService not ready.");
568         return ERR_INVALID_OPERATION;
569     }
570 
571     return appMgrServiceInner_->GetRenderProcessTerminationStatus(renderPid, status);
572 }
573 
GetConfiguration(Configuration & config)574 int32_t AppMgrService::GetConfiguration(Configuration& config)
575 {
576     if (!IsReady()) {
577         HILOG_ERROR("GetConfiguration failed, AppMgrService not ready.");
578         return ERR_INVALID_OPERATION;
579     }
580     config = *(appMgrServiceInner_->GetConfiguration());
581     return ERR_OK;
582 }
583 
UpdateConfiguration(const Configuration & config)584 int32_t AppMgrService::UpdateConfiguration(const Configuration& config)
585 {
586     if (!IsReady()) {
587         HILOG_ERROR("UpdateConfiguration failed, AppMgrService not ready.");
588         return ERR_INVALID_OPERATION;
589     }
590     return appMgrServiceInner_->UpdateConfiguration(config);
591 }
592 
RegisterConfigurationObserver(const sptr<IConfigurationObserver> & observer)593 int32_t AppMgrService::RegisterConfigurationObserver(const sptr<IConfigurationObserver> &observer)
594 {
595     if (!IsReady()) {
596         HILOG_ERROR("RegisterConfigurationObserver failed, AppMgrService not ready.");
597         return ERR_INVALID_OPERATION;
598     }
599     return appMgrServiceInner_->RegisterConfigurationObserver(observer);
600 }
601 
UnregisterConfigurationObserver(const sptr<IConfigurationObserver> & observer)602 int32_t AppMgrService::UnregisterConfigurationObserver(const sptr<IConfigurationObserver> &observer)
603 {
604     if (!IsReady()) {
605         HILOG_ERROR("UnregisterConfigurationObserver failed, AppMgrService not ready.");
606         return ERR_INVALID_OPERATION;
607     }
608     return appMgrServiceInner_->UnregisterConfigurationObserver(observer);
609 }
610 
611 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAppService()612 int AppMgrService::BlockAppService()
613 {
614     HILOG_DEBUG("begin");
615     if (!IsReady()) {
616         return ERR_INVALID_OPERATION;
617     }
618     auto task = [=]() {
619         while (1) {
620             HILOG_DEBUG("begin block app service");
621             std::this_thread::sleep_for(APP_MS_BLOCK*1s);
622         }
623     };
624     taskHandler_->SubmitTask(task);
625     return ERR_OK;
626 }
627 #endif
628 
GetAppRunningStateByBundleName(const std::string & bundleName)629 bool AppMgrService::GetAppRunningStateByBundleName(const std::string &bundleName)
630 {
631     if (!IsReady()) {
632         HILOG_ERROR("AppMgrService is not ready.");
633         return false;
634     }
635 
636     return appMgrServiceInner_->GetAppRunningStateByBundleName(bundleName);
637 }
638 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)639 int32_t AppMgrService::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
640 {
641     if (!IsReady()) {
642         HILOG_ERROR("AppMgrService is not ready.");
643         return ERR_INVALID_OPERATION;
644     }
645     return appMgrServiceInner_->NotifyLoadRepairPatch(bundleName, callback);
646 }
647 
NotifyHotReloadPage(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)648 int32_t AppMgrService::NotifyHotReloadPage(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
649 {
650     if (!IsReady()) {
651         HILOG_ERROR("AppMgrService is not ready.");
652         return ERR_INVALID_OPERATION;
653     }
654     return appMgrServiceInner_->NotifyHotReloadPage(bundleName, callback);
655 }
656 
657 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
SetContinuousTaskProcess(int32_t pid,bool isContinuousTask)658 int32_t AppMgrService::SetContinuousTaskProcess(int32_t pid, bool isContinuousTask)
659 {
660     if (!IsReady()) {
661         HILOG_ERROR("AppMgrService is not ready.");
662         return ERR_INVALID_OPERATION;
663     }
664 
665     return appMgrServiceInner_->SetContinuousTaskProcess(pid, isContinuousTask);
666 }
667 #endif
668 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)669 int32_t AppMgrService::NotifyUnLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
670 {
671     if (!IsReady()) {
672         HILOG_ERROR("AppMgrService is not ready.");
673         return ERR_INVALID_OPERATION;
674     }
675     return appMgrServiceInner_->NotifyUnLoadRepairPatch(bundleName, callback);
676 }
677 
JudgeSelfCalledByRecordId(int32_t recordId)678 bool AppMgrService::JudgeSelfCalledByRecordId(int32_t recordId)
679 {
680     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
681     if (isSaCall) {
682         return true;
683     }
684 
685     if (appMgrServiceInner_ == nullptr) {
686         return false;
687     }
688 
689     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
690     std::shared_ptr<AppRunningRecord> appRecord = appMgrServiceInner_->GetAppRunningRecordByAppRecordId(recordId);
691     if (appRecord == nullptr || ((appRecord->GetApplicationInfo())->accessTokenId) != callingTokenId) {
692         HILOG_ERROR("Is not self, not enabled");
693         return false;
694     }
695 
696     return true;
697 }
698 
IsSharedBundleRunning(const std::string & bundleName,uint32_t versionCode)699 bool AppMgrService::IsSharedBundleRunning(const std::string &bundleName, uint32_t versionCode)
700 {
701     if (!IsReady()) {
702         return ERR_INVALID_OPERATION;
703     }
704     return appMgrServiceInner_->IsSharedBundleRunning(bundleName, versionCode);
705 }
706 
StartNativeProcessForDebugger(const AAFwk::Want & want)707 int32_t AppMgrService::StartNativeProcessForDebugger(const AAFwk::Want &want)
708 {
709     if (!IsReady()) {
710         HILOG_ERROR("AppMgrService is not ready.");
711         return ERR_INVALID_OPERATION;
712     }
713     auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
714     if (!isShellCall) {
715         HILOG_ERROR("permission denied, only called by shell.");
716         return ERR_INVALID_OPERATION;
717     }
718     auto ret = appMgrServiceInner_->StartNativeProcessForDebugger(want);
719     if (ret != ERR_OK) {
720         HILOG_ERROR("debuggablePipe fail to start native process.");
721     }
722     return ret;
723 }
724 
GetBundleNameByPid(const int32_t pid,std::string & bundleName,int32_t & uid)725 int32_t AppMgrService::GetBundleNameByPid(const int32_t pid, std::string &bundleName, int32_t &uid)
726 {
727     if (!IsReady()) {
728         HILOG_ERROR("AppMgrService is not ready.");
729         return ERR_INVALID_OPERATION;
730     }
731     return appMgrServiceInner_->GetBundleNameByPid(pid, bundleName, uid);
732 }
733 
NotifyAppFault(const FaultData & faultData)734 int32_t AppMgrService::NotifyAppFault(const FaultData &faultData)
735 {
736     if (!IsReady()) {
737         HILOG_ERROR("AppMgrService is not ready.");
738         return ERR_INVALID_OPERATION;
739     }
740 
741     auto ret = appMgrServiceInner_->NotifyAppFault(faultData);
742     if (ret != ERR_OK) {
743         HILOG_ERROR("Notify fault data fail.");
744     }
745     return ret;
746 }
747 
NotifyAppFaultBySA(const AppFaultDataBySA & faultData)748 int32_t AppMgrService::NotifyAppFaultBySA(const AppFaultDataBySA &faultData)
749 {
750     if (!IsReady()) {
751         HILOG_ERROR("AppMgrService is not ready.");
752         return ERR_INVALID_OPERATION;
753     }
754 
755     auto ret = appMgrServiceInner_->NotifyAppFaultBySA(faultData);
756     if (ret != ERR_OK) {
757         HILOG_ERROR("Notify fault data fail.");
758     }
759     return ret;
760 }
761 
GetProcessMemoryByPid(const int32_t pid,int32_t & memorySize)762 int32_t AppMgrService::GetProcessMemoryByPid(const int32_t pid, int32_t &memorySize)
763 {
764     if (!IsReady()) {
765         HILOG_ERROR("AppMgrService is not ready.");
766         return ERR_INVALID_OPERATION;
767     }
768 
769     return appMgrServiceInner_->GetProcessMemoryByPid(pid, memorySize);
770 }
771 
GetRunningProcessInformation(const std::string & bundleName,int32_t userId,std::vector<RunningProcessInfo> & info)772 int32_t AppMgrService::GetRunningProcessInformation(const std::string &bundleName, int32_t userId,
773     std::vector<RunningProcessInfo> &info)
774 {
775     if (!IsReady()) {
776         HILOG_ERROR("AppMgrService is not ready.");
777         return ERR_INVALID_OPERATION;
778     }
779 
780     return appMgrServiceInner_->GetRunningProcessInformation(bundleName, userId, info);
781 }
782 }  // namespace AppExecFwk
783 }  // namespace OHOS
784