• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "ability_manager_service.h"
17 #include "accesstoken_kit.h"
18 
19 #include <fstream>
20 #include <functional>
21 #include <memory>
22 #include <nlohmann/json.hpp>
23 #include <string>
24 #include <sys/stat.h>
25 #include <sys/types.h>
26 #include <unistd.h>
27 #include <csignal>
28 #include <cstdlib>
29 
30 #include "ability_info.h"
31 #include "ability_manager_errors.h"
32 #include "ability_util.h"
33 #include "bytrace.h"
34 #include "bundle_mgr_client.h"
35 #include "distributed_client.h"
36 #include "hilog_wrapper.h"
37 #include "if_system_ability_manager.h"
38 #include "in_process_call_wrapper.h"
39 #include "ipc_skeleton.h"
40 #include "iservice_registry.h"
41 #include "itest_observer.h"
42 #ifdef SUPPORT_GRAPHICS
43 #include "png.h"
44 #include "ui_service_mgr_client.h"
45 #include "locale_config.h"
46 #include "lock_screen_white_list.h"
47 #include "mission_info_mgr.h"
48 #endif
49 #include "permission_constants.h"
50 #include "permission_verification.h"
51 #include "sa_mgr_client.h"
52 #include "softbus_bus_center.h"
53 #include "string_ex.h"
54 #include "system_ability_definition.h"
55 #include "os_account_manager.h"
56 #include "uri_permission_manager_client.h"
57 #include "xcollie/watchdog.h"
58 #include "parameter.h"
59 #ifdef SUPPORT_GRAPHICS
60 #include "window_focus_controller.h"
61 #endif
62 
63 using OHOS::AppExecFwk::ElementName;
64 using OHOS::Security::AccessToken::AccessTokenKit;
65 
66 namespace OHOS {
67 namespace AAFwk {
68 using namespace std::chrono;
69 using namespace std::chrono_literals;
70 const bool CONCURRENCY_MODE_FALSE = false;
71 const int32_t MAIN_USER_ID = 100;
72 const int32_t U0_USER_ID = 0;
73 constexpr int32_t INVALID_USER_ID = -1;
74 static const int EXPERIENCE_MEM_THRESHOLD = 20;
75 constexpr auto DATA_ABILITY_START_TIMEOUT = 5s;
76 constexpr int32_t NON_ANONYMIZE_LENGTH = 6;
77 constexpr uint32_t SCENE_FLAG_NORMAL = 0;
78 constexpr int32_t DMS_UID = 5522;
79 const int32_t MAX_NUMBER_OF_DISTRIBUTED_MISSIONS = 20;
80 const int32_t SWITCH_ACCOUNT_TRY = 3;
81 const int32_t MAX_NUMBER_OF_CONNECT_BMS = 15;
82 const std::string EMPTY_DEVICE_ID = "";
83 const int32_t APP_MEMORY_SIZE = 512;
84 const int32_t GET_PARAMETER_INCORRECT = -9;
85 const int32_t GET_PARAMETER_OTHER = -1;
86 const int32_t SIZE_10 = 10;
87 const int32_t ACCOUNT_MGR_SERVICE_UID = 3046;
88 const bool isRamConstrainedDevice = false;
89 const std::string APP_MEMORY_MAX_SIZE_PARAMETER = "const.product.dalvikheaplimit";
90 const std::string RAM_CONSTRAINED_DEVICE_SIGN = "const.product.islowram";
91 const std::string PKG_NAME = "ohos.distributedhardware.devicemanager";
92 const std::string ACTION_CHOOSE = "ohos.want.action.select";
93 const std::string HIGHEST_PRIORITY_ABILITY_ENTITY = "flag.home.intent.from.system";
94 const std::map<std::string, AbilityManagerService::DumpKey> AbilityManagerService::dumpMap = {
95     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--all", KEY_DUMP_ALL),
96     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-a", KEY_DUMP_ALL),
97     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--stack-list", KEY_DUMP_STACK_LIST),
98     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-l", KEY_DUMP_STACK_LIST),
99     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--stack", KEY_DUMP_STACK),
100     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-s", KEY_DUMP_STACK),
101     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission", KEY_DUMP_MISSION),
102     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-m", KEY_DUMP_MISSION),
103     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--top", KEY_DUMP_TOP_ABILITY),
104     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-t", KEY_DUMP_TOP_ABILITY),
105     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--waitting-queue", KEY_DUMP_WAIT_QUEUE),
106     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-w", KEY_DUMP_WAIT_QUEUE),
107     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--serv", KEY_DUMP_SERVICE),
108     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-e", KEY_DUMP_SERVICE),
109     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--data", KEY_DUMP_DATA),
110     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-d", KEY_DUMP_DATA),
111     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-focus", KEY_DUMP_FOCUS_ABILITY),
112     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-f", KEY_DUMP_FOCUS_ABILITY),
113     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--win-mode", KEY_DUMP_WINDOW_MODE),
114     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-z", KEY_DUMP_WINDOW_MODE),
115     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission-list", KEY_DUMP_MISSION_LIST),
116     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-L", KEY_DUMP_MISSION_LIST),
117     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission-infos", KEY_DUMP_MISSION_INFOS),
118     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-S", KEY_DUMP_MISSION_INFOS),
119 };
120 
121 const std::map<std::string, AbilityManagerService::DumpsysKey> AbilityManagerService::dumpsysMap = {
122     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--all", KEY_DUMPSYS_ALL),
123     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-a", KEY_DUMPSYS_ALL),
124     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--mission-list", KEY_DUMPSYS_MISSION_LIST),
125     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-l", KEY_DUMPSYS_MISSION_LIST),
126     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--ability", KEY_DUMPSYS_ABILITY),
127     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-i", KEY_DUMPSYS_ABILITY),
128     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--extension", KEY_DUMPSYS_SERVICE),
129     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-e", KEY_DUMPSYS_SERVICE),
130     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--pending", KEY_DUMPSYS_PENDING),
131     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-p", KEY_DUMPSYS_PENDING),
132     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--process", KEY_DUMPSYS_PROCESS),
133     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-r", KEY_DUMPSYS_PROCESS),
134     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--data", KEY_DUMPSYS_DATA),
135     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-d", KEY_DUMPSYS_DATA),
136 };
137 
138 const bool REGISTER_RESULT =
139     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<AbilityManagerService>::GetInstance().get());
140 
AbilityManagerService()141 AbilityManagerService::AbilityManagerService()
142     : SystemAbility(ABILITY_MGR_SERVICE_ID, true),
143       eventLoop_(nullptr),
144       handler_(nullptr),
145       state_(ServiceRunningState::STATE_NOT_START),
146       iBundleManager_(nullptr)
147 {
148     std::shared_ptr<AppScheduler> appScheduler(
149         DelayedSingleton<AppScheduler>::GetInstance().get(), [](AppScheduler *x) { x->DecStrongRef(x); });
150     appScheduler_ = appScheduler;
151     DumpFuncInit();
152     DumpSysFuncInit();
153 }
154 
~AbilityManagerService()155 AbilityManagerService::~AbilityManagerService()
156 {}
157 
OnStart()158 void AbilityManagerService::OnStart()
159 {
160     if (state_ == ServiceRunningState::STATE_RUNNING) {
161         HILOG_INFO("Ability manager service has already started.");
162         return;
163     }
164     HILOG_INFO("Ability manager service starting.");
165     if (!Init()) {
166         HILOG_ERROR("Failed to init service.");
167         return;
168     }
169     state_ = ServiceRunningState::STATE_RUNNING;
170     eventLoop_->Run();
171     /* Publish service maybe failed, so we need call this function at the last,
172      * so it can't affect the TDD test program */
173     bool ret = Publish(DelayedSingleton<AbilityManagerService>::GetInstance().get());
174     if (!ret) {
175         HILOG_ERROR("Init publish failed!");
176         return;
177     }
178 
179 #ifdef SUPPORT_GRAPHICS
180     auto windowsInstance = WindowFocusController::GetInstance();
181     if (windowsInstance) {
182         windowsInstance->SubscribeWindowFocus();
183     } else {
184         HILOG_ERROR("OnStart. windowsInstance == nullptr !");
185     }
186 #endif
187     HILOG_INFO("Ability manager service start success.");
188 }
189 
Init()190 bool AbilityManagerService::Init()
191 {
192     eventLoop_ = AppExecFwk::EventRunner::Create(AbilityConfig::NAME_ABILITY_MGR_SERVICE);
193     CHECK_POINTER_RETURN_BOOL(eventLoop_);
194 
195     handler_ = std::make_shared<AbilityEventHandler>(eventLoop_, weak_from_this());
196     CHECK_POINTER_RETURN_BOOL(handler_);
197 
198     // init user controller.
199     userController_ = std::make_shared<UserController>();
200     userController_->Init();
201     int userId = MAIN_USER_ID;
202 
203     InitConnectManager(userId, true);
204     InitDataAbilityManager(userId, true);
205     InitPendWantManager(userId, true);
206     systemDataAbilityManager_ = std::make_shared<DataAbilityManager>();
207 
208     amsConfigResolver_ = std::make_shared<AmsConfigurationParameter>();
209     amsConfigResolver_->Parse();
210     HILOG_INFO("ams config parse");
211     useNewMission_ = amsConfigResolver_->IsUseNewMission();
212 #ifdef SUPPORT_GRAPHICS
213     InitMissionListManager(userId, true);
214 #endif
215     SwitchManagers(U0_USER_ID, false);
216     int amsTimeOut = amsConfigResolver_->GetAMSTimeOutTime();
217     if (HiviewDFX::Watchdog::GetInstance().AddThread("AMSWatchdog", handler_, amsTimeOut) != 0) {
218         HILOG_ERROR("HiviewDFX::Watchdog::GetInstance AddThread Fail");
219     }
220 
221     auto startSystemTask = [aams = shared_from_this()]() { aams->StartSystemApplication(); };
222     handler_->PostTask(startSystemTask, "StartSystemApplication");
223     auto creatWhiteListTask = [aams = shared_from_this()]() {
224         if (access(AmsWhiteList::AMS_WHITE_LIST_DIR_PATH.c_str(), F_OK) != 0) {
225             if (mkdir(AmsWhiteList::AMS_WHITE_LIST_DIR_PATH.c_str(), S_IRWXO | S_IRWXG | S_IRWXU)) {
226                 HILOG_ERROR("mkdir AmsWhiteList::AMS_WHITE_LIST_DIR_PATH Fail");
227                 return;
228             }
229         }
230         if (aams->IsExistFile(AmsWhiteList::AMS_WHITE_LIST_FILE_PATH)) {
231             HILOG_INFO("file exists");
232             return;
233         }
234         HILOG_INFO("no such file, create...");
235         std::ofstream outFile(AmsWhiteList::AMS_WHITE_LIST_FILE_PATH, std::ios::out);
236         outFile.close();
237     };
238     handler_->PostTask(creatWhiteListTask, "creatWhiteList");
239     HILOG_INFO("Init success.");
240     return true;
241 }
242 
OnStop()243 void AbilityManagerService::OnStop()
244 {
245     HILOG_INFO("Stop Ability manager service.");
246     eventLoop_.reset();
247     handler_.reset();
248     state_ = ServiceRunningState::STATE_NOT_START;
249 }
250 
QueryServiceState() const251 ServiceRunningState AbilityManagerService::QueryServiceState() const
252 {
253     return state_;
254 }
255 
StartAbility(const Want & want,int32_t userId,int requestCode)256 int AbilityManagerService::StartAbility(const Want &want, int32_t userId, int requestCode)
257 {
258     HILOG_INFO("%{public}s coldStart:%{public}d", __func__, want.GetBoolParam("coldStart", false));
259     return StartAbilityInner(want, nullptr, requestCode, -1, userId);
260 }
261 
StartAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)262 int AbilityManagerService::StartAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
263     int32_t userId, int requestCode)
264 {
265     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
266     auto flags = want.GetFlags();
267     if ((flags & Want::FLAG_ABILITY_CONTINUATION) == Want::FLAG_ABILITY_CONTINUATION) {
268         HILOG_ERROR("StartAbility with continuation flags is not allowed!");
269         return ERR_INVALID_VALUE;
270     }
271     HILOG_INFO("%{public}s", __func__);
272     if (CheckIfOperateRemote(want)) {
273         HILOG_INFO("AbilityManagerService::StartAbility. try to StartRemoteAbility");
274         return StartRemoteAbility(want, requestCode);
275     }
276     return StartAbilityInner(want, callerToken, requestCode, -1, userId);
277 }
278 
StartAbilityInner(const Want & want,const sptr<IRemoteObject> & callerToken,int requestCode,int callerUid,int32_t userId)279 int AbilityManagerService::StartAbilityInner(const Want &want, const sptr<IRemoteObject> &callerToken,
280     int requestCode, int callerUid, int32_t userId)
281 {
282     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
283 
284     if (VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED) {
285         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
286         return CHECK_PERMISSION_FAILED;
287     }
288 
289     HILOG_DEBUG("%{public}s begin.", __func__);
290     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
291         HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
292         return ERR_INVALID_VALUE;
293     }
294 
295     int32_t oriValidUserId = GetValidUserId(userId);
296     int32_t validUserId = oriValidUserId;
297 
298     AbilityRequest abilityRequest;
299     auto result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
300     if (result != ERR_OK) {
301         HILOG_ERROR("Generate ability request local error.");
302         return result;
303     }
304 
305     auto abilityInfo = abilityRequest.abilityInfo;
306     validUserId = abilityInfo.applicationInfo.singleUser ? U0_USER_ID : validUserId;
307     HILOG_DEBUG("userId : %{public}d, singleUser is : %{public}d",
308         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleUser));
309 
310     if (!JudgeMultiUserConcurrency(abilityRequest.abilityInfo, validUserId)) {
311         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
312         return ERR_INVALID_VALUE;
313     }
314 
315     result = CheckStaticCfgPermission(abilityInfo);
316     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
317         return result;
318     }
319     GrantUriPermission(want, validUserId);
320     result = AbilityUtil::JudgeAbilityVisibleControl(abilityInfo, callerUid);
321     if (result != ERR_OK) {
322         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
323         return result;
324     }
325     auto type = abilityInfo.type;
326     HILOG_DEBUG("%{public}s Current ability type:%{public}d", __func__, type);
327     if (type == AppExecFwk::AbilityType::DATA) {
328         HILOG_ERROR("Cannot start data ability, use 'AcquireDataAbility()' instead.");
329         return ERR_INVALID_VALUE;
330     }
331     if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
332         HILOG_DEBUG("%{public}s PreLoadAppDataAbilities:%{public}s", __func__, abilityInfo.bundleName.c_str());
333         result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
334         if (result != ERR_OK) {
335             HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
336                 abilityInfo.bundleName.c_str(), result);
337             return result;
338         }
339     }
340     UpdateCallerInfo(abilityRequest.want);
341     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
342         auto connectManager = GetConnectManagerByUserId(validUserId);
343         if (!connectManager) {
344             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
345             return ERR_INVALID_VALUE;
346         }
347         HILOG_DEBUG("%{public}s Start SERVICE or EXTENSION", __func__);
348         return connectManager->StartAbility(abilityRequest);
349     }
350 
351     if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
352         HILOG_ERROR("IsAbilityControllerStart failed: %{public}s", abilityInfo.bundleName.c_str());
353         return ERR_WOULD_BLOCK;
354     }
355 #ifdef SUPPORT_GRAPHICS
356     auto missionListManager = GetListManagerByUserId(oriValidUserId);
357     if (missionListManager == nullptr) {
358         HILOG_ERROR("missionListManager is nullptr. oriValidUserId=%{public}d", oriValidUserId);
359         return ERR_INVALID_VALUE;
360     }
361     HILOG_DEBUG("%{public}s StartAbility by MissionList", __func__);
362     return missionListManager->StartAbility(abilityRequest);
363 #endif
364 }
365 
StartAbility(const Want & want,const AbilityStartSetting & abilityStartSetting,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)366 int AbilityManagerService::StartAbility(const Want &want, const AbilityStartSetting &abilityStartSetting,
367     const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
368 {
369     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
370     HILOG_DEBUG("Start ability setting.");
371 
372     if (VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED) {
373         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
374         return CHECK_PERMISSION_FAILED;
375     }
376 
377     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
378         return ERR_INVALID_VALUE;
379     }
380 
381     int32_t oriValidUserId = GetValidUserId(userId);
382     int32_t validUserId = oriValidUserId;
383 
384     AbilityRequest abilityRequest;
385     auto result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
386     if (result != ERR_OK) {
387         HILOG_ERROR("Generate ability request local error.");
388         return result;
389     }
390     auto abilityInfo = abilityRequest.abilityInfo;
391     validUserId = abilityInfo.applicationInfo.singleUser ? U0_USER_ID : validUserId;
392     HILOG_DEBUG("userId : %{public}d, singleUser is : %{public}d",
393         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleUser));
394 
395     if (!JudgeMultiUserConcurrency(abilityRequest.abilityInfo, validUserId)) {
396         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
397         return ERR_INVALID_VALUE;
398     }
399 
400     result = CheckStaticCfgPermission(abilityInfo);
401     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
402         return result;
403     }
404     result = AbilityUtil::JudgeAbilityVisibleControl(abilityInfo);
405     if (result != ERR_OK) {
406         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
407         return result;
408     }
409 
410     abilityRequest.startSetting = std::make_shared<AbilityStartSetting>(abilityStartSetting);
411 
412     if (abilityInfo.type == AppExecFwk::AbilityType::DATA) {
413         HILOG_ERROR("Cannot start data ability, use 'AcquireDataAbility()' instead.");
414         return ERR_INVALID_VALUE;
415     }
416 
417     if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
418         result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
419         if (result != ERR_OK) {
420             HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
421                 abilityInfo.bundleName.c_str(),
422                 result);
423             return result;
424         }
425     }
426 #ifdef SUPPORT_GRAPHICS
427     if (abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
428         HILOG_ERROR("Only support for page type ability.");
429         return ERR_INVALID_VALUE;
430     }
431 #endif
432     if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
433         return ERR_WOULD_BLOCK;
434     }
435 #ifdef SUPPORT_GRAPHICS
436     auto missionListManager = GetListManagerByUserId(oriValidUserId);
437     if (missionListManager == nullptr) {
438         HILOG_ERROR("missionListManager is Null. oriValidUserId=%{public}d", oriValidUserId);
439         return ERR_INVALID_VALUE;
440     }
441     return missionListManager->StartAbility(abilityRequest);
442 #endif
443 }
444 
StartAbility(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)445 int AbilityManagerService::StartAbility(const Want &want, const StartOptions &startOptions,
446     const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
447 {
448     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
449     HILOG_DEBUG("Start ability options.");
450 
451     if (VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED) {
452         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
453         return CHECK_PERMISSION_FAILED;
454     }
455 
456     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
457         return ERR_INVALID_VALUE;
458     }
459 
460     int32_t oriValidUserId = GetValidUserId(userId);
461     int32_t validUserId = oriValidUserId;
462 
463     AbilityRequest abilityRequest;
464     auto result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
465     if (result != ERR_OK) {
466         HILOG_ERROR("Generate ability request local error.");
467         return result;
468     }
469 
470     auto abilityInfo = abilityRequest.abilityInfo;
471     validUserId = abilityInfo.applicationInfo.singleUser ? U0_USER_ID : validUserId;
472     HILOG_DEBUG("userId : %{public}d, singleUser is : %{public}d",
473         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleUser));
474 
475     if (!JudgeMultiUserConcurrency(abilityRequest.abilityInfo, validUserId)) {
476         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
477         return ERR_INVALID_VALUE;
478     }
479 
480     result = CheckStaticCfgPermission(abilityInfo);
481     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
482         return result;
483     }
484     result = AbilityUtil::JudgeAbilityVisibleControl(abilityInfo);
485     if (result != ERR_OK) {
486         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
487         return result;
488     }
489 
490     if (abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
491         HILOG_ERROR("Only support for page type ability.");
492         return ERR_INVALID_VALUE;
493     }
494 
495     if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
496         result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
497         if (result != ERR_OK) {
498             HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
499                 abilityInfo.bundleName.c_str(),
500                 result);
501             return result;
502         }
503     }
504 
505     if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
506         return ERR_WOULD_BLOCK;
507     }
508     GrantUriPermission(want, validUserId);
509 #ifdef SUPPORT_GRAPHICS
510     abilityRequest.want.SetParam(Want::PARAM_RESV_DISPLAY_ID, startOptions.GetDisplayID());
511     abilityRequest.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions.GetWindowMode());
512     auto missionListManager = GetListManagerByUserId(oriValidUserId);
513     if (missionListManager == nullptr) {
514         HILOG_ERROR("missionListManager is Null. oriValidUserId=%{public}d", oriValidUserId);
515         return ERR_INVALID_VALUE;
516     }
517     return missionListManager->StartAbility(abilityRequest);
518 #endif
519 }
520 
GrantUriPermission(const Want & want,int32_t validUserId)521 void AbilityManagerService::GrantUriPermission(const Want &want, int32_t validUserId)
522 {
523     HILOG_DEBUG("AbilityManagerService::GrantUriPermission is called.");
524     auto bms = GetBundleManager();
525     CHECK_POINTER_IS_NULLPTR(bms);
526 
527     auto bundleName = want.GetBundle();
528     AppExecFwk::BundleInfo bundleInfo;
529     auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
530     if (!IN_PROCESS_CALL(bms->GetBundleInfo(bundleName, bundleFlag, bundleInfo, validUserId))) {
531         HILOG_ERROR("Get bundle info failed.");
532         return;
533     }
534 
535     if (want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) {
536         HILOG_INFO("Want to grant r/w permission of the uri");
537         auto targetTokenId = bundleInfo.applicationInfo.accessTokenId;
538         GrantUriPermission(want, validUserId, targetTokenId);
539     }
540 }
541 
GrantUriPermission(const Want & want,int32_t validUserId,uint32_t targetTokenId)542 void AbilityManagerService::GrantUriPermission(const Want &want, int32_t validUserId, uint32_t targetTokenId)
543 {
544     auto bms = GetBundleManager();
545     CHECK_POINTER_IS_NULLPTR(bms);
546     auto uriStr = want.GetUri().ToString();
547     auto uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
548     uriVec.emplace_back(uriStr);
549     auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
550     auto fromTokenId = IPCSkeleton::GetCallingTokenID();
551     AppExecFwk::ExtensionAbilityInfo info;
552     for (auto str : uriVec) {
553         if (!IN_PROCESS_CALL(bms->QueryExtensionAbilityInfoByUri(str, validUserId, info))) {
554             HILOG_WARN("Not found ExtensionAbilityInfo according to the uri.");
555             continue;
556         }
557         if (info.type != AppExecFwk::ExtensionAbilityType::FILESHARE) {
558             HILOG_WARN("The upms only open to FILESHARE. The type is %{public}u.", info.type);
559             HILOG_WARN("BundleName: %{public}s, AbilityName: %{public}s.", info.bundleName.c_str(), info.name.c_str());
560             continue;
561         }
562         if (fromTokenId != info.applicationInfo.accessTokenId) {
563             HILOG_WARN("Only the uri of this application can be authorized.");
564             continue;
565         }
566 
567         Uri uri(str);
568         if (want.GetFlags() & Want::FLAG_AUTH_WRITE_URI_PERMISSION) {
569             upmClient->GrantUriPermission(uri, Want::FLAG_AUTH_WRITE_URI_PERMISSION, fromTokenId, targetTokenId);
570         } else {
571             upmClient->GrantUriPermission(uri, Want::FLAG_AUTH_READ_URI_PERMISSION, fromTokenId, targetTokenId);
572         }
573     }
574 }
575 
TerminateAbility(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant)576 int AbilityManagerService::TerminateAbility(const sptr<IRemoteObject> &token, int resultCode, const Want *resultWant)
577 {
578     return TerminateAbilityWithFlag(token, resultCode, resultWant, true);
579 }
580 
CloseAbility(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant)581 int AbilityManagerService::CloseAbility(const sptr<IRemoteObject> &token, int resultCode, const Want *resultWant)
582 {
583     return TerminateAbilityWithFlag(token, resultCode, resultWant, false);
584 }
585 
TerminateAbilityWithFlag(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant,bool flag)586 int AbilityManagerService::TerminateAbilityWithFlag(const sptr<IRemoteObject> &token, int resultCode,
587     const Want *resultWant, bool flag)
588 {
589     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
590     HILOG_DEBUG("Terminate ability for result: %{public}d", (resultWant != nullptr));
591     if (!VerificationAllToken(token)) {
592         HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
593         return ERR_INVALID_VALUE;
594     }
595 
596     auto abilityRecord = Token::GetAbilityRecordByToken(token);
597     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
598     int result = AbilityUtil::JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
599     if (result != ERR_OK) {
600         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
601         return result;
602     }
603 
604     if (IsSystemUiApp(abilityRecord->GetAbilityInfo())) {
605         HILOG_ERROR("System ui not allow terminate.");
606         return ERR_INVALID_VALUE;
607     }
608 
609     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
610     auto type = abilityRecord->GetAbilityInfo().type;
611     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
612         auto connectManager = GetConnectManagerByUserId(userId);
613         if (!connectManager) {
614             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
615             return ERR_INVALID_VALUE;
616         }
617         return connectManager->TerminateAbility(token);
618     }
619 
620     if (type == AppExecFwk::AbilityType::DATA) {
621         HILOG_ERROR("Cannot terminate data ability, use 'ReleaseDataAbility()' instead.");
622         return ERR_INVALID_VALUE;
623     }
624 
625     if ((resultWant != nullptr) &&
626         AbilityUtil::IsSystemDialogAbility(
627             abilityRecord->GetAbilityInfo().bundleName, abilityRecord->GetAbilityInfo().name) &&
628         resultWant->HasParameter(AbilityConfig::SYSTEM_DIALOG_KEY) &&
629         resultWant->HasParameter(AbilityConfig::SYSTEM_DIALOG_CALLER_BUNDLENAME) &&
630         resultWant->HasParameter(AbilityConfig::SYSTEM_DIALOG_REQUEST_PERMISSIONS)) {
631         RequestPermission(resultWant);
632     }
633 
634     if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
635         return ERR_WOULD_BLOCK;
636     }
637 
638 #ifdef SUPPORT_GRAPHICS
639     auto ownerUserId = abilityRecord->GetOwnerMissionUserId();
640     auto missionListManager = GetListManagerByUserId(ownerUserId);
641     if (missionListManager == nullptr) {
642         HILOG_ERROR("missionListManager is Null. ownerUserId=%{public}d", ownerUserId);
643         return ERR_INVALID_VALUE;
644     }
645     return missionListManager->TerminateAbility(abilityRecord, resultCode, resultWant, flag);
646 #endif
647 }
648 
StartRemoteAbility(const Want & want,int requestCode)649 int AbilityManagerService::StartRemoteAbility(const Want &want, int requestCode)
650 {
651     HILOG_INFO("%{public}s", __func__);
652     want.DumpInfo(0);
653     int32_t callerUid = IPCSkeleton::GetCallingUid();
654     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
655     DistributedClient dmsClient;
656     HILOG_INFO("AbilityManagerService::Try to StartRemoteAbility, callerUid = %{public}d", callerUid);
657     HILOG_INFO("AbilityManagerService::Try to StartRemoteAbility, AccessTokenID = %{public}u", accessToken);
658     int result = dmsClient.StartRemoteAbility(want, callerUid, requestCode, accessToken);
659     if (result != ERR_NONE) {
660         HILOG_ERROR("AbilityManagerService::StartRemoteAbility failed, result = %{public}d", result);
661     }
662     return result;
663 }
664 
CheckIsRemote(const std::string & deviceId)665 bool AbilityManagerService::CheckIsRemote(const std::string& deviceId)
666 {
667     if (deviceId.empty()) {
668         HILOG_INFO("CheckIsRemote: deviceId is empty.");
669         return false;
670     }
671     std::string localDeviceId;
672     if (!GetLocalDeviceId(localDeviceId)) {
673         HILOG_ERROR("CheckIsRemote: get local deviceId failed");
674         return false;
675     }
676     if (localDeviceId == deviceId) {
677         HILOG_INFO("CheckIsRemote: deviceId is local.");
678         return false;
679     }
680     HILOG_INFO("CheckIsRemote, deviceId = %{public}s", AnonymizeDeviceId(deviceId).c_str());
681     return true;
682 }
683 
CheckIfOperateRemote(const Want & want)684 bool AbilityManagerService::CheckIfOperateRemote(const Want &want)
685 {
686     std::string deviceId = want.GetElement().GetDeviceID();
687     if (deviceId.empty() || want.GetElement().GetBundleName().empty() ||
688         want.GetElement().GetAbilityName().empty()) {
689         HILOG_DEBUG("CheckIfOperateRemote: DeviceId or BundleName or GetAbilityName empty");
690         return false;
691     }
692     return CheckIsRemote(deviceId);
693 }
694 
GetLocalDeviceId(std::string & localDeviceId)695 bool AbilityManagerService::GetLocalDeviceId(std::string& localDeviceId)
696 {
697     auto localNode = std::make_unique<NodeBasicInfo>();
698     int32_t errCode = GetLocalNodeDeviceInfo(PKG_NAME.c_str(), localNode.get());
699     if (errCode != ERR_OK) {
700         HILOG_ERROR("AbilityManagerService::GetLocalNodeDeviceInfo errCode = %{public}d", errCode);
701         return false;
702     }
703     if (localNode != nullptr) {
704         localDeviceId = localNode->networkId;
705         HILOG_INFO("get local deviceId, deviceId = %{public}s",
706             AnonymizeDeviceId(localDeviceId).c_str());
707         return true;
708     }
709     HILOG_ERROR("AbilityManagerService::GetLocalDeviceId localDeviceId null");
710     return false;
711 }
712 
AnonymizeDeviceId(const std::string & deviceId)713 std::string AbilityManagerService::AnonymizeDeviceId(const std::string& deviceId)
714 {
715     if (deviceId.length() < NON_ANONYMIZE_LENGTH) {
716         return EMPTY_DEVICE_ID;
717     }
718     std::string anonDeviceId = deviceId.substr(0, NON_ANONYMIZE_LENGTH);
719     anonDeviceId.append("******");
720     return anonDeviceId;
721 }
722 
RequestPermission(const Want * resultWant)723 void AbilityManagerService::RequestPermission(const Want *resultWant)
724 {
725     HILOG_INFO("Request permission.");
726     CHECK_POINTER_IS_NULLPTR(resultWant);
727     auto bms = GetBundleManager();
728     CHECK_POINTER_IS_NULLPTR(bms);
729 
730     auto callerBundleName = resultWant->GetStringParam(AbilityConfig::SYSTEM_DIALOG_CALLER_BUNDLENAME);
731     auto permissions = resultWant->GetStringArrayParam(AbilityConfig::SYSTEM_DIALOG_REQUEST_PERMISSIONS);
732 
733     IN_PROCESS_CALL_WITHOUT_RET(
734         for (auto &it : permissions) {
735             auto ret = bms->RequestPermissionFromUser(callerBundleName, it, GetUserId());
736             HILOG_INFO("Request permission from user result :%{public}d, permission:%{public}s.", ret, it.c_str());
737         }
738     );
739 }
740 
TerminateAbilityByCaller(const sptr<IRemoteObject> & callerToken,int requestCode)741 int AbilityManagerService::TerminateAbilityByCaller(const sptr<IRemoteObject> &callerToken, int requestCode)
742 {
743     HILOG_INFO("Terminate ability by caller.");
744     if (!VerificationAllToken(callerToken)) {
745         return ERR_INVALID_VALUE;
746     }
747 
748     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
749     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
750 #ifdef SUPPORT_GRAPHICS
751     if (IsSystemUiApp(abilityRecord->GetAbilityInfo())) {
752         HILOG_ERROR("System ui not allow terminate.");
753         return ERR_INVALID_VALUE;
754     }
755 #endif
756 
757     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
758     auto type = abilityRecord->GetAbilityInfo().type;
759 #ifdef SUPPORT_GRAPHICS
760     auto stackManager = GetStackManagerByUserId(userId);
761 #endif
762     auto connectManager = GetConnectManagerByUserId(userId);
763     switch (type) {
764         case AppExecFwk::AbilityType::SERVICE:
765         case AppExecFwk::AbilityType::EXTENSION: {
766             if (!connectManager) {
767                 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
768                 return ERR_INVALID_VALUE;
769             }
770             auto result = connectManager->TerminateAbility(abilityRecord, requestCode);
771             if (result == NO_FOUND_ABILITY_BY_CALLER) {
772                 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
773                     return ERR_WOULD_BLOCK;
774                 }
775 
776                 if (!stackManager) {
777                     HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
778                     return ERR_INVALID_VALUE;
779                 }
780                 return stackManager->TerminateAbility(abilityRecord, requestCode);
781             }
782             return result;
783         }
784 #ifdef SUPPORT_GRAPHICS
785         case AppExecFwk::AbilityType::PAGE: {
786             if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
787                 return ERR_WOULD_BLOCK;
788             }
789             if (!stackManager) {
790                 HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
791                 return ERR_INVALID_VALUE;
792             }
793             auto result = stackManager->TerminateAbility(abilityRecord, requestCode);
794             if (result == NO_FOUND_ABILITY_BY_CALLER) {
795                 if (!connectManager) {
796                     HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
797                     return ERR_INVALID_VALUE;
798                 }
799                 return connectManager->TerminateAbility(abilityRecord, requestCode);
800             }
801             return result;
802         }
803 #endif
804         default:
805             return ERR_INVALID_VALUE;
806     }
807 }
808 
MinimizeAbility(const sptr<IRemoteObject> & token,bool fromUser)809 int AbilityManagerService::MinimizeAbility(const sptr<IRemoteObject> &token, bool fromUser)
810 {
811     HILOG_INFO("Minimize ability.");
812     if (!VerificationAllToken(token)) {
813         return ERR_INVALID_VALUE;
814     }
815 
816     auto abilityRecord = Token::GetAbilityRecordByToken(token);
817     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
818     int result = AbilityUtil::JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
819     if (result != ERR_OK) {
820         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
821         return result;
822     }
823 
824     auto type = abilityRecord->GetAbilityInfo().type;
825     if (type != AppExecFwk::AbilityType::PAGE) {
826         HILOG_ERROR("Cannot minimize except page ability.");
827         return ERR_INVALID_VALUE;
828     }
829 
830     if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
831         return ERR_WOULD_BLOCK;
832     }
833 #ifdef SUPPORT_GRAPHICS
834     auto missionListManager = GetListManagerByUserId(abilityRecord->GetOwnerMissionUserId());
835     if (!missionListManager) {
836         HILOG_ERROR("minimize missionListManager is Null.");
837         return ERR_INVALID_VALUE;
838     }
839     return missionListManager->MinimizeAbility(token, fromUser);
840 #endif
841 }
842 
843 #ifdef SUPPORT_GRAPHICS
GetRecentMissions(const int32_t numMax,const int32_t flags,std::vector<AbilityMissionInfo> & recentList)844 int AbilityManagerService::GetRecentMissions(
845     const int32_t numMax, const int32_t flags, std::vector<AbilityMissionInfo> &recentList)
846 {
847     HILOG_INFO("numMax: %{public}d, flags: %{public}d", numMax, flags);
848     if (numMax < 0 || flags < 0) {
849         HILOG_ERROR("numMax or flags is invalid.");
850         return ERR_INVALID_VALUE;
851     }
852     if (!CheckCallerIsSystemAppByIpc()) {
853         HILOG_ERROR("caller is not systemApp");
854         return CALLER_ISNOT_SYSTEMAPP;
855     }
856 
857     return currentStackManager_->GetRecentMissions(numMax, flags, recentList);
858 }
859 
GetMissionSnapshot(const int32_t missionId,MissionPixelMap & missionPixelMap)860 int AbilityManagerService::GetMissionSnapshot(const int32_t missionId, MissionPixelMap &missionPixelMap)
861 {
862     if (missionId < 0) {
863         HILOG_ERROR("GetMissionSnapshot failed.");
864         return ERR_INVALID_VALUE;
865     }
866     return currentStackManager_->GetMissionSnapshot(missionId, missionPixelMap);
867 }
868 
SetMissionDescriptionInfo(const sptr<IRemoteObject> & token,const MissionDescriptionInfo & description)869 int AbilityManagerService::SetMissionDescriptionInfo(
870     const sptr<IRemoteObject> &token, const MissionDescriptionInfo &description)
871 {
872     HILOG_INFO("%{public}s called", __func__);
873     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
874     CHECK_POINTER_AND_RETURN(currentStackManager_, INNER_ERR);
875 
876     auto abilityRecord = Token::GetAbilityRecordByToken(token);
877     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
878 
879     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
880     auto stackManager = GetStackManagerByUserId(userId);
881     if (!stackManager) {
882         HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
883         return ERR_INVALID_VALUE;
884     }
885     return stackManager->SetMissionDescriptionInfo(abilityRecord, description);
886 }
887 
GetMissionLockModeState()888 int AbilityManagerService::GetMissionLockModeState()
889 {
890     HILOG_INFO("%{public}s called", __func__);
891     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_INVALID_VALUE);
892     return currentStackManager_->GetMissionLockModeState();
893 }
894 #endif
895 
UpdateConfiguration(const AppExecFwk::Configuration & config)896 int AbilityManagerService::UpdateConfiguration(const AppExecFwk::Configuration &config)
897 {
898     HILOG_INFO("%{public}s called", __func__);
899     return DelayedSingleton<AppScheduler>::GetInstance()->UpdateConfiguration(config);
900 }
901 
902 #ifdef SUPPORT_GRAPHICS
MoveMissionToTop(int32_t missionId)903 int AbilityManagerService::MoveMissionToTop(int32_t missionId)
904 {
905     HILOG_INFO("Move mission to top.");
906     if (missionId < 0) {
907         HILOG_ERROR("Mission id is invalid.");
908         return ERR_INVALID_VALUE;
909     }
910 
911     return currentStackManager_->MoveMissionToTop(missionId);
912 }
913 
MoveMissionToEnd(const sptr<IRemoteObject> & token,const bool nonFirst)914 int AbilityManagerService::MoveMissionToEnd(const sptr<IRemoteObject> &token, const bool nonFirst)
915 {
916     HILOG_INFO("Move mission to end.");
917     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
918     if (!VerificationAllToken(token)) {
919         return ERR_INVALID_VALUE;
920     }
921     auto abilityRecord = Token::GetAbilityRecordByToken(token);
922     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
923     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
924     auto stackManager = GetStackManagerByUserId(userId);
925     if (!stackManager) {
926         HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
927         return ERR_INVALID_VALUE;
928     }
929     return stackManager->MoveMissionToEnd(token, nonFirst);
930 }
931 
RemoveMission(int id)932 int AbilityManagerService::RemoveMission(int id)
933 {
934     HILOG_INFO("Remove mission.");
935     if (id < 0) {
936         HILOG_ERROR("Mission id is invalid.");
937         return ERR_INVALID_VALUE;
938     }
939     if (!CheckCallerIsSystemAppByIpc()) {
940         HILOG_ERROR("caller is not systemApp");
941         return CALLER_ISNOT_SYSTEMAPP;
942     }
943     return currentStackManager_->RemoveMissionById(id);
944 }
945 #endif
946 
ConnectAbility(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,int32_t userId)947 int AbilityManagerService::ConnectAbility(
948     const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, int32_t userId)
949 {
950     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
951     HILOG_INFO("Connect ability.");
952     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
953     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
954 
955     if (VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED) {
956         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
957         return CHECK_PERMISSION_FAILED;
958     }
959 
960     if (CheckIfOperateRemote(want)) {
961         HILOG_INFO("AbilityManagerService::ConnectAbility. try to ConnectRemoteAbility");
962         return ConnectRemoteAbility(want, connect->AsObject());
963     }
964 
965     int32_t validUserId = GetValidUserId(userId);
966     if (callerToken != nullptr && callerToken->GetObjectDescriptor() != u"ohos.aafwk.AbilityToken") {
967         HILOG_INFO("%{public}s invalid Token.", __func__);
968         return ConnectLocalAbility(want, validUserId, connect, nullptr);
969     }
970     return ConnectLocalAbility(want, validUserId, connect, callerToken);
971 }
972 
DisconnectAbility(const sptr<IAbilityConnection> & connect)973 int AbilityManagerService::DisconnectAbility(const sptr<IAbilityConnection> &connect)
974 {
975     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
976     HILOG_DEBUG("Disconnect ability.");
977     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
978     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
979 
980     DisconnectLocalAbility(connect);
981     DisconnectRemoteAbility(connect->AsObject());
982     return ERR_OK;
983 }
984 
ConnectLocalAbility(const Want & want,const int32_t userId,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken)985 int AbilityManagerService::ConnectLocalAbility(const Want &want, const int32_t userId,
986     const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken)
987 {
988     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
989     HILOG_INFO("%{public}s begin ConnectAbilityLocal", __func__);
990     AbilityRequest abilityRequest;
991     ErrCode result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, callerToken, userId);
992     if (result != ERR_OK) {
993         HILOG_ERROR("Generate ability request error.");
994         return result;
995     }
996     auto abilityInfo = abilityRequest.abilityInfo;
997     int32_t validUserId = abilityInfo.applicationInfo.singleUser ? U0_USER_ID : userId;
998     HILOG_DEBUG("validUserId : %{public}d, singleUser is : %{public}d",
999         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleUser));
1000 
1001     if (!JudgeMultiUserConcurrency(abilityRequest.abilityInfo, validUserId)) {
1002         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1003         return ERR_INVALID_VALUE;
1004     }
1005 
1006     result = CheckStaticCfgPermission(abilityInfo);
1007     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
1008         return result;
1009     }
1010 
1011     if (!VerifyUriPermisson(abilityRequest, want)) {
1012         HILOG_ERROR("The uri has not granted.");
1013         return ERR_INVALID_OPERATION;
1014     }
1015 
1016     result = AbilityUtil::JudgeAbilityVisibleControl(abilityInfo);
1017     if (result != ERR_OK) {
1018         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1019         return result;
1020     }
1021     auto type = abilityInfo.type;
1022     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
1023         HILOG_ERROR("Connect Ability failed, target Ability is not Service.");
1024         return TARGET_ABILITY_NOT_SERVICE;
1025     }
1026     result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
1027     if (result != ERR_OK) {
1028         HILOG_ERROR("ConnectAbility: App data ability preloading failed, '%{public}s', %{public}d",
1029             abilityInfo.bundleName.c_str(),
1030             result);
1031         return result;
1032     }
1033 
1034     auto connectManager = GetConnectManagerByUserId(validUserId);
1035     if (connectManager == nullptr) {
1036         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
1037         return ERR_INVALID_VALUE;
1038     }
1039     return connectManager->ConnectAbilityLocked(abilityRequest, connect, callerToken);
1040 }
1041 
ConnectRemoteAbility(const Want & want,const sptr<IRemoteObject> & connect)1042 int AbilityManagerService::ConnectRemoteAbility(const Want &want, const sptr<IRemoteObject> &connect)
1043 {
1044     HILOG_INFO("%{public}s begin ConnectAbilityRemote", __func__);
1045     int32_t callerUid = IPCSkeleton::GetCallingUid();
1046     int32_t callerPid = IPCSkeleton::GetCallingPid();
1047     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1048     DistributedClient dmsClient;
1049     HILOG_INFO("AbilityManagerService::Try to ConnectRemoteAbility, AccessTokenID = %{public}u", accessToken);
1050     return dmsClient.ConnectRemoteAbility(want, connect, callerUid, callerPid, accessToken);
1051 }
1052 
DisconnectLocalAbility(const sptr<IAbilityConnection> & connect)1053 int AbilityManagerService::DisconnectLocalAbility(const sptr<IAbilityConnection> &connect)
1054 {
1055     HILOG_INFO("%{public}s begin DisconnectAbilityLocal", __func__);
1056     return connectManager_->DisconnectAbilityLocked(connect);
1057 }
1058 
DisconnectRemoteAbility(const sptr<IRemoteObject> & connect)1059 int AbilityManagerService::DisconnectRemoteAbility(const sptr<IRemoteObject> &connect)
1060 {
1061     HILOG_INFO("%{public}s begin DisconnectAbilityRemote", __func__);
1062     int32_t callerUid = IPCSkeleton::GetCallingUid();
1063     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1064     DistributedClient dmsClient;
1065     return dmsClient.DisconnectRemoteAbility(connect, callerUid, accessToken);
1066 }
1067 
1068 #ifdef SUPPORT_GRAPHICS
ContinueMission(const std::string & srcDeviceId,const std::string & dstDeviceId,int32_t missionId,const sptr<IRemoteObject> & callBack,AAFwk::WantParams & wantParams)1069 int AbilityManagerService::ContinueMission(const std::string &srcDeviceId, const std::string &dstDeviceId,
1070     int32_t missionId, const sptr<IRemoteObject> &callBack, AAFwk::WantParams &wantParams)
1071 {
1072     HILOG_INFO("ContinueMission srcDeviceId: %{public}s, dstDeviceId: %{public}s, missionId: %{public}d",
1073         srcDeviceId.c_str(), dstDeviceId.c_str(), missionId);
1074     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1075         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1076         return CHECK_PERMISSION_FAILED;
1077     }
1078     DistributedClient dmsClient;
1079     return dmsClient.ContinueMission(srcDeviceId, dstDeviceId, missionId, callBack, wantParams);
1080 }
1081 #endif
1082 
ContinueAbility(const std::string & deviceId,int32_t missionId)1083 int AbilityManagerService::ContinueAbility(const std::string &deviceId, int32_t missionId)
1084 {
1085     HILOG_INFO("ContinueAbility deviceId : %{public}s, missionId = %{public}d.", deviceId.c_str(), missionId);
1086 
1087     sptr<IRemoteObject> abilityToken = GetAbilityTokenByMissionId(missionId);
1088     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1089 
1090     auto abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
1091     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1092 
1093     abilityRecord->ContinueAbility(deviceId);
1094     return ERR_OK;
1095 }
1096 
StartContinuation(const Want & want,const sptr<IRemoteObject> & abilityToken,int32_t status)1097 int AbilityManagerService::StartContinuation(const Want &want, const sptr<IRemoteObject> &abilityToken, int32_t status)
1098 {
1099     HILOG_INFO("Start Continuation.");
1100     if (!CheckIfOperateRemote(want)) {
1101         HILOG_ERROR("deviceId or bundle name or abilityName empty");
1102         return ERR_INVALID_VALUE;
1103     }
1104     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1105 
1106     int32_t appUid = IPCSkeleton::GetCallingUid();
1107     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1108     HILOG_INFO("AbilityManagerService::Try to StartContinuation, AccessTokenID = %{public}u", accessToken);
1109     int32_t missionId = GetMissionIdByAbilityToken(abilityToken);
1110     if (missionId == -1) {
1111         HILOG_ERROR("AbilityManagerService::StartContinuation failed to get missionId.");
1112         return ERR_INVALID_VALUE;
1113     }
1114     DistributedClient dmsClient;
1115     auto result =  dmsClient.StartContinuation(want, missionId, appUid, status, accessToken);
1116     if (result != ERR_OK) {
1117         HILOG_ERROR("StartContinuation failed, result = %{public}d, notify caller", result);
1118         NotifyContinuationResult(missionId, result);
1119     }
1120     return result;
1121 }
1122 
NotifyCompleteContinuation(const std::string & deviceId,int32_t sessionId,bool isSuccess)1123 void AbilityManagerService::NotifyCompleteContinuation(const std::string &deviceId,
1124     int32_t sessionId, bool isSuccess)
1125 {
1126     HILOG_INFO("NotifyCompleteContinuation.");
1127     DistributedClient dmsClient;
1128     dmsClient.NotifyCompleteContinuation(Str8ToStr16(deviceId), sessionId, isSuccess);
1129 }
1130 
NotifyContinuationResult(int32_t missionId,int32_t result)1131 int AbilityManagerService::NotifyContinuationResult(int32_t missionId, int32_t result)
1132 {
1133     HILOG_INFO("Notify Continuation Result : %{public}d.", result);
1134 
1135     auto abilityToken = GetAbilityTokenByMissionId(missionId);
1136     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1137 
1138     auto abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
1139     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1140 
1141     abilityRecord->NotifyContinuationResult(result);
1142     return ERR_OK;
1143 }
1144 
1145 #ifdef SUPPORT_GRAPHICS
StartSyncRemoteMissions(const std::string & devId,bool fixConflict,int64_t tag)1146 int AbilityManagerService::StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag)
1147 {
1148     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1149         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1150         return CHECK_PERMISSION_FAILED;
1151     }
1152     DistributedClient dmsClient;
1153     return dmsClient.StartSyncRemoteMissions(devId, fixConflict, tag);
1154 }
1155 
StopSyncRemoteMissions(const std::string & devId)1156 int AbilityManagerService::StopSyncRemoteMissions(const std::string& devId)
1157 {
1158     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1159         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1160         return CHECK_PERMISSION_FAILED;
1161     }
1162     DistributedClient dmsClient;
1163     return dmsClient.StopSyncRemoteMissions(devId);
1164 }
1165 
RegisterMissionListener(const std::string & deviceId,const sptr<IRemoteMissionListener> & listener)1166 int AbilityManagerService::RegisterMissionListener(const std::string &deviceId,
1167     const sptr<IRemoteMissionListener> &listener)
1168 {
1169     std::string localDeviceId;
1170     if (!GetLocalDeviceId(localDeviceId) || localDeviceId == deviceId) {
1171         HILOG_ERROR("RegisterMissionListener: Check DeviceId failed");
1172         return REGISTER_REMOTE_MISSION_LISTENER_FAIL;
1173     }
1174     CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
1175     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1176         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1177         return CHECK_PERMISSION_FAILED;
1178     }
1179     DistributedClient dmsClient;
1180     return dmsClient.RegisterMissionListener(Str8ToStr16(deviceId), listener->AsObject());
1181 }
1182 
UnRegisterMissionListener(const std::string & deviceId,const sptr<IRemoteMissionListener> & listener)1183 int AbilityManagerService::UnRegisterMissionListener(const std::string &deviceId,
1184     const sptr<IRemoteMissionListener> &listener)
1185 {
1186     std::string localDeviceId;
1187     if (!GetLocalDeviceId(localDeviceId) || localDeviceId == deviceId) {
1188         HILOG_ERROR("RegisterMissionListener: Check DeviceId failed");
1189         return REGISTER_REMOTE_MISSION_LISTENER_FAIL;
1190     }
1191     CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
1192     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1193         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1194         return CHECK_PERMISSION_FAILED;
1195     }
1196     DistributedClient dmsClient;
1197     return dmsClient.UnRegisterMissionListener(Str8ToStr16(deviceId), listener->AsObject());
1198 }
1199 #endif
1200 
RemoveAllServiceRecord()1201 void AbilityManagerService::RemoveAllServiceRecord()
1202 {
1203     connectManager_->RemoveAll();
1204 }
1205 
GetWantSender(const WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken)1206 sptr<IWantSender> AbilityManagerService::GetWantSender(
1207     const WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken)
1208 {
1209     HILOG_INFO("Get want Sender.");
1210     CHECK_POINTER_AND_RETURN(pendingWantManager_, nullptr);
1211 
1212     auto bms = GetBundleManager();
1213     CHECK_POINTER_AND_RETURN(bms, nullptr);
1214 
1215     int32_t callerUid = IPCSkeleton::GetCallingUid();
1216     int userId = wantSenderInfo.userId;
1217     AppExecFwk::BundleInfo bundleInfo;
1218     if (!wantSenderInfo.bundleName.empty()) {
1219         bool bundleMgrResult = false;
1220         if (wantSenderInfo.userId < 0) {
1221             if (AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callerUid, userId) != 0) {
1222                 HILOG_ERROR("GetOsAccountLocalIdFromUid failed. uid=%{public}d", callerUid);
1223                 return nullptr;
1224             }
1225         }
1226         bundleMgrResult = IN_PROCESS_CALL(bms->GetBundleInfo(wantSenderInfo.bundleName,
1227             AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
1228         if (!bundleMgrResult) {
1229             HILOG_ERROR("GetBundleInfo is fail.");
1230             return nullptr;
1231         }
1232     }
1233 
1234     HILOG_INFO("AbilityManagerService::GetWantSender: bundleName = %{public}s", wantSenderInfo.bundleName.c_str());
1235     return pendingWantManager_->GetWantSender(
1236         callerUid, bundleInfo.uid,
1237         IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(callerUid)), wantSenderInfo, callerToken);
1238 }
1239 
SendWantSender(const sptr<IWantSender> & target,const SenderInfo & senderInfo)1240 int AbilityManagerService::SendWantSender(const sptr<IWantSender> &target, const SenderInfo &senderInfo)
1241 {
1242     HILOG_INFO("Send want sender.");
1243     CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
1244     CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
1245     return pendingWantManager_->SendWantSender(target, senderInfo);
1246 }
1247 
CancelWantSender(const sptr<IWantSender> & sender)1248 void AbilityManagerService::CancelWantSender(const sptr<IWantSender> &sender)
1249 {
1250     HILOG_INFO("Cancel want sender.");
1251     CHECK_POINTER(pendingWantManager_);
1252     CHECK_POINTER(sender);
1253 
1254     auto bms = GetBundleManager();
1255     CHECK_POINTER(bms);
1256 
1257     int32_t callerUid = IPCSkeleton::GetCallingUid();
1258     sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(sender->AsObject());
1259 
1260     int userId = -1;
1261     if (AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callerUid, userId) != 0) {
1262         HILOG_ERROR("GetOsAccountLocalIdFromUid failed. uid=%{public}d", callerUid);
1263         return;
1264     }
1265     AppExecFwk::BundleInfo bundleInfo;
1266     bool bundleMgrResult = IN_PROCESS_CALL(
1267         bms->GetBundleInfo(record->GetKey()->GetBundleName(),
1268             AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
1269     if (!bundleMgrResult) {
1270         HILOG_ERROR("GetBundleInfo is fail.");
1271         return;
1272     }
1273 
1274     pendingWantManager_->CancelWantSender(callerUid, bundleInfo.uid,
1275         IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(callerUid)), sender);
1276 }
1277 
GetPendingWantUid(const sptr<IWantSender> & target)1278 int AbilityManagerService::GetPendingWantUid(const sptr<IWantSender> &target)
1279 {
1280     HILOG_INFO("%{public}s:begin.", __func__);
1281 
1282     if (pendingWantManager_ == nullptr) {
1283         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1284         return -1;
1285     }
1286     if (target == nullptr) {
1287         HILOG_ERROR("%s, target is nullptr", __func__);
1288         return -1;
1289     }
1290     return pendingWantManager_->GetPendingWantUid(target);
1291 }
1292 
GetPendingWantUserId(const sptr<IWantSender> & target)1293 int AbilityManagerService::GetPendingWantUserId(const sptr<IWantSender> &target)
1294 {
1295     HILOG_INFO("%{public}s:begin.", __func__);
1296 
1297     if (pendingWantManager_ == nullptr) {
1298         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1299         return -1;
1300     }
1301     if (target == nullptr) {
1302         HILOG_ERROR("%s, target is nullptr", __func__);
1303         return -1;
1304     }
1305     return pendingWantManager_->GetPendingWantUserId(target);
1306 }
1307 
GetPendingWantBundleName(const sptr<IWantSender> & target)1308 std::string AbilityManagerService::GetPendingWantBundleName(const sptr<IWantSender> &target)
1309 {
1310     HILOG_INFO("Get pending want bundle name.");
1311     CHECK_POINTER_AND_RETURN(pendingWantManager_, "");
1312     CHECK_POINTER_AND_RETURN(target, "");
1313     return pendingWantManager_->GetPendingWantBundleName(target);
1314 }
1315 
GetPendingWantCode(const sptr<IWantSender> & target)1316 int AbilityManagerService::GetPendingWantCode(const sptr<IWantSender> &target)
1317 {
1318     HILOG_INFO("%{public}s:begin.", __func__);
1319 
1320     if (pendingWantManager_ == nullptr) {
1321         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1322         return -1;
1323     }
1324     if (target == nullptr) {
1325         HILOG_ERROR("%s, target is nullptr", __func__);
1326         return -1;
1327     }
1328     return pendingWantManager_->GetPendingWantCode(target);
1329 }
1330 
GetPendingWantType(const sptr<IWantSender> & target)1331 int AbilityManagerService::GetPendingWantType(const sptr<IWantSender> &target)
1332 {
1333     HILOG_INFO("%{public}s:begin.", __func__);
1334 
1335     if (pendingWantManager_ == nullptr) {
1336         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1337         return -1;
1338     }
1339     if (target == nullptr) {
1340         HILOG_ERROR("%s, target is nullptr", __func__);
1341         return -1;
1342     }
1343     return pendingWantManager_->GetPendingWantType(target);
1344 }
1345 
RegisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & receiver)1346 void AbilityManagerService::RegisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &receiver)
1347 {
1348     HILOG_INFO("Register cancel listener.");
1349     CHECK_POINTER(pendingWantManager_);
1350     CHECK_POINTER(sender);
1351     CHECK_POINTER(receiver);
1352     pendingWantManager_->RegisterCancelListener(sender, receiver);
1353 }
1354 
UnregisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & receiver)1355 void AbilityManagerService::UnregisterCancelListener(
1356     const sptr<IWantSender> &sender, const sptr<IWantReceiver> &receiver)
1357 {
1358     HILOG_INFO("Unregister cancel listener.");
1359     CHECK_POINTER(pendingWantManager_);
1360     CHECK_POINTER(sender);
1361     CHECK_POINTER(receiver);
1362     pendingWantManager_->UnregisterCancelListener(sender, receiver);
1363 }
1364 
GetPendingRequestWant(const sptr<IWantSender> & target,std::shared_ptr<Want> & want)1365 int AbilityManagerService::GetPendingRequestWant(const sptr<IWantSender> &target, std::shared_ptr<Want> &want)
1366 {
1367     HILOG_INFO("Get pending request want.");
1368     CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
1369     CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
1370     CHECK_POINTER_AND_RETURN(want, ERR_INVALID_VALUE);
1371     return pendingWantManager_->GetPendingRequestWant(target, want);
1372 }
1373 
1374 #ifdef SUPPORT_GRAPHICS
SetShowOnLockScreen(bool isAllow)1375 int AbilityManagerService::SetShowOnLockScreen(bool isAllow)
1376 {
1377     HILOG_INFO("SetShowOnLockScreen");
1378     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
1379     auto bms = GetBundleManager();
1380     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
1381     int callerUid = IPCSkeleton::GetCallingUid();
1382     std::string bundleName;
1383     bool result = IN_PROCESS_CALL(bms->GetBundleNameForUid(callerUid, bundleName));
1384     if (!result) {
1385         HILOG_ERROR("GetBundleNameForUid fail");
1386         return GET_BUNDLENAME_BY_UID_FAIL;
1387     }
1388     return currentStackManager_->SetShowOnLockScreen(bundleName, isAllow);
1389 }
1390 
LockMissionForCleanup(int32_t missionId)1391 int AbilityManagerService::LockMissionForCleanup(int32_t missionId)
1392 {
1393     HILOG_INFO("request unlock mission for clean up all, id :%{public}d", missionId);
1394     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
1395 
1396     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1397         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1398         return CHECK_PERMISSION_FAILED;
1399     }
1400     return currentMissionListManager_->SetMissionLockedState(missionId, true);
1401 }
1402 
UnlockMissionForCleanup(int32_t missionId)1403 int AbilityManagerService::UnlockMissionForCleanup(int32_t missionId)
1404 {
1405     HILOG_INFO("request unlock mission for clean up all, id :%{public}d", missionId);
1406     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
1407 
1408     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1409         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1410         return CHECK_PERMISSION_FAILED;
1411     }
1412     return currentMissionListManager_->SetMissionLockedState(missionId, false);
1413 }
1414 
RegisterMissionListener(const sptr<IMissionListener> & listener)1415 int AbilityManagerService::RegisterMissionListener(const sptr<IMissionListener> &listener)
1416 {
1417     HILOG_INFO("request RegisterMissionListener ");
1418     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1419 
1420     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1421         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1422         return CHECK_PERMISSION_FAILED;
1423     }
1424     return currentMissionListManager_->RegisterMissionListener(listener);
1425 }
1426 
UnRegisterMissionListener(const sptr<IMissionListener> & listener)1427 int AbilityManagerService::UnRegisterMissionListener(const sptr<IMissionListener> &listener)
1428 {
1429     HILOG_INFO("request RegisterMissionListener ");
1430     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1431 
1432     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1433         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1434         return CHECK_PERMISSION_FAILED;
1435     }
1436     return currentMissionListManager_->UnRegisterMissionListener(listener);
1437 }
1438 
GetMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)1439 int AbilityManagerService::GetMissionInfos(const std::string& deviceId, int32_t numMax,
1440     std::vector<MissionInfo> &missionInfos)
1441 {
1442     HILOG_INFO("request GetMissionInfos.");
1443     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1444 
1445     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1446         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1447         return CHECK_PERMISSION_FAILED;
1448     }
1449 
1450     if (CheckIsRemote(deviceId)) {
1451         return GetRemoteMissionInfos(deviceId, numMax, missionInfos);
1452     }
1453 
1454     return currentMissionListManager_->GetMissionInfos(numMax, missionInfos);
1455 }
1456 
GetRemoteMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)1457 int AbilityManagerService::GetRemoteMissionInfos(const std::string& deviceId, int32_t numMax,
1458     std::vector<MissionInfo> &missionInfos)
1459 {
1460     HILOG_INFO("GetRemoteMissionInfos begin");
1461     DistributedClient dmsClient;
1462     int result = dmsClient.GetMissionInfos(deviceId, numMax, missionInfos);
1463     if (result != ERR_OK) {
1464         HILOG_ERROR("GetRemoteMissionInfos failed, result = %{public}d", result);
1465         return result;
1466     }
1467     return ERR_OK;
1468 }
1469 
GetMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)1470 int AbilityManagerService::GetMissionInfo(const std::string& deviceId, int32_t missionId,
1471     MissionInfo &missionInfo)
1472 {
1473     HILOG_INFO("request GetMissionInfo, missionId:%{public}d", missionId);
1474     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1475 
1476     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1477         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1478         return CHECK_PERMISSION_FAILED;
1479     }
1480 
1481     if (CheckIsRemote(deviceId)) {
1482         return GetRemoteMissionInfo(deviceId, missionId, missionInfo);
1483     }
1484 
1485     return currentMissionListManager_->GetMissionInfo(missionId, missionInfo);
1486 }
1487 
GetRemoteMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)1488 int AbilityManagerService::GetRemoteMissionInfo(const std::string& deviceId, int32_t missionId,
1489     MissionInfo &missionInfo)
1490 {
1491     HILOG_INFO("GetMissionInfoFromDms begin");
1492     std::vector<MissionInfo> missionVector;
1493     int result = GetRemoteMissionInfos(deviceId, MAX_NUMBER_OF_DISTRIBUTED_MISSIONS, missionVector);
1494     if (result != ERR_OK) {
1495         return result;
1496     }
1497     for (auto iter = missionVector.begin(); iter != missionVector.end(); iter++) {
1498         if (iter->id == missionId) {
1499             missionInfo = *iter;
1500             return ERR_OK;
1501         }
1502     }
1503     HILOG_WARN("missionId not found");
1504     return ERR_INVALID_VALUE;
1505 }
1506 
CleanMission(int32_t missionId)1507 int AbilityManagerService::CleanMission(int32_t missionId)
1508 {
1509     HILOG_INFO("request CleanMission, missionId:%{public}d", missionId);
1510     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1511 
1512     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1513         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1514         return CHECK_PERMISSION_FAILED;
1515     }
1516 
1517     return currentMissionListManager_->ClearMission(missionId);
1518 }
1519 
CleanAllMissions()1520 int AbilityManagerService::CleanAllMissions()
1521 {
1522     HILOG_INFO("request CleanAllMissions ");
1523     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1524 
1525     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1526         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1527         return CHECK_PERMISSION_FAILED;
1528     }
1529 
1530     Want want;
1531     want.SetElementName(AbilityConfig::LAUNCHER_BUNDLE_NAME, AbilityConfig::LAUNCHER_ABILITY_NAME);
1532     if (!IsAbilityControllerStart(want, AbilityConfig::LAUNCHER_BUNDLE_NAME)) {
1533         HILOG_ERROR("IsAbilityControllerStart failed: %{public}s", want.GetBundle().c_str());
1534         return ERR_WOULD_BLOCK;
1535     }
1536 
1537     return currentMissionListManager_->ClearAllMissions();
1538 }
1539 
MoveMissionToFront(int32_t missionId)1540 int AbilityManagerService::MoveMissionToFront(int32_t missionId)
1541 {
1542     HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId);
1543     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1544 
1545     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1546         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1547         return CHECK_PERMISSION_FAILED;
1548     }
1549 
1550     if (!IsAbilityControllerStartById(missionId)) {
1551         HILOG_ERROR("IsAbilityControllerStart false");
1552         return ERR_WOULD_BLOCK;
1553     }
1554 
1555     return currentMissionListManager_->MoveMissionToFront(missionId);
1556 }
1557 
MoveMissionToFront(int32_t missionId,const StartOptions & startOptions)1558 int AbilityManagerService::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions)
1559 {
1560     HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId);
1561     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
1562 
1563     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
1564         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1565         return CHECK_PERMISSION_FAILED;
1566     }
1567 
1568     if (!IsAbilityControllerStartById(missionId)) {
1569         HILOG_ERROR("IsAbilityControllerStart false");
1570         return ERR_WOULD_BLOCK;
1571     }
1572 
1573     auto options = std::make_shared<StartOptions>(startOptions);
1574     return currentMissionListManager_->MoveMissionToFront(missionId, options);
1575 }
1576 
GetMissionIdByToken(const sptr<IRemoteObject> & token)1577 int32_t AbilityManagerService::GetMissionIdByToken(const sptr<IRemoteObject> &token)
1578 {
1579     HILOG_INFO("request GetMissionIdByToken.");
1580     if (!token) {
1581         HILOG_ERROR("token is invalid.");
1582         return -1;
1583     }
1584 
1585     if (IPCSkeleton::GetCallingPid() != getpid()) {
1586         HILOG_ERROR("%{public}s: Only support same process call.", __func__);
1587         return -1;
1588     }
1589 
1590     return GetMissionIdByAbilityToken(token);
1591 }
1592 #endif
1593 
IsAbilityControllerStartById(int32_t missionId)1594 bool AbilityManagerService::IsAbilityControllerStartById(int32_t missionId)
1595 {
1596     InnerMissionInfo innerMissionInfo;
1597     int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1598         missionId, innerMissionInfo);
1599     if (getMission != ERR_OK) {
1600         HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
1601         return true;
1602     }
1603     if (!IsAbilityControllerStart(innerMissionInfo.missionInfo.want, innerMissionInfo.missionInfo.want.GetBundle())) {
1604         HILOG_ERROR("IsAbilityControllerStart failed: %{public}s",
1605             innerMissionInfo.missionInfo.want.GetBundle().c_str());
1606         return false;
1607     }
1608     return true;
1609 }
1610 
GetServiceRecordByElementName(const std::string & element)1611 std::shared_ptr<AbilityRecord> AbilityManagerService::GetServiceRecordByElementName(const std::string &element)
1612 {
1613     return connectManager_->GetServiceRecordByElementName(element);
1614 }
1615 
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)1616 std::list<std::shared_ptr<ConnectionRecord>> AbilityManagerService::GetConnectRecordListByCallback(
1617     sptr<IAbilityConnection> callback)
1618 {
1619     return connectManager_->GetConnectRecordListByCallback(callback);
1620 }
1621 
AcquireDataAbility(const Uri & uri,bool tryBind,const sptr<IRemoteObject> & callerToken)1622 sptr<IAbilityScheduler> AbilityManagerService::AcquireDataAbility(
1623     const Uri &uri, bool tryBind, const sptr<IRemoteObject> &callerToken)
1624 {
1625     HILOG_INFO("%{public}s, called. uid %{public}d", __func__, IPCSkeleton::GetCallingUid());
1626     bool isSystem = (IPCSkeleton::GetCallingUid() <= AppExecFwk::Constants::BASE_SYS_UID);
1627     if (!isSystem) {
1628         HILOG_INFO("callerToken not system %{public}s", __func__);
1629         if (!VerificationAllToken(callerToken)) {
1630             HILOG_INFO("VerificationAllToken fail");
1631             return nullptr;
1632         }
1633     }
1634 
1635     auto bms = GetBundleManager();
1636     CHECK_POINTER_AND_RETURN(bms, nullptr);
1637 
1638     auto localUri(uri);
1639     if (localUri.GetScheme() != AbilityConfig::SCHEME_DATA_ABILITY) {
1640         HILOG_ERROR("Acquire data ability with invalid uri scheme.");
1641         return nullptr;
1642     }
1643     std::vector<std::string> pathSegments;
1644     localUri.GetPathSegments(pathSegments);
1645     if (pathSegments.empty()) {
1646         HILOG_ERROR("Acquire data ability with invalid uri path.");
1647         return nullptr;
1648     }
1649 
1650     auto userId = GetValidUserId(INVALID_USER_ID);
1651     AbilityRequest abilityRequest;
1652     std::string dataAbilityUri = localUri.ToString();
1653     HILOG_INFO("%{public}s, called. userId %{public}d", __func__, userId);
1654     bool queryResult = IN_PROCESS_CALL(bms->QueryAbilityInfoByUri(dataAbilityUri, userId, abilityRequest.abilityInfo));
1655     if (!queryResult || abilityRequest.abilityInfo.name.empty() || abilityRequest.abilityInfo.bundleName.empty()) {
1656         HILOG_ERROR("Invalid ability info for data ability acquiring.");
1657         return nullptr;
1658     }
1659 
1660     if (!CheckDataAbilityRequest(abilityRequest)) {
1661         HILOG_ERROR("Invalid ability request info for data ability acquiring.");
1662         return nullptr;
1663     }
1664 
1665     HILOG_DEBUG("Query data ability info: %{public}s|%{public}s|%{public}s",
1666         abilityRequest.appInfo.name.c_str(),
1667         abilityRequest.appInfo.bundleName.c_str(),
1668         abilityRequest.abilityInfo.name.c_str());
1669 
1670     if (CheckStaticCfgPermission(abilityRequest.abilityInfo) != AppExecFwk::Constants::PERMISSION_GRANTED) {
1671         return nullptr;
1672     }
1673 
1674     if (abilityRequest.abilityInfo.applicationInfo.singleUser) {
1675         userId = U0_USER_ID;
1676     }
1677 
1678     std::shared_ptr<DataAbilityManager> dataAbilityManager = GetDataAbilityManagerByUserId(userId);
1679     CHECK_POINTER_AND_RETURN(dataAbilityManager, nullptr);
1680     return dataAbilityManager->Acquire(abilityRequest, tryBind, callerToken, isSystem);
1681 }
1682 
CheckDataAbilityRequest(AbilityRequest & abilityRequest)1683 bool AbilityManagerService::CheckDataAbilityRequest(AbilityRequest &abilityRequest)
1684 {
1685     int result = AbilityUtil::JudgeAbilityVisibleControl(abilityRequest.abilityInfo);
1686     if (result != ERR_OK) {
1687         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1688         return false;
1689     }
1690     abilityRequest.appInfo = abilityRequest.abilityInfo.applicationInfo;
1691     if (abilityRequest.appInfo.name.empty() || abilityRequest.appInfo.bundleName.empty()) {
1692         HILOG_ERROR("Invalid app info for data ability acquiring.");
1693         return false;
1694     }
1695     if (abilityRequest.abilityInfo.type != AppExecFwk::AbilityType::DATA) {
1696         HILOG_ERROR("BMS query result is not a data ability.");
1697         return false;
1698     }
1699     abilityRequest.uid = abilityRequest.appInfo.uid;
1700     return true;
1701 }
1702 
ReleaseDataAbility(sptr<IAbilityScheduler> dataAbilityScheduler,const sptr<IRemoteObject> & callerToken)1703 int AbilityManagerService::ReleaseDataAbility(
1704     sptr<IAbilityScheduler> dataAbilityScheduler, const sptr<IRemoteObject> &callerToken)
1705 {
1706     HILOG_INFO("%{public}s, called.", __func__);
1707     if (!dataAbilityScheduler || !callerToken) {
1708         HILOG_ERROR("dataAbilitySchedule or callerToken is nullptr");
1709         return ERR_INVALID_VALUE;
1710     }
1711 
1712     bool isSystem = (IPCSkeleton::GetCallingUid() <= AppExecFwk::Constants::BASE_SYS_UID);
1713     if (!isSystem) {
1714         HILOG_INFO("callerToken not system %{public}s", __func__);
1715         if (!VerificationAllToken(callerToken)) {
1716             HILOG_ERROR("VerificationAllToken fail");
1717             return ERR_INVALID_STATE;
1718         }
1719     }
1720 
1721     std::shared_ptr<DataAbilityManager> dataAbilityManager = GetDataAbilityManager(dataAbilityScheduler);
1722     if (!dataAbilityManager) {
1723         HILOG_ERROR("dataAbilityScheduler is not exists");
1724         return ERR_INVALID_VALUE;
1725     }
1726 
1727     return dataAbilityManager->Release(dataAbilityScheduler, callerToken, isSystem);
1728 }
1729 
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)1730 int AbilityManagerService::AttachAbilityThread(
1731     const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
1732 {
1733     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1734     HILOG_INFO("Attach ability thread.");
1735     CHECK_POINTER_AND_RETURN(scheduler, ERR_INVALID_VALUE);
1736     if (!VerificationAllToken(token)) {
1737         return ERR_INVALID_VALUE;
1738     }
1739     auto abilityRecord = Token::GetAbilityRecordByToken(token);
1740     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1741 
1742     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
1743     auto abilityInfo = abilityRecord->GetAbilityInfo();
1744     auto type = abilityInfo.type;
1745     // force timeout ability for test
1746     if (IsNeedTimeoutForTest(abilityInfo.name, AbilityRecord::ConvertAbilityState(AbilityState::INITIAL))) {
1747         HILOG_WARN("force timeout ability for test, state:INITIAL, ability: %{public}s",
1748             abilityInfo.name.c_str());
1749         return ERR_OK;
1750     }
1751     int returnCode = -1;
1752     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
1753         auto connectManager = GetConnectManagerByUserId(userId);
1754         if (!connectManager) {
1755             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
1756             return ERR_INVALID_VALUE;
1757         }
1758         returnCode = connectManager->AttachAbilityThreadLocked(scheduler, token);
1759     } else if (type == AppExecFwk::AbilityType::DATA) {
1760         auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
1761         if (!dataAbilityManager) {
1762             HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
1763             return ERR_INVALID_VALUE;
1764         }
1765         returnCode = dataAbilityManager->AttachAbilityThread(scheduler, token);
1766     } else {
1767 #ifdef SUPPORT_GRAPHICS
1768         int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
1769         auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
1770         if (!missionListManager) {
1771             HILOG_ERROR("missionListManager is Null. ownerMissionUserId=%{public}d", ownerMissionUserId);
1772             return ERR_INVALID_VALUE;
1773         }
1774         returnCode = missionListManager->AttachAbilityThread(scheduler, token);
1775 #endif
1776     }
1777     return returnCode;
1778 }
1779 
DumpFuncInit()1780 void AbilityManagerService::DumpFuncInit()
1781 {
1782     dumpFuncMap_[KEY_DUMP_ALL] = &AbilityManagerService::DumpInner;
1783 #ifdef SUPPORT_GRAPHICS
1784     dumpFuncMap_[KEY_DUMP_STACK_LIST] = &AbilityManagerService::DumpStackListInner;
1785     dumpFuncMap_[KEY_DUMP_STACK] = &AbilityManagerService::DumpStackInner;
1786 #endif
1787     dumpFuncMap_[KEY_DUMP_MISSION] = &AbilityManagerService::DumpMissionInner;
1788     dumpFuncMap_[KEY_DUMP_TOP_ABILITY] = &AbilityManagerService::DumpTopAbilityInner;
1789     dumpFuncMap_[KEY_DUMP_WAIT_QUEUE] = &AbilityManagerService::DumpWaittingAbilityQueueInner;
1790     dumpFuncMap_[KEY_DUMP_SERVICE] = &AbilityManagerService::DumpStateInner;
1791     dumpFuncMap_[KEY_DUMP_DATA] = &AbilityManagerService::DataDumpStateInner;
1792     dumpFuncMap_[KEY_DUMP_FOCUS_ABILITY] = &AbilityManagerService::DumpFocusMapInner;
1793 #ifdef SUPPORT_GRAPHICS
1794     dumpFuncMap_[KEY_DUMP_WINDOW_MODE] = &AbilityManagerService::DumpWindowModeInner;
1795     dumpFuncMap_[KEY_DUMP_MISSION_LIST] = &AbilityManagerService::DumpMissionListInner;
1796     dumpFuncMap_[KEY_DUMP_MISSION_INFOS] = &AbilityManagerService::DumpMissionInfosInner;
1797 #endif
1798 }
1799 
DumpSysFuncInit()1800 void AbilityManagerService::DumpSysFuncInit()
1801 {
1802     dumpsysFuncMap_[KEY_DUMPSYS_ALL] = &AbilityManagerService::DumpSysInner;
1803 #ifdef SUPPORT_GRAPHICS
1804     dumpsysFuncMap_[KEY_DUMPSYS_MISSION_LIST] = &AbilityManagerService::DumpSysMissionListInner;
1805     dumpsysFuncMap_[KEY_DUMPSYS_ABILITY] = &AbilityManagerService::DumpSysAbilityInner;
1806 #endif
1807     dumpsysFuncMap_[KEY_DUMPSYS_SERVICE] = &AbilityManagerService::DumpSysStateInner;
1808     dumpsysFuncMap_[KEY_DUMPSYS_PENDING] = &AbilityManagerService::DumpSysPendingInner;
1809     dumpsysFuncMap_[KEY_DUMPSYS_PROCESS] = &AbilityManagerService::DumpSysProcess;
1810     dumpsysFuncMap_[KEY_DUMPSYS_DATA] = &AbilityManagerService::DataDumpSysStateInner;
1811 }
1812 
DumpSysInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)1813 void AbilityManagerService::DumpSysInner(
1814     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
1815 {
1816     std::vector<std::string> argList;
1817     SplitStr(args, " ", argList);
1818     if (argList.empty()) {
1819         return;
1820     }
1821     DumpSysMissionListInner(args, info, isClient, isUserID, userId);
1822     DumpSysStateInner(args, info, isClient, isUserID, userId);
1823     DumpSysPendingInner(args, info, isClient, isUserID, userId);
1824     DumpSysProcess(args, info, isClient, isUserID, userId);
1825 }
1826 
1827 #ifdef SUPPORT_GRAPHICS
DumpSysMissionListInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)1828 void AbilityManagerService::DumpSysMissionListInner(
1829     const std::string &args, std::vector<std::string> &info, bool isClient, bool isUserID, int userId)
1830 {
1831     std::shared_ptr<MissionListManager> targetManager;
1832     if (isUserID) {
1833         std::shared_lock<std::shared_mutex> lock(managersMutex_);
1834         auto it = missionListManagers_.find(userId);
1835         if (it == missionListManagers_.end()) {
1836             info.push_back("error: No user found'.");
1837             return;
1838         }
1839         targetManager = it->second;
1840     } else {
1841         targetManager = currentMissionListManager_;
1842     }
1843 
1844     CHECK_POINTER(targetManager);
1845 
1846     std::vector<std::string> argList;
1847     SplitStr(args, " ", argList);
1848     if (argList.empty()) {
1849         return;
1850     }
1851 
1852     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
1853         targetManager->DumpMissionList(info, isClient, argList[1]);
1854     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
1855         targetManager->DumpMissionList(info, isClient);
1856     } else {
1857         info.emplace_back("error: invalid argument, please see 'aa dump -h'.");
1858     }
1859 }
DumpSysAbilityInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)1860 void AbilityManagerService::DumpSysAbilityInner(
1861     const std::string &args, std::vector<std::string> &info, bool isClient, bool isUserID, int userId)
1862 {
1863     std::shared_ptr<MissionListManager> targetManager;
1864     if (isUserID) {
1865         std::shared_lock<std::shared_mutex> lock(managersMutex_);
1866         auto it = missionListManagers_.find(userId);
1867         if (it == missionListManagers_.end()) {
1868             info.push_back("error: No user found'.");
1869             return;
1870         }
1871         targetManager = it->second;
1872     } else {
1873         targetManager = currentMissionListManager_;
1874     }
1875 
1876     CHECK_POINTER(targetManager);
1877 
1878     std::vector<std::string> argList;
1879     SplitStr(args, " ", argList);
1880     if (argList.empty()) {
1881         return;
1882     }
1883     if (argList.size() >= MIN_DUMP_ARGUMENT_NUM) {
1884         HILOG_INFO("argList = %{public}s", argList[1].c_str());
1885         std::vector<std::string> params(argList.begin() + MIN_DUMP_ARGUMENT_NUM, argList.end());
1886         targetManager->DumpMissionListByRecordId(info, isClient, std::stoi(argList[1]), params);
1887     } else {
1888         info.emplace_back("error: invalid argument, please see 'aa dump -h'.");
1889     }
1890 }
1891 #endif
1892 
DumpSysStateInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)1893 void AbilityManagerService::DumpSysStateInner(
1894     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
1895 {
1896     std::shared_ptr<AbilityConnectManager> targetManager;
1897 
1898     if (isUserID) {
1899         std::shared_lock<std::shared_mutex> lock(managersMutex_);
1900         auto it = connectManagers_.find(userId);
1901         if (it == connectManagers_.end()) {
1902             info.push_back("error: No user found'.");
1903             return;
1904         }
1905         targetManager = it->second;
1906     } else {
1907         targetManager = connectManager_;
1908     }
1909 
1910     CHECK_POINTER(targetManager);
1911 
1912     std::vector<std::string> argList;
1913     SplitStr(args, " ", argList);
1914     if (argList.empty()) {
1915         return;
1916     }
1917 
1918     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
1919         targetManager->DumpState(info, isClient, argList[1]);
1920     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
1921         targetManager->DumpState(info, isClient);
1922     } else {
1923         info.emplace_back("error: invalid argument, please see 'aa dump -h'.");
1924     }
1925 }
1926 
DumpSysPendingInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)1927 void AbilityManagerService::DumpSysPendingInner(
1928     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
1929 {
1930     std::shared_ptr<PendingWantManager> targetManager;
1931     if (isUserID) {
1932         std::shared_lock<std::shared_mutex> lock(managersMutex_);
1933         auto it = pendingWantManagers_.find(userId);
1934         if (it == pendingWantManagers_.end()) {
1935             info.push_back("error: No user found.");
1936             return;
1937         }
1938         targetManager = it->second;
1939     } else {
1940         targetManager = pendingWantManager_;
1941     }
1942 
1943     CHECK_POINTER(targetManager);
1944 
1945     std::vector<std::string> argList;
1946     SplitStr(args, " ", argList);
1947     if (argList.empty()) {
1948         return;
1949     }
1950 
1951     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
1952         targetManager->DumpByRecordId(info, argList[1]);
1953     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
1954         targetManager->Dump(info);
1955     } else {
1956         info.emplace_back("error: invalid argument, please see 'aa dump -h'.");
1957     }
1958 }
1959 
DumpSysProcess(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)1960 void AbilityManagerService::DumpSysProcess(
1961     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
1962 {
1963     std::vector<std::string> argList;
1964     SplitStr(args, " ", argList);
1965     if (argList.empty()) {
1966         return;
1967     }
1968     std::vector<AppExecFwk::RunningProcessInfo> ProcessInfos;
1969     int ret = 0;
1970     if (isUserID) {
1971         ret = GetProcessRunningInfosByUserId(ProcessInfos, userId);
1972     } else {
1973         ret = GetProcessRunningInfos(ProcessInfos);
1974     }
1975 
1976     if (ret != ERR_OK || ProcessInfos.size() == 0) {
1977         return;
1978     }
1979 
1980     std::string dumpInfo = "  AppRunningRecords:";
1981     info.push_back(dumpInfo);
1982     auto processInfoID = 0;
1983     auto hasProcessName = (argList.size() == MIN_DUMP_ARGUMENT_NUM ? true : false);
1984     for (const auto& ProcessInfo : ProcessInfos) {
1985         if (hasProcessName && argList[1] != ProcessInfo.processName_) {
1986             continue;
1987         }
1988 
1989         dumpInfo = "    AppRunningRecord ID #" + std::to_string(processInfoID);
1990         processInfoID++;
1991         info.push_back(dumpInfo);
1992         dumpInfo = "      process name [" + ProcessInfo.processName_ + "]";
1993         info.push_back(dumpInfo);
1994         dumpInfo = "      pid #" + std::to_string(ProcessInfo.pid_) +
1995             "  uid #" + std::to_string(ProcessInfo.uid_);
1996         info.push_back(dumpInfo);
1997         auto appState = static_cast<AppState>(ProcessInfo.state_);
1998         if (appScheduler_) {
1999             dumpInfo = "      state #" + appScheduler_->ConvertAppState(appState);
2000         }
2001         info.push_back(dumpInfo);
2002     }
2003 }
2004 
DataDumpSysStateInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2005 void AbilityManagerService::DataDumpSysStateInner(
2006     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2007 {
2008     std::shared_ptr<DataAbilityManager> targetManager;
2009     if (isUserID) {
2010         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2011         auto it = dataAbilityManagers_.find(userId);
2012         if (it == dataAbilityManagers_.end()) {
2013             info.push_back("error: No user found.");
2014             return;
2015         }
2016         targetManager = it->second;
2017     } else {
2018         targetManager = dataAbilityManager_;
2019     }
2020 
2021     CHECK_POINTER(targetManager);
2022 
2023     std::vector<std::string> argList;
2024     SplitStr(args, " ", argList);
2025     if (argList.empty()) {
2026         return;
2027     }
2028     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2029         targetManager->DumpSysState(info, isClient, argList[1]);
2030     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2031         targetManager->DumpSysState(info, isClient);
2032     } else {
2033         info.emplace_back("error: invalid argument, please see 'aa dump -h'.");
2034     }
2035 }
2036 
DumpInner(const std::string & args,std::vector<std::string> & info)2037 void AbilityManagerService::DumpInner(const std::string &args, std::vector<std::string> &info)
2038 {
2039     if (currentMissionListManager_) {
2040         currentMissionListManager_->Dump(info);
2041     }
2042 }
2043 
2044 #ifdef SUPPORT_GRAPHICS
DumpStackListInner(const std::string & args,std::vector<std::string> & info)2045 void AbilityManagerService::DumpStackListInner(const std::string &args, std::vector<std::string> &info)
2046 {
2047     currentStackManager_->DumpStackList(info);
2048 }
2049 
DumpFocusMapInner(const std::string & args,std::vector<std::string> & info)2050 void AbilityManagerService::DumpFocusMapInner(const std::string &args, std::vector<std::string> &info)
2051 {
2052     currentStackManager_->DumpFocusMap(info);
2053 }
2054 
DumpWindowModeInner(const std::string & args,std::vector<std::string> & info)2055 void AbilityManagerService::DumpWindowModeInner(const std::string &args, std::vector<std::string> &info)
2056 {
2057     currentStackManager_->DumpWindowMode(info);
2058 }
2059 
DumpMissionListInner(const std::string & args,std::vector<std::string> & info)2060 void AbilityManagerService::DumpMissionListInner(const std::string &args, std::vector<std::string> &info)
2061 {
2062     if (currentMissionListManager_) {
2063         currentMissionListManager_->DumpMissionList(info, false, "");
2064     }
2065 }
2066 
DumpMissionInfosInner(const std::string & args,std::vector<std::string> & info)2067 void AbilityManagerService::DumpMissionInfosInner(const std::string &args, std::vector<std::string> &info)
2068 {
2069     if (currentMissionListManager_) {
2070         currentMissionListManager_->DumpMissionInfos(info);
2071     }
2072 }
2073 
DumpStackInner(const std::string & args,std::vector<std::string> & info)2074 void AbilityManagerService::DumpStackInner(const std::string &args, std::vector<std::string> &info)
2075 {
2076     std::vector<std::string> argList;
2077     SplitStr(args, " ", argList);
2078     if (argList.empty()) {
2079         return;
2080     }
2081     if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2082         info.push_back("error: invalid argument, please see 'ability dump -h'.");
2083         return;
2084     }
2085     int stackId = DEFAULT_INVAL_VALUE;
2086     (void)StrToInt(argList[1], stackId);
2087     currentStackManager_->DumpStack(stackId, info);
2088 }
2089 
DumpMissionInner(const std::string & args,std::vector<std::string> & info)2090 void AbilityManagerService::DumpMissionInner(const std::string &args, std::vector<std::string> &info)
2091 {
2092     std::vector<std::string> argList;
2093     SplitStr(args, " ", argList);
2094     if (argList.empty()) {
2095         return;
2096     }
2097     if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2098         info.push_back("error: invalid argument, please see 'ability dump -h'.");
2099         return;
2100     }
2101     int missionId = DEFAULT_INVAL_VALUE;
2102     (void)StrToInt(argList[1], missionId);
2103     currentMissionListManager_->DumpMission(missionId, info);
2104 }
2105 #endif
2106 
DumpTopAbilityInner(const std::string & args,std::vector<std::string> & info)2107 void AbilityManagerService::DumpTopAbilityInner(const std::string &args, std::vector<std::string> &info)
2108 {
2109     currentStackManager_->DumpTopAbility(info);
2110 }
2111 
DumpWaittingAbilityQueueInner(const std::string & args,std::vector<std::string> & info)2112 void AbilityManagerService::DumpWaittingAbilityQueueInner(const std::string &args, std::vector<std::string> &info)
2113 {
2114     std::string result;
2115     DumpWaittingAbilityQueue(result);
2116     info.push_back(result);
2117 }
2118 
DumpStateInner(const std::string & args,std::vector<std::string> & info)2119 void AbilityManagerService::DumpStateInner(const std::string &args, std::vector<std::string> &info)
2120 {
2121     std::vector<std::string> argList;
2122     SplitStr(args, " ", argList);
2123     if (argList.empty()) {
2124         return;
2125     }
2126     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2127         connectManager_->DumpState(info, false, argList[1]);
2128     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2129         connectManager_->DumpState(info, false);
2130     } else {
2131         info.emplace_back("error: invalid argument, please see 'ability dump -h'.");
2132     }
2133 }
2134 
IsExistFile(const std::string & path)2135 bool AbilityManagerService::IsExistFile(const std::string &path)
2136 {
2137     HILOG_INFO("%{public}s", __func__);
2138     if (path.empty()) {
2139         return false;
2140     }
2141     struct stat buf = {};
2142     if (stat(path.c_str(), &buf) != 0) {
2143         return false;
2144     }
2145     HILOG_INFO("%{public}s  :file exists", __func__);
2146     return S_ISREG(buf.st_mode);
2147 }
2148 
DataDumpStateInner(const std::string & args,std::vector<std::string> & info)2149 void AbilityManagerService::DataDumpStateInner(const std::string &args, std::vector<std::string> &info)
2150 {
2151     std::vector<std::string> argList;
2152     SplitStr(args, " ", argList);
2153     if (argList.empty()) {
2154         return;
2155     }
2156     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2157         dataAbilityManager_->DumpState(info, argList[1]);
2158     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2159         dataAbilityManager_->DumpState(info);
2160     } else {
2161         info.emplace_back("error: invalid argument, please see 'ability dump -h'.");
2162     }
2163 }
2164 
DumpState(const std::string & args,std::vector<std::string> & info)2165 void AbilityManagerService::DumpState(const std::string &args, std::vector<std::string> &info)
2166 {
2167     std::vector<std::string> argList;
2168     SplitStr(args, " ", argList);
2169     if (argList.empty()) {
2170         return;
2171     }
2172     auto it = dumpMap.find(argList[0]);
2173     if (it == dumpMap.end()) {
2174         return;
2175     }
2176     DumpKey key = it->second;
2177     auto itFunc = dumpFuncMap_.find(key);
2178     if (itFunc != dumpFuncMap_.end()) {
2179         auto dumpFunc = itFunc->second;
2180         if (dumpFunc != nullptr) {
2181             (this->*dumpFunc)(args, info);
2182             return;
2183         }
2184     }
2185     info.push_back("error: invalid argument, please see 'ability dump -h'.");
2186 }
2187 
DumpSysState(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2188 void AbilityManagerService::DumpSysState(
2189     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2190 {
2191     std::vector<std::string> argList;
2192     SplitStr(args, " ", argList);
2193     if (argList.empty()) {
2194         return;
2195     }
2196     auto it = dumpsysMap.find(argList[0]);
2197     if (it == dumpsysMap.end()) {
2198         return;
2199     }
2200     DumpsysKey key = it->second;
2201     auto itFunc = dumpsysFuncMap_.find(key);
2202     if (itFunc != dumpsysFuncMap_.end()) {
2203         auto dumpsysFunc = itFunc->second;
2204         if (dumpsysFunc != nullptr) {
2205             (this->*dumpsysFunc)(args, info, isClient, isUserID, userId);
2206             return;
2207         }
2208     }
2209     info.push_back("error: invalid argument, please see 'ability dump -h'.");
2210 }
2211 
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)2212 int AbilityManagerService::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state, const PacMap &saveData)
2213 {
2214     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2215     HILOG_INFO("Ability transition done, state:%{public}d", state);
2216     if (!VerificationAllToken(token)) {
2217         return ERR_INVALID_VALUE;
2218     }
2219     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2220     CHECK_POINTER_AND_RETURN_LOG(abilityRecord, ERR_INVALID_VALUE, "Ability record is nullptr.");
2221     auto abilityInfo = abilityRecord->GetAbilityInfo();
2222     HILOG_DEBUG("state:%{public}d  name:%{public}s", state, abilityInfo.name.c_str());
2223     auto type = abilityInfo.type;
2224     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2225     // force timeout ability for test
2226     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
2227     if (IsNeedTimeoutForTest(abilityInfo.name,
2228         AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState)))) {
2229         HILOG_WARN("force timeout ability for test, state:%{public}s, ability: %{public}s",
2230             AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState)).c_str(),
2231             abilityInfo.name.c_str());
2232         return ERR_OK;
2233     }
2234     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
2235         auto connectManager = GetConnectManagerByUserId(userId);
2236         if (!connectManager) {
2237             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2238             return ERR_INVALID_VALUE;
2239         }
2240         return connectManager->AbilityTransitionDone(token, state);
2241     }
2242     if (type == AppExecFwk::AbilityType::DATA) {
2243         auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2244         if (!dataAbilityManager) {
2245             HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
2246             return ERR_INVALID_VALUE;
2247         }
2248         return dataAbilityManager->AbilityTransitionDone(token, state);
2249     }
2250 #ifdef SUPPORT_GRAPHICS
2251     int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
2252     auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
2253     if (!missionListManager) {
2254         HILOG_ERROR("missionListManager is Null. ownerMissionUserId=%{public}d", ownerMissionUserId);
2255         return ERR_INVALID_VALUE;
2256     }
2257     return missionListManager->AbilityTransactionDone(token, state, saveData);
2258 #endif
2259 }
2260 
ScheduleConnectAbilityDone(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)2261 int AbilityManagerService::ScheduleConnectAbilityDone(
2262     const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
2263 {
2264     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2265     HILOG_INFO("Schedule connect ability done.");
2266     if (!VerificationAllToken(token)) {
2267         return ERR_INVALID_VALUE;
2268     }
2269 
2270     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2271     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2272 
2273     auto type = abilityRecord->GetAbilityInfo().type;
2274     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2275         HILOG_ERROR("Connect ability failed, target ability is not service.");
2276         return TARGET_ABILITY_NOT_SERVICE;
2277     }
2278     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2279     auto connectManager = GetConnectManagerByUserId(userId);
2280     if (!connectManager) {
2281         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2282         return ERR_INVALID_VALUE;
2283     }
2284     return connectManager->ScheduleConnectAbilityDoneLocked(token, remoteObject);
2285 }
2286 
ScheduleDisconnectAbilityDone(const sptr<IRemoteObject> & token)2287 int AbilityManagerService::ScheduleDisconnectAbilityDone(const sptr<IRemoteObject> &token)
2288 {
2289     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2290     HILOG_INFO("Schedule disconnect ability done.");
2291     if (!VerificationAllToken(token)) {
2292         return ERR_INVALID_VALUE;
2293     }
2294 
2295     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2296     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2297 
2298     auto type = abilityRecord->GetAbilityInfo().type;
2299     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2300         HILOG_ERROR("Connect ability failed, target ability is not service.");
2301         return TARGET_ABILITY_NOT_SERVICE;
2302     }
2303     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2304     auto connectManager = GetConnectManagerByUserId(userId);
2305     if (!connectManager) {
2306         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2307         return ERR_INVALID_VALUE;
2308     }
2309     return connectManager->ScheduleDisconnectAbilityDoneLocked(token);
2310 }
2311 
ScheduleCommandAbilityDone(const sptr<IRemoteObject> & token)2312 int AbilityManagerService::ScheduleCommandAbilityDone(const sptr<IRemoteObject> &token)
2313 {
2314     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2315     HILOG_INFO("Schedule command ability done.");
2316     if (!VerificationAllToken(token)) {
2317         return ERR_INVALID_VALUE;
2318     }
2319 
2320     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2321     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2322     // force timeout ability for test
2323     if (IsNeedTimeoutForTest(abilityRecord->GetAbilityInfo().name, std::string("COMMAND"))) {
2324         HILOG_WARN("force timeout ability for test, state:COMMAND, ability: %{public}s",
2325             abilityRecord->GetAbilityInfo().name.c_str());
2326         return ERR_OK;
2327     }
2328     auto type = abilityRecord->GetAbilityInfo().type;
2329     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2330         HILOG_ERROR("Connect ability failed, target ability is not service.");
2331         return TARGET_ABILITY_NOT_SERVICE;
2332     }
2333     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2334     auto connectManager = GetConnectManagerByUserId(userId);
2335     if (!connectManager) {
2336         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2337         return ERR_INVALID_VALUE;
2338     }
2339     return connectManager->ScheduleCommandAbilityDoneLocked(token);
2340 }
2341 
2342 #ifdef SUPPORT_GRAPHICS
AddWindowInfo(const sptr<IRemoteObject> & token,int32_t windowToken)2343 void AbilityManagerService::AddWindowInfo(const sptr<IRemoteObject> &token, int32_t windowToken)
2344 {
2345     HILOG_DEBUG("Add window id.");
2346     if (!VerificationAllToken(token)) {
2347         return;
2348     }
2349     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2350     CHECK_POINTER(abilityRecord);
2351     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2352     auto stackManager = GetStackManagerByUserId(userId);
2353     if (!stackManager) {
2354         HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
2355         return ;
2356     }
2357     stackManager->AddWindowInfo(token, windowToken);
2358 }
2359 #endif
2360 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const int32_t state)2361 void AbilityManagerService::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
2362 {
2363     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2364     HILOG_INFO("On ability request done.");
2365 
2366     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2367     CHECK_POINTER(abilityRecord);
2368     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2369 
2370     auto type = abilityRecord->GetAbilityInfo().type;
2371     switch (type) {
2372         case AppExecFwk::AbilityType::SERVICE:
2373         case AppExecFwk::AbilityType::EXTENSION: {
2374             auto connectManager = GetConnectManagerByUserId(userId);
2375             if (!connectManager) {
2376                 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2377                 return;
2378             }
2379             connectManager->OnAbilityRequestDone(token, state);
2380             break;
2381         }
2382         case AppExecFwk::AbilityType::DATA: {
2383             auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2384             if (!dataAbilityManager) {
2385                 HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
2386                 return;
2387             }
2388             dataAbilityManager->OnAbilityRequestDone(token, state);
2389             break;
2390         }
2391         default: {
2392 #ifdef SUPPORT_GRAPHICS
2393             int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
2394             auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
2395             if (!missionListManager) {
2396                 HILOG_ERROR("missionListManager is Null. ownerMissionUserId=%{public}d", ownerMissionUserId);
2397                 return;
2398             }
2399             missionListManager->OnAbilityRequestDone(token, state);
2400 #endif
2401             break;
2402         }
2403     }
2404 }
2405 
OnAppStateChanged(const AppInfo & info)2406 void AbilityManagerService::OnAppStateChanged(const AppInfo &info)
2407 {
2408     HILOG_INFO("On app state changed.");
2409     connectManager_->OnAppStateChanged(info);
2410 #ifdef SUPPORT_GRAPHICS
2411     currentMissionListManager_->OnAppStateChanged(info);
2412 #endif
2413     dataAbilityManager_->OnAppStateChanged(info);
2414 }
2415 
GetEventHandler()2416 std::shared_ptr<AbilityEventHandler> AbilityManagerService::GetEventHandler()
2417 {
2418     return handler_;
2419 }
2420 
2421 #ifdef SUPPORT_GRAPHICS
SetStackManager(int userId,bool switchUser)2422 void AbilityManagerService::SetStackManager(int userId, bool switchUser)
2423 {
2424     auto iterator = stackManagers_.find(userId);
2425     if (iterator != stackManagers_.end()) {
2426         if (switchUser) {
2427             currentStackManager_ = iterator->second;
2428         }
2429     } else {
2430         auto manager = std::make_shared<AbilityStackManager>(userId);
2431         manager->Init();
2432         stackManagers_.emplace(userId, manager);
2433         if (switchUser) {
2434             currentStackManager_ = manager;
2435         }
2436     }
2437 }
2438 
InitMissionListManager(int userId,bool switchUser)2439 void AbilityManagerService::InitMissionListManager(int userId, bool switchUser)
2440 {
2441     bool find = false;
2442     {
2443         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2444         auto iterator = missionListManagers_.find(userId);
2445         find = (iterator != missionListManagers_.end());
2446         if (find) {
2447             if (switchUser) {
2448                 DelayedSingleton<MissionInfoMgr>::GetInstance()->Init(userId);
2449                 currentMissionListManager_ = iterator->second;
2450             }
2451         }
2452     }
2453     if (!find) {
2454         auto manager = std::make_shared<MissionListManager>(userId);
2455         manager->Init();
2456         std::unique_lock<std::shared_mutex> lock(managersMutex_);
2457         missionListManagers_.emplace(userId, manager);
2458         if (switchUser) {
2459             currentMissionListManager_ = manager;
2460         }
2461     }
2462 }
2463 
GetStackManager()2464 std::shared_ptr<AbilityStackManager> AbilityManagerService::GetStackManager()
2465 {
2466     return currentStackManager_;
2467 }
2468 #endif
2469 
DumpWaittingAbilityQueue(std::string & result)2470 void AbilityManagerService::DumpWaittingAbilityQueue(std::string &result)
2471 {
2472     currentStackManager_->DumpWaittingAbilityQueue(result);
2473     return;
2474 }
2475 
2476 // multi user scene
GetUserId()2477 int AbilityManagerService::GetUserId()
2478 {
2479     if (userController_) {
2480         return userController_->GetCurrentUserId();
2481     }
2482     return U0_USER_ID;
2483 }
2484 
StartHighestPriorityAbility(bool isBoot)2485 void AbilityManagerService::StartHighestPriorityAbility(bool isBoot)
2486 {
2487     HILOG_DEBUG("%{public}s", __func__);
2488     auto bms = GetBundleManager();
2489     CHECK_POINTER(bms);
2490 
2491     auto userId = GetUserId();
2492     HILOG_DEBUG("%{public}s, QueryAbilityInfo, userId is %{public}d", __func__, userId);
2493 
2494     /* Query the highest priority abiltiy or extension ability, and start it. usually, it is OOBE or launcher */
2495     Want want;
2496     want.AddEntity(HIGHEST_PRIORITY_ABILITY_ENTITY);
2497     AppExecFwk::AbilityInfo abilityInfo;
2498     AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
2499     int attemptNums = 0;
2500     while (!IN_PROCESS_CALL(bms->ImplicitQueryInfoByPriority(want,
2501         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, userId,
2502         abilityInfo, extensionAbilityInfo))) {
2503         HILOG_INFO("Waiting query highest priority ability info completed.");
2504         if (!isBoot && ++attemptNums > SWITCH_ACCOUNT_TRY) {
2505             HILOG_ERROR("Query highest priority ability failed.");
2506             return;
2507         }
2508         usleep(REPOLL_TIME_MICRO_SECONDS);
2509     }
2510 
2511     if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
2512         HILOG_ERROR("Query highest priority ability failed");
2513         return;
2514     }
2515 
2516     Want abilityWant; // donot use 'want' here, because the entity of 'want' is not empty
2517     if (!abilityInfo.name.empty()) {
2518         /* highest priority abiltiy */
2519         HILOG_INFO("Start the highest priority ability. bundleName: %{public}s, ability:%{public}s",
2520             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
2521         abilityWant.SetElementName(abilityInfo.bundleName, abilityInfo.name);
2522     } else {
2523         /* highest priority extension abiltiy */
2524         HILOG_INFO("Start the highest priority entension ability. bundleName: %{public}s, ability:%{public}s",
2525             extensionAbilityInfo.bundleName.c_str(), extensionAbilityInfo.name.c_str());
2526         abilityWant.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
2527     }
2528 
2529     /* note: OOBE APP need disable itself, otherwise, it will be started when restart system everytime */
2530     (void)StartAbility(abilityWant, userId, DEFAULT_INVAL_VALUE);
2531 }
2532 
StartingPhoneServiceAbility()2533 void AbilityManagerService::StartingPhoneServiceAbility()
2534 {
2535     HILOG_DEBUG("%{public}s", __func__);
2536     auto bms = GetBundleManager();
2537     CHECK_POINTER_IS_NULLPTR(bms);
2538 
2539     AppExecFwk::AbilityInfo phoneServiceInfo;
2540     Want phoneServiceWant;
2541     phoneServiceWant.SetElementName(AbilityConfig::PHONE_SERVICE_BUNDLE_NAME,
2542         AbilityConfig::PHONE_SERVICE_ABILITY_NAME);
2543 
2544     auto userId = GetUserId();
2545     int attemptNums = 1;
2546     HILOG_DEBUG("%{public}s, QueryAbilityInfo, userId is %{public}d", __func__, userId);
2547     IN_PROCESS_CALL_WITHOUT_RET(
2548         while (!(bms->QueryAbilityInfo(phoneServiceWant,
2549             OHOS::AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, userId, phoneServiceInfo)) &&
2550             attemptNums <= MAX_NUMBER_OF_CONNECT_BMS) {
2551             HILOG_INFO("Waiting query phone service ability info completed.");
2552             usleep(REPOLL_TIME_MICRO_SECONDS);
2553             attemptNums++;
2554         }
2555     );
2556 
2557     (void)StartAbility(phoneServiceWant, userId, DEFAULT_INVAL_VALUE);
2558 }
2559 
StartingMmsAbility()2560 void AbilityManagerService::StartingMmsAbility()
2561 {
2562     HILOG_DEBUG("%{public}s", __func__);
2563     auto bms = GetBundleManager();
2564     CHECK_POINTER_IS_NULLPTR(bms);
2565 
2566     AppExecFwk::AbilityInfo mmsInfo;
2567     Want mmsWant;
2568     mmsWant.SetElementName(AbilityConfig::MMS_BUNDLE_NAME, AbilityConfig::MMS_ABILITY_NAME);
2569 
2570     auto userId = GetUserId();
2571     int attemptNums = 1;
2572     HILOG_DEBUG("%{public}s, QueryAbilityInfo, userId is %{public}d", __func__, userId);
2573     IN_PROCESS_CALL_WITHOUT_RET(
2574         while (!(bms->QueryAbilityInfo(mmsWant,
2575             OHOS::AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, userId, mmsInfo)) &&
2576             attemptNums <= MAX_NUMBER_OF_CONNECT_BMS) {
2577             HILOG_INFO("Waiting query mms service completed.");
2578             usleep(REPOLL_TIME_MICRO_SECONDS);
2579             attemptNums++;
2580         }
2581     );
2582 
2583     HILOG_INFO("attemptNums : %{public}d", attemptNums);
2584     if (attemptNums <= MAX_NUMBER_OF_CONNECT_BMS) {
2585         (void)StartAbility(mmsWant, userId, DEFAULT_INVAL_VALUE);
2586     }
2587 }
2588 
GenerateAbilityRequest(const Want & want,int requestCode,AbilityRequest & request,const sptr<IRemoteObject> & callerToken,int32_t userId)2589 int AbilityManagerService::GenerateAbilityRequest(
2590     const Want &want, int requestCode, AbilityRequest &request, const sptr<IRemoteObject> &callerToken, int32_t userId)
2591 {
2592     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2593     request.want = want;
2594     request.requestCode = requestCode;
2595     request.callerToken = callerToken;
2596     request.startSetting = nullptr;
2597 
2598     auto bms = GetBundleManager();
2599     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
2600 #ifdef SUPPORT_GRAPHICS
2601     if (want.GetAction().compare(ACTION_CHOOSE) == 0) {
2602         return ShowPickerDialog(want, userId);
2603     }
2604 #endif
2605     auto abilityInfoFlag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION |
2606         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION |
2607         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA);
2608     HILOG_DEBUG("%{public}s, QueryAbilityInfo, userId is %{public}d", __func__, userId);
2609     IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(want, abilityInfoFlag, userId, request.abilityInfo));
2610     if (request.abilityInfo.name.empty() || request.abilityInfo.bundleName.empty()) {
2611         // try to find extension
2612         std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
2613         IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag, userId, extensionInfos));
2614         if (extensionInfos.size() <= 0) {
2615             HILOG_ERROR("Get extension info failed.");
2616             return RESOLVE_ABILITY_ERR;
2617         }
2618 
2619         AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
2620         if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
2621             HILOG_ERROR("extensionInfo empty.");
2622             return RESOLVE_ABILITY_ERR;
2623         }
2624         HILOG_DEBUG("QueryExtensionAbilityInfo, extension ability info found, name=%{public}s",
2625             extensionInfo.name.c_str());
2626         // For compatibility translates to AbilityInfo
2627         InitAbilityInfoFromExtension(extensionInfo, request.abilityInfo);
2628     }
2629     HILOG_DEBUG("Query ability name: %{public}s, is stage mode: %{public}d",
2630         request.abilityInfo.name.c_str(), request.abilityInfo.isStageBasedModel);
2631     if (request.abilityInfo.type == AppExecFwk::AbilityType::SERVICE && request.abilityInfo.isStageBasedModel) {
2632         HILOG_INFO("stage mode, abilityInfo SERVICE type reset EXTENSION.");
2633         request.abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
2634     }
2635 
2636     if (request.abilityInfo.applicationInfo.name.empty() || request.abilityInfo.applicationInfo.bundleName.empty()) {
2637         HILOG_ERROR("Get app info failed.");
2638         return RESOLVE_APP_ERR;
2639     }
2640     request.appInfo = request.abilityInfo.applicationInfo;
2641     request.compatibleVersion = (int32_t)request.appInfo.apiCompatibleVersion;
2642     request.uid = request.appInfo.uid;
2643     HILOG_DEBUG("End, app name: %{public}s, bundle name: %{public}s, uid: %{public}d",
2644         request.appInfo.name.c_str(), request.appInfo.bundleName.c_str(), request.uid);
2645 
2646     return ERR_OK;
2647 }
2648 
2649 #ifdef SUPPORT_GRAPHICS
GetAllStackInfo(StackInfo & stackInfo)2650 int AbilityManagerService::GetAllStackInfo(StackInfo &stackInfo)
2651 {
2652     HILOG_DEBUG("Get all stack info.");
2653     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
2654     currentStackManager_->GetAllStackInfo(stackInfo);
2655     return ERR_OK;
2656 }
2657 #endif
2658 
TerminateAbilityResult(const sptr<IRemoteObject> & token,int startId)2659 int AbilityManagerService::TerminateAbilityResult(const sptr<IRemoteObject> &token, int startId)
2660 {
2661     HILOG_INFO("Terminate ability result, startId: %{public}d", startId);
2662     if (!VerificationAllToken(token)) {
2663         return ERR_INVALID_VALUE;
2664     }
2665 
2666     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2667     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2668     int result = AbilityUtil::JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
2669     if (result != ERR_OK) {
2670         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
2671         return result;
2672     }
2673 
2674     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2675     auto type = abilityRecord->GetAbilityInfo().type;
2676     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2677         HILOG_ERROR("target ability is not service.");
2678         return TARGET_ABILITY_NOT_SERVICE;
2679     }
2680 
2681     auto connectManager = GetConnectManagerByUserId(userId);
2682     if (!connectManager) {
2683         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2684         return ERR_INVALID_VALUE;
2685     }
2686     return connectManager->TerminateAbilityResult(token, startId);
2687 }
2688 
StopServiceAbility(const Want & want,int32_t userId)2689 int AbilityManagerService::StopServiceAbility(const Want &want, int32_t userId)
2690 {
2691     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2692     HILOG_DEBUG("Stop service ability.");
2693 
2694     int32_t validUserId = GetValidUserId(userId);
2695 
2696     AbilityRequest abilityRequest;
2697     auto result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, validUserId);
2698     if (result != ERR_OK) {
2699         HILOG_ERROR("Generate ability request local error.");
2700         return result;
2701     }
2702 
2703     auto abilityInfo = abilityRequest.abilityInfo;
2704     validUserId = abilityInfo.applicationInfo.singleUser ? U0_USER_ID : validUserId;
2705     HILOG_DEBUG("validUserId : %{public}d, singleUser is : %{public}d",
2706         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleUser));
2707 
2708     if (!JudgeMultiUserConcurrency(abilityRequest.abilityInfo, validUserId)) {
2709         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
2710         return ERR_INVALID_VALUE;
2711     }
2712 
2713     auto type = abilityInfo.type;
2714     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2715         HILOG_ERROR("Target ability is not service type.");
2716         return TARGET_ABILITY_NOT_SERVICE;
2717     }
2718 
2719     auto connectManager = GetConnectManagerByUserId(validUserId);
2720     if (connectManager == nullptr) {
2721         return ERR_INVALID_VALUE;
2722     }
2723 
2724     return connectManager->StopServiceAbility(abilityRequest);
2725 }
2726 
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)2727 void AbilityManagerService::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
2728 {
2729     CHECK_POINTER(abilityRecord);
2730 
2731     auto manager = GetListManagerByUserId(abilityRecord->GetOwnerMissionUserId());
2732     if (manager) {
2733         manager->OnAbilityDied(abilityRecord, GetUserId());
2734         return;
2735     }
2736 
2737     auto connectManager = GetConnectManagerByToken(abilityRecord->GetToken());
2738     if (connectManager) {
2739         connectManager->OnAbilityDied(abilityRecord, GetUserId());
2740         return;
2741     }
2742 
2743     auto dataAbilityManager = GetDataAbilityManagerByToken(abilityRecord->GetToken());
2744     if (dataAbilityManager) {
2745         dataAbilityManager->OnAbilityDied(abilityRecord);
2746     }
2747 }
2748 
OnCallConnectDied(std::shared_ptr<CallRecord> callRecord)2749 void AbilityManagerService::OnCallConnectDied(std::shared_ptr<CallRecord> callRecord)
2750 {
2751     CHECK_POINTER(callRecord);
2752     if (currentMissionListManager_) {
2753         currentMissionListManager_->OnCallConnectDied(callRecord);
2754     }
2755 }
2756 
GetMaxRestartNum(int & max)2757 void AbilityManagerService::GetMaxRestartNum(int &max)
2758 {
2759     if (amsConfigResolver_) {
2760         max = amsConfigResolver_->GetMaxRestartNum();
2761     }
2762 }
2763 
2764 #ifdef SUPPORT_GRAPHICS
IsUseNewMission()2765 bool AbilityManagerService::IsUseNewMission()
2766 {
2767     return useNewMission_;
2768 }
2769 #endif
2770 
KillProcess(const std::string & bundleName)2771 int AbilityManagerService::KillProcess(const std::string &bundleName)
2772 {
2773     HILOG_DEBUG("Kill process, bundleName: %{public}s", bundleName.c_str());
2774     auto bms = GetBundleManager();
2775     CHECK_POINTER_AND_RETURN(bms, KILL_PROCESS_FAILED);
2776     int32_t userId = GetUserId();
2777     AppExecFwk::BundleInfo bundleInfo;
2778     if (!IN_PROCESS_CALL(
2779         bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId))) {
2780         HILOG_ERROR("Failed to get bundle info when kill process.");
2781         return GET_BUNDLE_INFO_FAILED;
2782     }
2783 
2784     if (bundleInfo.isKeepAlive) {
2785         HILOG_ERROR("Can not kill keep alive process.");
2786         return KILL_PROCESS_KEEP_ALIVE;
2787     }
2788 
2789     int ret = DelayedSingleton<AppScheduler>::GetInstance()->KillApplication(bundleName);
2790     if (ret != ERR_OK) {
2791         return KILL_PROCESS_FAILED;
2792     }
2793     return ERR_OK;
2794 }
2795 
ClearUpApplicationData(const std::string & bundleName)2796 int AbilityManagerService::ClearUpApplicationData(const std::string &bundleName)
2797 {
2798     HILOG_DEBUG("ClearUpApplicationData, bundleName: %{public}s", bundleName.c_str());
2799     int ret = DelayedSingleton<AppScheduler>::GetInstance()->ClearUpApplicationData(bundleName);
2800     if (ret != ERR_OK) {
2801         return CLEAR_APPLICATION_DATA_FAIL;
2802     }
2803     return ERR_OK;
2804 }
2805 
UninstallApp(const std::string & bundleName,int32_t uid)2806 int AbilityManagerService::UninstallApp(const std::string &bundleName, int32_t uid)
2807 {
2808     HILOG_DEBUG("Uninstall app, bundleName: %{public}s, uid=%{public}d", bundleName.c_str(), uid);
2809     pid_t callingPid = IPCSkeleton::GetCallingPid();
2810     pid_t pid = getpid();
2811     if (callingPid != pid) {
2812         HILOG_ERROR("%{public}s: Not bundleMgr call.", __func__);
2813         return CHECK_PERMISSION_FAILED;
2814     }
2815 
2816     int32_t targetUserId = uid / BASE_USER_RANGE;
2817     if (targetUserId == U0_USER_ID) {
2818         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2819         for (auto item: missionListManagers_) {
2820             if (item.second) {
2821                 item.second->UninstallApp(bundleName, uid);
2822             }
2823         }
2824     } else {
2825         auto listManager = GetListManagerByUserId(targetUserId);
2826         if (listManager) {
2827             listManager->UninstallApp(bundleName, uid);
2828         }
2829     }
2830     if (pendingWantManager_) {
2831         pendingWantManager_->ClearPendingWantRecord(bundleName, uid);
2832     }
2833     int ret = DelayedSingleton<AppScheduler>::GetInstance()->KillApplicationByUid(bundleName, uid);
2834     if (ret != ERR_OK) {
2835         return UNINSTALL_APP_FAILED;
2836     }
2837     return ERR_OK;
2838 }
2839 
GetBundleManager()2840 sptr<AppExecFwk::IBundleMgr> AbilityManagerService::GetBundleManager()
2841 {
2842     if (iBundleManager_ == nullptr) {
2843         auto bundleObj =
2844             OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
2845         if (bundleObj == nullptr) {
2846             HILOG_ERROR("Failed to get bundle manager service.");
2847             return nullptr;
2848         }
2849         iBundleManager_ = iface_cast<AppExecFwk::IBundleMgr>(bundleObj);
2850     }
2851     return iBundleManager_;
2852 }
2853 
PreLoadAppDataAbilities(const std::string & bundleName,const int32_t userId)2854 int AbilityManagerService::PreLoadAppDataAbilities(const std::string &bundleName, const int32_t userId)
2855 {
2856     if (bundleName.empty()) {
2857         HILOG_ERROR("Invalid bundle name when app data abilities preloading.");
2858         return ERR_INVALID_VALUE;
2859     }
2860 
2861     auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2862     if (dataAbilityManager == nullptr) {
2863         HILOG_ERROR("Invalid data ability manager when app data abilities preloading.");
2864         return ERR_INVALID_STATE;
2865     }
2866 
2867     auto bms = GetBundleManager();
2868     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
2869 
2870     AppExecFwk::BundleInfo bundleInfo;
2871     bool ret = IN_PROCESS_CALL(
2872         bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, userId));
2873     if (!ret) {
2874         HILOG_ERROR("Failed to get bundle info when app data abilities preloading, userId is %{public}d", userId);
2875         return RESOLVE_APP_ERR;
2876     }
2877 
2878     HILOG_INFO("App data abilities preloading for bundle '%{public}s'...", bundleName.data());
2879 
2880     auto begin = system_clock::now();
2881     AbilityRequest dataAbilityRequest;
2882     dataAbilityRequest.appInfo = bundleInfo.applicationInfo;
2883     for (auto it = bundleInfo.abilityInfos.begin(); it != bundleInfo.abilityInfos.end(); ++it) {
2884         if (it->type != AppExecFwk::AbilityType::DATA) {
2885             continue;
2886         }
2887         if ((system_clock::now() - begin) >= DATA_ABILITY_START_TIMEOUT) {
2888             HILOG_ERROR("App data ability preloading for '%{public}s' timeout.", bundleName.c_str());
2889             return ERR_TIMED_OUT;
2890         }
2891         dataAbilityRequest.abilityInfo = *it;
2892         dataAbilityRequest.uid = bundleInfo.uid;
2893         HILOG_INFO("App data ability preloading: '%{public}s.%{public}s'...", it->bundleName.c_str(), it->name.c_str());
2894 
2895         auto dataAbility = dataAbilityManager->Acquire(dataAbilityRequest, false, nullptr, false);
2896         if (dataAbility == nullptr) {
2897             HILOG_ERROR(
2898                 "Failed to preload data ability '%{public}s.%{public}s'.", it->bundleName.c_str(), it->name.c_str());
2899             return ERR_NULL_OBJECT;
2900         }
2901     }
2902 
2903     HILOG_INFO("App data abilities preloading done.");
2904 
2905     return ERR_OK;
2906 }
2907 
IsSystemUiApp(const AppExecFwk::AbilityInfo & info) const2908 bool AbilityManagerService::IsSystemUiApp(const AppExecFwk::AbilityInfo &info) const
2909 {
2910     if (info.bundleName != AbilityConfig::SYSTEM_UI_BUNDLE_NAME) {
2911         return false;
2912     }
2913     return (info.name == AbilityConfig::SYSTEM_UI_NAVIGATION_BAR ||
2914         info.name == AbilityConfig::SYSTEM_UI_STATUS_BAR ||
2915         info.name == AbilityConfig::SYSTEM_UI_ABILITY_NAME);
2916 }
2917 
IsSystemUI(const std::string & bundleName) const2918 bool AbilityManagerService::IsSystemUI(const std::string &bundleName) const
2919 {
2920     return bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME;
2921 }
2922 
HandleLoadTimeOut(int64_t eventId)2923 void AbilityManagerService::HandleLoadTimeOut(int64_t eventId)
2924 {
2925     HILOG_DEBUG("Handle load timeout.");
2926     std::shared_lock<std::shared_mutex> lock(managersMutex_);
2927     for (auto& item : missionListManagers_) {
2928         if (item.second) {
2929             item.second->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId);
2930         }
2931     }
2932 }
2933 
HandleActiveTimeOut(int64_t eventId)2934 void AbilityManagerService::HandleActiveTimeOut(int64_t eventId)
2935 {
2936     HILOG_DEBUG("Handle active timeout.");
2937     std::shared_lock<std::shared_mutex> lock(managersMutex_);
2938     for (auto& item : missionListManagers_) {
2939         if (item.second) {
2940             item.second->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, eventId);
2941         }
2942     }
2943 }
2944 
HandleInactiveTimeOut(int64_t eventId)2945 void AbilityManagerService::HandleInactiveTimeOut(int64_t eventId)
2946 {
2947     HILOG_DEBUG("Handle inactive timeout.");
2948     std::shared_lock<std::shared_mutex> lock(managersMutex_);
2949     for (auto& item : missionListManagers_) {
2950         if (item.second) {
2951             item.second->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, eventId);
2952         }
2953     }
2954 
2955     for (auto& item : connectManagers_) {
2956         if (item.second) {
2957             item.second->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, eventId);
2958         }
2959     }
2960 }
2961 
HandleForegroundNewTimeOut(int64_t eventId)2962 void AbilityManagerService::HandleForegroundNewTimeOut(int64_t eventId)
2963 {
2964     HILOG_DEBUG("Handle ForegroundNew timeout.");
2965     std::shared_lock<std::shared_mutex> lock(managersMutex_);
2966     for (auto& item : missionListManagers_) {
2967         if (item.second) {
2968             item.second->OnTimeOut(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, eventId);
2969         }
2970     }
2971 }
2972 
HandleBackgroundNewTimeOut(int64_t eventId)2973 void AbilityManagerService::HandleBackgroundNewTimeOut(int64_t eventId)
2974 {
2975     HILOG_DEBUG("Handle BackgroundNew timeout.");
2976     std::shared_lock<std::shared_mutex> lock(managersMutex_);
2977     for (auto& item : missionListManagers_) {
2978         if (item.second) {
2979             item.second->OnTimeOut(AbilityManagerService::BACKGROUNDNEW_TIMEOUT_MSG, eventId);
2980         }
2981     }
2982 }
2983 
VerificationToken(const sptr<IRemoteObject> & token)2984 bool AbilityManagerService::VerificationToken(const sptr<IRemoteObject> &token)
2985 {
2986     HILOG_INFO("Verification token.");
2987     CHECK_POINTER_RETURN_BOOL(dataAbilityManager_);
2988     CHECK_POINTER_RETURN_BOOL(connectManager_);
2989     CHECK_POINTER_RETURN_BOOL(currentStackManager_);
2990     CHECK_POINTER_RETURN_BOOL(currentMissionListManager_);
2991 
2992     if (currentMissionListManager_->GetAbilityRecordByToken(token)) {
2993         return true;
2994     }
2995     if (currentMissionListManager_->GetAbilityFromTerminateList(token)) {
2996         return true;
2997     }
2998 
2999     if (dataAbilityManager_->GetAbilityRecordByToken(token)) {
3000         HILOG_INFO("Verification token4.");
3001         return true;
3002     }
3003 
3004     if (connectManager_->GetServiceRecordByToken(token)) {
3005         HILOG_INFO("Verification token5.");
3006         return true;
3007     }
3008 
3009     HILOG_ERROR("Failed to verify token.");
3010     return false;
3011 }
3012 
VerificationAllToken(const sptr<IRemoteObject> & token)3013 bool AbilityManagerService::VerificationAllToken(const sptr<IRemoteObject> &token)
3014 {
3015     HILOG_INFO("VerificationAllToken.");
3016     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3017     for (auto item: missionListManagers_) {
3018         if (item.second && item.second->GetAbilityRecordByToken(token)) {
3019             return true;
3020         }
3021 
3022         if (item.second && item.second->GetAbilityFromTerminateList(token)) {
3023             return true;
3024         }
3025     }
3026 
3027     for (auto item: dataAbilityManagers_) {
3028         if (item.second && item.second->GetAbilityRecordByToken(token)) {
3029             return true;
3030         }
3031     }
3032 
3033     for (auto item: connectManagers_) {
3034         if (item.second && item.second->GetServiceRecordByToken(token)) {
3035             return true;
3036         }
3037     }
3038 
3039     HILOG_ERROR("Failed to verify all token.");
3040     return false;
3041 }
3042 
GetDataAbilityManager(const sptr<IAbilityScheduler> & scheduler)3043 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManager(
3044     const sptr<IAbilityScheduler> &scheduler)
3045 {
3046     if (scheduler == nullptr) {
3047         HILOG_ERROR("the param ability scheduler is nullptr");
3048         return nullptr;
3049     }
3050 
3051     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3052     for (auto& item: dataAbilityManagers_) {
3053         if (item.second && item.second->ContainsDataAbility(scheduler)) {
3054             return item.second;
3055         }
3056     }
3057 
3058     return nullptr;
3059 }
3060 
GetStackManagerByUserId(int32_t userId)3061 std::shared_ptr<AbilityStackManager> AbilityManagerService::GetStackManagerByUserId(int32_t userId)
3062 {
3063     auto it = stackManagers_.find(userId);
3064     if (it != stackManagers_.end()) {
3065         return it->second;
3066     }
3067     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3068     return nullptr;
3069 }
3070 
3071 #ifdef SUPPORT_GRAPHICS
GetListManagerByUserId(int32_t userId)3072 std::shared_ptr<MissionListManager> AbilityManagerService::GetListManagerByUserId(int32_t userId)
3073 {
3074     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3075     auto it = missionListManagers_.find(userId);
3076     if (it != missionListManagers_.end()) {
3077         return it->second;
3078     }
3079     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3080     return nullptr;
3081 }
3082 #endif
3083 
GetConnectManagerByUserId(int32_t userId)3084 std::shared_ptr<AbilityConnectManager> AbilityManagerService::GetConnectManagerByUserId(int32_t userId)
3085 {
3086     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3087     auto it = connectManagers_.find(userId);
3088     if (it != connectManagers_.end()) {
3089         return it->second;
3090     }
3091     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3092     return nullptr;
3093 }
3094 
GetDataAbilityManagerByUserId(int32_t userId)3095 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManagerByUserId(int32_t userId)
3096 {
3097     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3098     auto it = dataAbilityManagers_.find(userId);
3099     if (it != dataAbilityManagers_.end()) {
3100         return it->second;
3101     }
3102     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3103     return nullptr;
3104 }
3105 
GetStackManagerByToken(const sptr<IRemoteObject> & token)3106 std::shared_ptr<AbilityStackManager> AbilityManagerService::GetStackManagerByToken(const sptr<IRemoteObject> &token)
3107 {
3108     for (auto item: stackManagers_) {
3109         if (item.second && item.second->GetAbilityRecordByToken(token)) {
3110             return item.second;
3111         }
3112 
3113         if (item.second && item.second->GetAbilityFromTerminateList(token)) {
3114             return item.second;
3115         }
3116     }
3117 
3118     return nullptr;
3119 }
3120 
GetConnectManagerByToken(const sptr<IRemoteObject> & token)3121 std::shared_ptr<AbilityConnectManager> AbilityManagerService::GetConnectManagerByToken(
3122     const sptr<IRemoteObject> &token)
3123 {
3124     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3125     for (auto item: connectManagers_) {
3126         if (item.second && item.second->GetServiceRecordByToken(token)) {
3127             return item.second;
3128         }
3129     }
3130 
3131     return nullptr;
3132 }
3133 
GetDataAbilityManagerByToken(const sptr<IRemoteObject> & token)3134 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManagerByToken(
3135     const sptr<IRemoteObject> &token)
3136 {
3137     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3138     for (auto item: dataAbilityManagers_) {
3139         if (item.second && item.second->GetAbilityRecordByToken(token)) {
3140             return item.second;
3141         }
3142     }
3143 
3144     return nullptr;
3145 }
3146 
3147 #ifdef SUPPORT_GRAPHICS
MoveMissionToFloatingStack(const MissionOption & missionOption)3148 int AbilityManagerService::MoveMissionToFloatingStack(const MissionOption &missionOption)
3149 {
3150     HILOG_INFO("Move mission to floating stack.");
3151     return currentStackManager_->MoveMissionToFloatingStack(missionOption);
3152 }
3153 
MoveMissionToSplitScreenStack(const MissionOption & primary,const MissionOption & secondary)3154 int AbilityManagerService::MoveMissionToSplitScreenStack(const MissionOption &primary, const MissionOption &secondary)
3155 {
3156     HILOG_INFO("Move mission to split screen stack.");
3157     return currentStackManager_->MoveMissionToSplitScreenStack(primary, secondary);
3158 }
3159 #endif
3160 
ChangeFocusAbility(const sptr<IRemoteObject> & lostFocusToken,const sptr<IRemoteObject> & getFocusToken)3161 int AbilityManagerService::ChangeFocusAbility(
3162     const sptr<IRemoteObject> &lostFocusToken, const sptr<IRemoteObject> &getFocusToken)
3163 {
3164     HILOG_INFO("Change focus ability.");
3165     CHECK_POINTER_AND_RETURN(lostFocusToken, ERR_INVALID_VALUE);
3166     CHECK_POINTER_AND_RETURN(getFocusToken, ERR_INVALID_VALUE);
3167     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_INVALID_VALUE);
3168 
3169     if (!VerificationAllToken(lostFocusToken)) {
3170         return ERR_INVALID_VALUE;
3171     }
3172 
3173     if (!VerificationAllToken(getFocusToken)) {
3174         return ERR_INVALID_VALUE;
3175     }
3176 
3177     return currentStackManager_->ChangeFocusAbility(lostFocusToken, getFocusToken);
3178 }
3179 
3180 #ifdef SUPPORT_GRAPHICS
MinimizeMultiWindow(int missionId)3181 int AbilityManagerService::MinimizeMultiWindow(int missionId)
3182 {
3183     HILOG_INFO("Minimize multi window.");
3184     return currentStackManager_->MinimizeMultiWindow(missionId);
3185 }
3186 
MaximizeMultiWindow(int missionId)3187 int AbilityManagerService::MaximizeMultiWindow(int missionId)
3188 {
3189     HILOG_INFO("Maximize multi window.");
3190     return currentStackManager_->MaximizeMultiWindow(missionId);
3191 }
3192 
GetFloatingMissions(std::vector<AbilityMissionInfo> & list)3193 int AbilityManagerService::GetFloatingMissions(std::vector<AbilityMissionInfo> &list)
3194 {
3195     HILOG_INFO("Get floating missions.");
3196     return currentStackManager_->GetFloatingMissions(list);
3197 }
3198 
CloseMultiWindow(int missionId)3199 int AbilityManagerService::CloseMultiWindow(int missionId)
3200 {
3201     HILOG_INFO("Close multi window.");
3202     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_INVALID_VALUE);
3203     return currentStackManager_->CloseMultiWindow(missionId);
3204 }
3205 
SetMissionStackSetting(const StackSetting & stackSetting)3206 int AbilityManagerService::SetMissionStackSetting(const StackSetting &stackSetting)
3207 {
3208     HILOG_INFO("Set mission stack setting.");
3209     currentStackManager_->SetMissionStackSetting(stackSetting);
3210     return ERR_OK;
3211 }
3212 
IsFirstInMission(const sptr<IRemoteObject> & token)3213 bool AbilityManagerService::IsFirstInMission(const sptr<IRemoteObject> &token)
3214 {
3215     HILOG_INFO("Is first in mission.");
3216     CHECK_POINTER_RETURN_BOOL(token);
3217     CHECK_POINTER_RETURN_BOOL(currentStackManager_);
3218 
3219     if (!VerificationAllToken(token)) {
3220         return false;
3221     }
3222     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3223     CHECK_POINTER_RETURN_BOOL(abilityRecord);
3224     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
3225     auto stackManager = GetStackManagerByUserId(userId);
3226     if (!stackManager) {
3227         HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
3228         return ERR_INVALID_VALUE;
3229     }
3230     return stackManager->IsFirstInMission(token);
3231 }
3232 
PowerOff()3233 int AbilityManagerService::PowerOff()
3234 {
3235     HILOG_INFO("Power off.");
3236     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
3237     return currentStackManager_->PowerOff();
3238 }
3239 
PowerOn()3240 int AbilityManagerService::PowerOn()
3241 {
3242     HILOG_INFO("Power on.");
3243     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
3244     return currentStackManager_->PowerOn();
3245 }
3246 
LockMission(int missionId)3247 int AbilityManagerService::LockMission(int missionId)
3248 {
3249     HILOG_INFO("request lock mission id :%{public}d", missionId);
3250     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
3251     auto bms = GetBundleManager();
3252     CHECK_POINTER_AND_RETURN(bms, ERR_NO_INIT);
3253 
3254     int callerUid = IPCSkeleton::GetCallingUid();
3255     int callerPid = IPCSkeleton::GetCallingPid();
3256     bool isSystemApp = IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(callerUid));
3257     HILOG_DEBUG("locker uid :%{public}d, pid :%{public}d. isSystemApp: %{public}d", callerUid, callerPid, isSystemApp);
3258     return currentStackManager_->StartLockMission(callerUid, missionId, isSystemApp, true);
3259 }
3260 
UnlockMission(int missionId)3261 int AbilityManagerService::UnlockMission(int missionId)
3262 {
3263     HILOG_INFO("request unlock mission id :%{public}d", missionId);
3264     CHECK_POINTER_AND_RETURN(currentStackManager_, ERR_NO_INIT);
3265     auto bms = GetBundleManager();
3266     CHECK_POINTER_AND_RETURN(bms, ERR_NO_INIT);
3267 
3268     int callerUid = IPCSkeleton::GetCallingUid();
3269     int callerPid = IPCSkeleton::GetCallingPid();
3270     bool isSystemApp = IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(callerUid));
3271     HILOG_DEBUG("locker uid :%{public}d, pid :%{public}d. isSystemApp: %{public}d", callerUid, callerPid, isSystemApp);
3272     return currentStackManager_->StartLockMission(callerUid, missionId, isSystemApp, false);
3273 }
3274 #endif
3275 
GetUidByBundleName(std::string bundleName)3276 int AbilityManagerService::GetUidByBundleName(std::string bundleName)
3277 {
3278     auto bms = GetBundleManager();
3279     CHECK_POINTER_AND_RETURN(bms, ERR_NO_INIT);
3280     return IN_PROCESS_CALL(bms->GetUidByBundleName(bundleName, GetUserId()));
3281 }
3282 
RestartAbility(const sptr<IRemoteObject> & token)3283 void AbilityManagerService::RestartAbility(const sptr<IRemoteObject> &token)
3284 {
3285     HILOG_INFO("%{public}s called", __func__);
3286     CHECK_POINTER(currentStackManager_);
3287     if (!VerificationAllToken(token)) {
3288         return;
3289     }
3290 
3291     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3292     CHECK_POINTER(abilityRecord);
3293     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
3294 
3295     auto stackManager = GetStackManagerByUserId(userId);
3296     if (!stackManager) {
3297         HILOG_ERROR("stackManager is nullptr. userId=%{public}d", userId);
3298         return;
3299     }
3300     stackManager->RestartAbility(abilityRecord);
3301 }
3302 
NotifyBmsAbilityLifeStatus(const std::string & bundleName,const std::string & abilityName,const int64_t launchTime,const int uid)3303 void AbilityManagerService::NotifyBmsAbilityLifeStatus(
3304     const std::string &bundleName, const std::string &abilityName, const int64_t launchTime, const int uid)
3305 {
3306     auto bundleManager = GetBundleManager();
3307     CHECK_POINTER(bundleManager);
3308     HILOG_INFO("NotifyBmsAbilityLifeStatus is called, uid :%{public}d", uid);
3309     IN_PROCESS_CALL_WITHOUT_RET(bundleManager->NotifyAbilityLifeStatus(bundleName, abilityName, launchTime, uid));
3310 }
3311 
StartSystemApplication()3312 void AbilityManagerService::StartSystemApplication()
3313 {
3314     HILOG_DEBUG("%{public}s", __func__);
3315 
3316     ConnectBmsService();
3317 
3318     if (!amsConfigResolver_ || amsConfigResolver_->NonConfigFile()) {
3319         HILOG_INFO("start all");
3320         StartingSettingsDataAbility();
3321         StartingSystemUiAbility();
3322         return;
3323     }
3324 
3325     StartingSettingsDataAbility();
3326     StartingSystemUiAbility();
3327     StartupResidentProcess(U0_USER_ID);
3328 }
3329 
3330 #ifdef SUPPORT_GRAPHICS
StartingSystemUiAbility()3331 void AbilityManagerService::StartingSystemUiAbility()
3332 {
3333     HILOG_DEBUG("%{public}s", __func__);
3334     Want systemUiWant;
3335     systemUiWant.SetElementName(AbilityConfig::SYSTEM_UI_BUNDLE_NAME, AbilityConfig::SYSTEM_UI_ABILITY_NAME);
3336     (void)StartAbility(systemUiWant, U0_USER_ID, DEFAULT_INVAL_VALUE);
3337 }
3338 #endif
3339 
ConnectBmsService()3340 void AbilityManagerService::ConnectBmsService()
3341 {
3342     HILOG_DEBUG("%{public}s", __func__);
3343     HILOG_INFO("Waiting AppMgr Service run completed.");
3344     while (!appScheduler_->Init(shared_from_this())) {
3345         HILOG_ERROR("failed to init appScheduler_");
3346         usleep(REPOLL_TIME_MICRO_SECONDS);
3347     }
3348 
3349     HILOG_INFO("Waiting BundleMgr Service run completed.");
3350     /* wait until connected to bundle manager service */
3351     while (iBundleManager_ == nullptr) {
3352         sptr<IRemoteObject> bundle_obj =
3353             OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
3354         if (bundle_obj == nullptr) {
3355             HILOG_ERROR("failed to get bundle manager service");
3356             usleep(REPOLL_TIME_MICRO_SECONDS);
3357             continue;
3358         }
3359         iBundleManager_ = iface_cast<AppExecFwk::IBundleMgr>(bundle_obj);
3360     }
3361 
3362     HILOG_INFO("Connect bms success!");
3363 }
3364 
CheckCallerIsSystemAppByIpc()3365 bool AbilityManagerService::CheckCallerIsSystemAppByIpc()
3366 {
3367     HILOG_DEBUG("%{public}s begin", __func__);
3368     auto bms = GetBundleManager();
3369     CHECK_POINTER_RETURN_BOOL(bms);
3370     int32_t callerUid = IPCSkeleton::GetCallingUid();
3371     HILOG_ERROR("callerUid %{public}d", callerUid);
3372     return IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(callerUid));
3373 }
3374 
GetWantSenderInfo(const sptr<IWantSender> & target,std::shared_ptr<WantSenderInfo> & info)3375 int AbilityManagerService::GetWantSenderInfo(const sptr<IWantSender> &target, std::shared_ptr<WantSenderInfo> &info)
3376 {
3377     HILOG_INFO("Get pending request info.");
3378     CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
3379     CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
3380     CHECK_POINTER_AND_RETURN(info, ERR_INVALID_VALUE);
3381     return pendingWantManager_->GetWantSenderInfo(target, info);
3382 }
3383 
3384 #ifdef SUPPORT_GRAPHICS
UpdateLockScreenState(bool isLockScreen)3385 void AbilityManagerService::UpdateLockScreenState(bool isLockScreen)
3386 {
3387     HILOG_DEBUG("%{public}s begin", __func__);
3388     CHECK_POINTER(currentStackManager_);
3389     currentStackManager_->UpdateLockScreenState(isLockScreen);
3390 }
3391 #endif
3392 
3393 /**
3394  * Get system memory information.
3395  * @param SystemMemoryAttr, memory information.
3396  */
GetSystemMemoryAttr(AppExecFwk::SystemMemoryAttr & memoryInfo)3397 void AbilityManagerService::GetSystemMemoryAttr(AppExecFwk::SystemMemoryAttr &memoryInfo)
3398 {
3399     auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
3400     if (appScheduler == nullptr) {
3401         HILOG_ERROR("%{public}s, appScheduler is nullptr", __func__);
3402         return;
3403     }
3404 
3405     int memoryThreshold = 0;
3406     if (amsConfigResolver_ == nullptr) {
3407         HILOG_ERROR("%{public}s, amsConfigResolver_ is nullptr", __func__);
3408         memoryThreshold = EXPERIENCE_MEM_THRESHOLD;
3409     } else {
3410         memoryThreshold = amsConfigResolver_->GetMemThreshold(AmsConfig::MemThreshold::HOME_APP);
3411     }
3412 
3413     nlohmann::json memJson = { "memoryThreshold", memoryThreshold };
3414     std::string memConfig = memJson.dump();
3415 
3416     appScheduler->GetSystemMemoryAttr(memoryInfo, memConfig);
3417 }
3418 
GetAppMemorySize()3419 int AbilityManagerService::GetAppMemorySize()
3420 {
3421     HILOG_INFO("service GetAppMemorySize start");
3422     const char *key = "const.product.dalvikheaplimit";
3423     const char *def = "512m";
3424     char *valueGet = nullptr;
3425     unsigned int len = 128;
3426     int ret = GetParameter(key, def, valueGet, len);
3427     int resultInt = 0;
3428     if ((ret != GET_PARAMETER_OTHER) && (ret != GET_PARAMETER_INCORRECT)) {
3429         int len = strlen(valueGet);
3430         for (int i = 0; i < len; i++) {
3431             if (valueGet[i] >= '0' && valueGet[i] <= '9') {
3432                 resultInt *= SIZE_10;
3433                 resultInt += valueGet[i] - '0';
3434             }
3435         }
3436         if (resultInt == 0) {
3437             return APP_MEMORY_SIZE;
3438         }
3439         return resultInt;
3440     }
3441     return APP_MEMORY_SIZE;
3442 }
3443 
IsRamConstrainedDevice()3444 bool AbilityManagerService::IsRamConstrainedDevice()
3445 {
3446     HILOG_INFO("service IsRamConstrainedDevice start");
3447     const char *key = "const.product.islowram";
3448     const char *def = "0";
3449     char *valueGet = nullptr;
3450     unsigned int len = 128;
3451     int ret = GetParameter(key, def, valueGet, len);
3452     if ((ret != GET_PARAMETER_OTHER) && (ret != GET_PARAMETER_INCORRECT)) {
3453         int value = atoi(valueGet);
3454         if (value) {
3455             return true;
3456         }
3457         return isRamConstrainedDevice;
3458     }
3459     return isRamConstrainedDevice;
3460 }
3461 
3462 #ifdef SUPPORT_GRAPHICS
GetMissionSaveTime() const3463 int AbilityManagerService::GetMissionSaveTime() const
3464 {
3465     if (!amsConfigResolver_) {
3466         return 0;
3467     }
3468 
3469     return amsConfigResolver_->GetMissionSaveTime();
3470 }
3471 
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)3472 int32_t AbilityManagerService::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
3473 {
3474     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3475     if (!abilityRecord) {
3476         HILOG_ERROR("abilityRecord is Null.");
3477         return -1;
3478     }
3479     auto userId = abilityRecord->GetOwnerMissionUserId();
3480     auto missionListManager = GetListManagerByUserId(userId);
3481     if (!missionListManager) {
3482         HILOG_ERROR("missionListManager is Null. userId=%{public}d", userId);
3483         return -1;
3484     }
3485     return missionListManager->GetMissionIdByAbilityToken(token);
3486 }
3487 
GetAbilityTokenByMissionId(int32_t missionId)3488 sptr<IRemoteObject> AbilityManagerService::GetAbilityTokenByMissionId(int32_t missionId)
3489 {
3490     if (!currentMissionListManager_) {
3491         return nullptr;
3492     }
3493     return currentMissionListManager_->GetAbilityTokenByMissionId(missionId);
3494 }
3495 #endif
3496 
StartingSettingsDataAbility()3497 void AbilityManagerService::StartingSettingsDataAbility()
3498 {
3499     HILOG_DEBUG("%{public}s", __func__);
3500     auto bms = GetBundleManager();
3501     CHECK_POINTER_IS_NULLPTR(bms);
3502 
3503     AppExecFwk::AbilityInfo abilityInfo;
3504     Want want;
3505     want.SetElementName(AbilityConfig::SETTINGS_DATA_BUNDLE_NAME, AbilityConfig::SETTINGS_DATA_ABILITY_NAME);
3506     uint32_t waitCnt = 0;
3507     IN_PROCESS_CALL_WITHOUT_RET(
3508         while (!bms->QueryAbilityInfo(want, OHOS::AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT,
3509             U0_USER_ID, abilityInfo) && waitCnt < MAX_WAIT_SETTINGS_DATA_NUM) {
3510             HILOG_INFO("Waiting query settings data info completed.");
3511             usleep(REPOLL_TIME_MICRO_SECONDS);
3512             waitCnt++;
3513         }
3514     );
3515 
3516     std::string abilityUri;
3517     if (!GetValidDataAbilityUri(abilityInfo.uri, abilityUri)) {
3518         return;
3519     }
3520 
3521     HILOG_INFO("abilityInfo uri: %{public}s.", abilityUri.c_str());
3522 
3523     // start settings data ability
3524     Uri uri(abilityUri);
3525     (void)AcquireDataAbility(uri, true, nullptr);
3526 }
3527 
StartRemoteAbilityByCall(const Want & want,const sptr<IRemoteObject> & connect)3528 int AbilityManagerService::StartRemoteAbilityByCall(const Want &want, const sptr<IRemoteObject> &connect)
3529 {
3530     int32_t callerUid = IPCSkeleton::GetCallingUid();
3531     int32_t callerPid = IPCSkeleton::GetCallingPid();
3532     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
3533     DistributedClient dmsClient;
3534     return dmsClient.StartRemoteAbilityByCall(want, connect, callerUid, callerPid, accessToken);
3535 }
3536 
ReleaseRemoteAbility(const sptr<IRemoteObject> & connect,const AppExecFwk::ElementName & element)3537 int AbilityManagerService::ReleaseRemoteAbility(const sptr<IRemoteObject> &connect,
3538     const AppExecFwk::ElementName &element)
3539 {
3540     DistributedClient dmsClient;
3541     return dmsClient.ReleaseRemoteAbility(connect, element);
3542 }
3543 
StartAbilityByCall(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken)3544 int AbilityManagerService::StartAbilityByCall(
3545     const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken)
3546 {
3547     HILOG_INFO("call ability.");
3548     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
3549     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
3550 
3551     if (CheckIfOperateRemote(want)) {
3552         HILOG_INFO("start remote ability by call");
3553         return StartRemoteAbilityByCall(want, connect->AsObject());
3554     }
3555 
3556     AbilityRequest abilityRequest;
3557     abilityRequest.callType = AbilityCallType::CALL_REQUEST_TYPE;
3558     abilityRequest.callerUid = IPCSkeleton::GetCallingUid();
3559     abilityRequest.callerToken = callerToken;
3560     abilityRequest.startSetting = nullptr;
3561     abilityRequest.want = want;
3562     abilityRequest.connect = connect;
3563     int result = GenerateAbilityRequest(want, -1, abilityRequest, callerToken, GetUserId());
3564     if (result != ERR_OK) {
3565         HILOG_ERROR("Generate ability request error.");
3566         return result;
3567     }
3568 
3569     if (!abilityRequest.IsNewVersion()) {
3570         HILOG_ERROR("target ability compatible version is lower than 8.");
3571         return RESOLVE_CALL_ABILITY_VERSION_ERR;
3572     }
3573 
3574     result = CheckCallPermissions(abilityRequest);
3575     if (result != ERR_OK) {
3576         HILOG_ERROR("CheckCallPermissions fail, result: %{public}d", result);
3577         return RESOLVE_CALL_NO_PERMISSIONS;
3578     }
3579 
3580     HILOG_DEBUG("abilityInfo.applicationInfo.singleUser is %{public}s",
3581         abilityRequest.abilityInfo.applicationInfo.singleUser ? "true" : "false");
3582     if (!currentMissionListManager_) {
3583         HILOG_ERROR("currentMissionListManager_ is Null. curentUserId=%{public}d", GetUserId());
3584         return ERR_INVALID_VALUE;
3585     }
3586 
3587     return currentMissionListManager_->ResolveLocked(abilityRequest);
3588 }
3589 
ReleaseAbility(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)3590 int AbilityManagerService::ReleaseAbility(
3591     const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
3592 {
3593     HILOG_DEBUG("Release called ability.");
3594 
3595     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
3596     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
3597 
3598     std::string elementName = element.GetURI();
3599     HILOG_DEBUG("try to release called ability, name: %{public}s.", elementName.c_str());
3600 
3601     if (CheckIsRemote(element.GetDeviceID())) {
3602         HILOG_INFO("release remote ability");
3603         return ReleaseRemoteAbility(connect->AsObject(), element);
3604     }
3605 
3606     return currentMissionListManager_->ReleaseLocked(connect, element);
3607 }
3608 
CheckCallPermissions(const AbilityRequest & abilityRequest)3609 int AbilityManagerService::CheckCallPermissions(const AbilityRequest &abilityRequest)
3610 {
3611     HILOG_DEBUG("%{public}s begin", __func__);
3612     auto abilityInfo = abilityRequest.abilityInfo;
3613     auto callerUid = abilityRequest.callerUid;
3614     auto targetUid = abilityInfo.applicationInfo.uid;
3615     if (AbilityUtil::ROOT_UID == callerUid) {
3616         HILOG_DEBUG("uid is root,ability cannot be called.");
3617         return RESOLVE_CALL_NO_PERMISSIONS;
3618     }
3619     auto bms = GetBundleManager();
3620     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
3621     auto isCallerSystemApp = IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(callerUid));
3622     auto isTargetSystemApp = IN_PROCESS_CALL(bms->CheckIsSystemAppByUid(targetUid));
3623     HILOG_ERROR("isCallerSystemApp:%{public}d, isTargetSystemApp:%{public}d",
3624         isCallerSystemApp, isTargetSystemApp);
3625     if (callerUid != SYSTEM_UID && !isCallerSystemApp && callerUid != DMS_UID) {
3626         HILOG_DEBUG("caller is common app.");
3627         std::string bundleName;
3628         bool result = IN_PROCESS_CALL(bms->GetBundleNameForUid(callerUid, bundleName));
3629         if (!result) {
3630             HILOG_ERROR("GetBundleNameForUid from bms fail.");
3631             return RESOLVE_CALL_NO_PERMISSIONS;
3632         }
3633         if (bundleName != abilityInfo.bundleName && callerUid != targetUid && !isTargetSystemApp) {
3634             HILOG_ERROR("the bundlename of caller is different from target one, caller: %{public}s "
3635                         "target: %{public}s",
3636                 bundleName.c_str(),
3637                 abilityInfo.bundleName.c_str());
3638             return RESOLVE_CALL_NO_PERMISSIONS;
3639         }
3640     } else {
3641         HILOG_DEBUG("caller is systemapp or system ability.");
3642     }
3643     HILOG_DEBUG("the caller has permission to resolve the callproxy of common ability.");
3644     // check whether the target ability is singleton mode and page type.
3645     if (abilityInfo.type == AppExecFwk::AbilityType::PAGE &&
3646         abilityInfo.launchMode == AppExecFwk::LaunchMode::SINGLETON) {
3647         HILOG_DEBUG("called ability is common ability and singleton.");
3648     } else {
3649         HILOG_ERROR("called ability is not common ability or singleton.");
3650         return RESOLVE_CALL_ABILITY_TYPE_ERR;
3651     }
3652     return ERR_OK;
3653 }
3654 
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)3655 int AbilityManagerService::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
3656 {
3657     HILOG_DEBUG("%{public}s", __func__);
3658     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3659     if (!abilityRecord) {
3660         HILOG_ERROR("no such ability record");
3661         return -1;
3662     }
3663 
3664     auto callingUid = IPCSkeleton::GetCallingUid();
3665     auto recordUid = abilityRecord->GetUid();
3666     if (callingUid != recordUid) {
3667         HILOG_ERROR("SetMissionLabel not self, callingUid:%{public}d, recordUid:%{public}d", callingUid, recordUid);
3668         return -1;
3669     }
3670 
3671     auto userId = abilityRecord->GetOwnerMissionUserId();
3672     auto missionListManager = GetListManagerByUserId(userId);
3673     if (!missionListManager) {
3674         HILOG_ERROR("failed to find mission list manager when set mission label.");
3675         return -1;
3676     }
3677 
3678     return missionListManager->SetMissionLabel(token, label);
3679 }
3680 
3681 #ifdef SUPPORT_GRAPHICS
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<OHOS::Media::PixelMap> & icon)3682 int AbilityManagerService::SetMissionIcon(const sptr<IRemoteObject> &token,
3683     const std::shared_ptr<OHOS::Media::PixelMap> &icon)
3684 {
3685     HILOG_DEBUG("%{public}s", __func__);
3686     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3687     if (!abilityRecord) {
3688         HILOG_ERROR("no such ability record");
3689         return -1;
3690     }
3691 
3692     auto callingUid = IPCSkeleton::GetCallingUid();
3693     auto recordUid = abilityRecord->GetUid();
3694     if (callingUid != recordUid) {
3695         HILOG_ERROR("not self, callingUid:%{public}d, recordUid:%{public}d", callingUid, recordUid);
3696         return -1;
3697     }
3698 
3699     auto userId = abilityRecord->GetOwnerMissionUserId();
3700     auto missionListManager = GetListManagerByUserId(userId);
3701     if (!missionListManager) {
3702         HILOG_ERROR("failed to find mission list manager.");
3703         return -1;
3704     }
3705 
3706     return missionListManager->SetMissionIcon(token, icon);
3707 }
3708 #endif
3709 
StartUser(int userId)3710 int AbilityManagerService::StartUser(int userId)
3711 {
3712     HILOG_DEBUG("%{public}s, userId:%{public}d", __func__, userId);
3713     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
3714     if (!isSaCall) {
3715         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3716         return CHECK_PERMISSION_FAILED;
3717     }
3718 
3719     std::string oldIdentity;
3720     if (IPCSkeleton::GetCallingUid() == ACCOUNT_MGR_SERVICE_UID) {
3721         oldIdentity = IPCSkeleton::ResetCallingIdentity();
3722         HILOG_INFO("calling uid after reset %{public}d.", IPCSkeleton::GetCallingUid());
3723     }
3724 
3725     if (userController_) {
3726         int ret = userController_->StartUser(userId, true);
3727         if (!oldIdentity.empty()) {
3728             IPCSkeleton::SetCallingIdentity(oldIdentity);
3729         }
3730         return ret;
3731     }
3732 
3733     if (!oldIdentity.empty()) {
3734         IPCSkeleton::SetCallingIdentity(oldIdentity);
3735     }
3736 
3737     return 0;
3738 }
3739 
StopUser(int userId,const sptr<IStopUserCallback> & callback)3740 int AbilityManagerService::StopUser(int userId, const sptr<IStopUserCallback> &callback)
3741 {
3742     HILOG_DEBUG("%{public}s", __func__);
3743     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
3744     if (!isSaCall) {
3745         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3746         return CHECK_PERMISSION_FAILED;
3747     }
3748 
3749     auto ret = -1;
3750     if (userController_) {
3751         ret = userController_->StopUser(userId);
3752         HILOG_DEBUG("ret = %{public}d", ret);
3753     }
3754     if (callback) {
3755         callback->OnStopUserDone(userId, ret);
3756     }
3757     return 0;
3758 }
3759 
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)3760 void AbilityManagerService::OnAcceptWantResponse(
3761     const AAFwk::Want &want, const std::string &flag)
3762 {
3763     HILOG_DEBUG("On accept want response");
3764     if (!currentMissionListManager_) {
3765         return;
3766     }
3767     currentMissionListManager_->OnAcceptWantResponse(want, flag);
3768 }
3769 
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)3770 void AbilityManagerService::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
3771 {
3772     HILOG_DEBUG("%{public}s called.", __func__);
3773     if (!currentMissionListManager_) {
3774         return;
3775     }
3776     currentMissionListManager_->OnStartSpecifiedAbilityTimeoutResponse(want);
3777 }
3778 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info)3779 int AbilityManagerService::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info)
3780 {
3781     HILOG_DEBUG("Get running ability infos.");
3782     auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyRunningInfoPerm();
3783 
3784     currentMissionListManager_->GetAbilityRunningInfos(info, isPerm);
3785     connectManager_->GetAbilityRunningInfos(info, isPerm);
3786     dataAbilityManager_->GetAbilityRunningInfos(info, isPerm);
3787 
3788     return ERR_OK;
3789 }
3790 
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info)3791 int AbilityManagerService::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info)
3792 {
3793     HILOG_DEBUG("Get extension infos, upperLimit : %{public}d", upperLimit);
3794     auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyRunningInfoPerm();
3795 
3796     connectManager_->GetExtensionRunningInfos(upperLimit, info, GetUserId(), isPerm);
3797     return ERR_OK;
3798 }
3799 
GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> & info)3800 int AbilityManagerService::GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> &info)
3801 {
3802     return DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfos(info);
3803 }
3804 
GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> & info,int32_t userId)3805 int AbilityManagerService::GetProcessRunningInfosByUserId(
3806     std::vector<AppExecFwk::RunningProcessInfo> &info, int32_t userId)
3807 {
3808     return DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfosByUserId(info, userId);
3809 }
3810 
ClearUserData(int32_t userId)3811 void AbilityManagerService::ClearUserData(int32_t userId)
3812 {
3813     HILOG_DEBUG("%{public}s", __func__);
3814     std::unique_lock<std::shared_mutex> lock(managersMutex_);
3815     missionListManagers_.erase(userId);
3816     connectManagers_.erase(userId);
3817     dataAbilityManagers_.erase(userId);
3818     pendingWantManagers_.erase(userId);
3819 }
3820 
3821 #ifdef SUPPORT_GRAPHICS
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)3822 int AbilityManagerService::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
3823 {
3824     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
3825     if (!isSaCall) {
3826         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3827         return 0;
3828     }
3829 
3830     if (!currentMissionListManager_) {
3831         HILOG_ERROR("snapshot: currentMissionListManager_ is nullptr.");
3832         return INNER_ERR;
3833     }
3834     currentMissionListManager_->RegisterSnapshotHandler(handler);
3835     HILOG_INFO("snapshot: AbilityManagerService register snapshot handler success.");
3836     return ERR_OK;
3837 }
3838 
GetMissionSnapshot(const std::string & deviceId,int32_t missionId,MissionSnapshot & missionSnapshot)3839 int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, int32_t missionId,
3840     MissionSnapshot& missionSnapshot)
3841 {
3842     if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) {
3843         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3844         return CHECK_PERMISSION_FAILED;
3845     }
3846 
3847     if (CheckIsRemote(deviceId)) {
3848         HILOG_INFO("get remote mission snapshot.");
3849         return GetRemoteMissionSnapshotInfo(deviceId, missionId, missionSnapshot);
3850     }
3851     HILOG_INFO("get local mission snapshot.");
3852     if (!currentMissionListManager_) {
3853         HILOG_ERROR("snapshot: currentMissionListManager_ is nullptr.");
3854         return INNER_ERR;
3855     }
3856     auto token = GetAbilityTokenByMissionId(missionId);
3857     bool result = currentMissionListManager_->GetMissionSnapshot(missionId, token, missionSnapshot);
3858     if (!result) {
3859         return INNER_ERR;
3860     }
3861     return ERR_OK;
3862 }
3863 
GetRemoteMissionSnapshotInfo(const std::string & deviceId,int32_t missionId,MissionSnapshot & missionSnapshot)3864 int32_t AbilityManagerService::GetRemoteMissionSnapshotInfo(const std::string& deviceId, int32_t missionId,
3865     MissionSnapshot& missionSnapshot)
3866 {
3867     HILOG_INFO("GetRemoteMissionSnapshotInfo begin");
3868     std::unique_ptr<MissionSnapshot> missionSnapshotPtr = std::make_unique<MissionSnapshot>();
3869     DistributedClient dmsClient;
3870     int result = dmsClient.GetRemoteMissionSnapshotInfo(deviceId, missionId, missionSnapshotPtr);
3871     if (result != ERR_OK) {
3872         HILOG_ERROR("GetRemoteMissionSnapshotInfo failed, result = %{public}d", result);
3873         return result;
3874     }
3875     missionSnapshot = *missionSnapshotPtr;
3876     return ERR_OK;
3877 }
3878 
StartFreezingScreen()3879 void AbilityManagerService::StartFreezingScreen()
3880 {
3881     HILOG_INFO("%{public}s", __func__);
3882 }
3883 
StopFreezingScreen()3884 void AbilityManagerService::StopFreezingScreen()
3885 {
3886     HILOG_INFO("%{public}s", __func__);
3887 }
3888 #endif
3889 
UserStarted(int32_t userId)3890 void AbilityManagerService::UserStarted(int32_t userId)
3891 {
3892     HILOG_INFO("%{public}s", __func__);
3893     InitConnectManager(userId, false);
3894 #ifdef SUPPORT_GRAPHICS
3895     SetStackManager(userId, false);
3896     InitMissionListManager(userId, false);
3897     InitDataAbilityManager(userId, false);
3898 #endif
3899     InitPendWantManager(userId, false);
3900 }
3901 
SwitchToUser(int32_t oldUserId,int32_t userId)3902 void AbilityManagerService::SwitchToUser(int32_t oldUserId, int32_t userId)
3903 {
3904     HILOG_INFO("%{public}s, oldUserId:%{public}d, newUserId:%{public}d", __func__, oldUserId, userId);
3905     SwitchManagers(userId);
3906     PauseOldUser(oldUserId);
3907     bool isBoot = false;
3908     if (oldUserId == U0_USER_ID) {
3909         isBoot = true;
3910     }
3911     StartUserApps(userId, isBoot);
3912     PauseOldConnectManager(oldUserId);
3913 }
3914 
SwitchManagers(int32_t userId,bool switchUser)3915 void AbilityManagerService::SwitchManagers(int32_t userId, bool switchUser)
3916 {
3917     HILOG_INFO("%{public}s, SwitchManagers:%{public}d-----begin", __func__, userId);
3918     InitConnectManager(userId, switchUser);
3919 #ifdef SUPPORT_GRAPHICS
3920     SetStackManager(userId, switchUser);
3921     if (userId != U0_USER_ID) {
3922         InitMissionListManager(userId, switchUser);
3923     }
3924 #endif
3925     InitDataAbilityManager(userId, switchUser);
3926     InitPendWantManager(userId, switchUser);
3927     HILOG_INFO("%{public}s, SwitchManagers:%{public}d-----end", __func__, userId);
3928 }
3929 
3930 #ifdef SUPPORT_GRAPHICS
PauseOldUser(int32_t userId)3931 void AbilityManagerService::PauseOldUser(int32_t userId)
3932 {
3933     HILOG_INFO("%{public}s, PauseOldUser:%{public}d-----begin", __func__, userId);
3934     PauseOldMissionListManager(userId);
3935     HILOG_INFO("%{public}s, PauseOldUser:%{public}d-----end", __func__, userId);
3936 }
3937 
PauseOldMissionListManager(int32_t userId)3938 void AbilityManagerService::PauseOldMissionListManager(int32_t userId)
3939 {
3940     HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----begin", __func__, userId);
3941     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3942     auto it = missionListManagers_.find(userId);
3943     if (it == missionListManagers_.end()) {
3944         HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end1", __func__, userId);
3945         return;
3946     }
3947     auto manager = it->second;
3948     if (!manager) {
3949         HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end2", __func__, userId);
3950         return;
3951     }
3952     manager->PauseManager();
3953     HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end", __func__, userId);
3954 }
3955 
PauseOldConnectManager(int32_t userId)3956 void AbilityManagerService::PauseOldConnectManager(int32_t userId)
3957 {
3958     HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----begin", __func__, userId);
3959     if (userId == U0_USER_ID) {
3960         HILOG_INFO("%{public}s, u0 not stop, id:%{public}d-----nullptr", __func__, userId);
3961         return;
3962     }
3963 
3964     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3965     auto it = connectManagers_.find(userId);
3966     if (it == connectManagers_.end()) {
3967         HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----no user", __func__, userId);
3968         return;
3969     }
3970     auto manager = it->second;
3971     if (!manager) {
3972         HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----nullptr", __func__, userId);
3973         return;
3974     }
3975     manager->StopAllExtensions();
3976     HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----end", __func__, userId);
3977 }
3978 
PauseOldStackManager(int32_t userId)3979 void AbilityManagerService::PauseOldStackManager(int32_t userId)
3980 {
3981     auto it = stackManagers_.find(userId);
3982     if (it == stackManagers_.end()) {
3983         return;
3984     }
3985     auto manager = it->second;
3986     if (!manager) {
3987         return;
3988     }
3989     manager->PauseManager();
3990 }
3991 #endif
3992 
StartUserApps(int32_t userId,bool isBoot)3993 void AbilityManagerService::StartUserApps(int32_t userId, bool isBoot)
3994 {
3995     HILOG_INFO("StartUserApps, userId:%{public}d, currentUserId:%{public}d", userId, GetUserId());
3996 #ifdef SUPPORT_GRAPHICS
3997     if (currentMissionListManager_ && currentMissionListManager_->IsStarted()) {
3998         HILOG_INFO("missionListManager ResumeManager");
3999         currentMissionListManager_->ResumeManager();
4000     }
4001 #endif
4002     StartSystemAbilityByUser(userId, isBoot);
4003 }
4004 
StartSystemAbilityByUser(int32_t userId,bool isBoot)4005 void AbilityManagerService::StartSystemAbilityByUser(int32_t userId, bool isBoot)
4006 {
4007     HILOG_INFO("StartSystemAbilityByUser, userId:%{public}d, currentUserId:%{public}d", userId, GetUserId());
4008     ConnectBmsService();
4009 
4010     if (!amsConfigResolver_ || amsConfigResolver_->NonConfigFile()) {
4011         HILOG_INFO("start all");
4012         StartHighestPriorityAbility(isBoot);
4013 #ifdef SUPPORT_GRAPHICS
4014         StartingScreenLockAbility();
4015 #endif
4016         return;
4017     }
4018 
4019     HILOG_INFO("start oobe or launcher");
4020     StartHighestPriorityAbility(isBoot);
4021 
4022 #ifdef SUPPORT_GRAPHICS
4023     if (amsConfigResolver_->GetStartScreenLockState()) {
4024         StartingScreenLockAbility();
4025     }
4026 #endif
4027 
4028     if (amsConfigResolver_->GetPhoneServiceState()) {
4029         HILOG_INFO("start phone service");
4030         StartingPhoneServiceAbility();
4031     }
4032 
4033     if (amsConfigResolver_->GetStartMmsState()) {
4034         HILOG_INFO("start mms");
4035         StartingMmsAbility();
4036     }
4037 }
4038 
InitConnectManager(int32_t userId,bool switchUser)4039 void AbilityManagerService::InitConnectManager(int32_t userId, bool switchUser)
4040 {
4041     bool find = false;
4042     {
4043         std::shared_lock<std::shared_mutex> lock(managersMutex_);
4044         auto it = connectManagers_.find(userId);
4045         find = (it != connectManagers_.end());
4046         if (find) {
4047             if (switchUser) {
4048                 connectManager_ = it->second;
4049             }
4050         }
4051     }
4052     if (!find) {
4053         auto manager = std::make_shared<AbilityConnectManager>(userId);
4054         manager->SetEventHandler(handler_);
4055         std::unique_lock<std::shared_mutex> lock(managersMutex_);
4056         connectManagers_.emplace(userId, manager);
4057         if (switchUser) {
4058             connectManager_ = manager;
4059         }
4060     }
4061 }
4062 
InitDataAbilityManager(int32_t userId,bool switchUser)4063 void AbilityManagerService::InitDataAbilityManager(int32_t userId, bool switchUser)
4064 {
4065     bool find = false;
4066     {
4067         std::shared_lock<std::shared_mutex> lock(managersMutex_);
4068         auto it = dataAbilityManagers_.find(userId);
4069         find = (it != dataAbilityManagers_.end());
4070         if (find) {
4071             if (switchUser) {
4072                 dataAbilityManager_ = it->second;
4073             }
4074         }
4075     }
4076     if (!find) {
4077         auto manager = std::make_shared<DataAbilityManager>();
4078         std::unique_lock<std::shared_mutex> lock(managersMutex_);
4079         dataAbilityManagers_.emplace(userId, manager);
4080         if (switchUser) {
4081             dataAbilityManager_ = manager;
4082         }
4083     }
4084 }
4085 
InitPendWantManager(int32_t userId,bool switchUser)4086 void AbilityManagerService::InitPendWantManager(int32_t userId, bool switchUser)
4087 {
4088     bool find = false;
4089     {
4090         std::shared_lock<std::shared_mutex> lock(managersMutex_);
4091         auto it = pendingWantManagers_.find(userId);
4092         find = (it != pendingWantManagers_.end());
4093         if (find) {
4094             if (switchUser) {
4095                 pendingWantManager_ = it->second;
4096             }
4097         }
4098     }
4099     if (!find) {
4100         auto manager = std::make_shared<PendingWantManager>();
4101         std::unique_lock<std::shared_mutex> lock(managersMutex_);
4102         pendingWantManagers_.emplace(userId, manager);
4103         if (switchUser) {
4104             pendingWantManager_ = manager;
4105         }
4106     }
4107 }
4108 
GetValidUserId(const int32_t userId)4109 int32_t AbilityManagerService::GetValidUserId(const int32_t userId)
4110 {
4111     HILOG_DEBUG("%{public}s  userId = %{public}d", __func__, userId);
4112     int32_t validUserId = userId;
4113 
4114     if (DEFAULT_INVAL_VALUE == userId) {
4115         validUserId = IPCSkeleton::GetCallingUid() / BASE_USER_RANGE;
4116         HILOG_DEBUG("%{public}s validUserId = %{public}d, CallingUid = %{public}d", __func__, validUserId,
4117             IPCSkeleton::GetCallingUid());
4118         if (validUserId == U0_USER_ID) {
4119             validUserId = GetUserId();
4120         }
4121     }
4122     return validUserId;
4123 }
4124 
SetAbilityController(const sptr<IAbilityController> & abilityController,bool imAStabilityTest)4125 int AbilityManagerService::SetAbilityController(const sptr<IAbilityController> &abilityController,
4126     bool imAStabilityTest)
4127 {
4128     HILOG_DEBUG("%{public}s, imAStabilityTest: %{public}d", __func__, imAStabilityTest);
4129     auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyControllerPerm();
4130     if (!isPerm) {
4131         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4132         return CHECK_PERMISSION_FAILED;
4133     }
4134 
4135     std::lock_guard<std::recursive_mutex> guard(globalLock_);
4136     abilityController_ = abilityController;
4137     controllerIsAStabilityTest_ = imAStabilityTest;
4138     HILOG_DEBUG("%{public}s, end", __func__);
4139     return ERR_OK;
4140 }
4141 
SendANRProcessID(int pid)4142 int AbilityManagerService::SendANRProcessID(int pid)
4143 {
4144     HILOG_INFO("AbilityManagerService::SendANRProcessID come, pid is %{public}d", pid);
4145     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4146     if (!isSaCall) {
4147         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4148         return CHECK_PERMISSION_FAILED;
4149     }
4150 
4151     int anrTimeOut = amsConfigResolver_->GetANRTimeOutTime();
4152     auto timeoutTask = [pid]() {
4153         if (kill(pid, SIGKILL) != ERR_OK) {
4154             HILOG_ERROR("Kill app not response process failed");
4155         }
4156     };
4157 #ifdef SUPPORT_GRAPHICS
4158     if (!SetANRMissionByProcessID(pid)) {
4159         HILOG_ERROR("Set app not response mission record failed");
4160     }
4161 #endif
4162     handler_->PostTask(timeoutTask, "TIME_OUT_TASK", anrTimeOut);
4163     appScheduler_->PostANRTaskByProcessID(pid);
4164     return ERR_OK;
4165 }
4166 
IsRunningInStabilityTest()4167 bool AbilityManagerService::IsRunningInStabilityTest()
4168 {
4169     std::lock_guard<std::recursive_mutex> guard(globalLock_);
4170     bool ret = abilityController_ != nullptr && controllerIsAStabilityTest_;
4171     HILOG_DEBUG("%{public}s, IsRunningInStabilityTest: %{public}d", __func__, ret);
4172     return ret;
4173 }
4174 
IsAbilityControllerStart(const Want & want,const std::string & bundleName)4175 bool AbilityManagerService::IsAbilityControllerStart(const Want &want, const std::string &bundleName)
4176 {
4177     if (abilityController_ != nullptr && controllerIsAStabilityTest_) {
4178         HILOG_DEBUG("%{public}s, controllerIsAStabilityTest_: %{public}d", __func__, controllerIsAStabilityTest_);
4179         bool isStart = abilityController_->AllowAbilityStart(want, bundleName);
4180         if (!isStart) {
4181             HILOG_INFO("Not finishing start ability because controller starting: %{public}s", bundleName.c_str());
4182             return false;
4183         }
4184     }
4185     return true;
4186 }
4187 
IsAbilityControllerForeground(const std::string & bundleName)4188 bool AbilityManagerService::IsAbilityControllerForeground(const std::string &bundleName)
4189 {
4190     if (abilityController_ != nullptr && controllerIsAStabilityTest_) {
4191         HILOG_DEBUG("%{public}s, controllerIsAStabilityTest_: %{public}d", __func__, controllerIsAStabilityTest_);
4192         bool isResume = abilityController_->AllowAbilityBackground(bundleName);
4193         if (!isResume) {
4194             HILOG_INFO("Not finishing terminate ability because controller resuming: %{public}s", bundleName.c_str());
4195             return false;
4196         }
4197     }
4198     return true;
4199 }
4200 
InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo & extensionInfo,AppExecFwk::AbilityInfo & abilityInfo)4201 int32_t AbilityManagerService::InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo,
4202     AppExecFwk::AbilityInfo &abilityInfo)
4203 {
4204     abilityInfo.applicationName = extensionInfo.applicationInfo.name;
4205     abilityInfo.applicationInfo = extensionInfo.applicationInfo;
4206     abilityInfo.bundleName = extensionInfo.bundleName;
4207     abilityInfo.package = extensionInfo.moduleName;
4208     abilityInfo.moduleName = extensionInfo.moduleName;
4209     abilityInfo.name = extensionInfo.name;
4210     abilityInfo.srcEntrance = extensionInfo.srcEntrance;
4211     abilityInfo.srcPath = extensionInfo.srcEntrance;
4212     abilityInfo.iconPath = extensionInfo.icon;
4213     abilityInfo.iconId = extensionInfo.iconId;
4214     abilityInfo.label = extensionInfo.label;
4215     abilityInfo.labelId = extensionInfo.labelId;
4216     abilityInfo.description = extensionInfo.description;
4217     abilityInfo.descriptionId = extensionInfo.descriptionId;
4218     abilityInfo.permissions = extensionInfo.permissions;
4219     abilityInfo.readPermission = extensionInfo.readPermission;
4220     abilityInfo.writePermission = extensionInfo.writePermission;
4221     abilityInfo.extensionAbilityType = extensionInfo.type;
4222     abilityInfo.visible = extensionInfo.visible;
4223     abilityInfo.resourcePath = extensionInfo.resourcePath;
4224     abilityInfo.enabled = extensionInfo.enabled;
4225     abilityInfo.isModuleJson = true;
4226     abilityInfo.isStageBasedModel = true;
4227     abilityInfo.process = extensionInfo.process;
4228     abilityInfo.metadata = extensionInfo.metadata;
4229     abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
4230     return 0;
4231 }
4232 
StartUserTest(const Want & want,const sptr<IRemoteObject> & observer)4233 int AbilityManagerService::StartUserTest(const Want &want, const sptr<IRemoteObject> &observer)
4234 {
4235     HILOG_DEBUG("enter");
4236     if (observer == nullptr) {
4237         HILOG_ERROR("observer is nullptr");
4238         return ERR_INVALID_VALUE;
4239     }
4240 
4241     std::string bundleName = want.GetStringParam("-b");
4242     if (bundleName.empty()) {
4243         HILOG_ERROR("Invalid bundle name");
4244         return ERR_INVALID_VALUE;
4245     }
4246 
4247     auto bms = GetBundleManager();
4248     CHECK_POINTER_AND_RETURN(bms, START_USER_TEST_FAIL);
4249     AppExecFwk::BundleInfo bundleInfo;
4250     if (!IN_PROCESS_CALL(
4251         bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, U0_USER_ID))) {
4252         HILOG_ERROR("Failed to get bundle info by U0_USER_ID %{public}d.", U0_USER_ID);
4253         int32_t userId = GetUserId();
4254         if (!IN_PROCESS_CALL(
4255             bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, GetUserId()))) {
4256             HILOG_ERROR("Failed to get bundle info by userId %{public}d.", userId);
4257             return GET_BUNDLE_INFO_FAILED;
4258         }
4259     }
4260 
4261     return DelayedSingleton<AppScheduler>::GetInstance()->StartUserTest(want, observer, bundleInfo, GetUserId());
4262 }
4263 
FinishUserTest(const std::string & msg,const int & resultCode,const std::string & bundleName)4264 int AbilityManagerService::FinishUserTest(const std::string &msg, const int &resultCode, const std::string &bundleName)
4265 {
4266     HILOG_DEBUG("enter");
4267     if (bundleName.empty()) {
4268         HILOG_ERROR("Invalid bundle name.");
4269         return ERR_INVALID_VALUE;
4270     }
4271 
4272     return DelayedSingleton<AppScheduler>::GetInstance()->FinishUserTest(msg, resultCode, bundleName);
4273 }
4274 
GetCurrentTopAbility(sptr<IRemoteObject> & token)4275 int AbilityManagerService::GetCurrentTopAbility(sptr<IRemoteObject> &token)
4276 {
4277     HILOG_DEBUG("enter");
4278 
4279     auto bms = GetBundleManager();
4280     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
4281 
4282     auto callerUid = IPCSkeleton::GetCallingUid();
4283     std::string bundleName;
4284     auto result = IN_PROCESS_CALL(bms->GetBundleNameForUid(callerUid, bundleName));
4285     if (!result) {
4286         HILOG_ERROR("GetBundleNameForUid fail");
4287         return GET_BUNDLENAME_BY_UID_FAIL;
4288     }
4289 
4290     auto abilityRecord = currentMissionListManager_->GetCurrentTopAbility(bundleName);
4291     if (!abilityRecord) {
4292         HILOG_ERROR("Failed to get top ability");
4293         return ERR_INVALID_VALUE;
4294     }
4295 
4296     token = abilityRecord->GetToken();
4297     if (!token) {
4298         HILOG_ERROR("Failed to get token");
4299         return ERR_INVALID_VALUE;
4300     }
4301 
4302     HILOG_INFO("bundleName : %{public}s, abilityName : %{public}s",
4303         bundleName.data(), abilityRecord->GetAbilityInfo().name.data());
4304     return ERR_OK;
4305 }
4306 
DelegatorDoAbilityForeground(const sptr<IRemoteObject> & token)4307 int AbilityManagerService::DelegatorDoAbilityForeground(const sptr<IRemoteObject> &token)
4308 {
4309     HILOG_DEBUG("enter");
4310     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
4311 
4312     auto missionId = GetMissionIdByAbilityToken(token);
4313     if (missionId < 0) {
4314         HILOG_ERROR("Invalid mission id.");
4315         return ERR_INVALID_VALUE;
4316     }
4317 
4318     return DelegatorMoveMissionToFront(missionId);
4319 }
4320 
DelegatorDoAbilityBackground(const sptr<IRemoteObject> & token)4321 int AbilityManagerService::DelegatorDoAbilityBackground(const sptr<IRemoteObject> &token)
4322 {
4323     HILOG_DEBUG("enter");
4324     return MinimizeAbility(token, true);
4325 }
4326 
DoAbilityForeground(const sptr<IRemoteObject> & token,uint32_t flag)4327 int AbilityManagerService::DoAbilityForeground(const sptr<IRemoteObject> &token, uint32_t flag)
4328 {
4329     HILOG_DEBUG("DoAbilityForeground, sceneFlag:%{public}u", flag);
4330     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
4331     if (!VerificationToken(token) && !VerificationAllToken(token)) {
4332         HILOG_ERROR("%{public}s token error.", __func__);
4333         return ERR_INVALID_VALUE;
4334     }
4335 
4336     std::lock_guard<std::recursive_mutex> guard(globalLock_);
4337     auto abilityRecord = Token::GetAbilityRecordByToken(token);
4338     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4339     int result = AbilityUtil::JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
4340     if (result != ERR_OK) {
4341         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
4342         return result;
4343     }
4344 
4345     auto type = abilityRecord->GetAbilityInfo().type;
4346     if (type != AppExecFwk::AbilityType::PAGE) {
4347         HILOG_ERROR("Cannot minimize except page ability.");
4348         return ERR_INVALID_VALUE;
4349     }
4350 
4351     if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
4352         HILOG_ERROR("IsAbilityControllerForeground false.");
4353         return ERR_WOULD_BLOCK;
4354     }
4355 
4356     abilityRecord->ProcessForegroundAbility(flag);
4357     return ERR_OK;
4358 }
4359 
DoAbilityBackground(const sptr<IRemoteObject> & token,uint32_t flag)4360 int AbilityManagerService::DoAbilityBackground(const sptr<IRemoteObject> &token, uint32_t flag)
4361 {
4362     HILOG_DEBUG("DoAbilityBackground, sceneFlag:%{public}u", flag);
4363     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
4364 
4365     auto abilityRecord = Token::GetAbilityRecordByToken(token);
4366     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4367 
4368     abilityRecord->lifeCycleStateInfo_.sceneFlag = flag;
4369     int ret = MinimizeAbility(token);
4370     abilityRecord->lifeCycleStateInfo_.sceneFlag = SCENE_FLAG_NORMAL;
4371     return ret;
4372 }
4373 
4374 #ifdef SUPPORT_GRAPHICS
DelegatorMoveMissionToFront(int32_t missionId)4375 int AbilityManagerService::DelegatorMoveMissionToFront(int32_t missionId)
4376 {
4377     HILOG_INFO("enter missionId : %{public}d", missionId);
4378     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
4379 
4380     if (!IsAbilityControllerStartById(missionId)) {
4381         HILOG_ERROR("IsAbilityControllerStart false");
4382         return ERR_WOULD_BLOCK;
4383     }
4384 
4385     return currentMissionListManager_->MoveMissionToFront(missionId);
4386 }
4387 
ShowPickerDialog(const Want & want,int32_t userId)4388 int32_t AbilityManagerService::ShowPickerDialog(const Want& want, int32_t userId)
4389 {
4390     auto bms = GetBundleManager();
4391     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
4392     HILOG_INFO("share content: ShowPickerDialog, userId is %{public}d", userId);
4393     std::vector<AppExecFwk::AbilityInfo> abilityInfos;
4394     IN_PROCESS_CALL_WITHOUT_RET(
4395         bms->QueryAbilityInfos(
4396             want, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, abilityInfos)
4397     );
4398     return Ace::UIServiceMgrClient::GetInstance()->ShowAppPickerDialog(want, abilityInfos, userId);
4399 }
4400 #endif
4401 
UpdateCallerInfo(Want & want)4402 void AbilityManagerService::UpdateCallerInfo(Want& want)
4403 {
4404     int32_t tokenId = (int32_t)IPCSkeleton::GetCallingTokenID();
4405     int32_t callerUid = IPCSkeleton::GetCallingUid();
4406     int32_t callerPid = IPCSkeleton::GetCallingPid();
4407     want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
4408     want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
4409     want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
4410 }
4411 
JudgeMultiUserConcurrency(const AppExecFwk::AbilityInfo & info,const int32_t userId)4412 bool AbilityManagerService::JudgeMultiUserConcurrency(const AppExecFwk::AbilityInfo &info, const int32_t userId)
4413 {
4414     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4415 
4416     if (userId == U0_USER_ID) {
4417         HILOG_DEBUG("%{public}s, userId is 0.", __func__);
4418         return true;
4419     }
4420 
4421     HILOG_DEBUG("userId : %{public}d, current userId : %{public}d", userId, GetUserId());
4422 
4423     // Only non-concurrent mode is supported
4424     bool concurrencyMode = CONCURRENCY_MODE_FALSE;
4425     if (!concurrencyMode) {
4426         return (userId == GetUserId());
4427     }
4428 
4429     return true;
4430 }
4431 
4432 #ifdef SUPPORT_GRAPHICS
StartingScreenLockAbility()4433 void AbilityManagerService::StartingScreenLockAbility()
4434 {
4435     HILOG_DEBUG("%{public}s", __func__);
4436     auto userId = GetUserId();
4437     Want screenLockWant;
4438     screenLockWant.SetElementName(AbilityConfig::SCREEN_LOCK_BUNDLE_NAME, AbilityConfig::SCREEN_LOCK_ABILITY_NAME);
4439     (void)StartAbility(screenLockWant, userId, DEFAULT_INVAL_VALUE);
4440 }
4441 #endif
4442 
ForceTimeoutForTest(const std::string & abilityName,const std::string & state)4443 int AbilityManagerService::ForceTimeoutForTest(const std::string &abilityName, const std::string &state)
4444 {
4445     int32_t callerUid = IPCSkeleton::GetCallingUid();
4446     if (callerUid != AbilityUtil::ROOT_UID) {
4447         HILOG_ERROR("calling uid has no permission to force timeout.");
4448         return INVALID_DATA;
4449     }
4450     if (abilityName.empty()) {
4451         HILOG_ERROR("abilityName is empty.");
4452         return INVALID_DATA;
4453     }
4454     if (abilityName == "clean") {
4455         timeoutMap_.clear();
4456         return ERR_OK;
4457     }
4458     if (state != AbilityRecord::ConvertAbilityState(AbilityState::INITIAL) &&
4459         state != AbilityRecord::ConvertAbilityState(AbilityState::INACTIVE) &&
4460         state != AbilityRecord::ConvertAbilityState(AbilityState::FOREGROUND_NEW) &&
4461         state != AbilityRecord::ConvertAbilityState(AbilityState::BACKGROUND_NEW) &&
4462         state != AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING) &&
4463         state != std::string("COMMAND")) {
4464         HILOG_ERROR("lifecycle state is invalid.");
4465         return INVALID_DATA;
4466     }
4467     timeoutMap_.insert(std::make_pair(state, abilityName));
4468     return ERR_OK;
4469 }
4470 
CheckStaticCfgPermission(AppExecFwk::AbilityInfo & abilityInfo)4471 int AbilityManagerService::CheckStaticCfgPermission(AppExecFwk::AbilityInfo &abilityInfo)
4472 {
4473     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4474     if (isSaCall) {
4475         // do not need check static config permission when start ability by SA
4476         return ERR_OK;
4477     }
4478 
4479     auto tokenId = IPCSkeleton::GetCallingTokenID();
4480     if ((abilityInfo.type == AppExecFwk::AbilityType::EXTENSION &&
4481         abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::DATASHARE) ||
4482         (abilityInfo.type == AppExecFwk::AbilityType::DATA)) {
4483         // just need check the read permission and write permission of extension ability or data ability
4484         if (!abilityInfo.readPermission.empty()) {
4485             int checkReadPermission = AccessTokenKit::VerifyAccessToken(tokenId, abilityInfo.readPermission);
4486             if (checkReadPermission == ERR_OK) {
4487                 return AppExecFwk::Constants::PERMISSION_GRANTED;
4488             }
4489             HILOG_WARN("verify access token fail, read permission: %{public}s", abilityInfo.readPermission.c_str());
4490         }
4491         if (!abilityInfo.writePermission.empty()) {
4492             int checkWritePermission = AccessTokenKit::VerifyAccessToken(tokenId, abilityInfo.writePermission);
4493             if (checkWritePermission == ERR_OK) {
4494                 return AppExecFwk::Constants::PERMISSION_GRANTED;
4495             }
4496             HILOG_WARN("verify access token fail, write permission: %{public}s", abilityInfo.writePermission.c_str());
4497         }
4498 
4499         if (!abilityInfo.readPermission.empty() || !abilityInfo.writePermission.empty()) {
4500             // 'readPermission' and 'writePermission' take precedence over 'permission'
4501             // when 'readPermission' or 'writePermission' is not empty, no need check 'permission'
4502             return AppExecFwk::Constants::PERMISSION_NOT_GRANTED;
4503         }
4504     }
4505 
4506     // verify permission if 'permission' is not empty
4507     if (abilityInfo.permissions.empty()) {
4508         return AppExecFwk::Constants::PERMISSION_GRANTED;
4509     }
4510 
4511     for (auto permission : abilityInfo.permissions) {
4512         if (AccessTokenKit::VerifyAccessToken(tokenId, permission)
4513             != AppExecFwk::Constants::PERMISSION_GRANTED) {
4514             HILOG_ERROR("verify access token fail, permission: %{public}s", permission.c_str());
4515             return AppExecFwk::Constants::PERMISSION_NOT_GRANTED;
4516         }
4517     }
4518 
4519     return AppExecFwk::Constants::PERMISSION_GRANTED;
4520 }
4521 
IsNeedTimeoutForTest(const std::string & abilityName,const std::string & state) const4522 bool AbilityManagerService::IsNeedTimeoutForTest(const std::string &abilityName, const std::string &state) const
4523 {
4524     for (auto iter = timeoutMap_.begin(); iter != timeoutMap_.end(); iter++) {
4525         if (iter->first == state && iter->second == abilityName) {
4526             return true;
4527         }
4528     }
4529     return false;
4530 }
4531 
VerifyUriPermisson(const AbilityRequest & abilityRequest,const Want & want)4532 bool AbilityManagerService::VerifyUriPermisson(const AbilityRequest &abilityRequest, const Want &want)
4533 {
4534     if (abilityRequest.abilityInfo.extensionAbilityType != AppExecFwk::ExtensionAbilityType::FILESHARE) {
4535         HILOG_DEBUG("Only FILESHARE need to Verify uri permission.");
4536         return true;
4537     }
4538     auto uriStr = want.GetUri().ToString();
4539     auto uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
4540     uriVec.emplace_back(uriStr);
4541     auto targetTokenId = IPCSkeleton::GetCallingTokenID();
4542     auto uriPermMgrClient = AAFwk::UriPermissionManagerClient::GetInstance();
4543     for (auto str : uriVec) {
4544         Uri uri(str);
4545         if (uriPermMgrClient->VerifyUriPermission(uri, Want::FLAG_AUTH_WRITE_URI_PERMISSION, targetTokenId)) {
4546             return true;
4547         }
4548         if (uriPermMgrClient->VerifyUriPermission(uri, Want::FLAG_AUTH_READ_URI_PERMISSION, targetTokenId)) {
4549             return true;
4550         }
4551     }
4552     return false;
4553 }
4554 
4555 #ifdef SUPPORT_GRAPHICS
SetANRMissionByProcessID(int pid)4556 bool AbilityManagerService::SetANRMissionByProcessID(int pid)
4557 {
4558     HILOG_INFO("start.");
4559     if (appScheduler_ == nullptr || currentMissionListManager_ == nullptr) {
4560         HILOG_ERROR("null point.");
4561         return false;
4562     }
4563     std::vector<sptr<IRemoteObject>> tokens;
4564     if (appScheduler_->GetAbilityRecordsByProcessID(pid, tokens) != ERR_OK) {
4565         HILOG_ERROR("Get ability record failed.");
4566         return false;
4567     }
4568     for (auto &item : tokens) {
4569         auto abilityRecord = currentMissionListManager_->GetAbilityRecordByToken(item);
4570         if (abilityRecord == nullptr) {
4571             HILOG_WARN("abilityRecord is nullptr.");
4572             continue;
4573         }
4574         auto mission = abilityRecord->GetMission();
4575         if (mission == nullptr) {
4576             HILOG_WARN("mission is nullptr.");
4577             continue;
4578         }
4579         mission->SetANRState();
4580     }
4581     return true;
4582 }
4583 #endif
4584 
StartupResidentProcess(int userId)4585 void AbilityManagerService::StartupResidentProcess(int userId)
4586 {
4587     // Location may change
4588     auto bms = GetBundleManager();
4589     CHECK_POINTER_IS_NULLPTR(bms);
4590 
4591     std::vector<AppExecFwk::BundleInfo> bundleInfos;
4592     bool getBundleInfos = IN_PROCESS_CALL(
4593         bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, userId));
4594     if (!getBundleInfos) {
4595         HILOG_ERROR("get bundle infos failed");
4596         return;
4597     }
4598 
4599     HILOG_INFO("StartupResidentProcess GetBundleInfos size: %{public}u, userId: %{public}d",
4600         bundleInfos.size(), userId);
4601 
4602     StartMainElement(userId, bundleInfos);
4603     if (!bundleInfos.empty()) {
4604         DelayedSingleton<AppScheduler>::GetInstance()->StartupResidentProcess(bundleInfos);
4605     }
4606 }
4607 
StartMainElement(int userId,std::vector<AppExecFwk::BundleInfo> & bundleInfos)4608 void AbilityManagerService::StartMainElement(int userId, std::vector<AppExecFwk::BundleInfo> &bundleInfos)
4609 {
4610     std::set<uint32_t> needEraseIndexSet;
4611 
4612     for (size_t i = 0; i < bundleInfos.size(); i++) {
4613         if (!bundleInfos[i].isKeepAlive) {
4614             needEraseIndexSet.insert(i);
4615             continue;
4616         }
4617         for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) {
4618             std::string mainElement;
4619             if (!hapModuleInfo.isModuleJson) {
4620                 // old application model
4621                 mainElement = hapModuleInfo.mainAbility;
4622                 if (mainElement.empty()) {
4623                     continue;
4624                 }
4625                 needEraseIndexSet.insert(i);
4626                 std::string uriStr;
4627                 bool getDataAbilityUri = GetDataAbilityUri(hapModuleInfo.abilityInfos, mainElement, uriStr);
4628                 if (getDataAbilityUri) {
4629                     // dataability, need use AcquireDataAbility
4630                     Uri uri(uriStr);
4631                     (void)AcquireDataAbility(uri, true, nullptr);
4632                     continue;
4633                 }
4634             } else {
4635                 // new application model
4636                 mainElement = hapModuleInfo.mainElementName;
4637                 if (mainElement.empty()) {
4638                     continue;
4639                 }
4640                 needEraseIndexSet.insert(i);
4641             }
4642 
4643             // startAbility
4644             AppExecFwk::AbilityInfo abilityInfo;
4645             Want want;
4646             want.SetElementName(hapModuleInfo.bundleName, mainElement);
4647             (void)StartAbility(want, userId, DEFAULT_INVAL_VALUE);
4648         }
4649     }
4650 
4651     // delete item which process has been started.
4652     for (auto iter = needEraseIndexSet.rbegin(); iter != needEraseIndexSet.rend(); iter++) {
4653         bundleInfos.erase(bundleInfos.begin() + *iter);
4654     }
4655 }
4656 
GetValidDataAbilityUri(const std::string & abilityInfoUri,std::string & adjustUri)4657 bool AbilityManagerService::GetValidDataAbilityUri(const std::string &abilityInfoUri, std::string &adjustUri)
4658 {
4659     // note: do not use abilityInfo.uri directly, need check uri first.
4660     size_t firstSeparator = abilityInfoUri.find_first_of('/');
4661     size_t lastSeparator = abilityInfoUri.find_last_of('/');
4662     if (lastSeparator - firstSeparator != 1) {
4663         HILOG_ERROR("ability info uri error, uri: %{public}s", abilityInfoUri.c_str());
4664         return false;
4665     }
4666 
4667     adjustUri = abilityInfoUri;
4668     adjustUri.insert(lastSeparator, "/");
4669     return true;
4670 }
4671 
GetDataAbilityUri(const std::vector<AppExecFwk::AbilityInfo> & abilityInfos,const std::string & mainAbility,std::string & uri)4672 bool AbilityManagerService::GetDataAbilityUri(const std::vector<AppExecFwk::AbilityInfo> &abilityInfos,
4673     const std::string &mainAbility, std::string &uri)
4674 {
4675     if (abilityInfos.empty() || mainAbility.empty()) {
4676         HILOG_ERROR("abilityInfos or mainAbility is empty. mainAbility: %{public}s", mainAbility.c_str());
4677         return false;
4678     }
4679 
4680     std::string dataAbilityUri;
4681     for (auto abilityInfo : abilityInfos) {
4682         if (abilityInfo.type == AppExecFwk::AbilityType::DATA &&
4683             abilityInfo.name == mainAbility) {
4684             dataAbilityUri = abilityInfo.uri;
4685             HILOG_INFO("get data ability uri: %{public}s", dataAbilityUri.c_str());
4686             break;
4687         }
4688     }
4689 
4690     return GetValidDataAbilityUri(dataAbilityUri, uri);
4691 }
4692 
VerifyMissionPermission()4693 int AbilityManagerService::VerifyMissionPermission()
4694 {
4695     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4696     if (isSaCall) {
4697         return ERR_OK;
4698     }
4699     auto isCallingPerm = AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(
4700         PermissionConstants::PERMISSION_MANAGE_MISSION);
4701     if (isCallingPerm) {
4702         HILOG_DEBUG("%{public}s: Permission verification succeeded.", __func__);
4703         return ERR_OK;
4704     }
4705     HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4706     return CHECK_PERMISSION_FAILED;
4707 }
4708 
GetAbilityRunningInfo(std::vector<AbilityRunningInfo> & info,std::shared_ptr<AbilityRecord> & abilityRecord)4709 void AbilityManagerService::GetAbilityRunningInfo(std::vector<AbilityRunningInfo> &info,
4710     std::shared_ptr<AbilityRecord> &abilityRecord)
4711 {
4712     AbilityRunningInfo runningInfo;
4713     AppExecFwk::RunningProcessInfo processInfo;
4714 
4715     runningInfo.ability = abilityRecord->GetWant().GetElement();
4716     runningInfo.startTime = abilityRecord->GetStartTime();
4717     runningInfo.abilityState = static_cast<int>(abilityRecord->GetAbilityState());
4718 
4719     DelayedSingleton<AppScheduler>::GetInstance()->
4720         GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
4721     runningInfo.pid = processInfo.pid_;
4722     runningInfo.uid = processInfo.uid_;
4723     runningInfo.processName = processInfo.processName_;
4724     info.emplace_back(runningInfo);
4725 }
4726 
VerifyAccountPermission(int32_t userId)4727 int AbilityManagerService::VerifyAccountPermission(int32_t userId)
4728 {
4729     if ((userId < 0) || (userController_ && (userController_->GetCurrentUserId() == userId))) {
4730         return ERR_OK;
4731     }
4732     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4733     if (isSaCall) {
4734         return ERR_OK;
4735     }
4736     auto isCallingPerm = AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(
4737         PermissionConstants::PERMISSION_INTERACT_ACROSS_LOCAL_ACCOUNTS);
4738     if (isCallingPerm) {
4739         return ERR_OK;
4740     }
4741     HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4742     return CHECK_PERMISSION_FAILED;
4743 }
4744 
GetTopAbility()4745 AppExecFwk::ElementName AbilityManagerService::GetTopAbility()
4746 {
4747     HILOG_DEBUG("%{public}s start.", __func__);
4748     AppExecFwk::ElementName elementName = {};
4749 #ifdef SUPPORT_GRAPHICS
4750     auto windowsInstance = WindowFocusController::GetInstance();
4751     if (windowsInstance) {
4752         windowsInstance->GetTopAbility(elementName);
4753     } else {
4754         HILOG_ERROR("OnStart. windowsInstance == nullptr !");
4755     }
4756     auto bundleName = elementName.GetBundleName();
4757     auto abilityName = elementName.GetAbilityName();
4758     HILOG_DEBUG("BundleName is %{public}s, AbilityName is %{public}s", bundleName.c_str(), abilityName.c_str());
4759     bool isDeviceEmpty = elementName.GetDeviceID().empty();
4760     std::string localDeviceId;
4761     bool hasLocalDeviceId = GetLocalDeviceId(localDeviceId);
4762     if (isDeviceEmpty && hasLocalDeviceId) {
4763         elementName.SetDeviceID(localDeviceId);
4764         HILOG_DEBUG("%{public}s DeviceId %{public}s .", __func__, elementName.GetDeviceID().c_str());
4765     }
4766     HILOG_DEBUG("%{public}s end.", __func__);
4767 #endif
4768     return elementName;
4769 }
4770 
DumpAbilityInfoDone(std::vector<std::string> & infos,const sptr<IRemoteObject> & callerToken)4771 int AbilityManagerService::DumpAbilityInfoDone(std::vector<std::string> &infos, const sptr<IRemoteObject> &callerToken)
4772 {
4773     HILOG_DEBUG("DumpAbilityInfoDone begin");
4774     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
4775     if (abilityRecord == nullptr) {
4776         HILOG_ERROR("abilityRecord nullptr");
4777         return ERR_INVALID_VALUE;
4778     }
4779     abilityRecord->DumpAbilityInfoDone(infos);
4780     return ERR_OK;
4781 }
4782 }  // namespace AAFwk
4783 }  // namespace OHOS
4784