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