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