1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ability_record.h"
17
18 #include <singleton.h>
19 #include <vector>
20
21 #include "ability_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 "accesstoken_kit.h"
27 #include "bundle_mgr_client.h"
28 #include "connection_state_manager.h"
29 #include "hitrace_meter.h"
30 #include "image_source.h"
31 #include "in_process_call_wrapper.h"
32 #include "errors.h"
33 #include "event_report.h"
34 #include "hilog_wrapper.h"
35 #include "os_account_manager_wrapper.h"
36 #include "parameters.h"
37 #include "system_ability_token_callback.h"
38 #include "uri_permission_manager_client.h"
39 #ifdef SUPPORT_GRAPHICS
40 #include "image_source.h"
41 #include "locale_config.h"
42 #include "mission_info_mgr.h"
43 #endif
44 #ifdef EFFICIENCY_MANAGER_ENABLE
45 #include "suspend_manager_client.h"
46 #endif // EFFICIENCY_MANAGER_ENABLE
47
48
49 namespace OHOS {
50 namespace AAFwk {
51 using namespace OHOS::Security;
52 const std::string DEBUG_APP = "debugApp";
53 const std::string DMS_PROCESS_NAME = "distributedsched";
54 const std::string DMS_MISSION_ID = "dmsMissionId";
55 const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
56 const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId";
57 const std::u16string SYSTEM_ABILITY_TOKEN_CALLBACK = u"ohos.aafwk.ISystemAbilityTokenCallback";
58 const std::string SHOW_ON_LOCK_SCREEN = "ShowOnLockScreen";
59 const std::string DLP_INDEX = "ohos.dlp.params.index";
60 const std::string DLP_BUNDLE_NAME = "com.ohos.dlpmanager";
61 const std::string COMPONENT_STARTUP_NEW_RULES = "component.startup.newRules";
62 const std::string NEED_STARTINGWINDOW = "ohos.ability.NeedStartingWindow";
63 const uint32_t RELEASE_STARTING_BG_TIMEOUT = 15000; // release starting window resource timeout.
64 int64_t AbilityRecord::abilityRecordId = 0;
65 int64_t AbilityRecord::g_abilityRecordEventId_ = 0;
66 const int32_t DEFAULT_USER_ID = 0;
67 const int32_t SEND_RESULT_CANCELED = -1;
68 const int VECTOR_SIZE = 2;
69 const std::map<AbilityState, std::string> AbilityRecord::stateToStrMap = {
70 std::map<AbilityState, std::string>::value_type(INITIAL, "INITIAL"),
71 std::map<AbilityState, std::string>::value_type(INACTIVE, "INACTIVE"),
72 std::map<AbilityState, std::string>::value_type(ACTIVE, "ACTIVE"),
73 std::map<AbilityState, std::string>::value_type(INACTIVATING, "INACTIVATING"),
74 std::map<AbilityState, std::string>::value_type(ACTIVATING, "ACTIVATING"),
75 std::map<AbilityState, std::string>::value_type(TERMINATING, "TERMINATING"),
76 std::map<AbilityState, std::string>::value_type(FOREGROUND, "FOREGROUND"),
77 std::map<AbilityState, std::string>::value_type(BACKGROUND, "BACKGROUND"),
78 std::map<AbilityState, std::string>::value_type(FOREGROUNDING, "FOREGROUNDING"),
79 std::map<AbilityState, std::string>::value_type(BACKGROUNDING, "BACKGROUNDING"),
80 std::map<AbilityState, std::string>::value_type(FOREGROUND_FAILED, "FOREGROUND_FAILED"),
81 std::map<AbilityState, std::string>::value_type(FOREGROUND_INVALID_MODE, "FOREGROUND_INVALID_MODE"),
82 std::map<AbilityState, std::string>::value_type(FOREGROUND_WINDOW_FREEZED, "FOREGROUND_WINDOW_FREEZED"),
83 };
84 const std::map<AppState, std::string> AbilityRecord::appStateToStrMap_ = {
85 std::map<AppState, std::string>::value_type(AppState::BEGIN, "BEGIN"),
86 std::map<AppState, std::string>::value_type(AppState::READY, "READY"),
87 std::map<AppState, std::string>::value_type(AppState::FOREGROUND, "FOREGROUND"),
88 std::map<AppState, std::string>::value_type(AppState::BACKGROUND, "BACKGROUND"),
89 std::map<AppState, std::string>::value_type(AppState::SUSPENDED, "SUSPENDED"),
90 std::map<AppState, std::string>::value_type(AppState::TERMINATED, "TERMINATED"),
91 std::map<AppState, std::string>::value_type(AppState::END, "END"),
92 std::map<AppState, std::string>::value_type(AppState::FOCUS, "FOCUS"),
93 };
94 const std::map<AbilityLifeCycleState, AbilityState> AbilityRecord::convertStateMap = {
95 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INITIAL, INITIAL),
96 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INACTIVE, INACTIVE),
97 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_ACTIVE, ACTIVE),
98 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_NEW, FOREGROUND),
99 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND_NEW, BACKGROUND),
100 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_FAILED, FOREGROUND_FAILED),
101 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INVALID_WINDOW_MODE,
102 FOREGROUND_INVALID_MODE),
103 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_WINDOW_FREEZED,
104 FOREGROUND_WINDOW_FREEZED),
105 };
106
Token(std::weak_ptr<AbilityRecord> abilityRecord)107 Token::Token(std::weak_ptr<AbilityRecord> abilityRecord) : abilityRecord_(abilityRecord)
108 {}
109
~Token()110 Token::~Token()
111 {}
112
GetAbilityRecordByToken(const sptr<IRemoteObject> & token)113 std::shared_ptr<AbilityRecord> Token::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
114 {
115 CHECK_POINTER_AND_RETURN(token, nullptr);
116
117 std::string descriptor = Str16ToStr8(token->GetObjectDescriptor());
118 if (descriptor != "ohos.aafwk.AbilityToken") {
119 HILOG_ERROR("Input token is not an AbilityToken, token->GetObjectDescriptor(): %{public}s",
120 descriptor.c_str());
121 return nullptr;
122 }
123
124 // Double check if token is valid
125 sptr<IAbilityToken> theToken = iface_cast<IAbilityToken>(token);
126 if (!theToken) {
127 return nullptr;
128 }
129 if (theToken->GetDescriptor() != u"ohos.aafwk.AbilityToken") {
130 return nullptr;
131 }
132
133 return (static_cast<Token *>(token.GetRefPtr()))->GetAbilityRecord();
134 }
135
GetAbilityRecord() const136 std::shared_ptr<AbilityRecord> Token::GetAbilityRecord() const
137 {
138 return abilityRecord_.lock();
139 }
140
AbilityRecord(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode)141 AbilityRecord::AbilityRecord(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
142 const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode)
143 : want_(want), abilityInfo_(abilityInfo), applicationInfo_(applicationInfo), requestCode_(requestCode)
144 {
145 recordId_ = abilityRecordId++;
146 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
147 if (abilityMgr) {
148 bool isRootLauncher = (applicationInfo_.bundleName == LAUNCHER_BUNDLE_NAME);
149 abilityMgr->GetMaxRestartNum(restartMax_, isRootLauncher);
150 bool flag = abilityMgr->GetStartUpNewRuleFlag();
151 want_.SetParam(COMPONENT_STARTUP_NEW_RULES, flag);
152 }
153 restartCount_ = restartMax_;
154 appIndex_ = want.GetIntParam(DLP_INDEX, 0);
155 }
156
~AbilityRecord()157 AbilityRecord::~AbilityRecord()
158 {
159 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
160 auto object = scheduler_->AsObject();
161 if (object != nullptr) {
162 object->RemoveDeathRecipient(schedulerDeathRecipient_);
163 }
164 }
165 }
166
CreateAbilityRecord(const AbilityRequest & abilityRequest)167 std::shared_ptr<AbilityRecord> AbilityRecord::CreateAbilityRecord(const AbilityRequest &abilityRequest)
168 {
169 std::shared_ptr<AbilityRecord> abilityRecord = std::make_shared<AbilityRecord>(
170 abilityRequest.want, abilityRequest.abilityInfo, abilityRequest.appInfo, abilityRequest.requestCode);
171 CHECK_POINTER_AND_RETURN(abilityRecord, nullptr);
172 abilityRecord->SetUid(abilityRequest.uid);
173 abilityRecord->SetAppIndex(abilityRequest.want.GetIntParam(DLP_INDEX, 0));
174 abilityRecord->SetCallerAccessTokenId(abilityRequest.callerAccessTokenId);
175 if (!abilityRecord->Init()) {
176 HILOG_ERROR("failed to init new ability record");
177 return nullptr;
178 }
179 if (abilityRequest.startSetting != nullptr) {
180 HILOG_INFO("abilityRequest.startSetting...");
181 abilityRecord->SetStartSetting(abilityRequest.startSetting);
182 }
183 if (abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
184 HILOG_INFO("abilityRequest.callType is CALL_REQUEST_TYPE.");
185 abilityRecord->SetStartedByCall(true);
186 }
187 return abilityRecord;
188 }
189
Init()190 bool AbilityRecord::Init()
191 {
192 lifecycleDeal_ = std::make_unique<LifecycleDeal>();
193 CHECK_POINTER_RETURN_BOOL(lifecycleDeal_);
194
195 token_ = new (std::nothrow) Token(weak_from_this());
196 CHECK_POINTER_RETURN_BOOL(token_);
197
198 if (applicationInfo_.isLauncherApp) {
199 isLauncherAbility_ = true;
200 }
201 return true;
202 }
203
SetUid(int32_t uid)204 void AbilityRecord::SetUid(int32_t uid)
205 {
206 uid_ = uid;
207 }
208
GetUid()209 int32_t AbilityRecord::GetUid()
210 {
211 return uid_;
212 }
213
GetPid()214 int32_t AbilityRecord::GetPid()
215 {
216 return pid_;
217 }
218
LoadAbility()219 int AbilityRecord::LoadAbility()
220 {
221 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
222 HILOG_INFO("Start load ability, name is %{public}s.", abilityInfo_.name.c_str());
223 if (applicationInfo_.asanEnabled) {
224 auto loadTimeOut = AbilityManagerService::LOAD_TIMEOUT_ASANENABLED;
225 SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, loadTimeOut);
226 } else if (abilityInfo_.type != AppExecFwk::AbilityType::DATA) {
227 auto loadTimeOut = want_.GetBoolParam("coldStart", false) ?
228 AbilityManagerService::COLDSTART_LOAD_TIMEOUT : AbilityManagerService::LOAD_TIMEOUT;
229 SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, loadTimeOut);
230 }
231
232 startTime_ = AbilityUtil::SystemTimeMillis();
233 CHECK_POINTER_AND_RETURN(token_, ERR_INVALID_VALUE);
234 std::string appName = applicationInfo_.name;
235 if (appName.empty()) {
236 HILOG_ERROR("app name is empty");
237 return ERR_INVALID_VALUE;
238 }
239
240 if (!CanRestartRootLauncher()) {
241 HILOG_ERROR("Root launcher restart is out of max count.");
242 return ERR_INVALID_VALUE;
243 }
244
245 if (isRestarting_) {
246 restartTime_ = AbilityUtil::SystemTimeMillis();
247 }
248
249 sptr<Token> callerToken_ = nullptr;
250 if (!callerList_.empty() && callerList_.back()) {
251 auto caller = callerList_.back()->GetCaller();
252 if (caller) {
253 callerToken_ = caller->GetToken();
254 }
255 }
256 want_.SetParam(ABILITY_OWNER_USERID, ownerMissionUserId_);
257 auto result = DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
258 token_, callerToken_, abilityInfo_, applicationInfo_, want_);
259 want_.RemoveParam(ABILITY_OWNER_USERID);
260 return result;
261 }
262
CanRestartRootLauncher()263 bool AbilityRecord::CanRestartRootLauncher()
264 {
265 if (isLauncherRoot_ && isRestarting_ && IsLauncherAbility() && (restartCount_ < 0)) {
266 HILOG_ERROR("Root launcher restart is out of max count.");
267 return false;
268 }
269 return true;
270 }
271
CanRestartResident()272 bool AbilityRecord::CanRestartResident()
273 {
274 HILOG_DEBUG("isKeepAlive: %{public}d, isRestarting: %{public}d, restartCount: %{public}d",
275 isKeepAlive_, isRestarting_, restartCount_);
276 if (isKeepAlive_ && isRestarting_ && (restartCount_ < 0)) {
277 int restartIntervalTime = 0;
278 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
279 if (abilityMgr) {
280 abilityMgr->GetRestartIntervalTime(restartIntervalTime);
281 }
282 HILOG_DEBUG("restartTime: %{public}lld, now: %{public}lld, intervalTine:%{public}d",
283 static_cast<unsigned long long>(restartTime_),
284 static_cast<unsigned long long>(AbilityUtil::SystemTimeMillis()), restartIntervalTime);
285 if ((AbilityUtil::SystemTimeMillis() - restartTime_) < restartIntervalTime) {
286 HILOG_ERROR("Resident restart is out of max count");
287 return false;
288 }
289 }
290 return true;
291 }
292
ForegroundAbility(uint32_t sceneFlag)293 void AbilityRecord::ForegroundAbility(uint32_t sceneFlag)
294 {
295 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
296 HILOG_INFO("Start to foreground ability, name is %{public}s.", abilityInfo_.name.c_str());
297 CHECK_POINTER(lifecycleDeal_);
298
299 SendEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, AbilityManagerService::FOREGROUND_TIMEOUT);
300
301 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
302 // earlier than above actions.
303 currentState_ = AbilityState::FOREGROUNDING;
304 lifeCycleStateInfo_.sceneFlag = sceneFlag;
305 lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_);
306 lifeCycleStateInfo_.sceneFlag = 0;
307 lifeCycleStateInfo_.sceneFlagBak = 0;
308
309 // update ability state to appMgr service when restart
310 if (IsNewWant()) {
311 sptr<Token> preToken = nullptr;
312 if (GetPreAbilityRecord()) {
313 preToken = GetPreAbilityRecord()->GetToken();
314 }
315 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
316 }
317 }
318
ProcessForegroundAbility(uint32_t sceneFlag)319 void AbilityRecord::ProcessForegroundAbility(uint32_t sceneFlag)
320 {
321 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
322 std::string element = GetWant().GetElement().GetURI();
323 HILOG_DEBUG("ability record: %{public}s", element.c_str());
324
325 if (isReady_) {
326 if (IsAbilityState(AbilityState::FOREGROUND)) {
327 HILOG_DEBUG("Activate %{public}s", element.c_str());
328 ForegroundAbility(sceneFlag);
329 } else {
330 // background to active state
331 HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
332 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
333 #ifdef EFFICIENCY_MANAGER_ENABLE
334 std::string bundleName = GetAbilityInfo().bundleName;
335 int32_t uid = GetUid();
336 SuspendManager::SuspendManagerClient::GetInstance().ThawOneApplication(
337 uid, bundleName, "THAW_BY_FOREGROUND_ABILITY");
338 #endif // EFFICIENCY_MANAGER_ENABLE
339 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
340 }
341 } else {
342 HILOG_INFO("To load ability.");
343 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
344 LoadAbility();
345 }
346 }
347
GetLabel()348 std::string AbilityRecord::GetLabel()
349 {
350 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
351 std::string strLabel = applicationInfo_.label;
352
353 if (abilityInfo_.resourcePath.empty()) {
354 HILOG_WARN("resource path is empty.");
355 return strLabel;
356 }
357
358 #ifdef SUPPORT_GRAPHICS
359 auto resourceMgr = CreateResourceManager();
360 if (!resourceMgr) {
361 return strLabel;
362 }
363
364 auto result = resourceMgr->GetStringById(applicationInfo_.labelId, strLabel);
365 if (result != OHOS::Global::Resource::RState::SUCCESS) {
366 HILOG_WARN("%{public}s. Failed to GetStringById.", __func__);
367 }
368
369 InitColdStartingWindowResource(resourceMgr);
370 #endif
371
372 return strLabel;
373 }
374
375 #ifdef SUPPORT_GRAPHICS
ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> & callerAbility,uint32_t sceneFlag)376 void AbilityRecord::ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> &callerAbility, uint32_t sceneFlag)
377 {
378 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
379 std::string element = GetWant().GetElement().GetURI();
380 HILOG_DEBUG("SUPPORT_GRAPHICS: ability record: %{public}s", element.c_str());
381
382 StartingWindowHot();
383 auto flag = !IsForeground();
384 NotifyAnimationFromTerminatingAbility(callerAbility, flag);
385 PostCancelStartingWindowHotTask();
386
387 if (IsAbilityState(AbilityState::FOREGROUND)) {
388 HILOG_DEBUG("Activate %{public}s", element.c_str());
389 ForegroundAbility(sceneFlag);
390 } else {
391 // background to active state
392 HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
393 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
394 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
395 }
396 }
397
NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord> & callerAbility,bool flag)398 void AbilityRecord::NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord>& callerAbility,
399 bool flag)
400 {
401 auto windowHandler = GetWMSHandler();
402 if (!windowHandler) {
403 HILOG_WARN("Get WMS handler failed.");
404 return;
405 }
406
407 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
408 if (callerAbility) {
409 auto callerAbilityInfo = callerAbility->GetAbilityInfo();
410 SetAbilityTransitionInfo(callerAbilityInfo, fromInfo);
411 fromInfo->abilityToken_ = callerAbility->GetToken();
412 }
413
414 if (flag) {
415 fromInfo->reason_ = TransitionReason::BACK_TRANSITION;
416 } else {
417 fromInfo->reason_ = TransitionReason::CLOSE;
418 }
419
420 auto toInfo = CreateAbilityTransitionInfo();
421 SetAbilityTransitionInfo(abilityInfo_, toInfo);
422
423 windowHandler->NotifyWindowTransition(fromInfo, toInfo);
424 }
425
NotifyAnimationFromTerminatingAbility() const426 void AbilityRecord::NotifyAnimationFromTerminatingAbility() const
427 {
428 auto windowHandler = GetWMSHandler();
429 if (!windowHandler) {
430 HILOG_WARN("Get WMS handler failed.");
431 return;
432 }
433
434 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
435 SetAbilityTransitionInfo(fromInfo);
436 fromInfo->reason_ = TransitionReason::CLOSE;
437 windowHandler->NotifyWindowTransition(fromInfo, nullptr);
438 }
439
SetAbilityTransitionInfo(sptr<AbilityTransitionInfo> & info) const440 void AbilityRecord::SetAbilityTransitionInfo(sptr<AbilityTransitionInfo>& info) const
441 {
442 info->abilityToken_ = token_;
443 info->missionId_ = missionId_;
444 info->abilityName_ = abilityInfo_.name;
445 info->bundleName_ = abilityInfo_.bundleName;
446 info->windowModes_ = abilityInfo_.windowModes;
447 info->maxWindowRatio_ = abilityInfo_.maxWindowRatio;
448 info->minWindowRatio_ = abilityInfo_.minWindowRatio;
449 info->maxWindowWidth_ = abilityInfo_.maxWindowWidth;
450 info->minWindowWidth_ = abilityInfo_.minWindowWidth;
451 info->maxWindowHeight_ = abilityInfo_.maxWindowHeight;
452 info->minWindowHeight_ = abilityInfo_.minWindowHeight;
453 }
454
CreateAbilityTransitionInfo()455 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo()
456 {
457 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
458 SetAbilityTransitionInfo(info);
459 SetStartingWindow(true);
460 return info;
461 }
462
StartingWindowHot()463 void AbilityRecord::StartingWindowHot()
464 {
465 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
466 auto windowHandler = GetWMSHandler();
467 if (!windowHandler) {
468 HILOG_WARN("Get WMS handler failed.");
469 return;
470 }
471
472 auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
473 if (!pixelMap) {
474 HILOG_WARN("Get snapshot failed.");
475 }
476
477 auto info = CreateAbilityTransitionInfo();
478 HILOG_INFO("Notify wms to start StartingWindow.");
479 windowHandler->StartingWindow(info, pixelMap);
480 }
481
ProcessForegroundAbility(bool isRecent,const AbilityRequest & abilityRequest,std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<AbilityRecord> & callerAbility,uint32_t sceneFlag)482 void AbilityRecord::ProcessForegroundAbility(bool isRecent, const AbilityRequest &abilityRequest,
483 std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility,
484 uint32_t sceneFlag)
485 {
486 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
487 std::string element = GetWant().GetElement().GetURI();
488 HILOG_DEBUG("SUPPORT_GRAPHICS: ability record: %{public}s", element.c_str());
489 GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
490
491 if (isReady_) {
492 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
493 if (!handler) {
494 HILOG_ERROR("Fail to get AbilityEventHandler.");
495 return;
496 }
497 auto taskName = std::to_string(missionId_) + "_hot";
498 handler->RemoveTask(taskName);
499 StartingWindowTask(isRecent, false, abilityRequest, startOptions);
500 AnimationTask(isRecent, abilityRequest, startOptions, callerAbility);
501 PostCancelStartingWindowHotTask();
502
503 if (IsAbilityState(AbilityState::FOREGROUND)) {
504 HILOG_DEBUG("Activate %{public}s", element.c_str());
505 ForegroundAbility(sceneFlag);
506 } else {
507 // background to active state
508 HILOG_DEBUG("MoveToForeground, %{public}s", element.c_str());
509 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
510 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token_);
511 }
512 } else {
513 HILOG_INFO("SUPPORT_GRAPHICS: to load ability.");
514 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
515 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
516 auto needStartingWindow = abilityRequest.want.GetBoolParam(NEED_STARTINGWINDOW, true);
517 if (!isSaCall || needStartingWindow) {
518 StartingWindowTask(isRecent, true, abilityRequest, startOptions);
519 AnimationTask(isRecent, abilityRequest, startOptions, callerAbility);
520 PostCancelStartingWindowColdTask();
521 }
522 LoadAbility();
523 }
524 }
525
GetWantFromMission() const526 std::shared_ptr<Want> AbilityRecord::GetWantFromMission() const
527 {
528 InnerMissionInfo innerMissionInfo;
529 int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
530 missionId_, innerMissionInfo);
531 if (getMission != ERR_OK) {
532 HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId_);
533 return nullptr;
534 }
535
536 return std::make_shared<Want>(innerMissionInfo.missionInfo.want);
537 }
538
AnimationTask(bool isRecent,const AbilityRequest & abilityRequest,const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<AbilityRecord> & callerAbility)539 void AbilityRecord::AnimationTask(bool isRecent, const AbilityRequest &abilityRequest,
540 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility)
541 {
542 HILOG_INFO("%{public}s was called.", __func__);
543 if (isRecent) {
544 auto want = GetWantFromMission();
545 NotifyAnimationFromRecentTask(startOptions, want);
546 } else {
547 if (!IsForeground()) {
548 NotifyAnimationFromStartingAbility(callerAbility, abilityRequest);
549 }
550 }
551 }
552
SetShowWhenLocked(const AppExecFwk::AbilityInfo & abilityInfo,sptr<AbilityTransitionInfo> & info) const553 void AbilityRecord::SetShowWhenLocked(const AppExecFwk::AbilityInfo &abilityInfo,
554 sptr<AbilityTransitionInfo> &info) const
555 {
556 std::vector<AppExecFwk::CustomizeData> datas = abilityInfo.metaData.customizeData;
557 for (AppExecFwk::CustomizeData data : datas) {
558 if (data.name == SHOW_ON_LOCK_SCREEN) {
559 info->isShowWhenLocked_ = true;
560 break;
561 }
562 }
563 }
564
SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo & abilityInfo,sptr<AbilityTransitionInfo> & info) const565 void AbilityRecord::SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo &abilityInfo,
566 sptr<AbilityTransitionInfo> &info) const
567 {
568 info->abilityName_ = abilityInfo.name;
569 info->bundleName_ = abilityInfo.bundleName;
570 info->windowModes_ = abilityInfo.windowModes;
571 SetShowWhenLocked(abilityInfo, info);
572 }
573
NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const574 void AbilityRecord::NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> &startOptions,
575 const std::shared_ptr<Want> &want) const
576 {
577 auto windowHandler = GetWMSHandler();
578 if (!windowHandler) {
579 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
580 return;
581 }
582
583 auto toInfo = CreateAbilityTransitionInfo(startOptions, want);
584 toInfo->abilityToken_ = token_;
585 toInfo->missionId_ = missionId_;
586 SetAbilityTransitionInfo(abilityInfo_, toInfo);
587 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
588 fromInfo->isRecent_ = true;
589 windowHandler->NotifyWindowTransition(fromInfo, toInfo);
590 }
591
NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest) const592 void AbilityRecord::NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> &callerAbility,
593 const AbilityRequest &abilityRequest) const
594 {
595 auto windowHandler = GetWMSHandler();
596 if (!windowHandler) {
597 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
598 return;
599 }
600
601 sptr<AbilityTransitionInfo> fromInfo = new AbilityTransitionInfo();
602 if (callerAbility) {
603 auto callerAbilityInfo = callerAbility->GetAbilityInfo();
604 SetAbilityTransitionInfo(callerAbilityInfo, fromInfo);
605 fromInfo->abilityToken_ = callerAbility->GetToken();
606 } else {
607 fromInfo->abilityToken_ = abilityRequest.callerToken;
608 }
609
610 auto toInfo = CreateAbilityTransitionInfo(abilityRequest);
611 toInfo->abilityToken_ = token_;
612 toInfo->missionId_ = missionId_;
613 SetAbilityTransitionInfo(abilityInfo_, toInfo);
614
615 windowHandler->NotifyWindowTransition(fromInfo, toInfo);
616 }
617
StartingWindowTask(bool isRecent,bool isCold,const AbilityRequest & abilityRequest,std::shared_ptr<StartOptions> & startOptions)618 void AbilityRecord::StartingWindowTask(bool isRecent, bool isCold, const AbilityRequest &abilityRequest,
619 std::shared_ptr<StartOptions> &startOptions)
620 {
621 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
622 HILOG_INFO("%{public}s was called.", __func__);
623 if (isRecent) {
624 auto want = GetWantFromMission();
625 if (isCold) {
626 StartingWindowCold(startOptions, want, abilityRequest);
627 } else {
628 StartingWindowHot(startOptions, want, abilityRequest);
629 }
630 } else {
631 std::shared_ptr<Want> want = nullptr;
632 if (isCold) {
633 StartingWindowCold(startOptions, want, abilityRequest);
634 } else {
635 StartingWindowHot(startOptions, want, abilityRequest);
636 }
637 }
638 }
639
PostCancelStartingWindowHotTask()640 void AbilityRecord::PostCancelStartingWindowHotTask()
641 {
642 if (want_.GetBoolParam(DEBUG_APP, false)) {
643 HILOG_INFO("PostCancelStartingWindowHotTask was called, debug mode, just return.");
644 return;
645 }
646 HILOG_INFO("PostCancelStartingWindowHotTask was called.");
647 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
648 CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
649
650 auto windowHandler = GetWMSHandler();
651 CHECK_POINTER_LOG(windowHandler, "PostCancelStartingWindowColdTask, Get WMS handler failed.");
652
653 auto abilityRecord(shared_from_this());
654 auto delayTask = [windowHandler, abilityRecord] {
655 if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow() &&
656 abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
657 HILOG_INFO("PostCancelStartingWindowHotTask, call windowHandler CancelStartingWindow.");
658 windowHandler->CancelStartingWindow(abilityRecord->GetToken());
659 abilityRecord->SetStartingWindow(false);
660 }
661 };
662 auto taskName = std::to_string(missionId_) + "_hot";
663 handler->PostTask(delayTask, taskName, AbilityManagerService::FOREGROUND_TIMEOUT);
664 }
665
PostCancelStartingWindowColdTask()666 void AbilityRecord::PostCancelStartingWindowColdTask()
667 {
668 if (want_.GetBoolParam(DEBUG_APP, false)) {
669 HILOG_INFO("PostCancelStartingWindowColdTask was called, debug mode, just return.");
670 return;
671 }
672 HILOG_INFO("PostCancelStartingWindowColdTask was called.");
673 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
674 CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
675
676 auto windowHandler = GetWMSHandler();
677 CHECK_POINTER_LOG(windowHandler, "PostCancelStartingWindowColdTask, Get WMS handler failed.");
678
679 auto abilityRecord(shared_from_this());
680 auto delayTask = [windowHandler, abilityRecord] {
681 if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow() &&
682 (abilityRecord->GetScheduler() == nullptr ||
683 abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING)) {
684 HILOG_INFO("PostCancelStartingWindowColdTask, call windowHandler CancelStartingWindow.");
685 windowHandler->CancelStartingWindow(abilityRecord->GetToken());
686 abilityRecord->SetStartingWindow(false);
687 }
688 };
689 auto taskName = std::to_string(missionId_) + "_cold";
690 handler->PostTask(delayTask, taskName, AbilityManagerService::LOAD_TIMEOUT);
691 }
692
GetWMSHandler() const693 sptr<IWindowManagerServiceHandler> AbilityRecord::GetWMSHandler() const
694 {
695 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
696 if (!abilityMgr) {
697 HILOG_WARN("%{public}s, Get Ability Manager Service failed.", __func__);
698 return nullptr;
699 }
700 return abilityMgr->GetWMSHandler();
701 }
702
SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> & info,const std::shared_ptr<Want> & want) const703 void AbilityRecord::SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> &info,
704 const std::shared_ptr<Want> &want) const
705 {
706 if (!want) {
707 HILOG_WARN("%{public}s, want is invalid.", __func__);
708 return;
709 }
710 auto mode = want->GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1);
711 auto displayId = want->GetIntParam(Want::PARAM_RESV_DISPLAY_ID, -1);
712 if (mode != -1) {
713 HILOG_INFO("%{public}s: origin window mode is %{public}d.", __func__, mode);
714 info->mode_ = static_cast<uint32_t>(mode);
715 }
716 if (displayId != -1) {
717 info->displayId_ = static_cast<uint64_t>(displayId);
718 }
719 }
720
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const721 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
722 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want) const
723 {
724 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
725 if (startOptions != nullptr) {
726 info->mode_ = static_cast<uint32_t>(startOptions->GetWindowMode());
727 HILOG_INFO("%{public}s: window mode is %{public}d.", __func__, info->mode_);
728 info->displayId_ = static_cast<uint64_t>(startOptions->GetDisplayID());
729 } else {
730 SetWindowModeAndDisplayId(info, want);
731 }
732 return info;
733 }
734
CreateAbilityTransitionInfo(const AbilityRequest & abilityRequest) const735 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(const AbilityRequest &abilityRequest) const
736 {
737 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
738 auto abilityStartSetting = abilityRequest.startSetting;
739 if (abilityStartSetting) {
740 auto windowMode = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_MODE_KEY);
741 auto displayId = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
742 try {
743 info->mode_ = static_cast<uint32_t>(std::stoi(windowMode));
744 info->displayId_ = static_cast<uint64_t>(std::stoi(displayId));
745 } catch (...) {
746 HILOG_WARN("windowMode: stoi(%{public}s) failed", windowMode.c_str());
747 HILOG_WARN("displayId: stoi(%{public}s) failed", displayId.c_str());
748 }
749 } else {
750 SetWindowModeAndDisplayId(info, std::make_shared<Want>(abilityRequest.want));
751 }
752 return info;
753 }
754
CreateResourceManager() const755 std::shared_ptr<Global::Resource::ResourceManager> AbilityRecord::CreateResourceManager() const
756 {
757 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
758 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
759 UErrorCode status = U_ZERO_ERROR;
760 icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
761 resConfig->SetLocaleInfo(locale);
762
763 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr(Global::Resource::CreateResourceManager());
764 resourceMgr->UpdateResConfig(*resConfig);
765
766 std::string loadPath;
767 if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
768 !abilityInfo_.hapPath.empty()) {
769 loadPath = abilityInfo_.hapPath;
770 } else {
771 loadPath = abilityInfo_.resourcePath;
772 }
773
774 if (loadPath.empty()) {
775 HILOG_WARN("Invalid app resource.");
776 return nullptr;
777 }
778
779 if (!resourceMgr->AddResource(loadPath.c_str())) {
780 HILOG_WARN("%{public}s AddResource failed.", __func__);
781 return nullptr;
782 }
783 return resourceMgr;
784 }
785
GetPixelMap(const uint32_t windowIconId,std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const786 std::shared_ptr<Media::PixelMap> AbilityRecord::GetPixelMap(const uint32_t windowIconId,
787 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const
788 {
789 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
790 if (resourceMgr == nullptr) {
791 HILOG_WARN("%{public}s resource manager does not exist.", __func__);
792 return nullptr;
793 }
794
795 Media::SourceOptions opts;
796 uint32_t errorCode = 0;
797 std::unique_ptr<Media::ImageSource> imageSource;
798 if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
799 !abilityInfo_.hapPath.empty()) { // hap is not unzip
800 std::unique_ptr<uint8_t[]> iconOut;
801 size_t len;
802 if (resourceMgr->GetMediaDataById(windowIconId, len, iconOut) != Global::Resource::RState::SUCCESS) {
803 return nullptr;
804 }
805 imageSource = Media::ImageSource::CreateImageSource(iconOut.get(), len, opts, errorCode);
806 } else { // already unzip hap
807 std::string iconPath;
808 if (resourceMgr->GetMediaById(windowIconId, iconPath) != Global::Resource::RState::SUCCESS) {
809 return nullptr;
810 }
811 imageSource = Media::ImageSource::CreateImageSource(iconPath, opts, errorCode);
812 }
813
814 if (errorCode != 0 || imageSource == nullptr) {
815 HILOG_ERROR("Failed to create icon id %{private}d err %{public}d", windowIconId, errorCode);
816 return nullptr;
817 }
818
819 Media::DecodeOptions decodeOpts;
820 auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
821 if (errorCode != 0) {
822 HILOG_ERROR("Failed to create PixelMap id %{private}d err %{public}d", windowIconId, errorCode);
823 return nullptr;
824 }
825 HILOG_DEBUG("%{public}s OUT.", __func__);
826 return std::shared_ptr<Media::PixelMap>(pixelMapPtr.release());
827 }
828
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)829 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
830 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want,
831 const AbilityRequest &abilityRequest)
832 {
833 sptr<AbilityTransitionInfo> info;
834 if (startOptions) {
835 info = CreateAbilityTransitionInfo(startOptions, want);
836 } else {
837 info = CreateAbilityTransitionInfo(abilityRequest);
838 }
839
840 SetAbilityTransitionInfo(info);
841 SetStartingWindow(true);
842 return info;
843 }
844
StartingWindowHot(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)845 void AbilityRecord::StartingWindowHot(const std::shared_ptr<StartOptions> &startOptions,
846 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
847 {
848 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
849 HILOG_INFO("%{public}s was called.", __func__);
850 auto windowHandler = GetWMSHandler();
851 if (!windowHandler) {
852 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
853 return;
854 }
855
856 auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
857 if (!pixelMap) {
858 HILOG_WARN("%{public}s, Get snapshot failed.", __func__);
859 }
860
861 auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
862 windowHandler->StartingWindow(info, pixelMap);
863 }
864
StartingWindowCold(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)865 void AbilityRecord::StartingWindowCold(const std::shared_ptr<StartOptions> &startOptions,
866 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
867 {
868 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
869 HILOG_INFO("%{public}s was called.", __func__);
870 auto windowHandler = GetWMSHandler();
871 if (!windowHandler) {
872 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
873 return;
874 }
875
876 // get bg pixelmap and color.
877 std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
878 uint32_t bgColor = 0;
879 GetColdStartingWindowResource(pixelMap, bgColor);
880
881 // start window
882 auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
883 windowHandler->StartingWindow(info, pixelMap, bgColor);
884 startingWindowBg_.reset();
885 }
886
GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> & bg,uint32_t & bgColor)887 void AbilityRecord::GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> &bg, uint32_t &bgColor)
888 {
889 bg = startingWindowBg_;
890 bgColor = bgColor_;
891 if (bg) {
892 return;
893 }
894
895 auto resourceMgr = CreateResourceManager();
896 if (!resourceMgr) {
897 HILOG_WARN("%{public}s, Get resourceMgr failed.", __func__);
898 return;
899 }
900
901 auto windowIconId = static_cast<uint32_t>(abilityInfo_.startWindowIconId);
902 bg = GetPixelMap(windowIconId, resourceMgr);
903
904 auto colorId = static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId);
905 auto colorErrval = resourceMgr->GetColorById(colorId, bgColor);
906 if (colorErrval != OHOS::Global::Resource::RState::SUCCESS) {
907 HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
908 bgColor = 0xdfffffff;
909 }
910 HILOG_DEBUG("%{public}s colorId is %{public}u, bgColor is %{public}u.", __func__, colorId, bgColor);
911 }
912
InitColdStartingWindowResource(const std::shared_ptr<Global::Resource::ResourceManager> & resourceMgr)913 void AbilityRecord::InitColdStartingWindowResource(
914 const std::shared_ptr<Global::Resource::ResourceManager> &resourceMgr)
915 {
916 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
917 if (!resourceMgr) {
918 HILOG_ERROR("invalid resourceManager.");
919 return;
920 }
921
922 startingWindowBg_ = GetPixelMap(static_cast<uint32_t>(abilityInfo_.startWindowIconId), resourceMgr);
923 if (resourceMgr->GetColorById(static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId), bgColor_) !=
924 OHOS::Global::Resource::RState::SUCCESS) {
925 HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
926 bgColor_ = 0xdfffffff;
927 }
928
929 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
930 if (startingWindowBg_ && handler) {
931 auto delayTask = [me = weak_from_this()] {
932 auto self = me.lock();
933 if (!self || !self->startingWindowBg_) {
934 return;
935 }
936 self->startingWindowBg_.reset();
937 };
938 handler->PostTask(delayTask, "release_bg", RELEASE_STARTING_BG_TIMEOUT);
939 }
940 }
941 #endif
942
BackgroundAbility(const Closure & task)943 void AbilityRecord::BackgroundAbility(const Closure &task)
944 {
945 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
946 HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityInfo_.name.c_str());
947 if (lifecycleDeal_ == nullptr) {
948 HILOG_ERROR("Move the ability to background fail, lifecycleDeal_ is null.");
949 return;
950 }
951 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
952 if (handler && task) {
953 if (!want_.GetBoolParam(DEBUG_APP, false)) {
954 g_abilityRecordEventId_++;
955 eventId_ = g_abilityRecordEventId_;
956 // eventId_ is a unique id of the task.
957 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUND_TIMEOUT);
958 } else {
959 HILOG_INFO("Is debug mode, no need to handle time out.");
960 }
961 }
962
963 if (!IsTerminating() || IsRestarting()) {
964 // schedule save ability state before moving to background.
965 SaveAbilityState();
966 }
967
968 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
969 // earlier than above actions.
970 currentState_ = AbilityState::BACKGROUNDING;
971 lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
972 }
973
TerminateAbility()974 int AbilityRecord::TerminateAbility()
975 {
976 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
977 HILOG_INFO("Schedule terminate ability to AppMs, ability:%{public}s.", abilityInfo_.name.c_str());
978 HandleDlpClosed();
979 AAFwk::EventInfo eventInfo;
980 eventInfo.bundleName = GetAbilityInfo().bundleName;
981 eventInfo.abilityName = GetAbilityInfo().name;
982 AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
983 eventInfo.errCode = DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_, clearMissionFlag_);
984 if (eventInfo.errCode != ERR_OK) {
985 AAFwk::EventReport::SendAbilityEvent(
986 AAFwk::EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
987 }
988 return eventInfo.errCode;
989 }
990
GetAbilityInfo() const991 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
992 {
993 return abilityInfo_;
994 }
995
GetApplicationInfo() const996 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
997 {
998 return applicationInfo_;
999 }
1000
GetAbilityState() const1001 AbilityState AbilityRecord::GetAbilityState() const
1002 {
1003 return currentState_;
1004 }
1005
IsForeground() const1006 bool AbilityRecord::IsForeground() const
1007 {
1008 return currentState_ == AbilityState::FOREGROUND || currentState_ == AbilityState::FOREGROUNDING;
1009 }
1010
SetAbilityState(AbilityState state)1011 void AbilityRecord::SetAbilityState(AbilityState state)
1012 {
1013 currentState_ = state;
1014 if (state == AbilityState::FOREGROUND || state == AbilityState::ACTIVE || state == AbilityState::BACKGROUND) {
1015 SetRestarting(false);
1016 }
1017 }
1018
SetScheduler(const sptr<IAbilityScheduler> & scheduler)1019 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
1020 {
1021 HILOG_INFO("%{public}s", __func__);
1022 CHECK_POINTER(lifecycleDeal_);
1023 if (scheduler != nullptr) {
1024 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1025 auto schedulerObject = scheduler_->AsObject();
1026 if (schedulerObject != nullptr) {
1027 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1028 }
1029 }
1030 if (schedulerDeathRecipient_ == nullptr) {
1031 std::weak_ptr<AbilityRecord> thisWeakPtr(shared_from_this());
1032 schedulerDeathRecipient_ =
1033 new AbilitySchedulerRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1034 auto abilityRecord = thisWeakPtr.lock();
1035 if (abilityRecord) {
1036 abilityRecord->OnSchedulerDied(remote);
1037 }
1038 });
1039 }
1040 isReady_ = true;
1041 scheduler_ = scheduler;
1042 lifecycleDeal_->SetScheduler(scheduler);
1043 auto schedulerObject = scheduler_->AsObject();
1044 if (schedulerObject != nullptr) {
1045 schedulerObject->AddDeathRecipient(schedulerDeathRecipient_);
1046 }
1047 pid_ = static_cast<int32_t>(IPCSkeleton::GetCallingPid()); // set pid when ability attach to service.
1048 HandleDlpAttached();
1049 } else {
1050 HILOG_ERROR("scheduler is nullptr");
1051 isReady_ = false;
1052 isWindowAttached_ = false;
1053 SetIsNewWant(false);
1054 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1055 auto schedulerObject = scheduler_->AsObject();
1056 if (schedulerObject != nullptr) {
1057 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1058 }
1059 }
1060 scheduler_ = scheduler;
1061 pid_ = 0;
1062 }
1063 }
1064
GetToken() const1065 sptr<Token> AbilityRecord::GetToken() const
1066 {
1067 return token_;
1068 }
1069
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1070 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1071 {
1072 preAbilityRecord_ = abilityRecord;
1073 }
1074
GetPreAbilityRecord() const1075 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
1076 {
1077 return preAbilityRecord_.lock();
1078 }
1079
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1080 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1081 {
1082 nextAbilityRecord_ = abilityRecord;
1083 }
1084
GetNextAbilityRecord() const1085 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
1086 {
1087 return nextAbilityRecord_.lock();
1088 }
1089
SetEventId(int64_t eventId)1090 void AbilityRecord::SetEventId(int64_t eventId)
1091 {
1092 eventId_ = eventId;
1093 }
1094
GetEventId() const1095 int64_t AbilityRecord::GetEventId() const
1096 {
1097 return eventId_;
1098 }
1099
IsReady() const1100 bool AbilityRecord::IsReady() const
1101 {
1102 return isReady_;
1103 }
1104
1105 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const1106 bool AbilityRecord::IsWindowAttached() const
1107 {
1108 return isWindowAttached_;
1109 }
1110 #endif
1111
IsLauncherAbility() const1112 bool AbilityRecord::IsLauncherAbility() const
1113 {
1114 return isLauncherAbility_;
1115 }
1116
IsTerminating() const1117 bool AbilityRecord::IsTerminating() const
1118 {
1119 return isTerminating_;
1120 }
1121
SetTerminatingState()1122 void AbilityRecord::SetTerminatingState()
1123 {
1124 isTerminating_ = true;
1125 }
1126
IsNewWant() const1127 bool AbilityRecord::IsNewWant() const
1128 {
1129 return lifeCycleStateInfo_.isNewWant;
1130 }
1131
SetIsNewWant(bool isNewWant)1132 void AbilityRecord::SetIsNewWant(bool isNewWant)
1133 {
1134 lifeCycleStateInfo_.isNewWant = isNewWant;
1135 }
1136
IsCreateByConnect() const1137 bool AbilityRecord::IsCreateByConnect() const
1138 {
1139 return isCreateByConnect_;
1140 }
1141
SetCreateByConnectMode()1142 void AbilityRecord::SetCreateByConnectMode()
1143 {
1144 isCreateByConnect_ = true;
1145 }
1146
Activate()1147 void AbilityRecord::Activate()
1148 {
1149 HILOG_INFO("Activate.");
1150 CHECK_POINTER(lifecycleDeal_);
1151
1152 SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, AbilityManagerService::ACTIVE_TIMEOUT);
1153
1154 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1155 // earlier than above actions.
1156 currentState_ = AbilityState::ACTIVATING;
1157 lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
1158
1159 // update ability state to appMgr service when restart
1160 if (IsNewWant()) {
1161 sptr<Token> preToken = nullptr;
1162 if (GetPreAbilityRecord()) {
1163 preToken = GetPreAbilityRecord()->GetToken();
1164 }
1165 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1166 }
1167 }
1168
Inactivate()1169 void AbilityRecord::Inactivate()
1170 {
1171 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1172 HILOG_INFO("Inactivate ability start, ability:%{public}s.", abilityInfo_.name.c_str());
1173 CHECK_POINTER(lifecycleDeal_);
1174
1175 SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
1176
1177 // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
1178 // earlier than above actions.
1179 currentState_ = AbilityState::INACTIVATING;
1180 lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_);
1181 }
1182
Terminate(const Closure & task)1183 void AbilityRecord::Terminate(const Closure &task)
1184 {
1185 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1186 HILOG_INFO("Begin to terminate ability, ability:%{public}s.", abilityInfo_.name.c_str());
1187 CHECK_POINTER(lifecycleDeal_);
1188 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1189 if (handler && task) {
1190 if (!want_.GetBoolParam(DEBUG_APP, false)) {
1191 g_abilityRecordEventId_++;
1192 eventId_ = g_abilityRecordEventId_;
1193 // eventId_ is a unique id of the task.
1194 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT);
1195 } else if (applicationInfo_.asanEnabled) {
1196 g_abilityRecordEventId_++;
1197 eventId_ = g_abilityRecordEventId_;
1198 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT_ASANENABLED);
1199 } else {
1200 HILOG_INFO("Is debug mode, no need to handle time out.");
1201 }
1202 }
1203 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1204 // earlier than above actions.
1205 currentState_ = AbilityState::TERMINATING;
1206 lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
1207 }
1208
ConnectAbility()1209 void AbilityRecord::ConnectAbility()
1210 {
1211 HILOG_INFO("Connect ability.");
1212 CHECK_POINTER(lifecycleDeal_);
1213 lifecycleDeal_->ConnectAbility(want_);
1214 }
1215
DisconnectAbility()1216 void AbilityRecord::DisconnectAbility()
1217 {
1218 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1219 HILOG_INFO("Disconnect ability, ability:%{public}s.", abilityInfo_.name.c_str());
1220 CHECK_POINTER(lifecycleDeal_);
1221 lifecycleDeal_->DisconnectAbility(want_);
1222 }
1223
CommandAbility()1224 void AbilityRecord::CommandAbility()
1225 {
1226 HILOG_INFO("Command ability, startId_:%{public}d.", startId_);
1227 CHECK_POINTER(lifecycleDeal_);
1228 lifecycleDeal_->CommandAbility(want_, false, startId_);
1229 }
1230
SaveAbilityState()1231 void AbilityRecord::SaveAbilityState()
1232 {
1233 HILOG_INFO("%{public}s", __func__);
1234 CHECK_POINTER(lifecycleDeal_);
1235 lifecycleDeal_->SaveAbilityState();
1236 }
1237
SaveAbilityState(const PacMap & inState)1238 void AbilityRecord::SaveAbilityState(const PacMap &inState)
1239 {
1240 HILOG_INFO("%{public}s : pacmap save", __func__);
1241 stateDatas_ = inState;
1242 }
1243
RestoreAbilityState()1244 void AbilityRecord::RestoreAbilityState()
1245 {
1246 HILOG_INFO("%{public}s", __func__);
1247 CHECK_POINTER(lifecycleDeal_);
1248 lifecycleDeal_->RestoreAbilityState(stateDatas_);
1249 stateDatas_.Clear();
1250 isRestarting_ = false;
1251 }
1252
SetWant(const Want & want)1253 void AbilityRecord::SetWant(const Want &want)
1254 {
1255 want_ = want;
1256 }
1257
GetWant() const1258 const Want &AbilityRecord::GetWant() const
1259 {
1260 return want_;
1261 }
1262
GetRequestCode() const1263 int AbilityRecord::GetRequestCode() const
1264 {
1265 return requestCode_;
1266 }
1267
SetResult(const std::shared_ptr<AbilityResult> & result)1268 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
1269 {
1270 result_ = result;
1271 }
1272
GetResult() const1273 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
1274 {
1275 return result_;
1276 }
1277
SendResult()1278 void AbilityRecord::SendResult()
1279 {
1280 HILOG_INFO("Send result to the caller, ability:%{public}s.", abilityInfo_.name.c_str());
1281 std::lock_guard<std::mutex> guard(lock_);
1282 CHECK_POINTER(scheduler_);
1283 CHECK_POINTER(result_);
1284 GrantUriPermission(result_->resultWant_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
1285 scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
1286 // reset result to avoid send result next time
1287 result_.reset();
1288 }
1289
SendResultToCallers()1290 void AbilityRecord::SendResultToCallers()
1291 {
1292 for (auto caller : GetCallerRecordList()) {
1293 if (caller == nullptr) {
1294 HILOG_WARN("Caller record is nullptr.");
1295 continue;
1296 }
1297 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1298 if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
1299 callerAbilityRecord->SendResult();
1300 } else {
1301 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1302 if (callerSystemAbilityRecord != nullptr) {
1303 HILOG_INFO("Send result to system ability.");
1304 callerSystemAbilityRecord->SendResultToSystemAbility(caller->GetRequestCode(),
1305 callerSystemAbilityRecord->GetResultCode(), callerSystemAbilityRecord->GetResultWant(),
1306 callerSystemAbilityRecord->GetCallerToken());
1307 }
1308 }
1309 }
1310 }
1311
SaveResultToCallers(const int resultCode,const Want * resultWant)1312 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
1313 {
1314 auto callerRecordList = GetCallerRecordList();
1315 if (callerRecordList.empty()) {
1316 HILOG_WARN("callerRecordList is empty.");
1317 return;
1318 }
1319 auto latestCaller = callerRecordList.back();
1320 for (auto caller : callerRecordList) {
1321 if (caller == nullptr) {
1322 HILOG_WARN("Caller record is nullptr.");
1323 continue;
1324 }
1325 if (caller == latestCaller) {
1326 HILOG_INFO("Caller record is the latest.");
1327 SaveResult(resultCode, resultWant, caller);
1328 continue;
1329 }
1330 SaveResult(SEND_RESULT_CANCELED, resultWant, caller);
1331 }
1332 }
1333
SaveResult(int resultCode,const Want * resultWant,std::shared_ptr<CallerRecord> caller)1334 void AbilityRecord::SaveResult(int resultCode, const Want *resultWant, std::shared_ptr<CallerRecord> caller)
1335 {
1336 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1337 if (callerAbilityRecord != nullptr) {
1338 callerAbilityRecord->SetResult(
1339 std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
1340 } else {
1341 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1342 if (callerSystemAbilityRecord != nullptr) {
1343 HILOG_INFO("Caller is system ability.");
1344 Want* newWant = const_cast<Want*>(resultWant);
1345 callerSystemAbilityRecord->SetResultToSystemAbility(callerSystemAbilityRecord, *newWant,
1346 resultCode);
1347 }
1348 }
1349 }
1350
SetResultToSystemAbility(std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,Want & resultWant,int resultCode)1351 void SystemAbilityCallerRecord::SetResultToSystemAbility(
1352 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,
1353 Want &resultWant, int resultCode)
1354 {
1355 std::vector<std::string> data;
1356 std::string srcAbilityId = callerSystemAbilityRecord->GetSrcAbilityId();
1357 SplitStr(srcAbilityId, "_", data);
1358 if (data.size() != VECTOR_SIZE) {
1359 HILOG_ERROR("Check data size failed");
1360 return;
1361 }
1362 std::string srcDeviceId = data[0];
1363 HILOG_DEBUG("Get srcDeviceId = %{public}s", srcDeviceId.c_str());
1364 int missionId = atoi(data[1].c_str());
1365 HILOG_INFO("Get missionId = %{public}d", missionId);
1366 resultWant.SetParam(DMS_SRC_NETWORK_ID, srcDeviceId);
1367 resultWant.SetParam(DMS_MISSION_ID, missionId);
1368 callerSystemAbilityRecord->SetResult(resultWant, resultCode);
1369 }
1370
SendResultToSystemAbility(int requestCode,int resultCode,Want & resultWant,const sptr<IRemoteObject> & callerToken)1371 void SystemAbilityCallerRecord::SendResultToSystemAbility(int requestCode, int resultCode, Want &resultWant,
1372 const sptr<IRemoteObject> &callerToken)
1373 {
1374 HILOG_INFO("%{public}s", __func__);
1375 int32_t callerUid = IPCSkeleton::GetCallingUid();
1376 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1377 HILOG_INFO("Try to SendResult, callerUid = %{public}d, AccessTokenId = %{public}u",
1378 callerUid, accessToken);
1379 if (callerToken == nullptr) {
1380 HILOG_ERROR("CallerToken is nullptr");
1381 return;
1382 }
1383 MessageParcel data;
1384 if (!data.WriteInterfaceToken(SYSTEM_ABILITY_TOKEN_CALLBACK)) {
1385 HILOG_ERROR("SendResultToSystemAbility Write interface token failed.");
1386 return;
1387 }
1388 if (!data.WriteParcelable(&resultWant)) {
1389 HILOG_ERROR("fail to WriteParcelable");
1390 return;
1391 }
1392 data.WriteInt32(callerUid);
1393 data.WriteInt32(requestCode);
1394 data.WriteUint32(accessToken);
1395 data.WriteInt32(resultCode);
1396 MessageParcel reply;
1397 MessageOption option(MessageOption::TF_SYNC);
1398 int result = callerToken->SendRequest(ISystemAbilityTokenCallback::SEND_RESULT, data, reply, option);
1399 if (result != ERR_OK) {
1400 HILOG_ERROR("SendResultToSystemAbility error = %{public}d", result);
1401 }
1402 }
1403
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)1404 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
1405 {
1406 CHECK_POINTER(connRecord);
1407 auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
1408 // found it
1409 if (it != connRecordList_.end()) {
1410 HILOG_DEBUG("Found it in list, so no need to add same connection");
1411 return;
1412 }
1413 // no found then add new connection to list
1414 HILOG_DEBUG("No found in list, so add new connection to list");
1415 connRecordList_.push_back(connRecord);
1416 }
1417
GetConnectRecordList() const1418 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
1419 {
1420 return connRecordList_;
1421 }
1422
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)1423 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
1424 {
1425 CHECK_POINTER(connRecord);
1426 connRecordList_.remove(connRecord);
1427 }
1428
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1429 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, std::string srcAbilityId)
1430 {
1431 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1432 HILOG_INFO("Add caller record.");
1433 if (!srcAbilityId.empty() && IsSystemAbilityCall(callerToken)) {
1434 AddSystemAbilityCallerRecord(callerToken, requestCode, srcAbilityId);
1435 return;
1436 }
1437 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1438 CHECK_POINTER(abilityRecord);
1439
1440 auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
1441 return (callerRecord->GetCaller() == abilityRecord);
1442 };
1443
1444 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1445 if (record != callerList_.end()) {
1446 callerList_.erase(record);
1447 }
1448
1449 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
1450
1451 lifeCycleStateInfo_.caller.requestCode = requestCode;
1452 lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
1453 lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1454 lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
1455 HILOG_INFO("caller %{public}s, %{public}s",
1456 abilityRecord->GetAbilityInfo().bundleName.c_str(),
1457 abilityRecord->GetAbilityInfo().name.c_str());
1458 }
1459
IsSystemAbilityCall(const sptr<IRemoteObject> & callerToken)1460 bool AbilityRecord::IsSystemAbilityCall(const sptr<IRemoteObject> &callerToken)
1461 {
1462 if (callerToken == nullptr) {
1463 return false;
1464 }
1465 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1466 if (abilityRecord != nullptr) {
1467 return false;
1468 }
1469 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
1470 bool isNativeCall = tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE;
1471 if (!isNativeCall) {
1472 HILOG_INFO("Is not native call.");
1473 return false;
1474 }
1475 AccessToken::NativeTokenInfo nativeTokenInfo;
1476 int32_t result = AccessToken::AccessTokenKit::GetNativeTokenInfo(IPCSkeleton::GetCallingTokenID(),
1477 nativeTokenInfo);
1478 if (result == ERR_OK && nativeTokenInfo.processName == DMS_PROCESS_NAME) {
1479 HILOG_INFO("Is system ability call.");
1480 return true;
1481 }
1482 return false;
1483 }
1484
AddSystemAbilityCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1485 void AbilityRecord::AddSystemAbilityCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode,
1486 std::string srcAbilityId)
1487 {
1488 HILOG_INFO("Add system ability caller record.");
1489 std::shared_ptr<SystemAbilityCallerRecord> systemAbilityRecord =
1490 std::make_shared<SystemAbilityCallerRecord>(srcAbilityId, callerToken);
1491 auto isExist = [&srcAbilityId](const std::shared_ptr<CallerRecord> &callerRecord) {
1492 std::shared_ptr<SystemAbilityCallerRecord> saCaller = callerRecord->GetSaCaller();
1493 return (saCaller != nullptr && saCaller->GetSrcAbilityId() == srcAbilityId);
1494 };
1495 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1496 if (record != callerList_.end()) {
1497 HILOG_INFO("Find same system ability caller record.");
1498 callerList_.erase(record);
1499 }
1500 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, systemAbilityRecord));
1501 HILOG_INFO("Add system ability record end.");
1502 }
1503
GetCallerRecordList() const1504 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
1505 {
1506 return callerList_;
1507 }
1508
GetCallerRecord() const1509 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
1510 {
1511 if (callerList_.empty()) {
1512 return nullptr;
1513 }
1514 return callerList_.back()->GetCaller();
1515 }
1516
IsConnectListEmpty()1517 bool AbilityRecord::IsConnectListEmpty()
1518 {
1519 return connRecordList_.empty();
1520 }
1521
GetConnectingRecord() const1522 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
1523 {
1524 auto connect =
1525 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1526 return record->GetConnectState() == ConnectionState::CONNECTING;
1527 });
1528 return (connect != connRecordList_.end()) ? *connect : nullptr;
1529 }
1530
GetConnectingRecordList()1531 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
1532 {
1533 std::list<std::shared_ptr<ConnectionRecord>> connectingList;
1534 for (auto record : connRecordList_) {
1535 if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
1536 connectingList.push_back(record);
1537 }
1538 }
1539 return connectingList;
1540 }
1541
GetDisconnectingRecord() const1542 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
1543 {
1544 auto connect =
1545 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1546 return record->GetConnectState() == ConnectionState::DISCONNECTING;
1547 });
1548 return (connect != connRecordList_.end()) ? *connect : nullptr;
1549 }
1550
GetAbilityTypeString(std::string & typeStr)1551 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
1552 {
1553 AppExecFwk::AbilityType type = GetAbilityInfo().type;
1554 switch (type) {
1555 #ifdef SUPPORT_GRAPHICS
1556 case AppExecFwk::AbilityType::PAGE: {
1557 typeStr = "PAGE";
1558 break;
1559 }
1560 #endif
1561 case AppExecFwk::AbilityType::SERVICE: {
1562 typeStr = "SERVICE";
1563 break;
1564 }
1565 // for config.json type
1566 case AppExecFwk::AbilityType::DATA: {
1567 typeStr = "DATA";
1568 break;
1569 }
1570 default: {
1571 typeStr = "UNKNOWN";
1572 break;
1573 }
1574 }
1575 }
1576
ConvertAbilityState(const AbilityState & state)1577 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
1578 {
1579 auto it = stateToStrMap.find(state);
1580 if (it != stateToStrMap.end()) {
1581 return it->second;
1582 }
1583 return "INVALIDSTATE";
1584 }
1585
ConvertAppState(const AppState & state)1586 std::string AbilityRecord::ConvertAppState(const AppState &state)
1587 {
1588 auto it = appStateToStrMap_.find(state);
1589 if (it != appStateToStrMap_.end()) {
1590 return it->second;
1591 }
1592 return "INVALIDSTATE";
1593 }
1594
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)1595 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
1596 {
1597 auto it = convertStateMap.find(state);
1598 if (it != convertStateMap.end()) {
1599 return it->second;
1600 }
1601 return DEFAULT_INVAL_VALUE;
1602 }
1603
Dump(std::vector<std::string> & info)1604 void AbilityRecord::Dump(std::vector<std::string> &info)
1605 {
1606 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1607 info.push_back(dumpInfo);
1608 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1609 info.push_back(dumpInfo);
1610 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1611 info.push_back(dumpInfo);
1612 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1613 info.push_back(dumpInfo);
1614 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1615 dumpInfo = " isKeepAlive: " + isKeepAlive;
1616 info.push_back(dumpInfo);
1617 // get ability type(unknown/page/service/provider)
1618 std::string typeStr;
1619 GetAbilityTypeString(typeStr);
1620 dumpInfo = " ability type [" + typeStr + "]";
1621 info.push_back(dumpInfo);
1622 std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1623 if (preAbility == nullptr) {
1624 dumpInfo = " previous ability app name [NULL]";
1625 dumpInfo.append("\n");
1626 dumpInfo += " previous ability file name [NULL]";
1627 } else {
1628 dumpInfo =
1629 " previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]";
1630 dumpInfo.append("\n");
1631 dumpInfo += " previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1632 }
1633 info.push_back(dumpInfo);
1634 std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1635 if (nextAbility == nullptr) {
1636 dumpInfo = " next ability app name [NULL]";
1637 dumpInfo.append("\n");
1638 dumpInfo += " next ability file name [NULL]";
1639 } else {
1640 dumpInfo =
1641 " next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]";
1642 dumpInfo.append("\n");
1643 dumpInfo += " next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1644 }
1645 info.push_back(dumpInfo);
1646 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1647 std::to_string(startTime_) + "]";
1648 info.push_back(dumpInfo);
1649 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1650 info.push_back(dumpInfo);
1651 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1652 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1653 info.push_back(dumpInfo);
1654
1655 if (isLauncherRoot_) {
1656 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1657 info.push_back(dumpInfo);
1658 }
1659 }
1660
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)1661 void AbilityRecord::DumpAbilityState(
1662 std::vector<std::string> &info, bool isClient, const std::vector<std::string> ¶ms)
1663 {
1664 HILOG_INFO("%{public}s begin.", __func__);
1665 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1666 info.push_back(dumpInfo);
1667 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1668 info.push_back(dumpInfo);
1669 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1670 info.push_back(dumpInfo);
1671 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1672 info.push_back(dumpInfo);
1673 std::string typeStr;
1674 GetAbilityTypeString(typeStr);
1675 dumpInfo = " ability type [" + typeStr + "]";
1676 info.push_back(dumpInfo);
1677
1678 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1679 std::to_string(startTime_) + "]";
1680 info.push_back(dumpInfo);
1681 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1682 info.push_back(dumpInfo);
1683 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1684 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1685 info.push_back(dumpInfo);
1686 dumpInfo = " callee connections: ";
1687 info.push_back(dumpInfo);
1688 if (callContainer_) {
1689 callContainer_->Dump(info);
1690 }
1691
1692 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1693 dumpInfo = " isKeepAlive: " + isKeepAlive;
1694 info.push_back(dumpInfo);
1695 if (isLauncherRoot_) {
1696 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1697 info.push_back(dumpInfo);
1698 }
1699
1700 // add dump client info
1701 DumpClientInfo(info, params, isClient, params.empty());
1702 }
1703
SetStartTime()1704 void AbilityRecord::SetStartTime()
1705 {
1706 if (startTime_ == 0) {
1707 startTime_ = AbilityUtil::SystemTimeMillis();
1708 }
1709 }
1710
GetStartTime() const1711 int64_t AbilityRecord::GetStartTime() const
1712 {
1713 return startTime_;
1714 }
1715
DumpService(std::vector<std::string> & info,bool isClient) const1716 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
1717 {
1718 std::vector<std::string> params;
1719 DumpService(info, params, isClient);
1720 }
1721
DumpService(std::vector<std::string> & info,std::vector<std::string> & params,bool isClient) const1722 void AbilityRecord::DumpService(std::vector<std::string> &info, std::vector<std::string> ¶ms, bool isClient) const
1723 {
1724 info.emplace_back(" AbilityRecord ID #" + std::to_string(GetRecordId()) + " state #" +
1725 AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1726 std::to_string(GetStartTime()) + "]");
1727 info.emplace_back(" main name [" + GetAbilityInfo().name + "]");
1728 info.emplace_back(" bundle name [" + GetAbilityInfo().bundleName + "]");
1729 info.emplace_back(" ability type [SERVICE]");
1730 info.emplace_back(" app state #" + AbilityRecord::ConvertAppState(appState_));
1731
1732 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1733 info.emplace_back(" isKeepAlive: " + isKeepAlive);
1734 if (isLauncherRoot_) {
1735 info.emplace_back(" can restart num #" + std::to_string(restartCount_));
1736 }
1737
1738 info.emplace_back(" Connections: " + std::to_string(connRecordList_.size()));
1739 for (auto &&conn : connRecordList_) {
1740 if (conn) {
1741 conn->Dump(info);
1742 }
1743 }
1744 // add dump client info
1745 DumpClientInfo(info, params, isClient);
1746 }
1747
OnSchedulerDied(const wptr<IRemoteObject> & remote)1748 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
1749 {
1750 HILOG_WARN("On scheduler died.");
1751 auto mission = GetMission();
1752 if (mission) {
1753 HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
1754 }
1755 std::lock_guard<std::mutex> guard(lock_);
1756 CHECK_POINTER(scheduler_);
1757
1758 auto object = remote.promote();
1759 CHECK_POINTER(object);
1760
1761 if (object != scheduler_->AsObject()) {
1762 HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
1763 return;
1764 }
1765
1766 RemoveUriPermission();
1767 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1768 auto schedulerObject = scheduler_->AsObject();
1769 if (schedulerObject != nullptr) {
1770 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1771 }
1772 }
1773 scheduler_.clear();
1774 CHECK_POINTER(lifecycleDeal_);
1775 lifecycleDeal_->SetScheduler(nullptr);
1776 isWindowAttached_ = false;
1777
1778 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1779 CHECK_POINTER(abilityManagerService);
1780
1781 auto handler = abilityManagerService->GetEventHandler();
1782 CHECK_POINTER(handler);
1783
1784 HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
1785 auto task = [abilityManagerService, ability = shared_from_this()]() {
1786 abilityManagerService->OnAbilityDied(ability);
1787 };
1788 handler->PostTask(task);
1789 auto uriTask = [want = want_, ability = shared_from_this()]() {
1790 ability->SaveResultToCallers(-1, &want);
1791 ability->SendResultToCallers();
1792 };
1793 handler->PostTask(uriTask);
1794 HandleDlpClosed();
1795 }
1796
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)1797 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
1798 {
1799 connRemoteObject_ = remoteObject;
1800 }
1801
GetConnRemoteObject() const1802 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
1803 {
1804 return connRemoteObject_;
1805 }
1806
AddStartId()1807 void AbilityRecord::AddStartId()
1808 {
1809 startId_++;
1810 }
GetStartId() const1811 int AbilityRecord::GetStartId() const
1812 {
1813 return startId_;
1814 }
1815
SetIsUninstallAbility()1816 void AbilityRecord::SetIsUninstallAbility()
1817 {
1818 isUninstall_ = true;
1819 }
1820
IsUninstallAbility() const1821 bool AbilityRecord::IsUninstallAbility() const
1822 {
1823 return isUninstall_;
1824 }
1825
SetLauncherRoot()1826 void AbilityRecord::SetLauncherRoot()
1827 {
1828 isLauncherRoot_ = true;
1829 }
1830
IsLauncherRoot() const1831 bool AbilityRecord::IsLauncherRoot() const
1832 {
1833 return isLauncherRoot_;
1834 }
1835
IsAbilityState(const AbilityState & state) const1836 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
1837 {
1838 return (currentState_ == state);
1839 }
1840
IsActiveState() const1841 bool AbilityRecord::IsActiveState() const
1842 {
1843 return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
1844 IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND) ||
1845 IsAbilityState(AbilityState::FOREGROUNDING));
1846 }
1847
SendEvent(uint32_t msg,uint32_t timeOut)1848 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut)
1849 {
1850 if (want_.GetBoolParam(DEBUG_APP, false)) {
1851 HILOG_INFO("Is debug mode, no need to handle time out.");
1852 return;
1853 }
1854 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1855 CHECK_POINTER(handler);
1856
1857 g_abilityRecordEventId_++;
1858 eventId_ = g_abilityRecordEventId_;
1859 handler->SendEvent(msg, eventId_, timeOut);
1860 }
1861
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)1862 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
1863 {
1864 lifeCycleStateInfo_.setting = setting;
1865 }
1866
GetStartSetting() const1867 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
1868 {
1869 return lifeCycleStateInfo_.setting;
1870 }
1871
SetRestarting(const bool isRestart)1872 void AbilityRecord::SetRestarting(const bool isRestart)
1873 {
1874 isRestarting_ = isRestart;
1875 HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
1876 if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1877 restartCount_ = isRestart ? (--restartCount_) : restartMax_;
1878 HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1879 }
1880 }
1881
SetRestarting(const bool isRestart,int32_t canRestartCount)1882 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canRestartCount)
1883 {
1884 isRestarting_ = isRestart;
1885 HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canRestartCount);
1886
1887 if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1888 restartCount_ = isRestart ? canRestartCount : restartMax_;
1889 HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1890 }
1891 }
1892
GetRestartCount() const1893 int32_t AbilityRecord::GetRestartCount() const
1894 {
1895 return restartCount_;
1896 }
1897
SetRestartCount(int32_t restartCount)1898 void AbilityRecord::SetRestartCount(int32_t restartCount)
1899 {
1900 restartCount_ = restartCount;
1901 }
1902
IsRestarting() const1903 bool AbilityRecord::IsRestarting() const
1904 {
1905 return isRestarting_;
1906 }
1907
SetKeepAlive()1908 void AbilityRecord::SetKeepAlive()
1909 {
1910 isKeepAlive_ = true;
1911 }
1912
GetRestartTime()1913 int64_t AbilityRecord::GetRestartTime()
1914 {
1915 return restartTime_;
1916 }
1917
SetRestartTime(const int64_t restartTime)1918 void AbilityRecord::SetRestartTime(const int64_t restartTime)
1919 {
1920 restartTime_ = restartTime;
1921 }
1922
SetAppState(const AppState & state)1923 void AbilityRecord::SetAppState(const AppState &state)
1924 {
1925 appState_ = state;
1926 }
1927
GetAppState() const1928 AppState AbilityRecord::GetAppState() const
1929 {
1930 return appState_;
1931 }
1932
SetLaunchReason(const LaunchReason & reason)1933 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
1934 {
1935 lifeCycleStateInfo_.launchParam.launchReason = reason;
1936 }
1937
SetLastExitReason(const LastExitReason & reason)1938 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
1939 {
1940 lifeCycleStateInfo_.launchParam.lastExitReason = reason;
1941 }
1942
NotifyContinuationResult(int32_t result)1943 void AbilityRecord::NotifyContinuationResult(int32_t result)
1944 {
1945 HILOG_INFO("NotifyContinuationResult.");
1946 CHECK_POINTER(lifecycleDeal_);
1947
1948 lifecycleDeal_->NotifyContinuationResult(result);
1949 }
1950
GetOwnedMissionList() const1951 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
1952 {
1953 return missionList_.lock();
1954 }
1955
SetMissionList(const std::shared_ptr<MissionList> & missionList)1956 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
1957 {
1958 missionList_ = missionList;
1959 }
1960
SetMission(const std::shared_ptr<Mission> & mission)1961 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
1962 {
1963 if (mission) {
1964 missionId_ = mission->GetMissionId();
1965 HILOG_INFO("SetMission come, missionId is %{public}d.", missionId_);
1966 }
1967 mission_ = mission;
1968 }
1969
SetMinimizeReason(bool fromUser)1970 void AbilityRecord::SetMinimizeReason(bool fromUser)
1971 {
1972 minimizeReason_ = fromUser;
1973 }
1974
SetAppIndex(const int32_t appIndex)1975 void AbilityRecord::SetAppIndex(const int32_t appIndex)
1976 {
1977 appIndex_ = appIndex;
1978 }
1979
GetAppIndex() const1980 int32_t AbilityRecord::GetAppIndex() const
1981 {
1982 return appIndex_;
1983 }
1984
IsMinimizeFromUser() const1985 bool AbilityRecord::IsMinimizeFromUser() const
1986 {
1987 return minimizeReason_;
1988 }
1989
SetClearMissionFlag(bool clearMissionFlag)1990 void AbilityRecord::SetClearMissionFlag(bool clearMissionFlag)
1991 {
1992 clearMissionFlag_= clearMissionFlag;
1993 }
1994
IsClearMissionFlag()1995 bool AbilityRecord::IsClearMissionFlag()
1996 {
1997 return clearMissionFlag_;
1998 }
1999
GetMission() const2000 std::shared_ptr<Mission> AbilityRecord::GetMission() const
2001 {
2002 return mission_.lock();
2003 }
2004
GetMissionId() const2005 int32_t AbilityRecord::GetMissionId() const
2006 {
2007 return missionId_;
2008 }
2009
SetSpecifiedFlag(const std::string & flag)2010 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
2011 {
2012 specifiedFlag_ = flag;
2013 }
2014
GetSpecifiedFlag() const2015 std::string AbilityRecord::GetSpecifiedFlag() const
2016 {
2017 return specifiedFlag_;
2018 }
2019
2020 // new version --start
IsStartedByCall() const2021 bool AbilityRecord::IsStartedByCall() const
2022 {
2023 return isStartedByCall_;
2024 }
2025
SetStartedByCall(const bool isFlag)2026 void AbilityRecord::SetStartedByCall(const bool isFlag)
2027 {
2028 isStartedByCall_ = isFlag;
2029 }
2030
IsStartToBackground() const2031 bool AbilityRecord::IsStartToBackground() const
2032 {
2033 return isStartToBackground_;
2034 }
2035
SetStartToBackground(const bool flag)2036 void AbilityRecord::SetStartToBackground(const bool flag)
2037 {
2038 isStartToBackground_ = flag;
2039 }
2040
IsStartToForeground() const2041 bool AbilityRecord::IsStartToForeground() const
2042 {
2043 return isStartToForeground_;
2044 }
2045
SetStartToForeground(const bool flag)2046 void AbilityRecord::SetStartToForeground(const bool flag)
2047 {
2048 isStartToForeground_ = flag;
2049 }
2050
CallRequest()2051 void AbilityRecord::CallRequest()
2052 {
2053 HILOG_INFO("Call Request.");
2054 CHECK_POINTER(scheduler_);
2055
2056 GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
2057 // Async call request
2058 scheduler_->CallRequest();
2059 }
2060
CallRequestDone(const sptr<IRemoteObject> & callStub) const2061 bool AbilityRecord::CallRequestDone(const sptr<IRemoteObject> &callStub) const
2062 {
2063 CHECK_POINTER_RETURN_BOOL(callContainer_);
2064 if (!callContainer_->CallRequestDone(callStub)) {
2065 HILOG_ERROR("Call request failed.");
2066 return false;
2067 }
2068 return true;
2069 }
2070
Resolve(const AbilityRequest & abilityRequest)2071 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
2072 {
2073 auto callback = abilityRequest.connect;
2074 if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
2075 HILOG_ERROR("only start by call type can create a call record.");
2076 return ResolveResultType::NG_INNER_ERROR;
2077 }
2078 if (!callContainer_) {
2079 callContainer_ = std::make_shared<CallContainer>();
2080 if (!callContainer_) {
2081 HILOG_ERROR("mark_shared error.");
2082 return ResolveResultType::NG_INNER_ERROR;
2083 }
2084 }
2085
2086 HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
2087 abilityRequest.callerUid,
2088 abilityRequest.abilityInfo.name.c_str());
2089
2090 std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
2091 if (!callRecord) {
2092 callRecord = CallRecord::CreateCallRecord(
2093 abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
2094 if (!callRecord) {
2095 HILOG_ERROR("mark_shared error.");
2096 return ResolveResultType::NG_INNER_ERROR;
2097 }
2098 }
2099
2100 callContainer_->AddCallRecord(callback, callRecord);
2101
2102 if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
2103 HILOG_DEBUG("this record has requested.");
2104 if (!callRecord->SchedulerConnectDone()) {
2105 HILOG_DEBUG("this callrecord has requested, but callback failed.");
2106 return ResolveResultType::NG_INNER_ERROR;
2107 }
2108 return ResolveResultType::OK_HAS_REMOTE_OBJ;
2109 }
2110
2111 callRecord->SetCallState(CallState::REQUESTING);
2112 return ResolveResultType::OK_NO_REMOTE_OBJ;
2113 }
2114
ReleaseCall(const sptr<IAbilityConnection> & connect)2115 bool AbilityRecord::ReleaseCall(const sptr<IAbilityConnection>& connect)
2116 {
2117 HILOG_DEBUG("ability release call record by callback.");
2118 CHECK_POINTER_RETURN_BOOL(callContainer_);
2119
2120 return callContainer_->RemoveCallRecord(connect);
2121 }
2122
IsNeedToCallRequest() const2123 bool AbilityRecord::IsNeedToCallRequest() const
2124 {
2125 HILOG_DEBUG("ability release call record by callback.");
2126 if (callContainer_ == nullptr) {
2127 return false;
2128 }
2129
2130 return callContainer_->IsNeedToCallRequest();
2131 }
2132
ContinueAbility(const std::string & deviceId,uint32_t versionCode)2133 void AbilityRecord::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
2134 {
2135 HILOG_INFO("ContinueAbility.");
2136 CHECK_POINTER(lifecycleDeal_);
2137
2138 lifecycleDeal_->ContinueAbility(deviceId, versionCode);
2139 }
2140
SetSwitchingPause(bool state)2141 void AbilityRecord::SetSwitchingPause(bool state)
2142 {
2143 isSwitchingPause_ = state;
2144 }
2145
IsSwitchingPause()2146 bool AbilityRecord::IsSwitchingPause()
2147 {
2148 return isSwitchingPause_;
2149 }
2150
SetOwnerMissionUserId(int32_t userId)2151 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
2152 {
2153 ownerMissionUserId_ = userId;
2154 }
2155
GetOwnerMissionUserId()2156 int32_t AbilityRecord::GetOwnerMissionUserId()
2157 {
2158 return ownerMissionUserId_;
2159 }
2160
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const2161 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> ¶ms,
2162 bool isClient, bool dumpConfig) const
2163 {
2164 if (!isClient || !scheduler_ || !isReady_) {
2165 HILOG_ERROR("something nullptr.");
2166 return;
2167 }
2168 std::unique_lock<std::mutex> lock(dumpLock_);
2169 scheduler_->DumpAbilityInfo(params, info);
2170
2171 HILOG_INFO("Dump begin wait.");
2172 isDumpTimeout_ = false;
2173 std::chrono::milliseconds timeout { AbilityManagerService::DUMP_TIMEOUT };
2174 if (dumpCondition_.wait_for(lock, timeout) == std::cv_status::timeout) {
2175 isDumpTimeout_ = true;
2176 }
2177 HILOG_INFO("Dump done and begin parse.");
2178 if (!isDumpTimeout_) {
2179 std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2180 for (auto one : dumpInfos_) {
2181 info.emplace_back(one);
2182 }
2183 }
2184
2185 if (!dumpConfig) {
2186 HILOG_INFO("not dumpConfig.");
2187 return;
2188 }
2189 AppExecFwk::Configuration config;
2190 if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
2191 info.emplace_back(" configuration: " + config.GetName());
2192 }
2193 }
2194
DumpAbilityInfoDone(std::vector<std::string> & infos)2195 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
2196 {
2197 HILOG_INFO("DumpAbilityInfoDone begin.");
2198 if (isDumpTimeout_) {
2199 HILOG_WARN("%{public}s, dump time out.", __func__);
2200 return;
2201 }
2202 {
2203 std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2204 dumpInfos_.clear();
2205 for (auto info : infos) {
2206 dumpInfos_.emplace_back(info);
2207 }
2208 }
2209 dumpCondition_.notify_all();
2210 }
2211
GrantUriPermission(const Want & want,int32_t userId,uint32_t targetTokenId)2212 void AbilityRecord::GrantUriPermission(const Want &want, int32_t userId, uint32_t targetTokenId)
2213 {
2214 if ((want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
2215 HILOG_WARN("Do not call uriPermissionMgr.");
2216 return;
2217 }
2218
2219 auto bms = AbilityUtil::GetBundleManager();
2220 CHECK_POINTER_IS_NULLPTR(bms);
2221 auto&& uriStr = want.GetUri().ToString();
2222 auto&& uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
2223 uriVec.emplace_back(uriStr);
2224 HILOG_DEBUG("GrantUriPermission uriVec size: %{public}zu", uriVec.size());
2225 auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2226 auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
2227 auto fromTokenId = IPCSkeleton::GetCallingTokenID();
2228 for (auto&& str : uriVec) {
2229 Uri uri(str);
2230 auto&& scheme = uri.GetScheme();
2231 HILOG_INFO("uri scheme is %{public}s.", scheme.c_str());
2232 // only support file scheme
2233 if (scheme != "file") {
2234 HILOG_WARN("only support file uri.");
2235 continue;
2236 }
2237 auto&& authority = uri.GetAuthority();
2238 HILOG_INFO("uri authority is %{public}s.", authority.c_str());
2239 AppExecFwk::BundleInfo uriBundleInfo;
2240 if (!IN_PROCESS_CALL(bms->GetBundleInfo(authority, bundleFlag, uriBundleInfo, userId))) {
2241 HILOG_WARN("To fail to get bundle info according to uri.");
2242 continue;
2243 }
2244 if (uriBundleInfo.applicationInfo.accessTokenId != fromTokenId &&
2245 uriBundleInfo.applicationInfo.accessTokenId != callerAccessTokenId_) {
2246 HILOG_ERROR("the uri does not belong to caller.");
2247 continue;
2248 }
2249 auto ret = IN_PROCESS_CALL(upmClient->GrantUriPermission(uri, want.GetFlags(),
2250 callerAccessTokenId_, targetTokenId));
2251 if (ret) {
2252 isGrantedUriPermission_ = true;
2253 }
2254 }
2255 }
2256
RemoveUriPermission()2257 void AbilityRecord::RemoveUriPermission()
2258 {
2259 if (isGrantedUriPermission_) {
2260 HILOG_DEBUG("To remove uri permission.");
2261 auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2262 upmClient->RemoveUriPermission(applicationInfo_.accessTokenId);
2263 isGrantedUriPermission_ = false;
2264 }
2265 }
2266
HandleDlpAttached()2267 void AbilityRecord::HandleDlpAttached()
2268 {
2269 if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2270 DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpManager(shared_from_this());
2271 }
2272
2273 if (appIndex_ > 0) {
2274 DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpAbility(shared_from_this());
2275 }
2276 }
2277
HandleDlpClosed()2278 void AbilityRecord::HandleDlpClosed()
2279 {
2280 if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2281 DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpManager(shared_from_this());
2282 }
2283
2284 if (appIndex_ > 0) {
2285 DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpAbility(shared_from_this());
2286 }
2287 }
2288
GetCurrentAccountId() const2289 int32_t AbilityRecord::GetCurrentAccountId() const
2290 {
2291 std::vector<int32_t> osActiveAccountIds;
2292 ErrCode ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
2293 QueryActiveOsAccountIds(osActiveAccountIds);
2294 if (ret != ERR_OK) {
2295 HILOG_ERROR("QueryActiveOsAccountIds failed.");
2296 return DEFAULT_USER_ID;
2297 }
2298 if (osActiveAccountIds.empty()) {
2299 HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
2300 return DEFAULT_USER_ID;
2301 }
2302
2303 return osActiveAccountIds.front();
2304 }
2305
SetWindowMode(int32_t windowMode)2306 void AbilityRecord::SetWindowMode(int32_t windowMode)
2307 {
2308 want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
2309 }
2310
RemoveWindowMode()2311 void AbilityRecord::RemoveWindowMode()
2312 {
2313 want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
2314 }
2315
SetPendingState(AbilityState state)2316 void AbilityRecord::SetPendingState(AbilityState state)
2317 {
2318 pendingState_.store(state);
2319 }
2320
GetPendingState() const2321 AbilityState AbilityRecord::GetPendingState() const
2322 {
2323 return pendingState_.load();
2324 }
2325
2326 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility()2327 int AbilityRecord::BlockAbility()
2328 {
2329 HILOG_INFO("BlockAbility.");
2330 if (scheduler_) {
2331 HILOG_INFO("scheduler_ begin to call BlockAbility %{public}s", __func__);
2332 return scheduler_->BlockAbility();
2333 }
2334 return ERR_NO_INIT;
2335 }
2336 #endif
2337
IsNeedBackToOtherMissionStack()2338 bool AbilityRecord::IsNeedBackToOtherMissionStack()
2339 {
2340 return isNeedBackToOtherMissionStack_;
2341 }
2342
SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)2343 void AbilityRecord::SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)
2344 {
2345 isNeedBackToOtherMissionStack_ = isNeedBackToOtherMissionStack;
2346 }
2347
GetOtherMissionStackAbilityRecord() const2348 std::shared_ptr<AbilityRecord> AbilityRecord::GetOtherMissionStackAbilityRecord() const
2349 {
2350 return otherMissionStackAbilityRecord_.lock();
2351 }
2352
SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)2353 void AbilityRecord::SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2354 {
2355 otherMissionStackAbilityRecord_ = abilityRecord;
2356 }
2357 } // namespace AAFwk
2358 } // namespace OHOS
2359