• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &params)
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> &params, 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> &params,
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