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 if (applicationInfo_.asanEnabled) {
691 handler->PostTask(delayTask, taskName, AbilityManagerService::LOAD_TIMEOUT_ASANENABLED);
692 } else {
693 handler->PostTask(delayTask, taskName, AbilityManagerService::LOAD_TIMEOUT);
694 }
695 }
696
GetWMSHandler() const697 sptr<IWindowManagerServiceHandler> AbilityRecord::GetWMSHandler() const
698 {
699 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
700 if (!abilityMgr) {
701 HILOG_WARN("%{public}s, Get Ability Manager Service failed.", __func__);
702 return nullptr;
703 }
704 return abilityMgr->GetWMSHandler();
705 }
706
SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> & info,const std::shared_ptr<Want> & want) const707 void AbilityRecord::SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> &info,
708 const std::shared_ptr<Want> &want) const
709 {
710 if (!want) {
711 HILOG_WARN("%{public}s, want is invalid.", __func__);
712 return;
713 }
714 auto mode = want->GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1);
715 auto displayId = want->GetIntParam(Want::PARAM_RESV_DISPLAY_ID, -1);
716 if (mode != -1) {
717 HILOG_INFO("%{public}s: origin window mode is %{public}d.", __func__, mode);
718 info->mode_ = static_cast<uint32_t>(mode);
719 }
720 if (displayId != -1) {
721 info->displayId_ = static_cast<uint64_t>(displayId);
722 }
723 }
724
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want) const725 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
726 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want) const
727 {
728 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
729 if (startOptions != nullptr) {
730 info->mode_ = static_cast<uint32_t>(startOptions->GetWindowMode());
731 HILOG_INFO("%{public}s: window mode is %{public}d.", __func__, info->mode_);
732 info->displayId_ = static_cast<uint64_t>(startOptions->GetDisplayID());
733 } else {
734 SetWindowModeAndDisplayId(info, want);
735 }
736 return info;
737 }
738
CreateAbilityTransitionInfo(const AbilityRequest & abilityRequest) const739 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(const AbilityRequest &abilityRequest) const
740 {
741 sptr<AbilityTransitionInfo> info = new AbilityTransitionInfo();
742 auto abilityStartSetting = abilityRequest.startSetting;
743 if (abilityStartSetting) {
744 auto windowMode = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_MODE_KEY);
745 auto displayId = abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
746 try {
747 info->mode_ = static_cast<uint32_t>(std::stoi(windowMode));
748 info->displayId_ = static_cast<uint64_t>(std::stoi(displayId));
749 } catch (...) {
750 HILOG_WARN("windowMode: stoi(%{public}s) failed", windowMode.c_str());
751 HILOG_WARN("displayId: stoi(%{public}s) failed", displayId.c_str());
752 }
753 } else {
754 SetWindowModeAndDisplayId(info, std::make_shared<Want>(abilityRequest.want));
755 }
756 return info;
757 }
758
CreateResourceManager() const759 std::shared_ptr<Global::Resource::ResourceManager> AbilityRecord::CreateResourceManager() const
760 {
761 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
762 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
763 UErrorCode status = U_ZERO_ERROR;
764 icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
765 resConfig->SetLocaleInfo(locale);
766
767 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr(Global::Resource::CreateResourceManager());
768 resourceMgr->UpdateResConfig(*resConfig);
769
770 std::string loadPath;
771 if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
772 !abilityInfo_.hapPath.empty()) {
773 loadPath = abilityInfo_.hapPath;
774 } else {
775 loadPath = abilityInfo_.resourcePath;
776 }
777
778 if (loadPath.empty()) {
779 HILOG_WARN("Invalid app resource.");
780 return nullptr;
781 }
782
783 if (!resourceMgr->AddResource(loadPath.c_str())) {
784 HILOG_WARN("%{public}s AddResource failed.", __func__);
785 return nullptr;
786 }
787 return resourceMgr;
788 }
789
GetPixelMap(const uint32_t windowIconId,std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const790 std::shared_ptr<Media::PixelMap> AbilityRecord::GetPixelMap(const uint32_t windowIconId,
791 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const
792 {
793 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
794 if (resourceMgr == nullptr) {
795 HILOG_WARN("%{public}s resource manager does not exist.", __func__);
796 return nullptr;
797 }
798
799 Media::SourceOptions opts;
800 uint32_t errorCode = 0;
801 std::unique_ptr<Media::ImageSource> imageSource;
802 if (system::GetBoolParameter(AbilityRuntime::Constants::COMPRESS_PROPERTY, false) &&
803 !abilityInfo_.hapPath.empty()) { // hap is not unzip
804 std::unique_ptr<uint8_t[]> iconOut;
805 size_t len;
806 if (resourceMgr->GetMediaDataById(windowIconId, len, iconOut) != Global::Resource::RState::SUCCESS) {
807 return nullptr;
808 }
809 imageSource = Media::ImageSource::CreateImageSource(iconOut.get(), len, opts, errorCode);
810 } else { // already unzip hap
811 std::string iconPath;
812 if (resourceMgr->GetMediaById(windowIconId, iconPath) != Global::Resource::RState::SUCCESS) {
813 return nullptr;
814 }
815 imageSource = Media::ImageSource::CreateImageSource(iconPath, opts, errorCode);
816 }
817
818 if (errorCode != 0 || imageSource == nullptr) {
819 HILOG_ERROR("Failed to create icon id %{private}d err %{public}d", windowIconId, errorCode);
820 return nullptr;
821 }
822
823 Media::DecodeOptions decodeOpts;
824 auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
825 if (errorCode != 0) {
826 HILOG_ERROR("Failed to create PixelMap id %{private}d err %{public}d", windowIconId, errorCode);
827 return nullptr;
828 }
829 HILOG_DEBUG("%{public}s OUT.", __func__);
830 return std::shared_ptr<Media::PixelMap>(pixelMapPtr.release());
831 }
832
CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)833 sptr<AbilityTransitionInfo> AbilityRecord::CreateAbilityTransitionInfo(
834 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want,
835 const AbilityRequest &abilityRequest)
836 {
837 sptr<AbilityTransitionInfo> info;
838 if (startOptions) {
839 info = CreateAbilityTransitionInfo(startOptions, want);
840 } else {
841 info = CreateAbilityTransitionInfo(abilityRequest);
842 }
843
844 SetAbilityTransitionInfo(info);
845 SetStartingWindow(true);
846 return info;
847 }
848
StartingWindowHot(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)849 void AbilityRecord::StartingWindowHot(const std::shared_ptr<StartOptions> &startOptions,
850 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
851 {
852 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
853 HILOG_INFO("%{public}s was called.", __func__);
854 auto windowHandler = GetWMSHandler();
855 if (!windowHandler) {
856 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
857 return;
858 }
859
860 auto pixelMap = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId_);
861 if (!pixelMap) {
862 HILOG_WARN("%{public}s, Get snapshot failed.", __func__);
863 }
864
865 auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
866 windowHandler->StartingWindow(info, pixelMap);
867 }
868
StartingWindowCold(const std::shared_ptr<StartOptions> & startOptions,const std::shared_ptr<Want> & want,const AbilityRequest & abilityRequest)869 void AbilityRecord::StartingWindowCold(const std::shared_ptr<StartOptions> &startOptions,
870 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest)
871 {
872 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
873 HILOG_INFO("%{public}s was called.", __func__);
874 auto windowHandler = GetWMSHandler();
875 if (!windowHandler) {
876 HILOG_WARN("%{public}s, Get WMS handler failed.", __func__);
877 return;
878 }
879
880 // get bg pixelmap and color.
881 std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
882 uint32_t bgColor = 0;
883 GetColdStartingWindowResource(pixelMap, bgColor);
884
885 // start window
886 auto info = CreateAbilityTransitionInfo(startOptions, want, abilityRequest);
887 windowHandler->StartingWindow(info, pixelMap, bgColor);
888 startingWindowBg_.reset();
889 }
890
GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> & bg,uint32_t & bgColor)891 void AbilityRecord::GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> &bg, uint32_t &bgColor)
892 {
893 bg = startingWindowBg_;
894 bgColor = bgColor_;
895 if (bg) {
896 return;
897 }
898
899 auto resourceMgr = CreateResourceManager();
900 if (!resourceMgr) {
901 HILOG_WARN("%{public}s, Get resourceMgr failed.", __func__);
902 return;
903 }
904
905 auto windowIconId = static_cast<uint32_t>(abilityInfo_.startWindowIconId);
906 bg = GetPixelMap(windowIconId, resourceMgr);
907
908 auto colorId = static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId);
909 auto colorErrval = resourceMgr->GetColorById(colorId, bgColor);
910 if (colorErrval != OHOS::Global::Resource::RState::SUCCESS) {
911 HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
912 bgColor = 0xdfffffff;
913 }
914 HILOG_DEBUG("%{public}s colorId is %{public}u, bgColor is %{public}u.", __func__, colorId, bgColor);
915 }
916
InitColdStartingWindowResource(const std::shared_ptr<Global::Resource::ResourceManager> & resourceMgr)917 void AbilityRecord::InitColdStartingWindowResource(
918 const std::shared_ptr<Global::Resource::ResourceManager> &resourceMgr)
919 {
920 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
921 if (!resourceMgr) {
922 HILOG_ERROR("invalid resourceManager.");
923 return;
924 }
925
926 startingWindowBg_ = GetPixelMap(static_cast<uint32_t>(abilityInfo_.startWindowIconId), resourceMgr);
927 if (resourceMgr->GetColorById(static_cast<uint32_t>(abilityInfo_.startWindowBackgroundId), bgColor_) !=
928 OHOS::Global::Resource::RState::SUCCESS) {
929 HILOG_WARN("%{public}s. Failed to GetColorById.", __func__);
930 bgColor_ = 0xdfffffff;
931 }
932
933 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
934 if (startingWindowBg_ && handler) {
935 auto delayTask = [me = weak_from_this()] {
936 auto self = me.lock();
937 if (!self || !self->startingWindowBg_) {
938 return;
939 }
940 self->startingWindowBg_.reset();
941 };
942 handler->PostTask(delayTask, "release_bg", RELEASE_STARTING_BG_TIMEOUT);
943 }
944 }
945
SetCompleteFirstFrameDrawing(const bool flag)946 void AbilityRecord::SetCompleteFirstFrameDrawing(const bool flag)
947 {
948 isCompleteFirstFrameDrawing_ = flag;
949 }
950
IsCompleteFirstFrameDrawing() const951 bool AbilityRecord::IsCompleteFirstFrameDrawing() const
952 {
953 return isCompleteFirstFrameDrawing_;
954 }
955 #endif
956
BackgroundAbility(const Closure & task)957 void AbilityRecord::BackgroundAbility(const Closure &task)
958 {
959 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
960 HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityInfo_.name.c_str());
961 if (lifecycleDeal_ == nullptr) {
962 HILOG_ERROR("Move the ability to background fail, lifecycleDeal_ is null.");
963 return;
964 }
965 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
966 if (handler && task) {
967 if (!want_.GetBoolParam(DEBUG_APP, false)) {
968 g_abilityRecordEventId_++;
969 eventId_ = g_abilityRecordEventId_;
970 // eventId_ is a unique id of the task.
971 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUND_TIMEOUT);
972 } else {
973 HILOG_INFO("Is debug mode, no need to handle time out.");
974 }
975 }
976
977 if (!IsTerminating() || IsRestarting()) {
978 // schedule save ability state before moving to background.
979 SaveAbilityState();
980 }
981
982 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
983 // earlier than above actions.
984 currentState_ = AbilityState::BACKGROUNDING;
985 lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
986 }
987
TerminateAbility()988 int AbilityRecord::TerminateAbility()
989 {
990 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
991 HILOG_INFO("Schedule terminate ability to AppMs, ability:%{public}s.", abilityInfo_.name.c_str());
992 HandleDlpClosed();
993 AAFwk::EventInfo eventInfo;
994 eventInfo.bundleName = GetAbilityInfo().bundleName;
995 eventInfo.abilityName = GetAbilityInfo().name;
996 AAFwk::EventReport::SendAbilityEvent(AAFwk::EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
997 eventInfo.errCode = DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_, clearMissionFlag_);
998 if (eventInfo.errCode != ERR_OK) {
999 AAFwk::EventReport::SendAbilityEvent(
1000 AAFwk::EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1001 }
1002 return eventInfo.errCode;
1003 }
1004
GetAbilityInfo() const1005 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
1006 {
1007 return abilityInfo_;
1008 }
1009
GetApplicationInfo() const1010 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
1011 {
1012 return applicationInfo_;
1013 }
1014
GetAbilityState() const1015 AbilityState AbilityRecord::GetAbilityState() const
1016 {
1017 return currentState_;
1018 }
1019
IsForeground() const1020 bool AbilityRecord::IsForeground() const
1021 {
1022 return currentState_ == AbilityState::FOREGROUND || currentState_ == AbilityState::FOREGROUNDING;
1023 }
1024
SetAbilityState(AbilityState state)1025 void AbilityRecord::SetAbilityState(AbilityState state)
1026 {
1027 currentState_ = state;
1028 if (state == AbilityState::FOREGROUND || state == AbilityState::ACTIVE || state == AbilityState::BACKGROUND) {
1029 SetRestarting(false);
1030 }
1031 }
1032
SetScheduler(const sptr<IAbilityScheduler> & scheduler)1033 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
1034 {
1035 HILOG_INFO("%{public}s", __func__);
1036 CHECK_POINTER(lifecycleDeal_);
1037 if (scheduler != nullptr) {
1038 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1039 auto schedulerObject = scheduler_->AsObject();
1040 if (schedulerObject != nullptr) {
1041 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1042 }
1043 }
1044 if (schedulerDeathRecipient_ == nullptr) {
1045 std::weak_ptr<AbilityRecord> thisWeakPtr(shared_from_this());
1046 schedulerDeathRecipient_ =
1047 new AbilitySchedulerRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1048 auto abilityRecord = thisWeakPtr.lock();
1049 if (abilityRecord) {
1050 abilityRecord->OnSchedulerDied(remote);
1051 }
1052 });
1053 }
1054 isReady_ = true;
1055 scheduler_ = scheduler;
1056 lifecycleDeal_->SetScheduler(scheduler);
1057 auto schedulerObject = scheduler_->AsObject();
1058 if (schedulerObject != nullptr) {
1059 schedulerObject->AddDeathRecipient(schedulerDeathRecipient_);
1060 }
1061 pid_ = static_cast<int32_t>(IPCSkeleton::GetCallingPid()); // set pid when ability attach to service.
1062 HandleDlpAttached();
1063 } else {
1064 HILOG_ERROR("scheduler is nullptr");
1065 isReady_ = false;
1066 isWindowAttached_ = false;
1067 SetIsNewWant(false);
1068 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1069 auto schedulerObject = scheduler_->AsObject();
1070 if (schedulerObject != nullptr) {
1071 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1072 }
1073 }
1074 scheduler_ = scheduler;
1075 pid_ = 0;
1076 }
1077 }
1078
GetToken() const1079 sptr<Token> AbilityRecord::GetToken() const
1080 {
1081 return token_;
1082 }
1083
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1084 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1085 {
1086 preAbilityRecord_ = abilityRecord;
1087 }
1088
GetPreAbilityRecord() const1089 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
1090 {
1091 return preAbilityRecord_.lock();
1092 }
1093
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)1094 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
1095 {
1096 nextAbilityRecord_ = abilityRecord;
1097 }
1098
GetNextAbilityRecord() const1099 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
1100 {
1101 return nextAbilityRecord_.lock();
1102 }
1103
SetEventId(int64_t eventId)1104 void AbilityRecord::SetEventId(int64_t eventId)
1105 {
1106 eventId_ = eventId;
1107 }
1108
GetEventId() const1109 int64_t AbilityRecord::GetEventId() const
1110 {
1111 return eventId_;
1112 }
1113
IsReady() const1114 bool AbilityRecord::IsReady() const
1115 {
1116 return isReady_;
1117 }
1118
1119 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const1120 bool AbilityRecord::IsWindowAttached() const
1121 {
1122 return isWindowAttached_;
1123 }
1124 #endif
1125
IsLauncherAbility() const1126 bool AbilityRecord::IsLauncherAbility() const
1127 {
1128 return isLauncherAbility_;
1129 }
1130
IsTerminating() const1131 bool AbilityRecord::IsTerminating() const
1132 {
1133 return isTerminating_;
1134 }
1135
SetTerminatingState()1136 void AbilityRecord::SetTerminatingState()
1137 {
1138 isTerminating_ = true;
1139 }
1140
IsNewWant() const1141 bool AbilityRecord::IsNewWant() const
1142 {
1143 return lifeCycleStateInfo_.isNewWant;
1144 }
1145
SetIsNewWant(bool isNewWant)1146 void AbilityRecord::SetIsNewWant(bool isNewWant)
1147 {
1148 lifeCycleStateInfo_.isNewWant = isNewWant;
1149 }
1150
IsCreateByConnect() const1151 bool AbilityRecord::IsCreateByConnect() const
1152 {
1153 return isCreateByConnect_;
1154 }
1155
SetCreateByConnectMode()1156 void AbilityRecord::SetCreateByConnectMode()
1157 {
1158 isCreateByConnect_ = true;
1159 }
1160
Activate()1161 void AbilityRecord::Activate()
1162 {
1163 HILOG_INFO("Activate.");
1164 CHECK_POINTER(lifecycleDeal_);
1165
1166 SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, AbilityManagerService::ACTIVE_TIMEOUT);
1167
1168 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1169 // earlier than above actions.
1170 currentState_ = AbilityState::ACTIVATING;
1171 lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
1172
1173 // update ability state to appMgr service when restart
1174 if (IsNewWant()) {
1175 sptr<Token> preToken = nullptr;
1176 if (GetPreAbilityRecord()) {
1177 preToken = GetPreAbilityRecord()->GetToken();
1178 }
1179 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1180 }
1181 }
1182
Inactivate()1183 void AbilityRecord::Inactivate()
1184 {
1185 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1186 HILOG_INFO("Inactivate ability start, ability:%{public}s.", abilityInfo_.name.c_str());
1187 CHECK_POINTER(lifecycleDeal_);
1188
1189 SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
1190
1191 // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
1192 // earlier than above actions.
1193 currentState_ = AbilityState::INACTIVATING;
1194 lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_);
1195 }
1196
Terminate(const Closure & task)1197 void AbilityRecord::Terminate(const Closure &task)
1198 {
1199 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1200 HILOG_INFO("Begin to terminate ability, ability:%{public}s.", abilityInfo_.name.c_str());
1201 CHECK_POINTER(lifecycleDeal_);
1202 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1203 if (handler && task) {
1204 if (!want_.GetBoolParam(DEBUG_APP, false)) {
1205 g_abilityRecordEventId_++;
1206 eventId_ = g_abilityRecordEventId_;
1207 // eventId_ is a unique id of the task.
1208 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT);
1209 } else if (applicationInfo_.asanEnabled) {
1210 g_abilityRecordEventId_++;
1211 eventId_ = g_abilityRecordEventId_;
1212 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT_ASANENABLED);
1213 } else {
1214 HILOG_INFO("Is debug mode, no need to handle time out.");
1215 }
1216 }
1217 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1218 // earlier than above actions.
1219 currentState_ = AbilityState::TERMINATING;
1220 lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
1221 }
1222
ConnectAbility()1223 void AbilityRecord::ConnectAbility()
1224 {
1225 HILOG_INFO("Connect ability.");
1226 CHECK_POINTER(lifecycleDeal_);
1227 lifecycleDeal_->ConnectAbility(want_);
1228 }
1229
DisconnectAbility()1230 void AbilityRecord::DisconnectAbility()
1231 {
1232 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1233 HILOG_INFO("Disconnect ability, ability:%{public}s.", abilityInfo_.name.c_str());
1234 CHECK_POINTER(lifecycleDeal_);
1235 lifecycleDeal_->DisconnectAbility(want_);
1236 }
1237
CommandAbility()1238 void AbilityRecord::CommandAbility()
1239 {
1240 HILOG_INFO("Command ability, startId_:%{public}d.", startId_);
1241 CHECK_POINTER(lifecycleDeal_);
1242 lifecycleDeal_->CommandAbility(want_, false, startId_);
1243 }
1244
SaveAbilityState()1245 void AbilityRecord::SaveAbilityState()
1246 {
1247 HILOG_INFO("%{public}s", __func__);
1248 CHECK_POINTER(lifecycleDeal_);
1249 lifecycleDeal_->SaveAbilityState();
1250 }
1251
SaveAbilityState(const PacMap & inState)1252 void AbilityRecord::SaveAbilityState(const PacMap &inState)
1253 {
1254 HILOG_INFO("%{public}s : pacmap save", __func__);
1255 stateDatas_ = inState;
1256 }
1257
RestoreAbilityState()1258 void AbilityRecord::RestoreAbilityState()
1259 {
1260 HILOG_INFO("%{public}s", __func__);
1261 CHECK_POINTER(lifecycleDeal_);
1262 lifecycleDeal_->RestoreAbilityState(stateDatas_);
1263 stateDatas_.Clear();
1264 isRestarting_ = false;
1265 }
1266
SetWant(const Want & want)1267 void AbilityRecord::SetWant(const Want &want)
1268 {
1269 want_ = want;
1270 }
1271
GetWant() const1272 const Want &AbilityRecord::GetWant() const
1273 {
1274 return want_;
1275 }
1276
GetRequestCode() const1277 int AbilityRecord::GetRequestCode() const
1278 {
1279 return requestCode_;
1280 }
1281
SetResult(const std::shared_ptr<AbilityResult> & result)1282 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
1283 {
1284 result_ = result;
1285 }
1286
GetResult() const1287 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
1288 {
1289 return result_;
1290 }
1291
SendResult()1292 void AbilityRecord::SendResult()
1293 {
1294 HILOG_INFO("Send result to the caller, ability:%{public}s.", abilityInfo_.name.c_str());
1295 std::lock_guard<std::mutex> guard(lock_);
1296 CHECK_POINTER(scheduler_);
1297 CHECK_POINTER(result_);
1298 GrantUriPermission(result_->resultWant_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
1299 scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
1300 // reset result to avoid send result next time
1301 result_.reset();
1302 }
1303
SendResultToCallers()1304 void AbilityRecord::SendResultToCallers()
1305 {
1306 for (auto caller : GetCallerRecordList()) {
1307 if (caller == nullptr) {
1308 HILOG_WARN("Caller record is nullptr.");
1309 continue;
1310 }
1311 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1312 if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
1313 callerAbilityRecord->SendResult();
1314 } else {
1315 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1316 if (callerSystemAbilityRecord != nullptr) {
1317 HILOG_INFO("Send result to system ability.");
1318 callerSystemAbilityRecord->SendResultToSystemAbility(caller->GetRequestCode(),
1319 callerSystemAbilityRecord->GetResultCode(), callerSystemAbilityRecord->GetResultWant(),
1320 callerSystemAbilityRecord->GetCallerToken());
1321 }
1322 }
1323 }
1324 }
1325
SaveResultToCallers(const int resultCode,const Want * resultWant)1326 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
1327 {
1328 auto callerRecordList = GetCallerRecordList();
1329 if (callerRecordList.empty()) {
1330 HILOG_WARN("callerRecordList is empty.");
1331 return;
1332 }
1333 auto latestCaller = callerRecordList.back();
1334 for (auto caller : callerRecordList) {
1335 if (caller == nullptr) {
1336 HILOG_WARN("Caller record is nullptr.");
1337 continue;
1338 }
1339 if (caller == latestCaller) {
1340 HILOG_INFO("Caller record is the latest.");
1341 SaveResult(resultCode, resultWant, caller);
1342 continue;
1343 }
1344 SaveResult(SEND_RESULT_CANCELED, resultWant, caller);
1345 }
1346 }
1347
SaveResult(int resultCode,const Want * resultWant,std::shared_ptr<CallerRecord> caller)1348 void AbilityRecord::SaveResult(int resultCode, const Want *resultWant, std::shared_ptr<CallerRecord> caller)
1349 {
1350 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
1351 if (callerAbilityRecord != nullptr) {
1352 callerAbilityRecord->SetResult(
1353 std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
1354 } else {
1355 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord = caller->GetSaCaller();
1356 if (callerSystemAbilityRecord != nullptr) {
1357 HILOG_INFO("Caller is system ability.");
1358 Want* newWant = const_cast<Want*>(resultWant);
1359 callerSystemAbilityRecord->SetResultToSystemAbility(callerSystemAbilityRecord, *newWant,
1360 resultCode);
1361 }
1362 }
1363 }
1364
SetResultToSystemAbility(std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,Want & resultWant,int resultCode)1365 void SystemAbilityCallerRecord::SetResultToSystemAbility(
1366 std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord,
1367 Want &resultWant, int resultCode)
1368 {
1369 std::vector<std::string> data;
1370 std::string srcAbilityId = callerSystemAbilityRecord->GetSrcAbilityId();
1371 SplitStr(srcAbilityId, "_", data);
1372 if (data.size() != VECTOR_SIZE) {
1373 HILOG_ERROR("Check data size failed");
1374 return;
1375 }
1376 std::string srcDeviceId = data[0];
1377 HILOG_DEBUG("Get srcDeviceId = %{public}s", srcDeviceId.c_str());
1378 int missionId = atoi(data[1].c_str());
1379 HILOG_INFO("Get missionId = %{public}d", missionId);
1380 resultWant.SetParam(DMS_SRC_NETWORK_ID, srcDeviceId);
1381 resultWant.SetParam(DMS_MISSION_ID, missionId);
1382 callerSystemAbilityRecord->SetResult(resultWant, resultCode);
1383 }
1384
SendResultToSystemAbility(int requestCode,int resultCode,Want & resultWant,const sptr<IRemoteObject> & callerToken)1385 void SystemAbilityCallerRecord::SendResultToSystemAbility(int requestCode, int resultCode, Want &resultWant,
1386 const sptr<IRemoteObject> &callerToken)
1387 {
1388 HILOG_INFO("%{public}s", __func__);
1389 int32_t callerUid = IPCSkeleton::GetCallingUid();
1390 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1391 HILOG_INFO("Try to SendResult, callerUid = %{public}d, AccessTokenId = %{public}u",
1392 callerUid, accessToken);
1393 if (callerToken == nullptr) {
1394 HILOG_ERROR("CallerToken is nullptr");
1395 return;
1396 }
1397 MessageParcel data;
1398 if (!data.WriteInterfaceToken(SYSTEM_ABILITY_TOKEN_CALLBACK)) {
1399 HILOG_ERROR("SendResultToSystemAbility Write interface token failed.");
1400 return;
1401 }
1402 if (!data.WriteParcelable(&resultWant)) {
1403 HILOG_ERROR("fail to WriteParcelable");
1404 return;
1405 }
1406 data.WriteInt32(callerUid);
1407 data.WriteInt32(requestCode);
1408 data.WriteUint32(accessToken);
1409 data.WriteInt32(resultCode);
1410 MessageParcel reply;
1411 MessageOption option(MessageOption::TF_SYNC);
1412 int result = callerToken->SendRequest(ISystemAbilityTokenCallback::SEND_RESULT, data, reply, option);
1413 if (result != ERR_OK) {
1414 HILOG_ERROR("SendResultToSystemAbility error = %{public}d", result);
1415 }
1416 }
1417
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)1418 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
1419 {
1420 CHECK_POINTER(connRecord);
1421 auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
1422 // found it
1423 if (it != connRecordList_.end()) {
1424 HILOG_DEBUG("Found it in list, so no need to add same connection");
1425 return;
1426 }
1427 // no found then add new connection to list
1428 HILOG_DEBUG("No found in list, so add new connection to list");
1429 connRecordList_.push_back(connRecord);
1430 }
1431
GetConnectRecordList() const1432 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
1433 {
1434 return connRecordList_;
1435 }
1436
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)1437 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
1438 {
1439 CHECK_POINTER(connRecord);
1440 connRecordList_.remove(connRecord);
1441 }
1442
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1443 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, std::string srcAbilityId)
1444 {
1445 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1446 HILOG_INFO("Add caller record.");
1447 if (!srcAbilityId.empty() && IsSystemAbilityCall(callerToken)) {
1448 AddSystemAbilityCallerRecord(callerToken, requestCode, srcAbilityId);
1449 return;
1450 }
1451 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1452 CHECK_POINTER(abilityRecord);
1453
1454 auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
1455 return (callerRecord->GetCaller() == abilityRecord);
1456 };
1457
1458 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1459 if (record != callerList_.end()) {
1460 callerList_.erase(record);
1461 }
1462
1463 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
1464
1465 lifeCycleStateInfo_.caller.requestCode = requestCode;
1466 lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
1467 lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1468 lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
1469 HILOG_INFO("caller %{public}s, %{public}s",
1470 abilityRecord->GetAbilityInfo().bundleName.c_str(),
1471 abilityRecord->GetAbilityInfo().name.c_str());
1472 }
1473
IsSystemAbilityCall(const sptr<IRemoteObject> & callerToken)1474 bool AbilityRecord::IsSystemAbilityCall(const sptr<IRemoteObject> &callerToken)
1475 {
1476 if (callerToken == nullptr) {
1477 return false;
1478 }
1479 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1480 if (abilityRecord != nullptr) {
1481 return false;
1482 }
1483 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
1484 bool isNativeCall = tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE;
1485 if (!isNativeCall) {
1486 HILOG_INFO("Is not native call.");
1487 return false;
1488 }
1489 AccessToken::NativeTokenInfo nativeTokenInfo;
1490 int32_t result = AccessToken::AccessTokenKit::GetNativeTokenInfo(IPCSkeleton::GetCallingTokenID(),
1491 nativeTokenInfo);
1492 if (result == ERR_OK && nativeTokenInfo.processName == DMS_PROCESS_NAME) {
1493 HILOG_INFO("Is system ability call.");
1494 return true;
1495 }
1496 return false;
1497 }
1498
AddSystemAbilityCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode,std::string srcAbilityId)1499 void AbilityRecord::AddSystemAbilityCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode,
1500 std::string srcAbilityId)
1501 {
1502 HILOG_INFO("Add system ability caller record.");
1503 std::shared_ptr<SystemAbilityCallerRecord> systemAbilityRecord =
1504 std::make_shared<SystemAbilityCallerRecord>(srcAbilityId, callerToken);
1505 auto isExist = [&srcAbilityId](const std::shared_ptr<CallerRecord> &callerRecord) {
1506 std::shared_ptr<SystemAbilityCallerRecord> saCaller = callerRecord->GetSaCaller();
1507 return (saCaller != nullptr && saCaller->GetSrcAbilityId() == srcAbilityId);
1508 };
1509 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
1510 if (record != callerList_.end()) {
1511 HILOG_INFO("Find same system ability caller record.");
1512 callerList_.erase(record);
1513 }
1514 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, systemAbilityRecord));
1515 HILOG_INFO("Add system ability record end.");
1516 }
1517
GetCallerRecordList() const1518 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
1519 {
1520 return callerList_;
1521 }
1522
GetCallerRecord() const1523 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
1524 {
1525 if (callerList_.empty()) {
1526 return nullptr;
1527 }
1528 return callerList_.back()->GetCaller();
1529 }
1530
IsConnectListEmpty()1531 bool AbilityRecord::IsConnectListEmpty()
1532 {
1533 return connRecordList_.empty();
1534 }
1535
GetConnectingRecord() const1536 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
1537 {
1538 auto connect =
1539 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1540 return record->GetConnectState() == ConnectionState::CONNECTING;
1541 });
1542 return (connect != connRecordList_.end()) ? *connect : nullptr;
1543 }
1544
GetConnectingRecordList()1545 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
1546 {
1547 std::list<std::shared_ptr<ConnectionRecord>> connectingList;
1548 for (auto record : connRecordList_) {
1549 if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
1550 connectingList.push_back(record);
1551 }
1552 }
1553 return connectingList;
1554 }
1555
GetDisconnectingRecord() const1556 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
1557 {
1558 auto connect =
1559 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
1560 return record->GetConnectState() == ConnectionState::DISCONNECTING;
1561 });
1562 return (connect != connRecordList_.end()) ? *connect : nullptr;
1563 }
1564
GetAbilityTypeString(std::string & typeStr)1565 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
1566 {
1567 AppExecFwk::AbilityType type = GetAbilityInfo().type;
1568 switch (type) {
1569 #ifdef SUPPORT_GRAPHICS
1570 case AppExecFwk::AbilityType::PAGE: {
1571 typeStr = "PAGE";
1572 break;
1573 }
1574 #endif
1575 case AppExecFwk::AbilityType::SERVICE: {
1576 typeStr = "SERVICE";
1577 break;
1578 }
1579 // for config.json type
1580 case AppExecFwk::AbilityType::DATA: {
1581 typeStr = "DATA";
1582 break;
1583 }
1584 default: {
1585 typeStr = "UNKNOWN";
1586 break;
1587 }
1588 }
1589 }
1590
ConvertAbilityState(const AbilityState & state)1591 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
1592 {
1593 auto it = stateToStrMap.find(state);
1594 if (it != stateToStrMap.end()) {
1595 return it->second;
1596 }
1597 return "INVALIDSTATE";
1598 }
1599
ConvertAppState(const AppState & state)1600 std::string AbilityRecord::ConvertAppState(const AppState &state)
1601 {
1602 auto it = appStateToStrMap_.find(state);
1603 if (it != appStateToStrMap_.end()) {
1604 return it->second;
1605 }
1606 return "INVALIDSTATE";
1607 }
1608
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)1609 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
1610 {
1611 auto it = convertStateMap.find(state);
1612 if (it != convertStateMap.end()) {
1613 return it->second;
1614 }
1615 return DEFAULT_INVAL_VALUE;
1616 }
1617
Dump(std::vector<std::string> & info)1618 void AbilityRecord::Dump(std::vector<std::string> &info)
1619 {
1620 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1621 info.push_back(dumpInfo);
1622 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1623 info.push_back(dumpInfo);
1624 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1625 info.push_back(dumpInfo);
1626 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1627 info.push_back(dumpInfo);
1628 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1629 dumpInfo = " isKeepAlive: " + isKeepAlive;
1630 info.push_back(dumpInfo);
1631 // get ability type(unknown/page/service/provider)
1632 std::string typeStr;
1633 GetAbilityTypeString(typeStr);
1634 dumpInfo = " ability type [" + typeStr + "]";
1635 info.push_back(dumpInfo);
1636 std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1637 if (preAbility == nullptr) {
1638 dumpInfo = " previous ability app name [NULL]";
1639 dumpInfo.append("\n");
1640 dumpInfo += " previous ability file name [NULL]";
1641 } else {
1642 dumpInfo =
1643 " previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]";
1644 dumpInfo.append("\n");
1645 dumpInfo += " previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1646 }
1647 info.push_back(dumpInfo);
1648 std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1649 if (nextAbility == nullptr) {
1650 dumpInfo = " next ability app name [NULL]";
1651 dumpInfo.append("\n");
1652 dumpInfo += " next ability file name [NULL]";
1653 } else {
1654 dumpInfo =
1655 " next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]";
1656 dumpInfo.append("\n");
1657 dumpInfo += " next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1658 }
1659 info.push_back(dumpInfo);
1660 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1661 std::to_string(startTime_) + "]";
1662 info.push_back(dumpInfo);
1663 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1664 info.push_back(dumpInfo);
1665 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1666 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1667 info.push_back(dumpInfo);
1668
1669 if (isLauncherRoot_) {
1670 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1671 info.push_back(dumpInfo);
1672 }
1673 }
1674
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)1675 void AbilityRecord::DumpAbilityState(
1676 std::vector<std::string> &info, bool isClient, const std::vector<std::string> ¶ms)
1677 {
1678 HILOG_INFO("%{public}s begin.", __func__);
1679 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1680 info.push_back(dumpInfo);
1681 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1682 info.push_back(dumpInfo);
1683 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1684 info.push_back(dumpInfo);
1685 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1686 info.push_back(dumpInfo);
1687 std::string typeStr;
1688 GetAbilityTypeString(typeStr);
1689 dumpInfo = " ability type [" + typeStr + "]";
1690 info.push_back(dumpInfo);
1691
1692 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1693 std::to_string(startTime_) + "]";
1694 info.push_back(dumpInfo);
1695 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1696 info.push_back(dumpInfo);
1697 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1698 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1699 info.push_back(dumpInfo);
1700 dumpInfo = " callee connections: ";
1701 info.push_back(dumpInfo);
1702 if (callContainer_) {
1703 callContainer_->Dump(info);
1704 }
1705
1706 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1707 dumpInfo = " isKeepAlive: " + isKeepAlive;
1708 info.push_back(dumpInfo);
1709 if (isLauncherRoot_) {
1710 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1711 info.push_back(dumpInfo);
1712 }
1713
1714 // add dump client info
1715 DumpClientInfo(info, params, isClient, params.empty());
1716 }
1717
SetStartTime()1718 void AbilityRecord::SetStartTime()
1719 {
1720 if (startTime_ == 0) {
1721 startTime_ = AbilityUtil::SystemTimeMillis();
1722 }
1723 }
1724
GetStartTime() const1725 int64_t AbilityRecord::GetStartTime() const
1726 {
1727 return startTime_;
1728 }
1729
DumpService(std::vector<std::string> & info,bool isClient) const1730 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
1731 {
1732 std::vector<std::string> params;
1733 DumpService(info, params, isClient);
1734 }
1735
DumpService(std::vector<std::string> & info,std::vector<std::string> & params,bool isClient) const1736 void AbilityRecord::DumpService(std::vector<std::string> &info, std::vector<std::string> ¶ms, bool isClient) const
1737 {
1738 info.emplace_back(" AbilityRecord ID #" + std::to_string(GetRecordId()) + " state #" +
1739 AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1740 std::to_string(GetStartTime()) + "]");
1741 info.emplace_back(" main name [" + GetAbilityInfo().name + "]");
1742 info.emplace_back(" bundle name [" + GetAbilityInfo().bundleName + "]");
1743 info.emplace_back(" ability type [SERVICE]");
1744 info.emplace_back(" app state #" + AbilityRecord::ConvertAppState(appState_));
1745
1746 std::string isKeepAlive = isKeepAlive_ ? "true" : "false";
1747 info.emplace_back(" isKeepAlive: " + isKeepAlive);
1748 if (isLauncherRoot_) {
1749 info.emplace_back(" can restart num #" + std::to_string(restartCount_));
1750 }
1751
1752 info.emplace_back(" Connections: " + std::to_string(connRecordList_.size()));
1753 for (auto &&conn : connRecordList_) {
1754 if (conn) {
1755 conn->Dump(info);
1756 }
1757 }
1758 // add dump client info
1759 DumpClientInfo(info, params, isClient);
1760 }
1761
OnSchedulerDied(const wptr<IRemoteObject> & remote)1762 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
1763 {
1764 HILOG_WARN("On scheduler died.");
1765 auto mission = GetMission();
1766 if (mission) {
1767 HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
1768 }
1769 std::lock_guard<std::mutex> guard(lock_);
1770 CHECK_POINTER(scheduler_);
1771
1772 auto object = remote.promote();
1773 CHECK_POINTER(object);
1774
1775 if (object != scheduler_->AsObject()) {
1776 HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
1777 return;
1778 }
1779
1780 RemoveUriPermission();
1781 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1782 auto schedulerObject = scheduler_->AsObject();
1783 if (schedulerObject != nullptr) {
1784 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1785 }
1786 }
1787 CHECK_POINTER(lifecycleDeal_);
1788 lifecycleDeal_->SetScheduler(nullptr);
1789 isWindowAttached_ = false;
1790
1791 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1792 CHECK_POINTER(abilityManagerService);
1793
1794 auto handler = abilityManagerService->GetEventHandler();
1795 CHECK_POINTER(handler);
1796
1797 HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
1798 auto task = [abilityManagerService, ability = shared_from_this()]() {
1799 abilityManagerService->OnAbilityDied(ability);
1800 };
1801 handler->PostTask(task);
1802 auto uriTask = [want = want_, ability = shared_from_this()]() {
1803 ability->SaveResultToCallers(-1, &want);
1804 ability->SendResultToCallers();
1805 };
1806 handler->PostTask(uriTask);
1807 HandleDlpClosed();
1808 }
1809
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)1810 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
1811 {
1812 connRemoteObject_ = remoteObject;
1813 }
1814
GetConnRemoteObject() const1815 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
1816 {
1817 return connRemoteObject_;
1818 }
1819
AddStartId()1820 void AbilityRecord::AddStartId()
1821 {
1822 startId_++;
1823 }
GetStartId() const1824 int AbilityRecord::GetStartId() const
1825 {
1826 return startId_;
1827 }
1828
SetIsUninstallAbility()1829 void AbilityRecord::SetIsUninstallAbility()
1830 {
1831 isUninstall_ = true;
1832 }
1833
IsUninstallAbility() const1834 bool AbilityRecord::IsUninstallAbility() const
1835 {
1836 return isUninstall_;
1837 }
1838
SetLauncherRoot()1839 void AbilityRecord::SetLauncherRoot()
1840 {
1841 isLauncherRoot_ = true;
1842 }
1843
IsLauncherRoot() const1844 bool AbilityRecord::IsLauncherRoot() const
1845 {
1846 return isLauncherRoot_;
1847 }
1848
IsAbilityState(const AbilityState & state) const1849 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
1850 {
1851 return (currentState_ == state);
1852 }
1853
IsActiveState() const1854 bool AbilityRecord::IsActiveState() const
1855 {
1856 return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
1857 IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND) ||
1858 IsAbilityState(AbilityState::FOREGROUNDING));
1859 }
1860
SendEvent(uint32_t msg,uint32_t timeOut)1861 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut)
1862 {
1863 if (want_.GetBoolParam(DEBUG_APP, false)) {
1864 HILOG_INFO("Is debug mode, no need to handle time out.");
1865 return;
1866 }
1867 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1868 CHECK_POINTER(handler);
1869
1870 g_abilityRecordEventId_++;
1871 eventId_ = g_abilityRecordEventId_;
1872 handler->SendEvent(msg, eventId_, timeOut);
1873 }
1874
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)1875 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
1876 {
1877 lifeCycleStateInfo_.setting = setting;
1878 }
1879
GetStartSetting() const1880 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
1881 {
1882 return lifeCycleStateInfo_.setting;
1883 }
1884
SetRestarting(const bool isRestart)1885 void AbilityRecord::SetRestarting(const bool isRestart)
1886 {
1887 isRestarting_ = isRestart;
1888 HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
1889 if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1890 restartCount_ = isRestart ? (--restartCount_) : restartMax_;
1891 HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1892 }
1893 }
1894
SetRestarting(const bool isRestart,int32_t canRestartCount)1895 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canRestartCount)
1896 {
1897 isRestarting_ = isRestart;
1898 HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canRestartCount);
1899
1900 if ((isLauncherRoot_ && IsLauncherAbility()) || isKeepAlive_) {
1901 restartCount_ = isRestart ? canRestartCount : restartMax_;
1902 HILOG_INFO("root launcher or resident process's restart count: %{public}d", restartCount_);
1903 }
1904 }
1905
GetRestartCount() const1906 int32_t AbilityRecord::GetRestartCount() const
1907 {
1908 return restartCount_;
1909 }
1910
SetRestartCount(int32_t restartCount)1911 void AbilityRecord::SetRestartCount(int32_t restartCount)
1912 {
1913 restartCount_ = restartCount;
1914 }
1915
IsRestarting() const1916 bool AbilityRecord::IsRestarting() const
1917 {
1918 return isRestarting_;
1919 }
1920
SetKeepAlive()1921 void AbilityRecord::SetKeepAlive()
1922 {
1923 isKeepAlive_ = true;
1924 }
1925
GetRestartTime()1926 int64_t AbilityRecord::GetRestartTime()
1927 {
1928 return restartTime_;
1929 }
1930
SetRestartTime(const int64_t restartTime)1931 void AbilityRecord::SetRestartTime(const int64_t restartTime)
1932 {
1933 restartTime_ = restartTime;
1934 }
1935
SetAppState(const AppState & state)1936 void AbilityRecord::SetAppState(const AppState &state)
1937 {
1938 appState_ = state;
1939 }
1940
GetAppState() const1941 AppState AbilityRecord::GetAppState() const
1942 {
1943 return appState_;
1944 }
1945
SetLaunchReason(const LaunchReason & reason)1946 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
1947 {
1948 lifeCycleStateInfo_.launchParam.launchReason = reason;
1949 }
1950
SetLastExitReason(const LastExitReason & reason)1951 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
1952 {
1953 lifeCycleStateInfo_.launchParam.lastExitReason = reason;
1954 }
1955
NotifyContinuationResult(int32_t result)1956 void AbilityRecord::NotifyContinuationResult(int32_t result)
1957 {
1958 HILOG_INFO("NotifyContinuationResult.");
1959 CHECK_POINTER(lifecycleDeal_);
1960
1961 lifecycleDeal_->NotifyContinuationResult(result);
1962 }
1963
GetOwnedMissionList() const1964 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
1965 {
1966 return missionList_.lock();
1967 }
1968
SetMissionList(const std::shared_ptr<MissionList> & missionList)1969 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
1970 {
1971 missionList_ = missionList;
1972 }
1973
SetMission(const std::shared_ptr<Mission> & mission)1974 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
1975 {
1976 if (mission) {
1977 missionId_ = mission->GetMissionId();
1978 HILOG_INFO("SetMission come, missionId is %{public}d.", missionId_);
1979 }
1980 mission_ = mission;
1981 }
1982
SetMinimizeReason(bool fromUser)1983 void AbilityRecord::SetMinimizeReason(bool fromUser)
1984 {
1985 minimizeReason_ = fromUser;
1986 }
1987
SetAppIndex(const int32_t appIndex)1988 void AbilityRecord::SetAppIndex(const int32_t appIndex)
1989 {
1990 appIndex_ = appIndex;
1991 }
1992
GetAppIndex() const1993 int32_t AbilityRecord::GetAppIndex() const
1994 {
1995 return appIndex_;
1996 }
1997
IsMinimizeFromUser() const1998 bool AbilityRecord::IsMinimizeFromUser() const
1999 {
2000 return minimizeReason_;
2001 }
2002
SetClearMissionFlag(bool clearMissionFlag)2003 void AbilityRecord::SetClearMissionFlag(bool clearMissionFlag)
2004 {
2005 clearMissionFlag_= clearMissionFlag;
2006 }
2007
IsClearMissionFlag()2008 bool AbilityRecord::IsClearMissionFlag()
2009 {
2010 return clearMissionFlag_;
2011 }
2012
GetMission() const2013 std::shared_ptr<Mission> AbilityRecord::GetMission() const
2014 {
2015 return mission_.lock();
2016 }
2017
GetMissionId() const2018 int32_t AbilityRecord::GetMissionId() const
2019 {
2020 return missionId_;
2021 }
2022
SetSpecifiedFlag(const std::string & flag)2023 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
2024 {
2025 specifiedFlag_ = flag;
2026 }
2027
GetSpecifiedFlag() const2028 std::string AbilityRecord::GetSpecifiedFlag() const
2029 {
2030 return specifiedFlag_;
2031 }
2032
2033 // new version --start
IsStartedByCall() const2034 bool AbilityRecord::IsStartedByCall() const
2035 {
2036 return isStartedByCall_;
2037 }
2038
SetStartedByCall(const bool isFlag)2039 void AbilityRecord::SetStartedByCall(const bool isFlag)
2040 {
2041 isStartedByCall_ = isFlag;
2042 }
2043
IsStartToBackground() const2044 bool AbilityRecord::IsStartToBackground() const
2045 {
2046 return isStartToBackground_;
2047 }
2048
SetStartToBackground(const bool flag)2049 void AbilityRecord::SetStartToBackground(const bool flag)
2050 {
2051 isStartToBackground_ = flag;
2052 }
2053
IsStartToForeground() const2054 bool AbilityRecord::IsStartToForeground() const
2055 {
2056 return isStartToForeground_;
2057 }
2058
SetStartToForeground(const bool flag)2059 void AbilityRecord::SetStartToForeground(const bool flag)
2060 {
2061 isStartToForeground_ = flag;
2062 }
2063
CallRequest()2064 void AbilityRecord::CallRequest()
2065 {
2066 HILOG_INFO("Call Request.");
2067 CHECK_POINTER(scheduler_);
2068
2069 GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId);
2070 // Async call request
2071 scheduler_->CallRequest();
2072 }
2073
CallRequestDone(const sptr<IRemoteObject> & callStub) const2074 bool AbilityRecord::CallRequestDone(const sptr<IRemoteObject> &callStub) const
2075 {
2076 CHECK_POINTER_RETURN_BOOL(callContainer_);
2077 if (!callContainer_->CallRequestDone(callStub)) {
2078 HILOG_ERROR("Call request failed.");
2079 return false;
2080 }
2081 return true;
2082 }
2083
Resolve(const AbilityRequest & abilityRequest)2084 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
2085 {
2086 auto callback = abilityRequest.connect;
2087 if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
2088 HILOG_ERROR("only start by call type can create a call record.");
2089 return ResolveResultType::NG_INNER_ERROR;
2090 }
2091 if (!callContainer_) {
2092 callContainer_ = std::make_shared<CallContainer>();
2093 if (!callContainer_) {
2094 HILOG_ERROR("mark_shared error.");
2095 return ResolveResultType::NG_INNER_ERROR;
2096 }
2097 }
2098
2099 HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
2100 abilityRequest.callerUid,
2101 abilityRequest.abilityInfo.name.c_str());
2102
2103 std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
2104 if (!callRecord) {
2105 callRecord = CallRecord::CreateCallRecord(
2106 abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
2107 if (!callRecord) {
2108 HILOG_ERROR("mark_shared error.");
2109 return ResolveResultType::NG_INNER_ERROR;
2110 }
2111 }
2112
2113 callContainer_->AddCallRecord(callback, callRecord);
2114
2115 if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
2116 HILOG_DEBUG("this record has requested.");
2117 if (!callRecord->SchedulerConnectDone()) {
2118 HILOG_DEBUG("this callrecord has requested, but callback failed.");
2119 return ResolveResultType::NG_INNER_ERROR;
2120 }
2121 return ResolveResultType::OK_HAS_REMOTE_OBJ;
2122 }
2123
2124 callRecord->SetCallState(CallState::REQUESTING);
2125 return ResolveResultType::OK_NO_REMOTE_OBJ;
2126 }
2127
ReleaseCall(const sptr<IAbilityConnection> & connect)2128 bool AbilityRecord::ReleaseCall(const sptr<IAbilityConnection>& connect)
2129 {
2130 HILOG_DEBUG("ability release call record by callback.");
2131 CHECK_POINTER_RETURN_BOOL(callContainer_);
2132
2133 return callContainer_->RemoveCallRecord(connect);
2134 }
2135
IsNeedToCallRequest() const2136 bool AbilityRecord::IsNeedToCallRequest() const
2137 {
2138 HILOG_DEBUG("ability release call record by callback.");
2139 if (callContainer_ == nullptr) {
2140 return false;
2141 }
2142
2143 return callContainer_->IsNeedToCallRequest();
2144 }
2145
ContinueAbility(const std::string & deviceId,uint32_t versionCode)2146 void AbilityRecord::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
2147 {
2148 HILOG_INFO("ContinueAbility.");
2149 CHECK_POINTER(lifecycleDeal_);
2150
2151 lifecycleDeal_->ContinueAbility(deviceId, versionCode);
2152 }
2153
SetSwitchingPause(bool state)2154 void AbilityRecord::SetSwitchingPause(bool state)
2155 {
2156 isSwitchingPause_ = state;
2157 }
2158
IsSwitchingPause()2159 bool AbilityRecord::IsSwitchingPause()
2160 {
2161 return isSwitchingPause_;
2162 }
2163
SetOwnerMissionUserId(int32_t userId)2164 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
2165 {
2166 ownerMissionUserId_ = userId;
2167 }
2168
GetOwnerMissionUserId()2169 int32_t AbilityRecord::GetOwnerMissionUserId()
2170 {
2171 return ownerMissionUserId_;
2172 }
2173
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const2174 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> ¶ms,
2175 bool isClient, bool dumpConfig) const
2176 {
2177 if (!isClient || !scheduler_ || !isReady_) {
2178 HILOG_ERROR("something nullptr.");
2179 return;
2180 }
2181 std::unique_lock<std::mutex> lock(dumpLock_);
2182 scheduler_->DumpAbilityInfo(params, info);
2183
2184 HILOG_INFO("Dump begin wait.");
2185 isDumpTimeout_ = false;
2186 std::chrono::milliseconds timeout { AbilityManagerService::DUMP_TIMEOUT };
2187 if (dumpCondition_.wait_for(lock, timeout) == std::cv_status::timeout) {
2188 isDumpTimeout_ = true;
2189 }
2190 HILOG_INFO("Dump done and begin parse.");
2191 if (!isDumpTimeout_) {
2192 std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2193 for (auto one : dumpInfos_) {
2194 info.emplace_back(one);
2195 }
2196 }
2197
2198 if (!dumpConfig) {
2199 HILOG_INFO("not dumpConfig.");
2200 return;
2201 }
2202 AppExecFwk::Configuration config;
2203 if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
2204 info.emplace_back(" configuration: " + config.GetName());
2205 }
2206 }
2207
DumpAbilityInfoDone(std::vector<std::string> & infos)2208 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
2209 {
2210 HILOG_INFO("DumpAbilityInfoDone begin.");
2211 if (isDumpTimeout_) {
2212 HILOG_WARN("%{public}s, dump time out.", __func__);
2213 return;
2214 }
2215 {
2216 std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
2217 dumpInfos_.clear();
2218 for (auto info : infos) {
2219 dumpInfos_.emplace_back(info);
2220 }
2221 }
2222 dumpCondition_.notify_all();
2223 }
2224
GrantUriPermission(const Want & want,int32_t userId,uint32_t targetTokenId)2225 void AbilityRecord::GrantUriPermission(const Want &want, int32_t userId, uint32_t targetTokenId)
2226 {
2227 if ((want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
2228 HILOG_WARN("Do not call uriPermissionMgr.");
2229 return;
2230 }
2231
2232 auto bms = AbilityUtil::GetBundleManager();
2233 CHECK_POINTER_IS_NULLPTR(bms);
2234 auto&& uriStr = want.GetUri().ToString();
2235 auto&& uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM);
2236 uriVec.emplace_back(uriStr);
2237 HILOG_DEBUG("GrantUriPermission uriVec size: %{public}zu", uriVec.size());
2238 auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2239 auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
2240 auto fromTokenId = IPCSkeleton::GetCallingTokenID();
2241 for (auto&& str : uriVec) {
2242 Uri uri(str);
2243 auto&& scheme = uri.GetScheme();
2244 HILOG_INFO("uri scheme is %{public}s.", scheme.c_str());
2245 // only support file scheme
2246 if (scheme != "file") {
2247 HILOG_WARN("only support file uri.");
2248 continue;
2249 }
2250 auto&& authority = uri.GetAuthority();
2251 HILOG_INFO("uri authority is %{public}s.", authority.c_str());
2252 AppExecFwk::BundleInfo uriBundleInfo;
2253 if (!IN_PROCESS_CALL(bms->GetBundleInfo(authority, bundleFlag, uriBundleInfo, userId))) {
2254 HILOG_WARN("To fail to get bundle info according to uri.");
2255 continue;
2256 }
2257 if (uriBundleInfo.applicationInfo.accessTokenId != fromTokenId &&
2258 uriBundleInfo.applicationInfo.accessTokenId != callerAccessTokenId_) {
2259 HILOG_ERROR("the uri does not belong to caller.");
2260 continue;
2261 }
2262 auto ret = IN_PROCESS_CALL(upmClient->GrantUriPermission(uri, want.GetFlags(),
2263 callerAccessTokenId_, targetTokenId));
2264 if (ret) {
2265 isGrantedUriPermission_ = true;
2266 }
2267 }
2268 }
2269
RemoveUriPermission()2270 void AbilityRecord::RemoveUriPermission()
2271 {
2272 if (isGrantedUriPermission_) {
2273 HILOG_DEBUG("To remove uri permission.");
2274 auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance();
2275 upmClient->RemoveUriPermission(applicationInfo_.accessTokenId);
2276 isGrantedUriPermission_ = false;
2277 }
2278 }
2279
HandleDlpAttached()2280 void AbilityRecord::HandleDlpAttached()
2281 {
2282 if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2283 DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpManager(shared_from_this());
2284 }
2285
2286 if (appIndex_ > 0) {
2287 DelayedSingleton<ConnectionStateManager>::GetInstance()->AddDlpAbility(shared_from_this());
2288 }
2289 }
2290
HandleDlpClosed()2291 void AbilityRecord::HandleDlpClosed()
2292 {
2293 if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) {
2294 DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpManager(shared_from_this());
2295 }
2296
2297 if (appIndex_ > 0) {
2298 DelayedSingleton<ConnectionStateManager>::GetInstance()->RemoveDlpAbility(shared_from_this());
2299 }
2300 }
2301
GetCurrentAccountId() const2302 int32_t AbilityRecord::GetCurrentAccountId() const
2303 {
2304 std::vector<int32_t> osActiveAccountIds;
2305 ErrCode ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
2306 QueryActiveOsAccountIds(osActiveAccountIds);
2307 if (ret != ERR_OK) {
2308 HILOG_ERROR("QueryActiveOsAccountIds failed.");
2309 return DEFAULT_USER_ID;
2310 }
2311 if (osActiveAccountIds.empty()) {
2312 HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
2313 return DEFAULT_USER_ID;
2314 }
2315
2316 return osActiveAccountIds.front();
2317 }
2318
SetWindowMode(int32_t windowMode)2319 void AbilityRecord::SetWindowMode(int32_t windowMode)
2320 {
2321 want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
2322 }
2323
RemoveWindowMode()2324 void AbilityRecord::RemoveWindowMode()
2325 {
2326 want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
2327 }
2328
SetPendingState(AbilityState state)2329 void AbilityRecord::SetPendingState(AbilityState state)
2330 {
2331 pendingState_.store(state);
2332 }
2333
GetPendingState() const2334 AbilityState AbilityRecord::GetPendingState() const
2335 {
2336 return pendingState_.load();
2337 }
2338
2339 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility()2340 int AbilityRecord::BlockAbility()
2341 {
2342 HILOG_INFO("BlockAbility.");
2343 if (scheduler_) {
2344 HILOG_INFO("scheduler_ begin to call BlockAbility %{public}s", __func__);
2345 return scheduler_->BlockAbility();
2346 }
2347 return ERR_NO_INIT;
2348 }
2349 #endif
2350
IsNeedBackToOtherMissionStack()2351 bool AbilityRecord::IsNeedBackToOtherMissionStack()
2352 {
2353 return isNeedBackToOtherMissionStack_;
2354 }
2355
SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)2356 void AbilityRecord::SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack)
2357 {
2358 isNeedBackToOtherMissionStack_ = isNeedBackToOtherMissionStack;
2359 }
2360
GetOtherMissionStackAbilityRecord() const2361 std::shared_ptr<AbilityRecord> AbilityRecord::GetOtherMissionStackAbilityRecord() const
2362 {
2363 return otherMissionStackAbilityRecord_.lock();
2364 }
2365
SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)2366 void AbilityRecord::SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2367 {
2368 otherMissionStackAbilityRecord_ = abilityRecord;
2369 }
2370 } // namespace AAFwk
2371 } // namespace OHOS
2372