1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ability_record.h"
17
18 #include <singleton.h>
19 #include <vector>
20
21 #include "constants.h"
22 #include "ability_event_handler.h"
23 #include "ability_manager_service.h"
24 #include "ability_scheduler_stub.h"
25 #include "ability_util.h"
26 #include "array_wrapper.h"
27 #include "accesstoken_kit.h"
28 #include "bundle_mgr_client.h"
29 #include "configuration_convertor.h"
30 #include "connection_state_manager.h"
31 #include "hitrace_meter.h"
32 #include "image_source.h"
33 #include "in_process_call_wrapper.h"
34 #include "errors.h"
35 #include "event_report.h"
36 #include "hilog_wrapper.h"
37 #include "os_account_manager_wrapper.h"
38 #include "parameters.h"
39 #include "scene_board_judgement.h"
40 #include "system_ability_token_callback.h"
41 #include "uri_permission_manager_client.h"
42 #include "permission_constants.h"
43 #ifdef SUPPORT_GRAPHICS
44 #include "image_source.h"
45 #include "locale_config.h"
46 #include "mission_info_mgr.h"
47 #endif
48 #ifdef EFFICIENCY_MANAGER_ENABLE
49 #include "suspend_manager_client.h"
50 #endif // EFFICIENCY_MANAGER_ENABLE
51
52
53 namespace OHOS {
54 namespace AAFwk {
55 using namespace OHOS::Security;
56 using namespace OHOS::AAFwk::PermissionConstants;
57 const std::string DEBUG_APP = "debugApp";
58 const std::string NATIVE_DEBUG = "nativeDebug";
59 const std::string PERF_CMD = "perfCmd";
60 const std::string DMS_PROCESS_NAME = "distributedsched";
61 const std::string DMS_MISSION_ID = "dmsMissionId";
62 const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
63 const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId";
64 const std::u16string SYSTEM_ABILITY_TOKEN_CALLBACK = u"ohos.aafwk.ISystemAbilityTokenCallback";
65 const std::string SHOW_ON_LOCK_SCREEN = "ShowOnLockScreen";
66 const std::string DLP_INDEX = "ohos.dlp.params.index";
67 const std::string DLP_BUNDLE_NAME = "com.ohos.dlpmanager";
68 const std::string COMPONENT_STARTUP_NEW_RULES = "component.startup.newRules";
69 const std::string KEY_MISSION_ID = "ohos.anco.param.missionId";
70 const std::string NEED_STARTINGWINDOW = "ohos.ability.NeedStartingWindow";
71 const std::string PARAMS_URI = "ability.verify.uri";
72 const std::string PARAMS_FILE_SAVING_URL_KEY = "pick_path_return";
73 const uint32_t RELEASE_STARTING_BG_TIMEOUT = 15000; // release starting window resource timeout.
74 const std::string SHELL_ASSISTANT_BUNDLENAME = "com.huawei.shell_assistant";
75 const std::string SHELL_ASSISTANT_DIEREASON = "crash_die";
76 const char* GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_PARAMETER = "persist.sys.prepare_terminate";
77 constexpr int32_t GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_SIZE = 6;
78 const int32_t SHELL_ASSISTANT_DIETYPE = 0;
79 int64_t AbilityRecord::abilityRecordId = 0;
80 const int32_t DEFAULT_USER_ID = 0;
81 const int32_t SEND_RESULT_CANCELED = -1;
82 const int VECTOR_SIZE = 2;
83 const int LOAD_TIMEOUT_ASANENABLED = 150;
84 const int TERMINATE_TIMEOUT_ASANENABLED = 150;
85 const int HALF_TIMEOUT = 2;
86 #ifdef SUPPORT_ASAN
87 const int COLDSTART_TIMEOUT_MULTIPLE = 15000;
88 const int LOAD_TIMEOUT_MULTIPLE = 15000;
89 const int FOREGROUND_TIMEOUT_MULTIPLE = 7500;
90 const int BACKGROUND_TIMEOUT_MULTIPLE = 4500;
91 const int ACTIVE_TIMEOUT_MULTIPLE = 7500;
92 const int TERMINATE_TIMEOUT_MULTIPLE = 15000;
93 const int INACTIVE_TIMEOUT_MULTIPLE = 800;
94 const int DUMP_TIMEOUT_MULTIPLE = 1500;
95 const int SHAREDATA_TIMEOUT_MULTIPLE = 7500;
96 #else
97 const int COLDSTART_TIMEOUT_MULTIPLE = 10;
98 const int LOAD_TIMEOUT_MULTIPLE = 10;
99 const int FOREGROUND_TIMEOUT_MULTIPLE = 5;
100 const int BACKGROUND_TIMEOUT_MULTIPLE = 3;
101 const int ACTIVE_TIMEOUT_MULTIPLE = 5;
102 const int TERMINATE_TIMEOUT_MULTIPLE = 10;
103 const int INACTIVE_TIMEOUT_MULTIPLE = 1;
104 const int DUMP_TIMEOUT_MULTIPLE = 1;
105 const int SHAREDATA_TIMEOUT_MULTIPLE = 5;
106 #endif
107 const std::map<AbilityState, std::string> AbilityRecord::stateToStrMap = {
108 std::map<AbilityState, std::string>::value_type(INITIAL, "INITIAL"),
109 std::map<AbilityState, std::string>::value_type(INACTIVE, "INACTIVE"),
110 std::map<AbilityState, std::string>::value_type(ACTIVE, "ACTIVE"),
111 std::map<AbilityState, std::string>::value_type(INACTIVATING, "INACTIVATING"),
112 std::map<AbilityState, std::string>::value_type(ACTIVATING, "ACTIVATING"),
113 std::map<AbilityState, std::string>::value_type(TERMINATING, "TERMINATING"),
114 std::map<AbilityState, std::string>::value_type(FOREGROUND, "FOREGROUND"),
115 std::map<AbilityState, std::string>::value_type(BACKGROUND, "BACKGROUND"),
116 std::map<AbilityState, std::string>::value_type(FOREGROUNDING, "FOREGROUNDING"),
117 std::map<AbilityState, std::string>::value_type(BACKGROUNDING, "BACKGROUNDING"),
118 std::map<AbilityState, std::string>::value_type(FOREGROUND_FAILED, "FOREGROUND_FAILED"),
119 std::map<AbilityState, std::string>::value_type(FOREGROUND_INVALID_MODE, "FOREGROUND_INVALID_MODE"),
120 std::map<AbilityState, std::string>::value_type(FOREGROUND_WINDOW_FREEZED, "FOREGROUND_WINDOW_FREEZED"),
121 std::map<AbilityState, std::string>::value_type(FOREGROUND_DO_NOTHING, "FOREGROUND_DO_NOTHING"),
122 std::map<AbilityState, std::string>::value_type(BACKGROUND_FAILED, "BACKGROUND_FAILED"),
123 };
124 const std::map<AppState, std::string> AbilityRecord::appStateToStrMap_ = {
125 std::map<AppState, std::string>::value_type(AppState::BEGIN, "BEGIN"),
126 std::map<AppState, std::string>::value_type(AppState::READY, "READY"),
127 std::map<AppState, std::string>::value_type(AppState::FOREGROUND, "FOREGROUND"),
128 std::map<AppState, std::string>::value_type(AppState::BACKGROUND, "BACKGROUND"),
129 std::map<AppState, std::string>::value_type(AppState::SUSPENDED, "SUSPENDED"),
130 std::map<AppState, std::string>::value_type(AppState::TERMINATED, "TERMINATED"),
131 std::map<AppState, std::string>::value_type(AppState::END, "END"),
132 std::map<AppState, std::string>::value_type(AppState::FOCUS, "FOCUS"),
133 };
134 const std::map<AbilityLifeCycleState, AbilityState> AbilityRecord::convertStateMap = {
135 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INITIAL, INITIAL),
136 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INACTIVE, INACTIVE),
137 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_ACTIVE, ACTIVE),
138 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_NEW, FOREGROUND),
139 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND_NEW, BACKGROUND),
140 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_FAILED, FOREGROUND_FAILED),
141 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INVALID_WINDOW_MODE,
142 FOREGROUND_INVALID_MODE),
143 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_WINDOW_FREEZED,
144 FOREGROUND_WINDOW_FREEZED),
145 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_DO_NOTHING, FOREGROUND_DO_NOTHING),
146 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND_FAILED, BACKGROUND_FAILED),
147 };
148
Token(std::weak_ptr<AbilityRecord> abilityRecord)149 Token::Token(std::weak_ptr<AbilityRecord> abilityRecord) : abilityRecord_(abilityRecord)
150 {}
151
~Token()152 Token::~Token()
153 {}
154
GetAbilityRecordByToken(const sptr<IRemoteObject> & token)155 std::shared_ptr<AbilityRecord> Token::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
156 {
157 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
158 if (token == nullptr) {
159 HILOG_INFO("null");
160 return nullptr;
161 }
162
163 std::string descriptor = Str16ToStr8(token->GetObjectDescriptor());
164 if (descriptor != "ohos.aafwk.AbilityToken") {
165 HILOG_ERROR("Input token is not an AbilityToken, token->GetObjectDescriptor(): %{public}s",
166 descriptor.c_str());
167 return nullptr;
168 }
169
170 // Double check if token is valid
171 sptr<IAbilityToken> theToken = iface_cast<IAbilityToken>(token);
172 if (!theToken) {
173 return nullptr;
174 }
175 if (theToken->GetDescriptor() != u"ohos.aafwk.AbilityToken") {
176 return nullptr;
177 }
178
179 return (static_cast<Token *>(token.GetRefPtr()))->GetAbilityRecord();
180 }
181
GetAbilityRecord() const182 std::shared_ptr<AbilityRecord> Token::GetAbilityRecord() const
183 {
184 return abilityRecord_.lock();
185 }
186
AbilityRecord(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode)187 AbilityRecord::AbilityRecord(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
188 const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode)
189 : want_(want), abilityInfo_(abilityInfo), applicationInfo_(applicationInfo), requestCode_(requestCode)
190 {
191 recordId_ = abilityRecordId++;
192 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
193 if (abilityMgr) {
194 bool isRootLauncher = (applicationInfo_.bundleName == LAUNCHER_BUNDLE_NAME);
195 restartMax_ = AmsConfigurationParameter::GetInstance().GetMaxRestartNum(isRootLauncher);
196 bool flag = abilityMgr->GetStartUpNewRuleFlag();
197 want_.SetParam(COMPONENT_STARTUP_NEW_RULES, flag);
198 }
199 restartCount_ = restartMax_;
200 appIndex_ = want.GetIntParam(DLP_INDEX, 0);
201 }
202
~AbilityRecord()203 AbilityRecord::~AbilityRecord()
204 {
205 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
206 auto object = scheduler_->AsObject();
207 if (object != nullptr) {
208 object->RemoveDeathRecipient(schedulerDeathRecipient_);
209 }
210 }
211 }
212
CreateAbilityRecord(const AbilityRequest & abilityRequest)213 std::shared_ptr<AbilityRecord> AbilityRecord::CreateAbilityRecord(const AbilityRequest &abilityRequest)
214 {
215 std::shared_ptr<AbilityRecord> abilityRecord = std::make_shared<AbilityRecord>(
216 abilityRequest.want, abilityRequest.abilityInfo, abilityRequest.appInfo, abilityRequest.requestCode);
217 CHECK_POINTER_AND_RETURN(abilityRecord, nullptr);
218 abilityRecord->SetUid(abilityRequest.uid);
219 abilityRecord->SetAppIndex(abilityRequest.want.GetIntParam(DLP_INDEX, 0));
220 abilityRecord->SetCallerAccessTokenId(abilityRequest.callerAccessTokenId);
221 abilityRecord->sessionInfo_ = abilityRequest.sessionInfo;
222 if (!abilityRecord->Init()) {
223 HILOG_ERROR("failed to init new ability record");
224 return nullptr;
225 }
226 if (abilityRequest.startSetting != nullptr) {
227 HILOG_DEBUG("abilityRequest.startSetting...");
228 abilityRecord->SetStartSetting(abilityRequest.startSetting);
229 }
230 if (abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
231 HILOG_DEBUG("abilityRequest.callType is CALL_REQUEST_TYPE.");
232 abilityRecord->SetStartedByCall(true);
233 }
234 abilityRecord->collaboratorType_ = abilityRequest.collaboratorType;
235 return abilityRecord;
236 }
237
Init()238 bool AbilityRecord::Init()
239 {
240 lifecycleDeal_ = std::make_unique<LifecycleDeal>();
241 CHECK_POINTER_RETURN_BOOL(lifecycleDeal_);
242
243 token_ = new (std::nothrow) Token(weak_from_this());
244 CHECK_POINTER_RETURN_BOOL(token_);
245
246 if (applicationInfo_.isLauncherApp) {
247 isLauncherAbility_ = true;
248 }
249 InitPersistableUriPermissionConfig();
250 return true;
251 }
252
SetUid(int32_t uid)253 void AbilityRecord::SetUid(int32_t uid)
254 {
255 uid_ = uid;
256 }
257
GetUid()258 int32_t AbilityRecord::GetUid()
259 {
260 return uid_;
261 }
262
GetPid()263 int32_t AbilityRecord::GetPid()
264 {
265 return pid_;
266 }
267
LoadAbility()268 int AbilityRecord::LoadAbility()
269 {
270 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
271 HILOG_DEBUG("name:%{public}s.", abilityInfo_.name.c_str());
272 int coldStartTimeout =
273 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COLDSTART_TIMEOUT_MULTIPLE;
274 int loadTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE;
275 if (applicationInfo_.asanEnabled) {
276 loadTimeout =
277 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_ASANENABLED;
278 SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, loadTimeout / HALF_TIMEOUT);
279 } else if (abilityInfo_.type != AppExecFwk::AbilityType::DATA) {
280 auto delayTime = want_.GetBoolParam("coldStart", false) ? coldStartTimeout : loadTimeout;
281 SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, delayTime / HALF_TIMEOUT);
282 }
283
284 startTime_ = AbilityUtil::SystemTimeMillis();
285 CHECK_POINTER_AND_RETURN(token_, ERR_INVALID_VALUE);
286 std::string appName = applicationInfo_.name;
287 if (appName.empty()) {
288 HILOG_ERROR("app name is empty");
289 return ERR_INVALID_VALUE;
290 }
291
292 if (!CanRestartRootLauncher()) {
293 HILOG_ERROR("Root launcher restart is out of max count.");
294 return ERR_INVALID_VALUE;
295 }
296
297 if (isRestarting_) {
298 restartTime_ = AbilityUtil::SystemTimeMillis();
299 }
300
301 sptr<Token> callerToken_ = nullptr;
302 if (!callerList_.empty() && callerList_.back()) {
303 auto caller = callerList_.back()->GetCaller();
304 if (caller) {
305 callerToken_ = caller->GetToken();
306 }
307 }
308 want_.SetParam(ABILITY_OWNER_USERID, ownerMissionUserId_);
309 want_.SetParam("ohos.ability.launch.reason", static_cast<int>(lifeCycleStateInfo_.launchParam.launchReason));
310 auto result = DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
311 token_, callerToken_, abilityInfo_, applicationInfo_, want_);
312 want_.RemoveParam(ABILITY_OWNER_USERID);
313 return result;
314 }
315
CanRestartRootLauncher()316 bool AbilityRecord::CanRestartRootLauncher()
317 {
318 if (isLauncherRoot_ && isRestarting_ && IsLauncherAbility() && (restartCount_ < 0)) {
319 HILOG_ERROR("Root launcher restart is out of max count.");
320 return false;
321 }
322 return true;
323 }
324
CanRestartResident()325 bool AbilityRecord::CanRestartResident()
326 {
327 HILOG_DEBUG("isKeepAlive: %{public}d, isRestarting: %{public}d, restartCount: %{public}d",
328 isKeepAlive_, isRestarting_, restartCount_);
329 if (isKeepAlive_ && isRestarting_ && (restartCount_ < 0)) {
330 int restartIntervalTime = 0;
331 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
332 if (abilityMgr) {
333 restartIntervalTime = AmsConfigurationParameter::GetInstance().GetRestartIntervalTime();
334 }
335 HILOG_DEBUG("restartTime: %{public}lld, now: %{public}lld, intervalTine:%{public}d",
336 static_cast<unsigned long long>(restartTime_),
337 static_cast<unsigned long long>(AbilityUtil::SystemTimeMillis()), restartIntervalTime);
338 if ((AbilityUtil::SystemTimeMillis() - restartTime_) < restartIntervalTime) {
339 HILOG_ERROR("Resident restart is out of max count");
340 return false;
341 }
342 }
343 return true;
344 }
345
ForegroundAbility(uint32_t sceneFlag)346 void AbilityRecord::ForegroundAbility(uint32_t sceneFlag)
347 {
348 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
349 HILOG_INFO("name:%{public}s.", abilityInfo_.name.c_str());
350 CHECK_POINTER(lifecycleDeal_);
351
352 int foregroundTimeout =
353 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * FOREGROUND_TIMEOUT_MULTIPLE;
354 SendEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, foregroundTimeout / HALF_TIMEOUT);
355
356 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
357 // earlier than above actions.
358 SetAbilityStateInner(AbilityState::FOREGROUNDING);
359 lifeCycleStateInfo_.sceneFlag = sceneFlag;
360 lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_, sessionInfo_);
361 lifeCycleStateInfo_.sceneFlag = 0;
362 lifeCycleStateInfo_.sceneFlagBak = 0;
363
364 // update ability state to appMgr service when restart
365 if (IsNewWant()) {
366 sptr<Token> preToken = nullptr;
367 if (GetPreAbilityRecord()) {
368 preToken = GetPreAbilityRecord()->GetToken();
369 }
370 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
371 }
372 }
373
ForegroundAbility(const Closure & task,uint32_t sceneFlag)374 void AbilityRecord::ForegroundAbility(const Closure &task, uint32_t sceneFlag)
375 {
376 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
377 HILOG_INFO("name:%{public}s.", abilityInfo_.name.c_str());
378 CHECK_POINTER(lifecycleDeal_);
379
380 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
381 if (handler && task) {
382 if (!want_.GetBoolParam(DEBUG_APP, false) && !want_.GetBoolParam(NATIVE_DEBUG, false)) {
383 int foregroundTimeout =
384 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * FOREGROUND_TIMEOUT_MULTIPLE;
385 handler->SubmitTask(task, "foreground_" + std::to_string(recordId_), foregroundTimeout, false);
386 } else {
387 HILOG_INFO("Is debug mode, no need to handle time out.");
388 }
389 }
390
391 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
392 // earlier than above actions.
393 SetAbilityStateInner(AbilityState::FOREGROUNDING);
394 lifeCycleStateInfo_.sceneFlag = sceneFlag;
395 lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_, sessionInfo_);
396 lifeCycleStateInfo_.sceneFlag = 0;
397 lifeCycleStateInfo_.sceneFlagBak = 0;
398
399 // update ability state to appMgr service when restart
400 if (IsNewWant()) {
401 sptr<Token> preToken = nullptr;
402 if (GetPreAbilityRecord()) {
403 preToken = GetPreAbilityRecord()->GetToken();
404 }
405 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
406 }
407 }
408
ProcessForegroundAbility(uint32_t tokenId,uint32_t sceneFlag)409 void AbilityRecord::ProcessForegroundAbility(uint32_t tokenId, uint32_t sceneFlag)
410 {
411 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
412 std::string element = GetWant().GetElement().GetURI();
413 HILOG_DEBUG("ability record: %{public}s", element.c_str());
414 GrantUriPermission(want_, applicationInfo_.bundleName, false, tokenId);
415
416 if (isReady_) {
417 if (IsAbilityState(AbilityState::FOREGROUND)) {
418 HILOG_DEBUG("Activate %{public}s", element.c_str());
419 ForegroundAbility(sceneFlag);
420 } else {
421 // background to active state
422 HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
423 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
424 #ifdef EFFICIENCY_MANAGER_ENABLE
425 std::string bundleName = GetAbilityInfo().bundleName;
426 int32_t uid = GetUid();
427 SuspendManager::SuspendManagerClient::GetInstance().ThawOneApplication(
428 uid, bundleName, "THAW_BY_FOREGROUND_ABILITY");
429 #endif // EFFICIENCY_MANAGER_ENABLE
430 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
431 }
432 } else {
433 HILOG_DEBUG("To load ability.");
434 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
435 LoadAbility();
436 }
437 }
438
GetLabel()439 std::string AbilityRecord::GetLabel()
440 {
441 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
442 std::string strLabel = applicationInfo_.label;
443
444 if (abilityInfo_.resourcePath.empty()) {
445 HILOG_WARN("resource path is empty.");
446 return strLabel;
447 }
448
449 #ifdef SUPPORT_GRAPHICS
450 auto resourceMgr = CreateResourceManager();
451 if (!resourceMgr) {
452 return strLabel;
453 }
454
455 auto result = resourceMgr->GetStringById(applicationInfo_.labelId, strLabel);
456 if (result != OHOS::Global::Resource::RState::SUCCESS) {
457 HILOG_WARN("%{public}s. Failed to GetStringById.", __func__);
458 }
459
460 InitColdStartingWindowResource(resourceMgr);
461 #endif
462
463 return strLabel;
464 }
465
466 #ifdef SUPPORT_GRAPHICS
ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> & callerAbility,bool needExit,uint32_t sceneFlag)467 void AbilityRecord::ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> &callerAbility, bool needExit,
468 uint32_t sceneFlag)
469 {
470 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
471 std::string element = GetWant().GetElement().GetURI();
472 HILOG_DEBUG("SUPPORT_GRAPHICS: ability record: %{public}s", element.c_str());
473
474 StartingWindowHot();
475 auto flag = !IsForeground();
476 NotifyAnimationFromTerminatingAbility(callerAbility, needExit, flag);
477 PostCancelStartingWindowHotTask();
478
479 if (IsAbilityState(AbilityState::FOREGROUND)) {
480 HILOG_DEBUG("Activate %{public}s", element.c_str());
481 ForegroundAbility(sceneFlag);
482 } else {
483 // background to active state
484 HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
485 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
486 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
487 }
488 }
489
NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord> & callerAbility,bool needExit,bool flag)490 void AbilityRecord::NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord>& callerAbility,
491 bool needExit, bool flag)
492 {
493 auto windowHandler = GetWMSHandler();
494 if (!windowHandler) {
495 HILOG_WARN("Get WMS handler failed.");
496 return;
497 }
498
499 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
500 if (callerAbility) {
501 auto callerAbilityInfo = callerAbility->GetAbilityInfo();
502 SetAbilityTransitionInfo(callerAbilityInfo, fromInfo);
503 fromInfo->abilityToken_ = callerAbility->GetToken();
504 }
505
506 if (flag && needExit) {
507 fromInfo->reason_ = TransitionReason::BACK_TRANSITION;
508 } else if (flag && !needExit) {
509 fromInfo->reason_ = TransitionReason::BACKGROUND_TRANSITION;
510 } else {
511 fromInfo->reason_ = TransitionReason::CLOSE;
512 }
513
514 auto toInfo = CreateAbilityTransitionInfo();
515 SetAbilityTransitionInfo(abilityInfo_, toInfo);
516 bool animaEnabled = false;
517 windowHandler->NotifyWindowTransition(fromInfo, toInfo, animaEnabled);
518 }
519
NotifyAnimationFromTerminatingAbility() const520 void AbilityRecord::NotifyAnimationFromTerminatingAbility() const
521 {
522 auto windowHandler = GetWMSHandler();
523 if (!windowHandler) {
524 HILOG_WARN("Get WMS handler failed.");
525 return;
526 }
527
528 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
529 SetAbilityTransitionInfo(fromInfo);
530 fromInfo->reason_ = TransitionReason::CLOSE;
531 bool animaEnabled = false;
532 windowHandler->NotifyWindowTransition(fromInfo, nullptr, animaEnabled);
533 }
534
NotifyAnimationFromMinimizeAbility(bool & animaEnabled)535 void AbilityRecord::NotifyAnimationFromMinimizeAbility(bool& animaEnabled)
536 {
537 auto windowHandler = GetWMSHandler();
538 if (!windowHandler) {
539 HILOG_WARN("Get WMS handler failed.");
540 return;
541 }
542 HILOG_INFO("Notify Animation From MinimizeAbility");
543 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
544 SetAbilityTransitionInfo(fromInfo);
545 fromInfo->reason_ = TransitionReason::MINIMIZE;
546 windowHandler->NotifyWindowTransition(fromInfo, nullptr, animaEnabled);
547 }
548
SetAbilityTransitionInfo(sptr<AbilityTransitionInfo> & info) const549 void AbilityRecord::SetAbilityTransitionInfo(sptr<AbilityTransitionInfo>& info) const
550 {
551 info->abilityToken_ = token_;
552 info->missionId_ = missionId_;
553 info->abilityName_ = abilityInfo_.name;
554 info->bundleName_ = abilityInfo_.bundleName;
555 info->windowModes_ = abilityInfo_.windowModes;
556 info->maxWindowRatio_ = abilityInfo_.maxWindowRatio;
557 info->minWindowRatio_ = abilityInfo_.minWindowRatio;
558 info->maxWindowWidth_ = abilityInfo_.maxWindowWidth;
559 info->minWindowWidth_ = abilityInfo_.minWindowWidth;
560 info->maxWindowHeight_ = abilityInfo_.maxWindowHeight;
561 info->minWindowHeight_ = abilityInfo_.minWindowHeight;
562 info->orientation_ = abilityInfo_.orientation;
563 info->apiCompatibleVersion_ = abilityInfo_.applicationInfo.apiCompatibleVersion;
564 }
565
CreateAbilityTransitionInfo()566 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo()
567 {
568 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
569 SetAbilityTransitionInfo(info);
570 SetStartingWindow(true);
571 return info;
572 }
573
StartingWindowHot()574 void AbilityRecord::StartingWindowHot()
575 {
576 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
577 auto windowHandler = GetWMSHandler();
578 if (!windowHandler) {
579 HILOG_WARN("Get WMS handler failed.");
580 return;
581 }
582
583 auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
584 if (!pixelMap) {
585 HILOG_WARN("Get snapshot failed.");
586 }
587
588 auto info = CreateAbilityTransitionInfo();
589 HILOG_INFO("Notify wms to start StartingWindow.");
590 windowHandler->StartingWindow(info, pixelMap);
591 }
592
ProcessForegroundAbility(bool isRecent,const AbilityRequest & abilityRequest,std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<AbilityRecord> & callerAbility,uint32_t sceneFlag)593 void AbilityRecord::ProcessForegroundAbility(bool isRecent, const AbilityRequest &abilityRequest,
594 std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility,
595 uint32_t sceneFlag)
596 {
597 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
598 std::string element = GetWant().GetElement().GetURI();
599 HILOG_DEBUG("SUPPORT_GRAPHICS: ability record: %{public}s", element.c_str());
600
601 GrantUriPermission(want_, applicationInfo_.bundleName, false, 0);
602
603 if (isReady_) {
604 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
605 if (!handler) {
606 HILOG_ERROR("Fail to get AbilityEventHandler.");
607 return;
608 }
609 auto taskName = std::to_string(missionId_) + "_hot";
610 handler->CancelTask(taskName);
611 StartingWindowTask(isRecent, false, abilityRequest, startOptions);
612 AnimationTask(isRecent, abilityRequest, startOptions, callerAbility);
613 PostCancelStartingWindowHotTask();
614
615 if (IsAbilityState(AbilityState::FOREGROUND)) {
616 HILOG_DEBUG("Activate %{public}s", element.c_str());
617 ForegroundAbility(sceneFlag);
618 } else {
619 // background to active state
620 HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
621 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
622 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
623 }
624 } else {
625 HILOG_DEBUG("SUPPORT_GRAPHICS: to load ability.");
626 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
627 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
628 auto needStartingWindow = abilityRequest.want.GetBoolParam(NEED_STARTINGWINDOW, true);
629 if (!isSaCall || needStartingWindow) {
630 StartingWindowTask(isRecent, true, abilityRequest, startOptions);
631 AnimationTask(isRecent, abilityRequest, startOptions, callerAbility);
632 PostCancelStartingWindowColdTask();
633 }
634 LoadAbility();
635 }
636 }
637
GetWantFromMission() const638 std::shared_ptr<Want> AbilityRecord::GetWantFromMission() const
639 {
640 InnerMissionInfo innerMissionInfo;
641 int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
642 missionId_, innerMissionInfo);
643 if (getMission != ERR_OK) {
644 HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId_);
645 return nullptr;
646 }
647
648 return std::make_shared<Want>(innerMissionInfo.missionInfo.want);
649 }
650
AnimationTask(bool isRecent,const AbilityRequest & abilityRequest,const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<AbilityRecord> & callerAbility)651 void AbilityRecord::AnimationTask(bool isRecent, const AbilityRequest &abilityRequest,
652 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility)
653 {
654 HILOG_DEBUG("called.");
655 if (isRecent) {
656 auto want = GetWantFromMission();
657 NotifyAnimationFromRecentTask(startOptions, want);
658 } else {
659 if (!IsForeground()) {
660 NotifyAnimationFromStartingAbility(callerAbility, abilityRequest);
661 }
662 }
663 }
664
SetShowWhenLocked(const AppExecFwk::AbilityInfo & abilityInfo,sptr<AbilityTransitionInfo> & info) const665 void AbilityRecord::SetShowWhenLocked(const AppExecFwk::AbilityInfo &abilityInfo,
666 sptr<AbilityTransitionInfo> &info) const
667 {
668 for (const auto &data : abilityInfo.metaData.customizeData) {
669 if (data.name == SHOW_ON_LOCK_SCREEN) {
670 info->isShowWhenLocked_ = true;
671 break;
672 }
673 }
674 }
675
SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo & abilityInfo,sptr<AbilityTransitionInfo> & info) const676 void AbilityRecord::SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo &abilityInfo,
677 sptr<AbilityTransitionInfo> &info) const
678 {
679 info->abilityName_ = abilityInfo.name;
680 info->bundleName_ = abilityInfo.bundleName;
681 info->windowModes_ = abilityInfo.windowModes;
682 info->orientation_ = abilityInfo.orientation;
683 info->apiCompatibleVersion_ = abilityInfo.applicationInfo.apiCompatibleVersion;
684 SetShowWhenLocked(abilityInfo, info);
685 }
686
NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const687 void AbilityRecord::NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> &startOptions,
688 const std::shared_ptr<Want> &want) const
689 {
690 auto windowHandler = GetWMSHandler();
691 if (!windowHandler) {
692 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
693 return;
694 }
695
696 auto toInfo = CreateAbilityTransitionInfo(startOptions, want);
697 toInfo->abilityToken_ = token_;
698 toInfo->missionId_ = missionId_;
699 SetAbilityTransitionInfo(abilityInfo_, toInfo);
700 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
701 fromInfo->isRecent_ = true;
702 bool animaEnabled = false;
703 windowHandler->NotifyWindowTransition(fromInfo, toInfo, animaEnabled);
704 }
705
NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest) const706 void AbilityRecord::NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> &callerAbility,
707 const AbilityRequest &abilityRequest) const
708 {
709 auto windowHandler = GetWMSHandler();
710 if (!windowHandler) {
711 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
712 return;
713 }
714
715 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
716 if (callerAbility) {
717 auto callerAbilityInfo = callerAbility->GetAbilityInfo();
718 SetAbilityTransitionInfo(callerAbilityInfo, fromInfo);
719 fromInfo->abilityToken_ = callerAbility->GetToken();
720 } else {
721 fromInfo->abilityToken_ = abilityRequest.callerToken;
722 }
723
724 auto toInfo = CreateAbilityTransitionInfo(abilityRequest);
725 toInfo->abilityToken_ = token_;
726 toInfo->missionId_ = missionId_;
727 SetAbilityTransitionInfo(abilityInfo_, toInfo);
728 bool animaEnabled = false;
729 windowHandler->NotifyWindowTransition(fromInfo, toInfo, animaEnabled);
730 }
731
StartingWindowTask(bool isRecent,bool isCold,const AbilityRequest & abilityRequest,std::shared_ptr<StartOptions> & startOptions)732 void AbilityRecord::StartingWindowTask(bool isRecent, bool isCold, const AbilityRequest &abilityRequest,
733 std::shared_ptr<StartOptions> &startOptions)
734 {
735 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
736 HILOG_DEBUG("%{public}s was called.", __func__);
737 if (isRecent) {
738 auto want = GetWantFromMission();
739 if (isCold) {
740 StartingWindowCold(startOptions, want, abilityRequest);
741 } else {
742 StartingWindowHot(startOptions, want, abilityRequest);
743 }
744 } else {
745 std::shared_ptr<Want> want = nullptr;
746 if (isCold) {
747 StartingWindowCold(startOptions, want, abilityRequest);
748 } else {
749 StartingWindowHot(startOptions, want, abilityRequest);
750 }
751 }
752 }
753
PostCancelStartingWindowHotTask()754 void AbilityRecord::PostCancelStartingWindowHotTask()
755 {
756 if (want_.GetBoolParam(DEBUG_APP, false) ||
757 want_.GetBoolParam(NATIVE_DEBUG, false) ||
758 !want_.GetStringParam(PERF_CMD).empty()) {
759 HILOG_INFO("PostCancelStartingWindowHotTask was called, debug mode, just return.");
760 return;
761 }
762 HILOG_INFO("PostCancelStartingWindowHotTask was called.");
763 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
764 CHECK_POINTER_LOG(handler, "Fail to get TaskHandler.");
765
766 auto windowHandler = GetWMSHandler();
767 CHECK_POINTER_LOG(windowHandler, "PostCancelStartingWindowColdTask, Get WMS handler failed.");
768
769 auto abilityRecord(shared_from_this());
770 auto delayTask = [windowHandler, abilityRecord] {
771 if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow() &&
772 abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
773 HILOG_DEBUG("PostCancelStartingWindowHotTask, call windowHandler CancelStartingWindow.");
774 windowHandler->CancelStartingWindow(abilityRecord->GetToken());
775 abilityRecord->SetStartingWindow(false);
776 }
777 };
778 auto taskName = std::to_string(missionId_) + "_hot";
779 int foregroundTimeout =
780 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * FOREGROUND_TIMEOUT_MULTIPLE;
781 handler->SubmitTask(delayTask, taskName, foregroundTimeout);
782 }
783
PostCancelStartingWindowColdTask()784 void AbilityRecord::PostCancelStartingWindowColdTask()
785 {
786 if (want_.GetBoolParam(DEBUG_APP, false) ||
787 want_.GetBoolParam(NATIVE_DEBUG, false) ||
788 !want_.GetStringParam(PERF_CMD).empty()) {
789 HILOG_INFO("PostCancelStartingWindowColdTask was called, debug mode, just return.");
790 return;
791 }
792 HILOG_DEBUG("PostCancelStartingWindowColdTask was called.");
793 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
794 CHECK_POINTER_LOG(handler, "Fail to get TaskHandler.");
795
796 auto windowHandler = GetWMSHandler();
797 CHECK_POINTER_LOG(windowHandler, "PostCancelStartingWindowColdTask, Get WMS handler failed.");
798
799 auto abilityRecord(shared_from_this());
800 auto delayTask = [windowHandler, abilityRecord] {
801 if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow() &&
802 (abilityRecord->GetScheduler() == nullptr ||
803 abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING)) {
804 HILOG_DEBUG("PostCancelStartingWindowColdTask, call windowHandler CancelStartingWindow.");
805 windowHandler->CancelStartingWindow(abilityRecord->GetToken());
806 abilityRecord->SetStartingWindow(false);
807 }
808 };
809 auto taskName = std::to_string(missionId_) + "_cold";
810 int loadTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE;
811 handler->SubmitTask(delayTask, taskName, loadTimeout);
812 }
813
GetWMSHandler() const814 sptr<IWindowManagerServiceHandler> AbilityRecord::GetWMSHandler() const
815 {
816 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
817 if (!abilityMgr) {
818 HILOG_WARN("%{public}s, Get Ability Manager Service failed.", __func__);
819 return nullptr;
820 }
821 return abilityMgr->GetWMSHandler();
822 }
823
SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> & info,const std::shared_ptr<Want> & want) const824 void AbilityRecord::SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> &info,
825 const std::shared_ptr<Want> &want) const
826 {
827 if (!want) {
828 HILOG_WARN("%{public}s, want is invalid.", __func__);
829 return;
830 }
831 auto mode = want->GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1);
832 auto displayId = want->GetIntParam(Want::PARAM_RESV_DISPLAY_ID, -1);
833 if (mode != -1) {
834 HILOG_INFO("%{public}s: origin window mode is %{public}d.", __func__, mode);
835 info->mode_ = static_cast<uint32_t>(mode);
836 }
837 if (displayId != -1) {
838 info->displayId_ = static_cast<uint64_t>(displayId);
839 }
840 }
841
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const842 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
843 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want) const
844 {
845 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
846 if (startOptions != nullptr) {
847 info->mode_ = static_cast<uint32_t>(startOptions->GetWindowMode());
848 HILOG_INFO("window mode:%{public}d.", info->mode_);
849 info->displayId_ = static_cast<uint64_t>(startOptions->GetDisplayID());
850 } else {
851 SetWindowModeAndDisplayId(info, want);
852 }
853 return info;
854 }
855
CreateAbilityTransitionInfo(const AbilityRequest & abilityRequest) const856 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(const AbilityRequest &abilityRequest) const
857 {
858 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
859 auto abilityStartSetting = abilityRequest.startSetting;
860 if (abilityStartSetting) {
861 auto windowMode = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_MODE_KEY);
862 auto displayId = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
863 try {
864 info->mode_ = static_cast<uint32_t>(std::stoi(windowMode));
865 info->displayId_ = static_cast<uint64_t>(std::stoi(displayId));
866 } catch (...) {
867 HILOG_WARN("windowMode: stoi(%{public}s) failed", windowMode.c_str());
868 HILOG_WARN("displayId: stoi(%{public}s) failed", displayId.c_str());
869 }
870 } else {
871 SetWindowModeAndDisplayId(info, std::make_shared<Want>(abilityRequest.want));
872 }
873 return info;
874 }
875
CreateResourceManager() const876 std::shared_ptr<Global::Resource::ResourceManager> AbilityRecord::CreateResourceManager() const
877 {
878 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
879 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
880 UErrorCode status = U_ZERO_ERROR;
881 icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
882 resConfig->SetLocaleInfo(locale);
883
884 AppExecFwk::Configuration cfg;
885 if (DelayedSingleton<AbilityManagerService>::GetInstance()->GetConfiguration(cfg) == 0) {
886 std::string colormode = cfg.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
887 HILOG_DEBUG("getcolormode is %{public}s.", colormode.c_str());
888 resConfig->SetColorMode(AppExecFwk::ConvertColorMode(colormode));
889 } else {
890 HILOG_WARN("getcolormode failed.");
891 }
892
893 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr(Global::Resource::CreateResourceManager());
894 resourceMgr->UpdateResConfig(*resConfig);
895
896 std::string loadPath;
897 if (!abilityInfo_.hapPath.empty()) {
898 loadPath = abilityInfo_.hapPath;
899 } else {
900 loadPath = abilityInfo_.resourcePath;
901 }
902
903 if (loadPath.empty()) {
904 HILOG_WARN("Invalid app resource.");
905 return nullptr;
906 }
907
908 if (!resourceMgr->AddResource(loadPath.c_str())) {
909 HILOG_WARN("%{public}s AddResource failed.", __func__);
910 return nullptr;
911 }
912 return resourceMgr;
913 }
914
GetPixelMap(const uint32_t windowIconId,std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const915 std::shared_ptr<Media::PixelMap> AbilityRecord::GetPixelMap(const uint32_t windowIconId,
916 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const
917 {
918 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
919 if (resourceMgr == nullptr) {
920 HILOG_WARN("%{public}s resource manager does not exist.", __func__);
921 return nullptr;
922 }
923
924 Media::SourceOptions opts;
925 uint32_t errorCode = 0;
926 std::unique_ptr<Media::ImageSource> imageSource;
927 if (!abilityInfo_.hapPath.empty()) { // hap is not unzip
928 std::unique_ptr<uint8_t[]> iconOut;
929 size_t len;
930 if (resourceMgr->GetMediaDataById(windowIconId, len, iconOut) != Global::Resource::RState::SUCCESS) {
931 return nullptr;
932 }
933 imageSource = Media::ImageSource::CreateImageSource(iconOut.get(), len, opts, errorCode);
934 } else { // already unzip hap
935 std::string iconPath;
936 if (resourceMgr->GetMediaById(windowIconId, iconPath) != Global::Resource::RState::SUCCESS) {
937 return nullptr;
938 }
939 imageSource = Media::ImageSource::CreateImageSource(iconPath, opts, errorCode);
940 }
941
942 if (errorCode != 0 || imageSource == nullptr) {
943 HILOG_ERROR("Failed to create icon id %{private}d err %{public}d", windowIconId, errorCode);
944 return nullptr;
945 }
946
947 Media::DecodeOptions decodeOpts;
948 auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
949 if (errorCode != 0) {
950 HILOG_ERROR("Failed to create PixelMap id %{private}d err %{public}d", windowIconId, errorCode);
951 return nullptr;
952 }
953 HILOG_DEBUG("OUT.");
954 return std::shared_ptr<Media::PixelMap>(pixelMapPtr.release());
955 }
956
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)957 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
958 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want,
959 const AbilityRequest &abilityRequest)
960 {
961 sptr<AbilityTransitionInfo> info;
962 if (startOptions) {
963 info = CreateAbilityTransitionInfo(startOptions, want);
964 } else {
965 info = CreateAbilityTransitionInfo(abilityRequest);
966 }
967
968 SetAbilityTransitionInfo(info);
969 SetStartingWindow(true);
970 return info;
971 }
972
StartingWindowHot(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)973 void AbilityRecord::StartingWindowHot(const std::shared_ptr<StartOptions> &startOptions,
974 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
975 {
976 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
977 HILOG_DEBUG("call");
978 auto windowHandler = GetWMSHandler();
979 if (!windowHandler) {
980 HILOG_WARN("Get WMS handler failed.");
981 return;
982 }
983
984 auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
985 if (!pixelMap) {
986 HILOG_WARN("%{public}s, Get snapshot failed.", __func__);
987 }
988
989 auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
990 windowHandler->StartingWindow(info, pixelMap);
991 }
992
StartingWindowCold(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)993 void AbilityRecord::StartingWindowCold(const std::shared_ptr<StartOptions> &startOptions,
994 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
995 {
996 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
997 HILOG_DEBUG("call");
998 auto windowHandler = GetWMSHandler();
999 if (!windowHandler) {
1000 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
1001 return;
1002 }
1003
1004 // get bg pixelmap and color.
1005 std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
1006 uint32_t bgColor = 0;
1007 GetColdStartingWindowResource(pixelMap, bgColor);
1008
1009 // start window
1010 auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
1011 windowHandler->StartingWindow(info, pixelMap, bgColor);
1012 startingWindowBg_.reset();
1013 }
1014
GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> & bg,uint32_t & bgColor)1015 void AbilityRecord::GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> &bg, uint32_t &bgColor)
1016 {
1017 bg = startingWindowBg_;
1018 bgColor = bgColor_;
1019 if (bg) {
1020 return;
1021 }
1022
1023 auto resourceMgr = CreateResourceManager();
1024 if (!resourceMgr) {
1025 HILOG_WARN("Get resourceMgr failed.");
1026 return;
1027 }
1028
1029 auto windowIconId = static_cast<uint32_t>(abilityInfo_.startWindowIconId);
1030 bg = GetPixelMap(windowIconId, resourceMgr);
1031
1032 auto colorId = static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId);
1033 auto colorErrval = resourceMgr->GetColorById(colorId, bgColor);
1034 if (colorErrval != OHOS::Global::Resource::RState::SUCCESS) {
1035 HILOG_WARN("Failed to GetColorById.");
1036 bgColor = 0xdfffffff;
1037 }
1038 HILOG_DEBUG("colorId is %{public}u, bgColor is %{public}u.", colorId, bgColor);
1039 }
1040
InitColdStartingWindowResource(const std::shared_ptr<Global::Resource::ResourceManager> & resourceMgr)1041 void AbilityRecord::InitColdStartingWindowResource(
1042 const std::shared_ptr<Global::Resource::ResourceManager> &resourceMgr)
1043 {
1044 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1045 if (!resourceMgr) {
1046 HILOG_ERROR("invalid resourceManager.");
1047 return;
1048 }
1049
1050 startingWindowBg_ = GetPixelMap(static_cast<uint32_t>(abilityInfo_.startWindowIconId), resourceMgr);
1051 if (resourceMgr->GetColorById(static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId), bgColor_) !=
1052 OHOS::Global::Resource::RState::SUCCESS) {
1053 HILOG_WARN("Failed to GetColorById.");
1054 bgColor_ = 0xdfffffff;
1055 }
1056
1057 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1058 if (startingWindowBg_ && handler) {
1059 auto delayTask = [me = weak_from_this()] {
1060 auto self = me.lock();
1061 if (!self || !self->startingWindowBg_) {
1062 return;
1063 }
1064 self->startingWindowBg_.reset();
1065 };
1066 handler->SubmitTask(delayTask, "release_bg", RELEASE_STARTING_BG_TIMEOUT);
1067 }
1068 }
1069
SetCompleteFirstFrameDrawing(const bool flag)1070 void AbilityRecord::SetCompleteFirstFrameDrawing(const bool flag)
1071 {
1072 isCompleteFirstFrameDrawing_ = flag;
1073 }
1074
IsCompleteFirstFrameDrawing() const1075 bool AbilityRecord::IsCompleteFirstFrameDrawing() const
1076 {
1077 return isCompleteFirstFrameDrawing_;
1078 }
1079 #endif
1080
BackgroundAbility(const Closure & task)1081 void AbilityRecord::BackgroundAbility(const Closure &task)
1082 {
1083 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1084 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1085 if (lifecycleDeal_ == nullptr) {
1086 HILOG_ERROR("Move the ability to background fail, lifecycleDeal_ is null.");
1087 return;
1088 }
1089 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1090 if (handler && task) {
1091 if (!want_.GetBoolParam(DEBUG_APP, false) &&
1092 !want_.GetBoolParam(NATIVE_DEBUG, false) &&
1093 want_.GetStringParam(PERF_CMD).empty()) {
1094 int backgroundTimeout =
1095 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * BACKGROUND_TIMEOUT_MULTIPLE;
1096 handler->SubmitTask(task, "background_" + std::to_string(recordId_), backgroundTimeout, false);
1097 } else {
1098 HILOG_INFO("Is debug mode, no need to handle time out.");
1099 }
1100 }
1101
1102 if (!IsTerminating() || IsRestarting()) {
1103 // schedule save ability state before moving to background.
1104 SaveAbilityState();
1105 }
1106
1107 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1108 // earlier than above actions.
1109 SetAbilityStateInner(AbilityState::BACKGROUNDING);
1110 lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_, sessionInfo_);
1111 }
1112
PrepareTerminateAbility()1113 bool AbilityRecord::PrepareTerminateAbility()
1114 {
1115 HILOG_DEBUG("call");
1116 if (lifecycleDeal_ == nullptr) {
1117 HILOG_ERROR("lifecycleDeal_ is nullptr.");
1118 return false;
1119 }
1120 return lifecycleDeal_->PrepareTerminateAbility();
1121 }
1122
TerminateAbility()1123 int AbilityRecord::TerminateAbility()
1124 {
1125 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1126 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1127 HandleDlpClosed();
1128 AAFwk::EventInfo eventInfo;
1129 eventInfo.bundleName = GetAbilityInfo().bundleName;
1130 eventInfo.abilityName = GetAbilityInfo().name;
1131 AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
1132 eventInfo.errCode = DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_, clearMissionFlag_);
1133 if (eventInfo.errCode != ERR_OK) {
1134 AAFwk::EventReport::SendAbilityEvent(
1135 AAFwk::EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1136 }
1137 return eventInfo.errCode;
1138 }
1139
GetAbilityInfo() const1140 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
1141 {
1142 return abilityInfo_;
1143 }
1144
GetApplicationInfo() const1145 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
1146 {
1147 return applicationInfo_;
1148 }
1149
GetAbilityState() const1150 AbilityState AbilityRecord::GetAbilityState() const
1151 {
1152 return currentState_;
1153 }
1154
IsForeground() const1155 bool AbilityRecord::IsForeground() const
1156 {
1157 return currentState_ == AbilityState::FOREGROUND || currentState_ == AbilityState::FOREGROUNDING;
1158 }
1159
SetAbilityStateInner(AbilityState state)1160 void AbilityRecord::SetAbilityStateInner(AbilityState state)
1161 {
1162 currentState_ = state;
1163 if (currentState_ == AbilityState::BACKGROUND) {
1164 isAbilityForegrounding_ = false;
1165 }
1166
1167 auto collaborator = DelayedSingleton<AbilityManagerService>::GetInstance()->GetCollaborator(
1168 collaboratorType_);
1169 if (collaborator != nullptr) {
1170 HILOG_INFO("start notify collaborator, missionId:%{public}d, state:%{public}d", missionId_,
1171 static_cast<int32_t>(state));
1172 int ret = ERR_OK;
1173 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1174 if (sessionInfo_ == nullptr) {
1175 HILOG_ERROR("sessionInfo_ is nullptr");
1176 return;
1177 }
1178 int32_t persistentId = sessionInfo_->persistentId;
1179 switch (state) {
1180 case AbilityState::BACKGROUNDING: {
1181 ret = collaborator->NotifyMoveMissionToBackground(persistentId);
1182 break;
1183 }
1184 case AbilityState::TERMINATING: {
1185 ret = collaborator->NotifyTerminateMission(persistentId);
1186 break;
1187 }
1188 default:
1189 break;
1190 }
1191 if (ret != ERR_OK) {
1192 HILOG_ERROR("notify broker move mission to background failed, err: %{public}d", ret);
1193 }
1194 return;
1195 }
1196 switch (state) {
1197 case AbilityState::FOREGROUNDING: {
1198 ret = collaborator->NotifyMoveMissionToForeground(missionId_);
1199 break;
1200 }
1201 case AbilityState::BACKGROUNDING: {
1202 ret = collaborator->NotifyMoveMissionToBackground(missionId_);
1203 break;
1204 }
1205 case AbilityState::TERMINATING: {
1206 ret = collaborator->NotifyTerminateMission(missionId_);
1207 break;
1208 }
1209 default:
1210 break;
1211 }
1212 if (ret != ERR_OK) {
1213 HILOG_ERROR("notify broker move mission to background failed, err: %{public}d", ret);
1214 }
1215 }
1216
1217 DelayedSingleton<MissionInfoMgr>::GetInstance()->SetMissionAbilityState(missionId_, currentState_);
1218 }
1219
GetAbilityForegroundingFlag() const1220 bool AbilityRecord::GetAbilityForegroundingFlag() const
1221 {
1222 return isAbilityForegrounding_;
1223 }
1224
SetAbilityForegroundingFlag()1225 void AbilityRecord::SetAbilityForegroundingFlag()
1226 {
1227 isAbilityForegrounding_ = true;
1228 DelayedSingleton<AppScheduler>::GetInstance()->SetAbilityForegroundingFlagToAppRecord(pid_);
1229 }
1230
SetAbilityState(AbilityState state)1231 void AbilityRecord::SetAbilityState(AbilityState state)
1232 {
1233 SetAbilityStateInner(state);
1234 if (state == AbilityState::FOREGROUND || state == AbilityState::ACTIVE || state == AbilityState::BACKGROUND) {
1235 SetRestarting(false);
1236 }
1237 }
1238
SetScheduler(const sptr<IAbilityScheduler> & scheduler)1239 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
1240 {
1241 HILOG_INFO("bundle:%{public}s, ability: %{public}s", applicationInfo_.bundleName.c_str(),
1242 abilityInfo_.name.c_str());
1243 CHECK_POINTER(lifecycleDeal_);
1244 if (scheduler != nullptr) {
1245 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1246 auto schedulerObject = scheduler_->AsObject();
1247 if (schedulerObject != nullptr) {
1248 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1249 }
1250 }
1251 if (schedulerDeathRecipient_ == nullptr) {
1252 std::weak_ptr<AbilityRecord> thisWeakPtr(shared_from_this());
1253 schedulerDeathRecipient_ =
1254 new AbilitySchedulerRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1255 auto abilityRecord = thisWeakPtr.lock();
1256 if (abilityRecord) {
1257 abilityRecord->OnSchedulerDied(remote);
1258 }
1259 });
1260 }
1261 isReady_ = true;
1262 scheduler_ = scheduler;
1263 lifecycleDeal_->SetScheduler(scheduler);
1264 auto schedulerObject = scheduler_->AsObject();
1265 if (schedulerObject == nullptr || !schedulerObject->AddDeathRecipient(schedulerDeathRecipient_)) {
1266 HILOG_ERROR("AddDeathRecipient failed.");
1267 }
1268 pid_ = static_cast<int32_t>(IPCSkeleton::GetCallingPid()); // set pid when ability attach to service.
1269 HandleDlpAttached();
1270 } else {
1271 HILOG_ERROR("scheduler is nullptr");
1272 isReady_ = false;
1273 isWindowAttached_ = false;
1274 SetIsNewWant(false);
1275 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1276 auto schedulerObject = scheduler_->AsObject();
1277 if (schedulerObject != nullptr) {
1278 HILOG_INFO("RemoveDeathRecipient");
1279 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1280 }
1281 }
1282 scheduler_ = scheduler;
1283 pid_ = 0;
1284 }
1285 }
1286
GetToken() const1287 sptr<Token> AbilityRecord::GetToken() const
1288 {
1289 return token_;
1290 }
1291
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1292 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1293 {
1294 preAbilityRecord_ = abilityRecord;
1295 }
1296
GetPreAbilityRecord() const1297 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
1298 {
1299 return preAbilityRecord_.lock();
1300 }
1301
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1302 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1303 {
1304 nextAbilityRecord_ = abilityRecord;
1305 }
1306
GetNextAbilityRecord() const1307 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
1308 {
1309 return nextAbilityRecord_.lock();
1310 }
1311
IsReady() const1312 bool AbilityRecord::IsReady() const
1313 {
1314 return isReady_;
1315 }
1316
1317 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const1318 bool AbilityRecord::IsWindowAttached() const
1319 {
1320 return isWindowAttached_;
1321 }
1322 #endif
1323
IsLauncherAbility() const1324 bool AbilityRecord::IsLauncherAbility() const
1325 {
1326 return isLauncherAbility_;
1327 }
1328
IsTerminating() const1329 bool AbilityRecord::IsTerminating() const
1330 {
1331 return isTerminating_;
1332 }
1333
SetTerminatingState()1334 void AbilityRecord::SetTerminatingState()
1335 {
1336 isTerminating_ = true;
1337 }
1338
IsNewWant() const1339 bool AbilityRecord::IsNewWant() const
1340 {
1341 return lifeCycleStateInfo_.isNewWant;
1342 }
1343
SetIsNewWant(bool isNewWant)1344 void AbilityRecord::SetIsNewWant(bool isNewWant)
1345 {
1346 lifeCycleStateInfo_.isNewWant = isNewWant;
1347 }
1348
IsCreateByConnect() const1349 bool AbilityRecord::IsCreateByConnect() const
1350 {
1351 return isCreateByConnect_;
1352 }
1353
SetCreateByConnectMode()1354 void AbilityRecord::SetCreateByConnectMode()
1355 {
1356 isCreateByConnect_ = true;
1357 }
1358
Activate()1359 void AbilityRecord::Activate()
1360 {
1361 HILOG_INFO("Activate.");
1362 CHECK_POINTER(lifecycleDeal_);
1363
1364 int activeTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * ACTIVE_TIMEOUT_MULTIPLE;
1365 SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, activeTimeout);
1366
1367 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1368 // earlier than above actions.
1369 SetAbilityStateInner(AbilityState::ACTIVATING);
1370 lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
1371
1372 // update ability state to appMgr service when restart
1373 if (IsNewWant()) {
1374 sptr<Token> preToken = nullptr;
1375 if (GetPreAbilityRecord()) {
1376 preToken = GetPreAbilityRecord()->GetToken();
1377 }
1378 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1379 }
1380 }
1381
Inactivate()1382 void AbilityRecord::Inactivate()
1383 {
1384 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1385 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1386 CHECK_POINTER(lifecycleDeal_);
1387
1388 int inactiveTimeout =
1389 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * INACTIVE_TIMEOUT_MULTIPLE;
1390 SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, inactiveTimeout);
1391
1392 // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
1393 // earlier than above actions.
1394 SetAbilityStateInner(AbilityState::INACTIVATING);
1395 lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_, sessionInfo_);
1396 }
1397
Terminate(const Closure & task)1398 void AbilityRecord::Terminate(const Closure &task)
1399 {
1400 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1401 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1402 CHECK_POINTER(lifecycleDeal_);
1403 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1404 if (handler && task) {
1405 if (!want_.GetBoolParam(DEBUG_APP, false) &&
1406 !want_.GetBoolParam(NATIVE_DEBUG, false) &&
1407 want_.GetStringParam(PERF_CMD).empty()) {
1408 int terminateTimeout =
1409 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * TERMINATE_TIMEOUT_MULTIPLE;
1410 handler->SubmitTask(task, "terminate_" + std::to_string(recordId_), terminateTimeout);
1411 } else if (applicationInfo_.asanEnabled) {
1412 int terminateTimeout =
1413 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * TERMINATE_TIMEOUT_ASANENABLED;
1414 handler->SubmitTask(task, "terminate_" + std::to_string(recordId_), terminateTimeout);
1415 } else {
1416 HILOG_INFO("Is debug mode, no need to handle time out.");
1417 }
1418 }
1419 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1420 // earlier than above actions.
1421 SetAbilityStateInner(AbilityState::TERMINATING);
1422 lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
1423 }
1424
ShareData(const int32_t & uniqueId)1425 void AbilityRecord::ShareData(const int32_t &uniqueId)
1426 {
1427 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1428 CHECK_POINTER(lifecycleDeal_);
1429 int loadTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * SHAREDATA_TIMEOUT_MULTIPLE;
1430 HILOG_DEBUG("loadTimeOut %{public}d.", loadTimeout);
1431 SendEvent(AbilityManagerService::SHAREDATA_TIMEOUT_MSG, loadTimeout, uniqueId);
1432 lifecycleDeal_->ShareData(uniqueId);
1433 }
1434
ConnectAbility()1435 void AbilityRecord::ConnectAbility()
1436 {
1437 HILOG_INFO("Connect ability.");
1438 CHECK_POINTER(lifecycleDeal_);
1439 lifecycleDeal_->ConnectAbility(want_);
1440 }
1441
DisconnectAbility()1442 void AbilityRecord::DisconnectAbility()
1443 {
1444 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1445 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1446 CHECK_POINTER(lifecycleDeal_);
1447 lifecycleDeal_->DisconnectAbility(want_);
1448 }
1449
CommandAbility()1450 void AbilityRecord::CommandAbility()
1451 {
1452 HILOG_INFO("startId_:%{public}d.", startId_);
1453 CHECK_POINTER(lifecycleDeal_);
1454 lifecycleDeal_->CommandAbility(want_, false, startId_);
1455 }
1456
CommandAbilityWindow(const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd)1457 void AbilityRecord::CommandAbilityWindow(const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1458 {
1459 CHECK_POINTER(lifecycleDeal_);
1460 lifecycleDeal_->CommandAbilityWindow(want_, sessionInfo, winCmd);
1461 }
1462
SaveAbilityState()1463 void AbilityRecord::SaveAbilityState()
1464 {
1465 HILOG_INFO("call");
1466 CHECK_POINTER(lifecycleDeal_);
1467 lifecycleDeal_->SaveAbilityState();
1468 }
1469
SaveAbilityState(const PacMap & inState)1470 void AbilityRecord::SaveAbilityState(const PacMap &inState)
1471 {
1472 HILOG_INFO("call");
1473 stateDatas_ = inState;
1474 }
1475
RestoreAbilityState()1476 void AbilityRecord::RestoreAbilityState()
1477 {
1478 HILOG_INFO("call");
1479 CHECK_POINTER(lifecycleDeal_);
1480 lifecycleDeal_->RestoreAbilityState(stateDatas_);
1481 stateDatas_.Clear();
1482 isRestarting_ = false;
1483 }
1484
SetWant(const Want & want)1485 void AbilityRecord::SetWant(const Want &want)
1486 {
1487 std::lock_guard<ffrt::mutex> guard(lock_);
1488 want_ = want;
1489 }
1490
GetWant() const1491 const Want &AbilityRecord::GetWant() const
1492 {
1493 return want_;
1494 }
1495
GetRequestCode() const1496 int AbilityRecord::GetRequestCode() const
1497 {
1498 return requestCode_;
1499 }
1500
SetResult(const std::shared_ptr<AbilityResult> & result)1501 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
1502 {
1503 result_ = result;
1504 }
1505
GetResult() const1506 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
1507 {
1508 return result_;
1509 }
1510
SendResult(bool isSandboxApp,uint32_t tokeId)1511 void AbilityRecord::SendResult(bool isSandboxApp, uint32_t tokeId)
1512 {
1513 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1514 std::lock_guard<ffrt::mutex> guard(lock_);
1515 CHECK_POINTER(scheduler_);
1516 CHECK_POINTER(result_);
1517 GrantUriPermission(result_->resultWant_, applicationInfo_.bundleName, isSandboxApp, tokeId);
1518 scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
1519 // reset result to avoid send result next time
1520 result_.reset();
1521 }
1522
SendSandboxSavefileResult(const Want & want,int resultCode,int requestCode)1523 void AbilityRecord::SendSandboxSavefileResult(const Want &want, int resultCode, int requestCode)
1524 {
1525 HILOG_INFO("ability:%{public}s.", abilityInfo_.name.c_str());
1526
1527 auto uriParam = want.GetParams().GetParam(PARAMS_FILE_SAVING_URL_KEY);
1528 auto uriArray = AAFwk::IArray::Query(uriParam);
1529 long arraySize = 0;
1530 if (uriArray && uriArray->GetLength(arraySize) == ERR_OK &&
1531 arraySize > 0 && AAFwk::Array::IsStringArray(uriArray)) {
1532 for (long i = 0; i < arraySize; i++) {
1533 sptr<AAFwk::IInterface> iface = nullptr;
1534 if (uriArray->Get(i, iface) != ERR_OK) {
1535 continue;
1536 }
1537 AAFwk::IString* iuri = AAFwk::IString::Query(iface);
1538 if (!iuri) {
1539 continue;
1540 }
1541 std::string uriStr;
1542 if (iuri->GetString(uriStr) != ERR_OK) {
1543 continue;
1544 }
1545 Uri uri(uriStr);
1546 auto ret = IN_PROCESS_CALL(UriPermissionManagerClient::GetInstance().GrantUriPermission(uri,
1547 Want::FLAG_AUTH_WRITE_URI_PERMISSION, abilityInfo_.bundleName, 0, appIndex_));
1548 if (ret != ERR_OK) {
1549 HILOG_WARN("GrantUriPermission failed");
1550 }
1551 }
1552 } else {
1553 HILOG_WARN("Uri illigal for request: %{public}d.", requestCode);
1554 }
1555
1556 auto scheduler = scheduler_;
1557 if (scheduler) {
1558 scheduler->SendResult(requestCode, resultCode, want);
1559 }
1560 }
1561
SendResultToCallers(bool schedulerdied)1562 void AbilityRecord::SendResultToCallers(bool schedulerdied)
1563 {
1564 for (auto caller : GetCallerRecordList()) {
1565 if (caller == nullptr) {
1566 HILOG_WARN("Caller record is nullptr.");
1567 continue;
1568 }
1569 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1570 if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
1571 bool isSandboxApp = appIndex_ > 0 ? true : false;
1572 callerAbilityRecord->SendResult(isSandboxApp, applicationInfo_.accessTokenId);
1573 } else {
1574 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1575 if (callerSystemAbilityRecord != nullptr) {
1576 HILOG_INFO("Send result to system ability.");
1577 callerSystemAbilityRecord->SendResultToSystemAbility(caller->GetRequestCode(),
1578 callerSystemAbilityRecord, abilityInfo_.applicationInfo.uid,
1579 abilityInfo_.applicationInfo.accessTokenId, schedulerdied);
1580 }
1581 }
1582 }
1583 }
1584
SaveResultToCallers(const int resultCode,const Want * resultWant)1585 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
1586 {
1587 auto callerRecordList = GetCallerRecordList();
1588 if (callerRecordList.empty()) {
1589 HILOG_WARN("callerRecordList is empty.");
1590 return;
1591 }
1592 auto latestCaller = callerRecordList.back();
1593 for (auto caller : callerRecordList) {
1594 if (caller == nullptr) {
1595 HILOG_WARN("Caller record is nullptr.");
1596 continue;
1597 }
1598 if (caller == latestCaller) {
1599 HILOG_INFO("Caller record is the latest.");
1600 SaveResult(resultCode, resultWant, caller);
1601 continue;
1602 }
1603 SaveResult(SEND_RESULT_CANCELED, resultWant, caller);
1604 }
1605 }
1606
SaveResult(int resultCode,const Want * resultWant,std::shared_ptr<CallerRecord> caller)1607 void AbilityRecord::SaveResult(int resultCode, const Want *resultWant, std::shared_ptr<CallerRecord> caller)
1608 {
1609 std::lock_guard<ffrt::mutex> guard(lock_);
1610 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1611 if (callerAbilityRecord != nullptr) {
1612 callerAbilityRecord->SetResult(
1613 std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
1614 } else {
1615 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1616 if (callerSystemAbilityRecord != nullptr) {
1617 HILOG_INFO("Caller is system ability.");
1618 Want* newWant = const_cast<Want*>(resultWant);
1619 callerSystemAbilityRecord->SetResultToSystemAbility(callerSystemAbilityRecord, *newWant,
1620 resultCode);
1621 }
1622 }
1623 }
1624
SetResultToSystemAbility(std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,Want & resultWant,int resultCode)1625 void SystemAbilityCallerRecord::SetResultToSystemAbility(
1626 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,
1627 Want &resultWant, int resultCode)
1628 {
1629 std::vector<std::string> data;
1630 std::string srcAbilityId = callerSystemAbilityRecord->GetSrcAbilityId();
1631 SplitStr(srcAbilityId, "_", data);
1632 if (data.size() != VECTOR_SIZE) {
1633 HILOG_ERROR("Check data size failed");
1634 return;
1635 }
1636 std::string srcDeviceId = data[0];
1637 HILOG_DEBUG("Get srcDeviceId = %{public}s", srcDeviceId.c_str());
1638 int missionId = atoi(data[1].c_str());
1639 HILOG_INFO("Get missionId = %{public}d", missionId);
1640 resultWant.SetParam(DMS_SRC_NETWORK_ID, srcDeviceId);
1641 resultWant.SetParam(DMS_MISSION_ID, missionId);
1642 callerSystemAbilityRecord->SetResult(resultWant, resultCode);
1643 }
1644
SendResultToSystemAbility(int requestCode,const std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,int32_t callerUid,uint32_t accessToken,bool schedulerdied)1645 void SystemAbilityCallerRecord::SendResultToSystemAbility(int requestCode,
1646 const std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,
1647 int32_t callerUid, uint32_t accessToken, bool schedulerdied)
1648 {
1649 HILOG_INFO("call");
1650 if (callerSystemAbilityRecord == nullptr) {
1651 HILOG_ERROR("callerSystemAbilityRecord is nullptr");
1652 return;
1653 }
1654 int resultCode = callerSystemAbilityRecord->GetResultCode();
1655 Want resultWant = callerSystemAbilityRecord->GetResultWant();
1656 sptr<IRemoteObject> callerToken = callerSystemAbilityRecord->GetCallerToken();
1657 if (!schedulerdied) {
1658 callerUid = IPCSkeleton::GetCallingUid();
1659 accessToken = IPCSkeleton::GetCallingTokenID();
1660 }
1661 HILOG_INFO("Try to SendResult, callerUid = %{public}d, AccessTokenId = %{public}u",
1662 callerUid, accessToken);
1663 if (callerToken == nullptr) {
1664 HILOG_ERROR("CallerToken is nullptr");
1665 return;
1666 }
1667 MessageParcel data;
1668 if (!data.WriteInterfaceToken(SYSTEM_ABILITY_TOKEN_CALLBACK)) {
1669 HILOG_ERROR("SendResultToSystemAbility Write interface token failed.");
1670 return;
1671 }
1672 if (!data.WriteParcelable(&resultWant)) {
1673 HILOG_ERROR("fail to WriteParcelable");
1674 return;
1675 }
1676 data.WriteInt32(callerUid);
1677 data.WriteInt32(requestCode);
1678 data.WriteUint32(accessToken);
1679 data.WriteInt32(resultCode);
1680 MessageParcel reply;
1681 MessageOption option(MessageOption::TF_SYNC);
1682 int result = callerToken->SendRequest(ISystemAbilityTokenCallback::SEND_RESULT, data, reply, option);
1683 if (result != ERR_OK) {
1684 HILOG_ERROR("SendResultToSystemAbility error = %{public}d", result);
1685 }
1686 }
1687
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)1688 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
1689 {
1690 CHECK_POINTER(connRecord);
1691 auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
1692 // found it
1693 if (it != connRecordList_.end()) {
1694 HILOG_DEBUG("Found it in list, so no need to add same connection");
1695 return;
1696 }
1697 // no found then add new connection to list
1698 HILOG_DEBUG("No found in list, so add new connection to list");
1699 connRecordList_.push_back(connRecord);
1700 }
1701
GetConnectRecordList() const1702 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
1703 {
1704 return connRecordList_;
1705 }
1706
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)1707 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
1708 {
1709 CHECK_POINTER(connRecord);
1710 connRecordList_.remove(connRecord);
1711 }
1712
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1713 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, std::string srcAbilityId)
1714 {
1715 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1716 HILOG_DEBUG("Add caller record.");
1717 if (!srcAbilityId.empty() && IsSystemAbilityCall(callerToken)) {
1718 AddSystemAbilityCallerRecord(callerToken, requestCode, srcAbilityId);
1719 return;
1720 }
1721 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1722 CHECK_POINTER(abilityRecord);
1723
1724 auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
1725 return (callerRecord->GetCaller() == abilityRecord);
1726 };
1727
1728 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1729 if (record != callerList_.end()) {
1730 callerList_.erase(record);
1731 }
1732
1733 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
1734
1735 lifeCycleStateInfo_.caller.requestCode = requestCode;
1736 lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
1737 lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1738 lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
1739 HILOG_INFO("caller %{public}s, %{public}s",
1740 abilityRecord->GetAbilityInfo().bundleName.c_str(),
1741 abilityRecord->GetAbilityInfo().name.c_str());
1742 }
1743
IsSystemAbilityCall(const sptr<IRemoteObject> & callerToken)1744 bool AbilityRecord::IsSystemAbilityCall(const sptr<IRemoteObject> &callerToken)
1745 {
1746 if (callerToken == nullptr) {
1747 return false;
1748 }
1749 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1750 if (abilityRecord != nullptr) {
1751 return false;
1752 }
1753 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
1754 bool isNativeCall = tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE;
1755 if (!isNativeCall) {
1756 HILOG_INFO("Is not native call.");
1757 return false;
1758 }
1759 AccessToken::NativeTokenInfo nativeTokenInfo;
1760 int32_t result = AccessToken::AccessTokenKit::GetNativeTokenInfo(IPCSkeleton::GetCallingTokenID(),
1761 nativeTokenInfo);
1762 if (result == ERR_OK && nativeTokenInfo.processName == DMS_PROCESS_NAME) {
1763 HILOG_INFO("Is system ability call.");
1764 return true;
1765 }
1766 return false;
1767 }
1768
AddSystemAbilityCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1769 void AbilityRecord::AddSystemAbilityCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode,
1770 std::string srcAbilityId)
1771 {
1772 HILOG_INFO("Add system ability caller record.");
1773 std::shared_ptr<SystemAbilityCallerRecord> systemAbilityRecord =
1774 std::make_shared<SystemAbilityCallerRecord>(srcAbilityId, callerToken);
1775 auto isExist = [&srcAbilityId](const std::shared_ptr<CallerRecord> &callerRecord) {
1776 std::shared_ptr<SystemAbilityCallerRecord> saCaller = callerRecord->GetSaCaller();
1777 return (saCaller != nullptr && saCaller->GetSrcAbilityId() == srcAbilityId);
1778 };
1779 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1780 if (record != callerList_.end()) {
1781 HILOG_INFO("Find same system ability caller record.");
1782 callerList_.erase(record);
1783 }
1784 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, systemAbilityRecord));
1785 HILOG_INFO("Add system ability record end.");
1786 }
1787
GetCallerRecordList() const1788 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
1789 {
1790 return callerList_;
1791 }
1792
GetCallerRecord() const1793 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
1794 {
1795 if (callerList_.empty()) {
1796 return nullptr;
1797 }
1798 return callerList_.back()->GetCaller();
1799 }
1800
IsConnectListEmpty()1801 bool AbilityRecord::IsConnectListEmpty()
1802 {
1803 return connRecordList_.empty();
1804 }
1805
GetConnectingRecord() const1806 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
1807 {
1808 auto connect =
1809 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1810 return record->GetConnectState() == ConnectionState::CONNECTING;
1811 });
1812 return (connect != connRecordList_.end()) ? *connect : nullptr;
1813 }
1814
GetConnectingRecordList()1815 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
1816 {
1817 std::list<std::shared_ptr<ConnectionRecord>> connectingList;
1818 for (auto record : connRecordList_) {
1819 if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
1820 connectingList.push_back(record);
1821 }
1822 }
1823 return connectingList;
1824 }
1825
GetDisconnectingRecord() const1826 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
1827 {
1828 auto connect =
1829 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1830 return record->GetConnectState() == ConnectionState::DISCONNECTING;
1831 });
1832 return (connect != connRecordList_.end()) ? *connect : nullptr;
1833 }
1834
GetAbilityTypeString(std::string & typeStr)1835 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
1836 {
1837 AppExecFwk::AbilityType type = GetAbilityInfo().type;
1838 switch (type) {
1839 #ifdef SUPPORT_GRAPHICS
1840 case AppExecFwk::AbilityType::PAGE: {
1841 typeStr = "PAGE";
1842 break;
1843 }
1844 #endif
1845 case AppExecFwk::AbilityType::SERVICE: {
1846 typeStr = "SERVICE";
1847 break;
1848 }
1849 // for config.json type
1850 case AppExecFwk::AbilityType::DATA: {
1851 typeStr = "DATA";
1852 break;
1853 }
1854 default: {
1855 typeStr = "UNKNOWN";
1856 break;
1857 }
1858 }
1859 }
1860
ConvertAbilityState(const AbilityState & state)1861 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
1862 {
1863 auto it = stateToStrMap.find(state);
1864 if (it != stateToStrMap.end()) {
1865 return it->second;
1866 }
1867 return "INVALIDSTATE";
1868 }
1869
ConvertAppState(const AppState & state)1870 std::string AbilityRecord::ConvertAppState(const AppState &state)
1871 {
1872 auto it = appStateToStrMap_.find(state);
1873 if (it != appStateToStrMap_.end()) {
1874 return it->second;
1875 }
1876 return "INVALIDSTATE";
1877 }
1878
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)1879 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
1880 {
1881 auto it = convertStateMap.find(state);
1882 if (it != convertStateMap.end()) {
1883 return it->second;
1884 }
1885 return DEFAULT_INVAL_VALUE;
1886 }
1887
Dump(std::vector<std::string> & info)1888 void AbilityRecord::Dump(std::vector<std::string> &info)
1889 {
1890 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1891 info.push_back(dumpInfo);
1892 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1893 info.push_back(dumpInfo);
1894 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1895 info.push_back(dumpInfo);
1896 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1897 info.push_back(dumpInfo);
1898 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1899 dumpInfo = " isKeepAlive: " + isKeepAlive;
1900 info.push_back(dumpInfo);
1901 // get ability type(unknown/page/service/provider)
1902 std::string typeStr;
1903 GetAbilityTypeString(typeStr);
1904 dumpInfo = " ability type [" + typeStr + "]";
1905 info.push_back(dumpInfo);
1906 std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1907 if (preAbility == nullptr) {
1908 dumpInfo = " previous ability app name [NULL]";
1909 dumpInfo.append("\n");
1910 dumpInfo += " previous ability file name [NULL]";
1911 } else {
1912 dumpInfo =
1913 " previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]";
1914 dumpInfo.append("\n");
1915 dumpInfo += " previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1916 }
1917 info.push_back(dumpInfo);
1918 std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1919 if (nextAbility == nullptr) {
1920 dumpInfo = " next ability app name [NULL]";
1921 dumpInfo.append("\n");
1922 dumpInfo += " next ability file name [NULL]";
1923 } else {
1924 dumpInfo =
1925 " next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]";
1926 dumpInfo.append("\n");
1927 dumpInfo += " next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1928 }
1929 info.push_back(dumpInfo);
1930 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1931 std::to_string(startTime_) + "]";
1932 info.push_back(dumpInfo);
1933 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1934 info.push_back(dumpInfo);
1935 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1936 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1937 info.push_back(dumpInfo);
1938
1939 if (isLauncherRoot_) {
1940 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1941 info.push_back(dumpInfo);
1942 }
1943 }
1944
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)1945 void AbilityRecord::DumpAbilityState(
1946 std::vector<std::string> &info, bool isClient, const std::vector<std::string> ¶ms)
1947 {
1948 HILOG_INFO("begin");
1949 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1950 info.push_back(dumpInfo);
1951 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1952 info.push_back(dumpInfo);
1953 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1954 info.push_back(dumpInfo);
1955 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1956 info.push_back(dumpInfo);
1957 std::string typeStr;
1958 GetAbilityTypeString(typeStr);
1959 dumpInfo = " ability type [" + typeStr + "]";
1960 info.push_back(dumpInfo);
1961
1962 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1963 std::to_string(startTime_) + "]";
1964 info.push_back(dumpInfo);
1965 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1966 info.push_back(dumpInfo);
1967 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1968 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1969 info.push_back(dumpInfo);
1970 dumpInfo = " callee connections: ";
1971 info.push_back(dumpInfo);
1972 if (callContainer_) {
1973 callContainer_->Dump(info);
1974 }
1975
1976 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1977 dumpInfo = " isKeepAlive: " + isKeepAlive;
1978 info.push_back(dumpInfo);
1979 if (isLauncherRoot_) {
1980 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1981 info.push_back(dumpInfo);
1982 }
1983
1984 auto mission = GetMission();
1985 if (mission) {
1986 std::string missionAffinity = mission->GetMissionAffinity();
1987 dumpInfo = " missionAffinity: " + missionAffinity;
1988 info.push_back(dumpInfo);
1989 }
1990
1991 // add dump client info
1992 DumpClientInfo(info, params, isClient, params.empty());
1993 }
1994
SetStartTime()1995 void AbilityRecord::SetStartTime()
1996 {
1997 if (startTime_ == 0) {
1998 startTime_ = AbilityUtil::SystemTimeMillis();
1999 }
2000 }
2001
GetStartTime() const2002 int64_t AbilityRecord::GetStartTime() const
2003 {
2004 return startTime_;
2005 }
2006
DumpService(std::vector<std::string> & info,bool isClient) const2007 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
2008 {
2009 std::vector<std::string> params;
2010 DumpService(info, params, isClient);
2011 }
2012
DumpService(std::vector<std::string> & info,std::vector<std::string> & params,bool isClient) const2013 void AbilityRecord::DumpService(std::vector<std::string> &info, std::vector<std::string> ¶ms, bool isClient) const
2014 {
2015 info.emplace_back(" AbilityRecord ID #" + std::to_string(GetRecordId()) + " state #" +
2016 AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
2017 std::to_string(GetStartTime()) + "]");
2018 info.emplace_back(" main name [" + GetAbilityInfo().name + "]");
2019 info.emplace_back(" bundle name [" + GetAbilityInfo().bundleName + "]");
2020 info.emplace_back(" ability type [SERVICE]");
2021 info.emplace_back(" app state #" + AbilityRecord::ConvertAppState(appState_));
2022
2023 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
2024 info.emplace_back(" isKeepAlive: " + isKeepAlive);
2025 if (isLauncherRoot_) {
2026 info.emplace_back(" can restart num #" + std::to_string(restartCount_));
2027 }
2028
2029 info.emplace_back(" Connections: " + std::to_string(connRecordList_.size()));
2030 for (auto &&conn : connRecordList_) {
2031 if (conn) {
2032 conn->Dump(info);
2033 }
2034 }
2035 // add dump client info
2036 DumpClientInfo(info, params, isClient);
2037 }
2038
RemoveAbilityDeathRecipient() const2039 void AbilityRecord::RemoveAbilityDeathRecipient() const
2040 {
2041 if (scheduler_ == nullptr) {
2042 HILOG_WARN("scheduler_ is invalid.");
2043 return;
2044 }
2045
2046 if (schedulerDeathRecipient_ == nullptr) {
2047 HILOG_WARN("schedulerDeathRecipient_ is invalid.");
2048 return;
2049 }
2050
2051 auto schedulerObject = scheduler_->AsObject();
2052 if (schedulerObject != nullptr) {
2053 HILOG_INFO("RemoveDeathRecipient");
2054 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
2055 }
2056 }
2057
OnSchedulerDied(const wptr<IRemoteObject> & remote)2058 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
2059 {
2060 HILOG_WARN("On scheduler died.");
2061 auto mission = GetMission();
2062 if (mission) {
2063 HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
2064 }
2065 std::lock_guard<ffrt::mutex> guard(lock_);
2066 CHECK_POINTER(scheduler_);
2067
2068 auto object = remote.promote();
2069 CHECK_POINTER(object);
2070
2071 if (object != scheduler_->AsObject()) {
2072 HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
2073 return;
2074 }
2075
2076 RevokeUriPermission();
2077 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
2078 auto schedulerObject = scheduler_->AsObject();
2079 if (schedulerObject != nullptr) {
2080 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
2081 }
2082 }
2083 CHECK_POINTER(lifecycleDeal_);
2084 lifecycleDeal_->SetScheduler(nullptr);
2085 isWindowAttached_ = false;
2086
2087 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
2088 CHECK_POINTER(abilityManagerService);
2089
2090 auto handler = abilityManagerService->GetTaskHandler();
2091 CHECK_POINTER(handler);
2092
2093 HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
2094 auto task = [abilityManagerService, ability = shared_from_this()]() {
2095 abilityManagerService->OnAbilityDied(ability);
2096 };
2097 handler->SubmitTask(task);
2098 auto uriTask = [want = want_, ability = shared_from_this()]() {
2099 ability->SaveResultToCallers(-1, &want);
2100 ability->SendResultToCallers(true);
2101 };
2102 handler->SubmitTask(uriTask);
2103 #ifdef SUPPORT_GRAPHICS
2104 NotifyAnimationAbilityDied();
2105 #endif
2106 HandleDlpClosed();
2107 NotifyRemoveShellProcess(CollaboratorType::RESERVE_TYPE);
2108 NotifyRemoveShellProcess(CollaboratorType::OTHERS_TYPE);
2109 }
2110
NotifyAnimationAbilityDied()2111 void AbilityRecord::NotifyAnimationAbilityDied()
2112 {
2113 // notify winddow manager service the ability died
2114 if (missionId_ != -1) {
2115 if (GetWMSHandler()) {
2116 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
2117 SetAbilityTransitionInfo(info);
2118 HILOG_INFO("Notification window manager UIAbiltiy abnormal death.");
2119 GetWMSHandler()->NotifyAnimationAbilityDied(info);
2120 }
2121 }
2122 }
2123
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)2124 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
2125 {
2126 connRemoteObject_ = remoteObject;
2127 }
2128
GetConnRemoteObject() const2129 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
2130 {
2131 return connRemoteObject_;
2132 }
2133
AddStartId()2134 void AbilityRecord::AddStartId()
2135 {
2136 startId_++;
2137 }
GetStartId() const2138 int AbilityRecord::GetStartId() const
2139 {
2140 return startId_;
2141 }
2142
SetIsUninstallAbility()2143 void AbilityRecord::SetIsUninstallAbility()
2144 {
2145 isUninstall_ = true;
2146 }
2147
IsUninstallAbility() const2148 bool AbilityRecord::IsUninstallAbility() const
2149 {
2150 return isUninstall_;
2151 }
2152
SetLauncherRoot()2153 void AbilityRecord::SetLauncherRoot()
2154 {
2155 isLauncherRoot_ = true;
2156 }
2157
IsLauncherRoot() const2158 bool AbilityRecord::IsLauncherRoot() const
2159 {
2160 return isLauncherRoot_;
2161 }
2162
IsAbilityState(const AbilityState & state) const2163 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
2164 {
2165 return (currentState_ == state);
2166 }
2167
IsActiveState() const2168 bool AbilityRecord::IsActiveState() const
2169 {
2170 return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
2171 IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND) ||
2172 IsAbilityState(AbilityState::FOREGROUNDING));
2173 }
2174
SendEvent(uint32_t msg,uint32_t timeOut,int32_t param)2175 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut, int32_t param)
2176 {
2177 if (want_.GetBoolParam(DEBUG_APP, false) ||
2178 want_.GetBoolParam(NATIVE_DEBUG, false) ||
2179 !want_.GetStringParam(PERF_CMD).empty()) {
2180 HILOG_INFO("Is debug mode, no need to handle time out.");
2181 return;
2182 }
2183 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2184 CHECK_POINTER(handler);
2185 param = (param == -1) ? recordId_ : param;
2186 auto eventWrap = EventWrap(msg, param);
2187 eventWrap.SetTimeout(timeOut);
2188 handler->SendEvent(eventWrap, timeOut);
2189 }
2190
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)2191 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
2192 {
2193 lifeCycleStateInfo_.setting = setting;
2194 }
2195
GetStartSetting() const2196 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
2197 {
2198 return lifeCycleStateInfo_.setting;
2199 }
2200
SetRestarting(const bool isRestart)2201 void AbilityRecord::SetRestarting(const bool isRestart)
2202 {
2203 isRestarting_ = isRestart;
2204 HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
2205 if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
2206 restartCount_ = isRestart ? (--restartCount_) : restartMax_;
2207 HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
2208 }
2209 }
2210
SetRestarting(const bool isRestart,int32_t canRestartCount)2211 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canRestartCount)
2212 {
2213 isRestarting_ = isRestart;
2214 HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canRestartCount);
2215
2216 if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
2217 restartCount_ = isRestart ? canRestartCount : restartMax_;
2218 HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
2219 }
2220 }
2221
GetRestartCount() const2222 int32_t AbilityRecord::GetRestartCount() const
2223 {
2224 return restartCount_;
2225 }
2226
SetRestartCount(int32_t restartCount)2227 void AbilityRecord::SetRestartCount(int32_t restartCount)
2228 {
2229 restartCount_ = restartCount;
2230 }
2231
IsRestarting() const2232 bool AbilityRecord::IsRestarting() const
2233 {
2234 return isRestarting_;
2235 }
2236
SetKeepAlive()2237 void AbilityRecord::SetKeepAlive()
2238 {
2239 isKeepAlive_ = true;
2240 }
2241
GetRestartTime()2242 int64_t AbilityRecord::GetRestartTime()
2243 {
2244 return restartTime_;
2245 }
2246
SetRestartTime(const int64_t restartTime)2247 void AbilityRecord::SetRestartTime(const int64_t restartTime)
2248 {
2249 restartTime_ = restartTime;
2250 }
2251
SetAppState(const AppState & state)2252 void AbilityRecord::SetAppState(const AppState &state)
2253 {
2254 appState_ = state;
2255 }
2256
GetAppState() const2257 AppState AbilityRecord::GetAppState() const
2258 {
2259 return appState_;
2260 }
2261
SetLaunchReason(const LaunchReason & reason)2262 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
2263 {
2264 lifeCycleStateInfo_.launchParam.launchReason = reason;
2265 }
2266
SetLastExitReason(const LastExitReason & reason)2267 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
2268 {
2269 lifeCycleStateInfo_.launchParam.lastExitReason = reason;
2270 }
2271
NotifyContinuationResult(int32_t result)2272 void AbilityRecord::NotifyContinuationResult(int32_t result)
2273 {
2274 HILOG_INFO("NotifyContinuationResult.");
2275 CHECK_POINTER(lifecycleDeal_);
2276
2277 lifecycleDeal_->NotifyContinuationResult(result);
2278 }
2279
GetOwnedMissionList() const2280 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
2281 {
2282 return missionList_.lock();
2283 }
2284
SetMissionList(const std::shared_ptr<MissionList> & missionList)2285 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
2286 {
2287 missionList_ = missionList;
2288 }
2289
SetMission(const std::shared_ptr<Mission> & mission)2290 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
2291 {
2292 if (mission) {
2293 missionId_ = mission->GetMissionId();
2294 HILOG_DEBUG("SetMission come, missionId is %{public}d.", missionId_);
2295 }
2296 want_.RemoveParam(KEY_MISSION_ID);
2297 want_.SetParam(KEY_MISSION_ID, missionId_);
2298 mission_ = mission;
2299 }
2300
SetSessionInfo(sptr<SessionInfo> sessionInfo)2301 void AbilityRecord::SetSessionInfo(sptr<SessionInfo> sessionInfo)
2302 {
2303 sessionInfo_ = sessionInfo;
2304 }
2305
SetMinimizeReason(bool fromUser)2306 void AbilityRecord::SetMinimizeReason(bool fromUser)
2307 {
2308 minimizeReason_ = fromUser;
2309 }
2310
SetAppIndex(const int32_t appIndex)2311 void AbilityRecord::SetAppIndex(const int32_t appIndex)
2312 {
2313 appIndex_ = appIndex;
2314 }
2315
GetAppIndex() const2316 int32_t AbilityRecord::GetAppIndex() const
2317 {
2318 return appIndex_;
2319 }
2320
IsMinimizeFromUser() const2321 bool AbilityRecord::IsMinimizeFromUser() const
2322 {
2323 return minimizeReason_;
2324 }
2325
SetClearMissionFlag(bool clearMissionFlag)2326 void AbilityRecord::SetClearMissionFlag(bool clearMissionFlag)
2327 {
2328 clearMissionFlag_= clearMissionFlag;
2329 }
2330
IsClearMissionFlag()2331 bool AbilityRecord::IsClearMissionFlag()
2332 {
2333 return clearMissionFlag_;
2334 }
2335
GetMission() const2336 std::shared_ptr<Mission> AbilityRecord::GetMission() const
2337 {
2338 return mission_.lock();
2339 }
2340
GetMissionId() const2341 int32_t AbilityRecord::GetMissionId() const
2342 {
2343 return missionId_;
2344 }
2345
SetSpecifiedFlag(const std::string & flag)2346 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
2347 {
2348 specifiedFlag_ = flag;
2349 }
2350
GetSpecifiedFlag() const2351 std::string AbilityRecord::GetSpecifiedFlag() const
2352 {
2353 return specifiedFlag_;
2354 }
2355
2356 // new version --start
IsStartedByCall() const2357 bool AbilityRecord::IsStartedByCall() const
2358 {
2359 return isStartedByCall_;
2360 }
2361
SetStartedByCall(const bool isFlag)2362 void AbilityRecord::SetStartedByCall(const bool isFlag)
2363 {
2364 isStartedByCall_ = isFlag;
2365 }
2366
IsStartToBackground() const2367 bool AbilityRecord::IsStartToBackground() const
2368 {
2369 return isStartToBackground_;
2370 }
2371
SetStartToBackground(const bool flag)2372 void AbilityRecord::SetStartToBackground(const bool flag)
2373 {
2374 isStartToBackground_ = flag;
2375 }
2376
IsStartToForeground() const2377 bool AbilityRecord::IsStartToForeground() const
2378 {
2379 return isStartToForeground_;
2380 }
2381
SetStartToForeground(const bool flag)2382 void AbilityRecord::SetStartToForeground(const bool flag)
2383 {
2384 isStartToForeground_ = flag;
2385 }
2386
CallRequest()2387 void AbilityRecord::CallRequest()
2388 {
2389 CHECK_POINTER(scheduler_);
2390 // Async call request
2391 scheduler_->CallRequest();
2392 }
2393
CallRequestDone(const sptr<IRemoteObject> & callStub) const2394 bool AbilityRecord::CallRequestDone(const sptr<IRemoteObject> &callStub) const
2395 {
2396 CHECK_POINTER_RETURN_BOOL(callContainer_);
2397 if (!callContainer_->CallRequestDone(callStub)) {
2398 HILOG_ERROR("Call request failed.");
2399 return false;
2400 }
2401 return true;
2402 }
2403
Resolve(const AbilityRequest & abilityRequest)2404 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
2405 {
2406 auto callback = abilityRequest.connect;
2407 if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
2408 HILOG_ERROR("only start by call type can create a call record.");
2409 return ResolveResultType::NG_INNER_ERROR;
2410 }
2411 if (!callContainer_) {
2412 callContainer_ = std::make_shared<CallContainer>();
2413 if (!callContainer_) {
2414 HILOG_ERROR("mark_shared error.");
2415 return ResolveResultType::NG_INNER_ERROR;
2416 }
2417 }
2418
2419 HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
2420 abilityRequest.callerUid,
2421 abilityRequest.abilityInfo.name.c_str());
2422
2423 std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
2424 if (!callRecord) {
2425 callRecord = CallRecord::CreateCallRecord(
2426 abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
2427 if (!callRecord) {
2428 HILOG_ERROR("mark_shared error.");
2429 return ResolveResultType::NG_INNER_ERROR;
2430 }
2431 }
2432
2433 callContainer_->AddCallRecord(callback, callRecord);
2434
2435 if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
2436 HILOG_DEBUG("this record has requested.");
2437 if (!callRecord->SchedulerConnectDone()) {
2438 HILOG_DEBUG("this callrecord has requested, but callback failed.");
2439 return ResolveResultType::NG_INNER_ERROR;
2440 }
2441 return ResolveResultType::OK_HAS_REMOTE_OBJ;
2442 }
2443
2444 callRecord->SetCallState(CallState::REQUESTING);
2445 return ResolveResultType::OK_NO_REMOTE_OBJ;
2446 }
2447
ReleaseCall(const sptr<IAbilityConnection> & connect)2448 bool AbilityRecord::ReleaseCall(const sptr<IAbilityConnection>& connect)
2449 {
2450 HILOG_DEBUG("ability release call record by callback.");
2451 CHECK_POINTER_RETURN_BOOL(callContainer_);
2452
2453 return callContainer_->RemoveCallRecord(connect);
2454 }
2455
IsExistConnection(const sptr<IAbilityConnection> & connect)2456 bool AbilityRecord::IsExistConnection(const sptr<IAbilityConnection> &connect)
2457 {
2458 HILOG_DEBUG("ability find call record by callback.");
2459 CHECK_POINTER_RETURN_BOOL(callContainer_);
2460
2461 return callContainer_->IsExistConnection(connect);
2462 }
2463
IsNeedToCallRequest() const2464 bool AbilityRecord::IsNeedToCallRequest() const
2465 {
2466 HILOG_DEBUG("ability release call record by callback.");
2467 if (callContainer_ == nullptr) {
2468 return false;
2469 }
2470
2471 return callContainer_->IsNeedToCallRequest();
2472 }
2473
ContinueAbility(const std::string & deviceId,uint32_t versionCode)2474 void AbilityRecord::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
2475 {
2476 HILOG_INFO("ContinueAbility.");
2477 CHECK_POINTER(lifecycleDeal_);
2478
2479 lifecycleDeal_->ContinueAbility(deviceId, versionCode);
2480 }
2481
SetSwitchingPause(bool state)2482 void AbilityRecord::SetSwitchingPause(bool state)
2483 {
2484 isSwitchingPause_ = state;
2485 }
2486
IsSwitchingPause()2487 bool AbilityRecord::IsSwitchingPause()
2488 {
2489 return isSwitchingPause_;
2490 }
2491
SetOwnerMissionUserId(int32_t userId)2492 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
2493 {
2494 ownerMissionUserId_ = userId;
2495 }
2496
GetOwnerMissionUserId()2497 int32_t AbilityRecord::GetOwnerMissionUserId()
2498 {
2499 return ownerMissionUserId_;
2500 }
2501
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const2502 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> ¶ms,
2503 bool isClient, bool dumpConfig) const
2504 {
2505 if (!isClient || !scheduler_ || !isReady_) {
2506 HILOG_ERROR("something nullptr.");
2507 return;
2508 }
2509 std::unique_lock<ffrt::mutex> lock(dumpLock_);
2510 scheduler_->DumpAbilityInfo(params, info);
2511
2512 HILOG_INFO("Dump begin wait.");
2513 isDumpTimeout_ = false;
2514 int dumpTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * DUMP_TIMEOUT_MULTIPLE;
2515 std::chrono::milliseconds timeout { dumpTimeout };
2516 if (dumpCondition_.wait_for(lock, timeout) == ffrt::cv_status::timeout) {
2517 isDumpTimeout_ = true;
2518 }
2519 HILOG_INFO("Dump done and begin parse.");
2520 if (!isDumpTimeout_) {
2521 std::lock_guard<ffrt::mutex> infoLock(dumpInfoLock_);
2522 for (auto one : dumpInfos_) {
2523 info.emplace_back(one);
2524 }
2525 }
2526
2527 if (!dumpConfig) {
2528 HILOG_INFO("not dumpConfig.");
2529 return;
2530 }
2531 AppExecFwk::Configuration config;
2532 if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
2533 info.emplace_back(" configuration: " + config.GetName());
2534 }
2535 }
2536
DumpAbilityInfoDone(std::vector<std::string> & infos)2537 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
2538 {
2539 HILOG_INFO("call");
2540 if (isDumpTimeout_) {
2541 HILOG_WARN("%{public}s, dump time out.", __func__);
2542 return;
2543 }
2544 {
2545 std::lock_guard<ffrt::mutex> infoLock(dumpInfoLock_);
2546 dumpInfos_.clear();
2547 for (auto info : infos) {
2548 dumpInfos_.emplace_back(info);
2549 }
2550 }
2551 dumpCondition_.notify_all();
2552 }
2553
GrantUriPermission(Want & want,std::string targetBundleName,bool isSandboxApp,uint32_t tokenId)2554 void AbilityRecord::GrantUriPermission(Want &want, std::string targetBundleName, bool isSandboxApp, uint32_t tokenId)
2555 {
2556 // reject sandbox to grant uri permission by start ability
2557 if (!callerList_.empty() && callerList_.back()) {
2558 auto caller = callerList_.back()->GetCaller();
2559 if (caller && caller->appIndex_ > 0) {
2560 HILOG_ERROR("Sandbox can not grant UriPermission by start ability.");
2561 return;
2562 }
2563 }
2564 // reject sandbox to grant uri permission by terminate self with result
2565 if (isSandboxApp) {
2566 HILOG_ERROR("Sandbox can not grant uriPermission by terminate self with result.");
2567 return;
2568 }
2569
2570 if ((want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
2571 HILOG_WARN("Do not call uriPermissionMgr.");
2572 return;
2573 }
2574 auto bms = AbilityUtil::GetBundleManager();
2575 CHECK_POINTER_IS_NULLPTR(bms);
2576 if (IsDmsCall()) {
2577 GrantDmsUriPermission(want, targetBundleName);
2578 return;
2579 }
2580 std::vector<std::string> uriVec;
2581 std::string uriStr = want.GetUri().ToString();
2582 uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
2583 uriVec.emplace_back(uriStr);
2584 HILOG_DEBUG("GrantUriPermission uriVec size: %{public}zu", uriVec.size());
2585 auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
2586 uint32_t fromTokenId = 0;
2587 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
2588 fromTokenId = tokenId;
2589 } else {
2590 fromTokenId = IPCSkeleton::GetCallingTokenID();
2591 }
2592
2593 auto permission =
2594 PermissionVerification::GetInstance()->VerifyCallingPermission(PERMISSION_PROXY_AUTHORIZATION_URI) ||
2595 PermissionVerification::GetInstance()->VerifyPermissionByTokenId(tokenId, PERMISSION_PROXY_AUTHORIZATION_URI);
2596 auto userId = GetCurrentAccountId();
2597 auto callerTokenId = static_cast<uint32_t>(want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, -1));
2598 for (auto&& str : uriVec) {
2599 Uri uri(str);
2600 auto&& scheme = uri.GetScheme();
2601 HILOG_INFO("uri scheme is %{public}s.", scheme.c_str());
2602 // only support file scheme
2603 if (scheme != "file") {
2604 HILOG_WARN("only support file uri.");
2605 continue;
2606 }
2607 auto&& authority = uri.GetAuthority();
2608 HILOG_INFO("uri authority is %{public}s.", authority.c_str());
2609 bool authorityFlag = authority == "media" || authority == "docs";
2610 uint32_t flag = want.GetFlags();
2611 if (authorityFlag && !isGrantPersistableUriPermissionEnable_) {
2612 flag &= (~Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION);
2613 if (!permission) {
2614 HILOG_WARN("Do not have uri permission proxy.");
2615 continue;
2616 }
2617 }
2618
2619 if (authorityFlag && isGrantPersistableUriPermissionEnable_ && !permission) {
2620 if (!AAFwk::UriPermissionManagerClient::GetInstance().CheckPersistableUriPermissionProxy(
2621 uri, flag, fromTokenId)) {
2622 HILOG_WARN("Do not have persistable uri permission proxy.");
2623 continue;
2624 }
2625 flag |= Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION;
2626 }
2627
2628 if (!authorityFlag) {
2629 AppExecFwk::BundleInfo uriBundleInfo;
2630 if (!IN_PROCESS_CALL(bms->GetBundleInfo(authority, bundleFlag, uriBundleInfo, userId))) {
2631 HILOG_WARN("To fail to get bundle info according to uri.");
2632 continue;
2633 }
2634 bool notBelong2Caller = uriBundleInfo.applicationInfo.accessTokenId != fromTokenId &&
2635 uriBundleInfo.applicationInfo.accessTokenId != callerAccessTokenId_ &&
2636 uriBundleInfo.applicationInfo.accessTokenId != callerTokenId;
2637 if (notBelong2Caller) {
2638 HILOG_ERROR("the uri does not belong to caller.");
2639 continue;
2640 }
2641 flag &= (~Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION);
2642 }
2643 int autoremove = 1;
2644 auto ret = IN_PROCESS_CALL(
2645 AAFwk::UriPermissionManagerClient::GetInstance().GrantUriPermission(uri, flag,
2646 targetBundleName, autoremove, appIndex_));
2647 if (ret == 0) {
2648 isGrantedUriPermission_ = true;
2649 }
2650 }
2651 }
2652
IsDmsCall()2653 bool AbilityRecord::IsDmsCall()
2654 {
2655 auto fromTokenId = IPCSkeleton::GetCallingTokenID();
2656 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(fromTokenId);
2657 bool isNativeCall = tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE;
2658 if (!isNativeCall) {
2659 HILOG_INFO("Is not native call.");
2660 return false;
2661 }
2662 AccessToken::NativeTokenInfo nativeTokenInfo;
2663 int32_t result = AccessToken::AccessTokenKit::GetNativeTokenInfo(fromTokenId, nativeTokenInfo);
2664 if (result == ERR_OK && nativeTokenInfo.processName == DMS_PROCESS_NAME) {
2665 HILOG_INFO("Is dms ability call.");
2666 return true;
2667 }
2668 return false;
2669 }
2670
GrantDmsUriPermission(Want & want,std::string targetBundleName)2671 void AbilityRecord::GrantDmsUriPermission(Want &want, std::string targetBundleName)
2672 {
2673 std::vector<std::string> uriVec = want.GetStringArrayParam(PARAMS_URI);
2674 HILOG_DEBUG("GrantDmsUriPermission uriVec size: %{public}zu", uriVec.size());
2675 for (auto&& str : uriVec) {
2676 Uri uri(str);
2677 auto&& scheme = uri.GetScheme();
2678 HILOG_INFO("uri scheme is %{public}s.", scheme.c_str());
2679 // only support file scheme
2680 if (scheme != "file") {
2681 HILOG_WARN("only support file uri.");
2682 continue;
2683 }
2684 int autoremove = 1;
2685 auto ret = IN_PROCESS_CALL(
2686 AAFwk::UriPermissionManagerClient::GetInstance().GrantUriPermission(uri, want.GetFlags(),
2687 targetBundleName, autoremove));
2688 if (ret == 0) {
2689 isGrantedUriPermission_ = true;
2690 }
2691 }
2692 uriVec.clear();
2693 want.SetParam(PARAMS_URI, uriVec);
2694 }
2695
RevokeUriPermission()2696 void AbilityRecord::RevokeUriPermission()
2697 {
2698 if (isGrantedUriPermission_) {
2699 HILOG_DEBUG("To remove uri permission.");
2700 AAFwk::UriPermissionManagerClient::GetInstance().RevokeUriPermission(applicationInfo_.accessTokenId);
2701 isGrantedUriPermission_ = false;
2702 }
2703 }
2704
HandleDlpAttached()2705 void AbilityRecord::HandleDlpAttached()
2706 {
2707 if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2708 DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpManager(shared_from_this());
2709 }
2710
2711 if (appIndex_ > 0) {
2712 DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpAbility(shared_from_this());
2713 }
2714 }
2715
HandleDlpClosed()2716 void AbilityRecord::HandleDlpClosed()
2717 {
2718 if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2719 DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpManager(shared_from_this());
2720 }
2721
2722 if (appIndex_ > 0) {
2723 DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpAbility(shared_from_this());
2724 }
2725 }
2726
NotifyRemoveShellProcess(int32_t type)2727 void AbilityRecord::NotifyRemoveShellProcess(int32_t type)
2728 {
2729 HILOG_INFO("NotifyRemoveShellProcess type is : %{public}d", type);
2730 if (abilityInfo_.bundleName == SHELL_ASSISTANT_BUNDLENAME) {
2731 auto collaborator = DelayedSingleton<AbilityManagerService>::GetInstance()->GetCollaborator(type);
2732 if (collaborator == nullptr) {
2733 HILOG_DEBUG("collaborator is nullptr");
2734 return;
2735 }
2736 int ret = collaborator->NotifyRemoveShellProcess(pid_, SHELL_ASSISTANT_DIETYPE, SHELL_ASSISTANT_DIEREASON);
2737 HILOG_INFO("notify broker params pid is: %{public}d", pid_);
2738 if (ret != ERR_OK) {
2739 HILOG_ERROR("notify broker remove shell process failed, err: %{public}d", ret);
2740 }
2741 }
2742 }
2743
GetCurrentAccountId() const2744 int32_t AbilityRecord::GetCurrentAccountId() const
2745 {
2746 std::vector<int32_t> osActiveAccountIds;
2747 ErrCode ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
2748 QueryActiveOsAccountIds(osActiveAccountIds);
2749 if (ret != ERR_OK) {
2750 HILOG_ERROR("QueryActiveOsAccountIds failed.");
2751 return DEFAULT_USER_ID;
2752 }
2753 if (osActiveAccountIds.empty()) {
2754 HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
2755 return DEFAULT_USER_ID;
2756 }
2757
2758 return osActiveAccountIds.front();
2759 }
2760
SetWindowMode(int32_t windowMode)2761 void AbilityRecord::SetWindowMode(int32_t windowMode)
2762 {
2763 want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
2764 }
2765
RemoveWindowMode()2766 void AbilityRecord::RemoveWindowMode()
2767 {
2768 want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
2769 }
2770
SetPendingState(AbilityState state)2771 void AbilityRecord::SetPendingState(AbilityState state)
2772 {
2773 pendingState_.store(state);
2774 }
2775
GetPendingState() const2776 AbilityState AbilityRecord::GetPendingState() const
2777 {
2778 return pendingState_.load();
2779 }
2780
2781 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility()2782 int AbilityRecord::BlockAbility()
2783 {
2784 HILOG_INFO("BlockAbility.");
2785 if (scheduler_) {
2786 HILOG_INFO("scheduler_ begin to call BlockAbility %{public}s", __func__);
2787 return scheduler_->BlockAbility();
2788 }
2789 return ERR_NO_INIT;
2790 }
2791 #endif
2792
IsNeedBackToOtherMissionStack()2793 bool AbilityRecord::IsNeedBackToOtherMissionStack()
2794 {
2795 return isNeedBackToOtherMissionStack_;
2796 }
2797
SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)2798 void AbilityRecord::SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)
2799 {
2800 isNeedBackToOtherMissionStack_ = isNeedBackToOtherMissionStack;
2801 }
2802
GetOtherMissionStackAbilityRecord() const2803 std::shared_ptr<AbilityRecord> AbilityRecord::GetOtherMissionStackAbilityRecord() const
2804 {
2805 return otherMissionStackAbilityRecord_.lock();
2806 }
2807
SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)2808 void AbilityRecord::SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2809 {
2810 otherMissionStackAbilityRecord_ = abilityRecord;
2811 }
2812
UpdateRecoveryInfo(bool hasRecoverInfo)2813 void AbilityRecord::UpdateRecoveryInfo(bool hasRecoverInfo)
2814 {
2815 if (hasRecoverInfo) {
2816 want_.SetParam(Want::PARAM_ABILITY_RECOVERY_RESTART, true);
2817 SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
2818 }
2819 }
2820
GetRecoveryInfo()2821 bool AbilityRecord::GetRecoveryInfo()
2822 {
2823 return want_.GetBoolParam(Want::PARAM_ABILITY_RECOVERY_RESTART, false);
2824 }
2825
InitPersistableUriPermissionConfig()2826 void AbilityRecord::InitPersistableUriPermissionConfig()
2827 {
2828 char value[GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_SIZE] = "false";
2829 int retSysParam = GetParameter(GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_PARAMETER, "false", value,
2830 GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_SIZE);
2831 HILOG_INFO("GrantPersistableUriPermissionEnable, %{public}s value is %{public}s.",
2832 GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_PARAMETER, value);
2833 if (retSysParam > 0 && !std::strcmp(value, "true")) {
2834 isGrantPersistableUriPermissionEnable_ = true;
2835 }
2836 }
2837
GetCollaboratorType() const2838 int32_t AbilityRecord::GetCollaboratorType() const
2839 {
2840 return collaboratorType_;
2841 }
2842 } // namespace AAFwk
2843 } // namespace OHOS
2844