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