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_event_handler.h"
22 #include "ability_manager_service.h"
23 #include "ability_scheduler_stub.h"
24 #include "ability_util.h"
25 #include "bundle_mgr_client.h"
26 #include "bytrace.h"
27 #include "errors.h"
28 #include "hilog_wrapper.h"
29 #include "os_account_manager.h"
30 #include "uri_permission_manager_client.h"
31
32 namespace OHOS {
33 namespace AAFwk {
34 const std::string DEBUG_APP = "debugApp";
35 const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId";
36 int64_t AbilityRecord::abilityRecordId = 0;
37 int64_t AbilityRecord::g_abilityRecordEventId_ = 0;
38 const std::map<AbilityState, std::string> AbilityRecord::stateToStrMap = {
39 std::map<AbilityState, std::string>::value_type(INITIAL, "INITIAL"),
40 std::map<AbilityState, std::string>::value_type(INACTIVE, "INACTIVE"),
41 std::map<AbilityState, std::string>::value_type(ACTIVE, "ACTIVE"),
42 std::map<AbilityState, std::string>::value_type(BACKGROUND, "BACKGROUND"),
43 std::map<AbilityState, std::string>::value_type(SUSPENDED, "SUSPENDED"),
44 std::map<AbilityState, std::string>::value_type(INACTIVATING, "INACTIVATING"),
45 std::map<AbilityState, std::string>::value_type(ACTIVATING, "ACTIVATING"),
46 std::map<AbilityState, std::string>::value_type(MOVING_BACKGROUND, "MOVING_BACKGROUND"),
47 std::map<AbilityState, std::string>::value_type(TERMINATING, "TERMINATING"),
48 std::map<AbilityState, std::string>::value_type(FOREGROUND_NEW, "FOREGROUND_NEW"),
49 std::map<AbilityState, std::string>::value_type(BACKGROUND_NEW, "BACKGROUND_NEW"),
50 std::map<AbilityState, std::string>::value_type(FOREGROUNDING_NEW, "FOREGROUNDING_NEW"),
51 std::map<AbilityState, std::string>::value_type(BACKGROUNDING_NEW, "BACKGROUNDING_NEW"),
52 };
53 const std::map<AppState, std::string> AbilityRecord::appStateToStrMap_ = {
54 std::map<AppState, std::string>::value_type(AppState::BEGIN, "BEGIN"),
55 std::map<AppState, std::string>::value_type(AppState::READY, "READY"),
56 std::map<AppState, std::string>::value_type(AppState::FOREGROUND, "FOREGROUND"),
57 std::map<AppState, std::string>::value_type(AppState::BACKGROUND, "BACKGROUND"),
58 std::map<AppState, std::string>::value_type(AppState::SUSPENDED, "SUSPENDED"),
59 std::map<AppState, std::string>::value_type(AppState::TERMINATED, "TERMINATED"),
60 std::map<AppState, std::string>::value_type(AppState::END, "END"),
61 };
62 const std::map<AbilityLifeCycleState, AbilityState> AbilityRecord::convertStateMap = {
63 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INITIAL, INITIAL),
64 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INACTIVE, INACTIVE),
65 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_ACTIVE, ACTIVE),
66 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND, BACKGROUND),
67 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_SUSPENDED, SUSPENDED),
68 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_NEW, FOREGROUND_NEW),
69 std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND_NEW, BACKGROUND_NEW),
70 };
71
Token(std::weak_ptr<AbilityRecord> abilityRecord)72 Token::Token(std::weak_ptr<AbilityRecord> abilityRecord) : abilityRecord_(abilityRecord)
73 {}
74
~Token()75 Token::~Token()
76 {}
77
GetAbilityRecordByToken(const sptr<IRemoteObject> & token)78 std::shared_ptr<AbilityRecord> Token::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
79 {
80 CHECK_POINTER_AND_RETURN(token, nullptr);
81 return (static_cast<Token *>(token.GetRefPtr()))->GetAbilityRecord();
82 }
83
GetAbilityRecord() const84 std::shared_ptr<AbilityRecord> Token::GetAbilityRecord() const
85 {
86 return abilityRecord_.lock();
87 }
88
AbilityRecord(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode,int32_t apiVersion)89 AbilityRecord::AbilityRecord(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
90 const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode, int32_t apiVersion)
91 : want_(want), abilityInfo_(abilityInfo), applicationInfo_(applicationInfo),
92 requestCode_(requestCode), compatibleVersion_(apiVersion)
93 {
94 recordId_ = abilityRecordId++;
95 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
96 if (abilityMgr) {
97 abilityMgr->GetMaxRestartNum(restratMax_);
98 }
99 restartCount_ = restratMax_;
100 }
101
~AbilityRecord()102 AbilityRecord::~AbilityRecord()
103 {
104 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
105 auto object = scheduler_->AsObject();
106 if (object != nullptr) {
107 object->RemoveDeathRecipient(schedulerDeathRecipient_);
108 }
109 }
110 }
111
CreateAbilityRecord(const AbilityRequest & abilityRequest)112 std::shared_ptr<AbilityRecord> AbilityRecord::CreateAbilityRecord(const AbilityRequest &abilityRequest)
113 {
114 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
115 if (abilityRequest.IsNewVersion() && abilityRequest.abilityInfo.type == AbilityType::PAGE) {
116 abilityRecord = std::make_shared<AbilityRecordNew>(abilityRequest.want, abilityRequest.abilityInfo,
117 abilityRequest.appInfo, abilityRequest.requestCode, abilityRequest.compatibleVersion);
118 } else {
119 abilityRecord = std::make_shared<AbilityRecord>(abilityRequest.want, abilityRequest.abilityInfo,
120 abilityRequest.appInfo, abilityRequest.requestCode, abilityRequest.compatibleVersion);
121 }
122 CHECK_POINTER_AND_RETURN(abilityRecord, nullptr);
123 abilityRecord->SetUid(abilityRequest.uid);
124 if (!abilityRecord->Init()) {
125 HILOG_ERROR("failed to init new ability record");
126 return nullptr;
127 }
128 if (abilityRequest.startSetting != nullptr) {
129 HILOG_INFO("abilityRequest.startSetting...");
130 abilityRecord->SetStartSetting(abilityRequest.startSetting);
131 }
132 if (abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
133 HILOG_INFO("abilityRequest.callType is CALL_REQUEST_TYPE.");
134 abilityRecord->SetStartedByCall(true);
135 }
136 return abilityRecord;
137 }
138
Init()139 bool AbilityRecord::Init()
140 {
141 lifecycleDeal_ = std::make_unique<LifecycleDeal>();
142 CHECK_POINTER_RETURN_BOOL(lifecycleDeal_);
143
144 token_ = new (std::nothrow) Token(weak_from_this());
145 CHECK_POINTER_RETURN_BOOL(token_);
146
147 if (applicationInfo_.isLauncherApp) {
148 isLauncherAbility_ = true;
149 }
150 return true;
151 }
152
SetUid(int32_t uid)153 void AbilityRecord::SetUid(int32_t uid)
154 {
155 uid_ = uid;
156 }
157
GetUid()158 int32_t AbilityRecord::GetUid()
159 {
160 return uid_;
161 }
162
LoadAbility()163 int AbilityRecord::LoadAbility()
164 {
165 BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
166 HILOG_INFO("%{public}s", __func__);
167 startTime_ = AbilityUtil::SystemTimeMillis();
168 CHECK_POINTER_AND_RETURN(token_, ERR_INVALID_VALUE);
169 std::string appName = applicationInfo_.name;
170 if (appName.empty()) {
171 HILOG_ERROR("app name is empty");
172 return ERR_INVALID_VALUE;
173 }
174
175 if (!CanRestartRootLauncher()) {
176 HILOG_ERROR("Root launcher restart is out of max count.");
177 return ERR_INVALID_VALUE;
178 }
179
180 if (abilityInfo_.type != AppExecFwk::AbilityType::DATA) {
181 if (isKernalSystemAbility_) {
182 SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, AbilityManagerService::SYSTEM_UI_TIMEOUT);
183 } else {
184 SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, AbilityManagerService::LOAD_TIMEOUT);
185 }
186 }
187 sptr<Token> callerToken_ = nullptr;
188 if (!callerList_.empty() && callerList_.back()) {
189 auto caller = callerList_.back()->GetCaller();
190 if (caller) {
191 callerToken_ = caller->GetToken();
192 }
193 }
194
195 want_.SetParam(ABILITY_OWNER_USERID, ownerMissionUserId_);
196 auto result = DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
197 token_, callerToken_, abilityInfo_, applicationInfo_, want_);
198 want_.RemoveParam(ABILITY_OWNER_USERID);
199 return result;
200 }
201
CanRestartRootLauncher()202 bool AbilityRecord::CanRestartRootLauncher()
203 {
204 if (isLauncherRoot_ && isRestarting_ && IsLauncherAbility() && (restartCount_ <= 0)) {
205 HILOG_ERROR("Root launcher restart is out of max count.");
206 return false;
207 }
208 return true;
209 }
210
ForegroundAbility(uint32_t sceneFlag)211 void AbilityRecord::ForegroundAbility(uint32_t sceneFlag)
212 {
213 BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
214 HILOG_INFO("ForegroundAbility.");
215 CHECK_POINTER(lifecycleDeal_);
216
217 SendEvent(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, AbilityManagerService::FOREGROUNDNEW_TIMEOUT);
218
219 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
220 // earlier than above actions.
221 currentState_ = AbilityState::FOREGROUNDING_NEW;
222 lifeCycleStateInfo_.sceneFlag = sceneFlag;
223 lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_);
224 lifeCycleStateInfo_.sceneFlag = 0;
225 lifeCycleStateInfo_.sceneFlagBak = 0;
226
227 // update ability state to appMgr service when restart
228 if (IsNewWant()) {
229 sptr<Token> preToken = nullptr;
230 if (GetPreAbilityRecord()) {
231 preToken = GetPreAbilityRecord()->GetToken();
232 }
233 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
234 }
235 }
236
ProcessForegroundAbility(uint32_t sceneFlag)237 void AbilityRecord::ProcessForegroundAbility(uint32_t sceneFlag)
238 {
239 std::string element = GetWant().GetElement().GetURI();
240 HILOG_DEBUG("ability record: %{public}s", element.c_str());
241
242 if (isReady_) {
243 if (IsAbilityState(AbilityState::BACKGROUND_NEW)) {
244 // background to activte state
245 HILOG_DEBUG("MoveToForground, %{public}s", element.c_str());
246 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
247 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForground(token_);
248 } else {
249 HILOG_DEBUG("Activate %{public}s", element.c_str());
250 ForegroundAbility(sceneFlag);
251 }
252 } else {
253 lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
254 LoadAbility();
255 }
256 }
257
BackgroundAbility(const Closure & task)258 void AbilityRecord::BackgroundAbility(const Closure &task)
259 {
260 HILOG_INFO("Move to backgroundNew.");
261 CHECK_POINTER(lifecycleDeal_);
262 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
263 if (handler && task) {
264 if (!want_.GetBoolParam(DEBUG_APP, false)) {
265 g_abilityRecordEventId_++;
266 eventId_ = g_abilityRecordEventId_;
267 // eventId_ is a unique id of the task.
268 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUNDNEW_TIMEOUT);
269 } else {
270 HILOG_INFO("Is debug mode, no need to handle time out.");
271 }
272 }
273
274 if (!IsTerminating() || IsRestarting()) {
275 // schedule save ability state before moving to background.
276 SaveAbilityState();
277 }
278
279 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
280 // earlier than above actions.
281 currentState_ = AbilityState::BACKGROUNDING_NEW;
282 lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
283 }
284
TerminateAbility()285 int AbilityRecord::TerminateAbility()
286 {
287 HILOG_INFO("%{public}s", __func__);
288 return DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_);
289 }
290
291 #ifdef SUPPORT_GRAPHICS
SetMissionRecord(const std::shared_ptr<MissionRecord> & missionRecord)292 void AbilityRecord::SetMissionRecord(const std::shared_ptr<MissionRecord> &missionRecord)
293 {
294 missionRecord_ = missionRecord;
295 if (missionRecord) {
296 lifeCycleStateInfo_.missionId = missionRecord->GetMissionRecordId();
297 }
298 }
299
SetMissionStackId(const int stackId)300 void AbilityRecord::SetMissionStackId(const int stackId)
301 {
302 lifeCycleStateInfo_.stackId = stackId;
303 }
304
GetMissionStackId() const305 int AbilityRecord::GetMissionStackId() const
306 {
307 return lifeCycleStateInfo_.stackId;
308 }
309
GetMissionRecord() const310 std::shared_ptr<MissionRecord> AbilityRecord::GetMissionRecord() const
311 {
312 return missionRecord_.lock();
313 }
314
GetMissionRecordId() const315 int AbilityRecord::GetMissionRecordId() const
316 {
317 if (missionRecord_.lock()) {
318 return missionRecord_.lock()->GetMissionRecordId();
319 }
320 return DEFAULT_INVAL_VALUE;
321 }
322 #endif
323
GetAbilityInfo() const324 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
325 {
326 return abilityInfo_;
327 }
328
GetApplicationInfo() const329 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
330 {
331 return applicationInfo_;
332 }
333
GetAbilityState() const334 AbilityState AbilityRecord::GetAbilityState() const
335 {
336 return currentState_;
337 }
338
IsForeground() const339 bool AbilityRecord::IsForeground() const
340 {
341 return currentState_ == AbilityState::FOREGROUND_NEW || currentState_ == AbilityState::FOREGROUNDING_NEW;
342 }
343
SetAbilityState(AbilityState state)344 void AbilityRecord::SetAbilityState(AbilityState state)
345 {
346 currentState_ = state;
347 if (state == AbilityState::ACTIVE) {
348 auto mission = GetMissionRecord();
349 if (mission) {
350 mission->UpdateActiveTimestamp();
351 }
352 }
353
354 if (state == AbilityState::FOREGROUND_NEW || state == AbilityState::ACTIVE) {
355 SetRestarting(false);
356 }
357 }
358
SetScheduler(const sptr<IAbilityScheduler> & scheduler)359 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
360 {
361 HILOG_INFO("%{public}s", __func__);
362 CHECK_POINTER(lifecycleDeal_);
363 if (scheduler != nullptr) {
364 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
365 auto schedulerObject = scheduler_->AsObject();
366 if (schedulerObject != nullptr) {
367 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
368 }
369 }
370 if (schedulerDeathRecipient_ == nullptr) {
371 schedulerDeathRecipient_ =
372 new AbilitySchedulerRecipient(std::bind(&AbilityRecord::OnSchedulerDied, this, std::placeholders::_1));
373 }
374 isReady_ = true;
375 scheduler_ = scheduler;
376 lifecycleDeal_->SetScheduler(scheduler);
377 auto schedulerObject = scheduler_->AsObject();
378 if (schedulerObject != nullptr) {
379 schedulerObject->AddDeathRecipient(schedulerDeathRecipient_);
380 }
381 } else {
382 HILOG_ERROR("scheduler is nullptr");
383 isReady_ = false;
384 isWindowAttached_ = false;
385 SetIsNewWant(false);
386 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
387 auto schedulerObject = scheduler_->AsObject();
388 if (schedulerObject != nullptr) {
389 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
390 }
391 }
392 scheduler_ = scheduler;
393 }
394 }
395
GetToken() const396 sptr<Token> AbilityRecord::GetToken() const
397 {
398 return token_;
399 }
400
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)401 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
402 {
403 preAbilityRecord_ = abilityRecord;
404 }
405
GetPreAbilityRecord() const406 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
407 {
408 return preAbilityRecord_.lock();
409 }
410
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)411 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
412 {
413 nextAbilityRecord_ = abilityRecord;
414 }
415
GetNextAbilityRecord() const416 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
417 {
418 return nextAbilityRecord_.lock();
419 }
420
SetBackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)421 void AbilityRecord::SetBackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
422 {
423 backAbilityRecord_ = abilityRecord;
424 }
425
GetBackAbilityRecord() const426 std::shared_ptr<AbilityRecord> AbilityRecord::GetBackAbilityRecord() const
427 {
428 return backAbilityRecord_.lock();
429 }
430
SetEventId(int64_t eventId)431 void AbilityRecord::SetEventId(int64_t eventId)
432 {
433 eventId_ = eventId;
434 }
435
GetEventId() const436 int64_t AbilityRecord::GetEventId() const
437 {
438 return eventId_;
439 }
440
IsReady() const441 bool AbilityRecord::IsReady() const
442 {
443 return isReady_;
444 }
445
446 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const447 bool AbilityRecord::IsWindowAttached() const
448 {
449 return isWindowAttached_;
450 }
451 #endif
452
IsLauncherAbility() const453 bool AbilityRecord::IsLauncherAbility() const
454 {
455 return isLauncherAbility_;
456 }
457
IsTerminating() const458 bool AbilityRecord::IsTerminating() const
459 {
460 return isTerminating_;
461 }
462
IsForceTerminate() const463 bool AbilityRecord::IsForceTerminate() const
464 {
465 return isForceTerminate_;
466 }
467
SetForceTerminate(bool flag)468 void AbilityRecord::SetForceTerminate(bool flag)
469 {
470 isForceTerminate_ = flag;
471 }
472
SetTerminatingState()473 void AbilityRecord::SetTerminatingState()
474 {
475 isTerminating_ = true;
476 }
477
IsNewWant() const478 bool AbilityRecord::IsNewWant() const
479 {
480 return lifeCycleStateInfo_.isNewWant;
481 }
482
SetIsNewWant(bool isNewWant)483 void AbilityRecord::SetIsNewWant(bool isNewWant)
484 {
485 lifeCycleStateInfo_.isNewWant = isNewWant;
486 }
487
IsCreateByConnect() const488 bool AbilityRecord::IsCreateByConnect() const
489 {
490 return isCreateByConnect_;
491 }
492
SetCreateByConnectMode()493 void AbilityRecord::SetCreateByConnectMode()
494 {
495 isCreateByConnect_ = true;
496 }
497
Activate()498 void AbilityRecord::Activate()
499 {
500 HILOG_INFO("Activate.");
501 CHECK_POINTER(lifecycleDeal_);
502
503 SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, AbilityManagerService::ACTIVE_TIMEOUT);
504
505 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
506 // earlier than above actions.
507 currentState_ = AbilityState::ACTIVATING;
508 lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
509
510 // update ability state to appMgr service when restart
511 if (IsNewWant()) {
512 sptr<Token> preToken = nullptr;
513 if (GetPreAbilityRecord()) {
514 preToken = GetPreAbilityRecord()->GetToken();
515 }
516 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
517 }
518 }
519
ProcessActivateInMoving()520 void AbilityRecord::ProcessActivateInMoving()
521 {
522 HILOG_DEBUG("ProcessActivateInMovingState.");
523 if (!IsAbilityState(AbilityState::ACTIVE) && !IsAbilityState(AbilityState::ACTIVATING)) {
524 SetInMovingState(true);
525 ProcessActivate();
526 }
527 }
528
ProcessInactivateInMoving()529 void AbilityRecord::ProcessInactivateInMoving()
530 {
531 HILOG_DEBUG("ProcessInactivateInMoving.");
532 if (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING)) {
533 SetInMovingState(true);
534 ProcessInactivate();
535 }
536 }
537
ProcessActivate()538 void AbilityRecord::ProcessActivate()
539 {
540 std::string element = GetWant().GetElement().GetURI();
541 HILOG_DEBUG("ability record: %{public}s", element.c_str());
542
543 if (isReady_) {
544 if (IsAbilityState(AbilityState::BACKGROUND) || IsAbilityState(AbilityState::BACKGROUND_NEW)) {
545 // background to activte state
546 HILOG_DEBUG("MoveToForground, %{public}s", element.c_str());
547 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForground(token_);
548 } else {
549 HILOG_DEBUG("Activate %{public}s", element.c_str());
550 Activate();
551 }
552 } else {
553 LoadAbility();
554 }
555 }
556
ProcessInactivate()557 void AbilityRecord::ProcessInactivate()
558 {
559 std::string element = GetWant().GetElement().GetURI();
560 HILOG_DEBUG("ability record: %{public}s", element.c_str());
561
562 if (isReady_) {
563 if (IsAbilityState(AbilityState::BACKGROUND)) {
564 // background to activte state
565 HILOG_DEBUG("MoveToForground, %{public}s", element.c_str());
566 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForground(token_);
567 } else if (!IsAbilityState(AbilityState::INACTIVE) && !IsAbilityState(AbilityState::INACTIVATING)) {
568 HILOG_DEBUG("Inactivate %{public}s", element.c_str());
569 Inactivate();
570 }
571 } else {
572 LoadAbility();
573 }
574 }
575
Inactivate()576 void AbilityRecord::Inactivate()
577 {
578 HILOG_INFO("Inactivate.");
579 CHECK_POINTER(lifecycleDeal_);
580
581 SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
582
583 // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
584 // earlier than above actions.
585 currentState_ = AbilityState::INACTIVATING;
586 lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_);
587 }
588
MoveToBackground(const Closure & task)589 void AbilityRecord::MoveToBackground(const Closure &task)
590 {
591 HILOG_INFO("Move to background.");
592 CHECK_POINTER(lifecycleDeal_);
593 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
594 if (handler && task) {
595 if (!want_.GetBoolParam(DEBUG_APP, false)) {
596 g_abilityRecordEventId_++;
597 eventId_ = g_abilityRecordEventId_;
598 // eventId_ is a unique id of the task.
599 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUND_TIMEOUT);
600 } else {
601 HILOG_INFO("Is debug mode, no need to handle time out.");
602 }
603 }
604
605 if (!IsTerminating() || IsRestarting()) {
606 // schedule save ability state before moving to background.
607 SaveAbilityState();
608 }
609
610 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
611 // earlier than above actions.
612 currentState_ = AbilityState::MOVING_BACKGROUND;
613 lifecycleDeal_->MoveToBackground(want_, lifeCycleStateInfo_);
614 }
615
Terminate(const Closure & task)616 void AbilityRecord::Terminate(const Closure &task)
617 {
618 HILOG_INFO("Terminate ability.");
619 CHECK_POINTER(lifecycleDeal_);
620 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
621 if (handler && task) {
622 if (!want_.GetBoolParam(DEBUG_APP, false)) {
623 g_abilityRecordEventId_++;
624 eventId_ = g_abilityRecordEventId_;
625 // eventId_ is a unique id of the task.
626 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT);
627 } else {
628 HILOG_INFO("Is debug mode, no need to handle time out.");
629 }
630 }
631 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
632 // earlier than above actions.
633 currentState_ = AbilityState::TERMINATING;
634 lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
635 }
636
ConnectAbility()637 void AbilityRecord::ConnectAbility()
638 {
639 HILOG_INFO("Connect ability.");
640 CHECK_POINTER(lifecycleDeal_);
641 lifecycleDeal_->ConnectAbility(want_);
642 }
643
DisconnectAbility()644 void AbilityRecord::DisconnectAbility()
645 {
646 HILOG_INFO("Disconnect ability.");
647 CHECK_POINTER(lifecycleDeal_);
648 lifecycleDeal_->DisconnectAbility(want_);
649 }
650
CommandAbility()651 void AbilityRecord::CommandAbility()
652 {
653 HILOG_INFO("Command ability, startId_:%{public}d.", startId_);
654 CHECK_POINTER(lifecycleDeal_);
655 lifecycleDeal_->CommandAbility(want_, false, startId_);
656 }
657
SaveAbilityState()658 void AbilityRecord::SaveAbilityState()
659 {
660 HILOG_INFO("%{public}s", __func__);
661 CHECK_POINTER(lifecycleDeal_);
662 lifecycleDeal_->SaveAbilityState();
663 }
664
SaveAbilityState(const PacMap & inState)665 void AbilityRecord::SaveAbilityState(const PacMap &inState)
666 {
667 HILOG_INFO("%{public}s : pacmap save", __func__);
668 stateDatas_ = inState;
669 }
670
RestoreAbilityState()671 void AbilityRecord::RestoreAbilityState()
672 {
673 HILOG_INFO("%{public}s", __func__);
674 CHECK_POINTER(lifecycleDeal_);
675 lifecycleDeal_->RestoreAbilityState(stateDatas_);
676 stateDatas_.Clear();
677 isRestarting_ = false;
678 }
679
680 #ifdef SUPPORT_GRAPHICS
TopActiveAbilityChanged(bool flag)681 void AbilityRecord::TopActiveAbilityChanged(bool flag)
682 {
683 HILOG_INFO("%{public}s called, isTop: %{public}d", __func__, flag);
684 CHECK_POINTER(scheduler_);
685 scheduler_->NotifyTopActiveAbilityChanged(flag);
686 }
687 #endif
688
SetWant(const Want & want)689 void AbilityRecord::SetWant(const Want &want)
690 {
691 want_ = want;
692 }
693
GetWant() const694 const Want &AbilityRecord::GetWant() const
695 {
696 return want_;
697 }
698
GetRequestCode() const699 int AbilityRecord::GetRequestCode() const
700 {
701 return requestCode_;
702 }
703
SetResult(const std::shared_ptr<AbilityResult> & result)704 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
705 {
706 result_ = result;
707 }
708
GetResult() const709 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
710 {
711 return result_;
712 }
713
SendResult()714 void AbilityRecord::SendResult()
715 {
716 HILOG_INFO("Send result.");
717 std::lock_guard<std::mutex> guard(lock_);
718 CHECK_POINTER(scheduler_);
719 CHECK_POINTER(result_);
720 scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
721 GrantUriPermission(result_->resultWant_);
722 // reset result to avoid send result next time
723 result_.reset();
724 }
725
SendResultToCallers()726 void AbilityRecord::SendResultToCallers()
727 {
728 for (auto caller : GetCallerRecordList()) {
729 if (caller == nullptr) {
730 HILOG_WARN("Caller record is nullptr.");
731 continue;
732 }
733 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
734 if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
735 callerAbilityRecord->SendResult();
736 }
737 }
738 }
739
SaveResultToCallers(const int resultCode,const Want * resultWant)740 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
741 {
742 for (auto caller : GetCallerRecordList()) {
743 if (caller == nullptr) {
744 HILOG_WARN("Caller record is nullptr.");
745 continue;
746 }
747 std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
748 if (callerAbilityRecord != nullptr) {
749 callerAbilityRecord->SetResult(
750 std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
751 }
752 }
753 }
754
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)755 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
756 {
757 CHECK_POINTER(connRecord);
758 auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
759 // found it
760 if (it != connRecordList_.end()) {
761 HILOG_DEBUG("Found it in list, so no need to add same connection(%{public}p)", connRecord.get());
762 return;
763 }
764 // no found then add new connection to list
765 HILOG_DEBUG("No found in list, so add new connection(%{public}p) to list", connRecord.get());
766 connRecordList_.push_back(connRecord);
767 }
768
GetConnectRecordList() const769 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
770 {
771 return connRecordList_;
772 }
773
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)774 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
775 {
776 CHECK_POINTER(connRecord);
777 connRecordList_.remove(connRecord);
778 }
779
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode)780 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode)
781 {
782 BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
783 HILOG_INFO("Add caller record.");
784 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
785 CHECK_POINTER(abilityRecord);
786
787 auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
788 return (callerRecord->GetCaller() == abilityRecord);
789 };
790
791 auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
792 if (record != callerList_.end()) {
793 callerList_.erase(record);
794 }
795
796 callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
797
798 lifeCycleStateInfo_.caller.requestCode = requestCode;
799 lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
800 lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
801 lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
802 HILOG_INFO("caller %{public}s, %{public}s, %{public}s",
803 abilityRecord->GetAbilityInfo().deviceId.c_str(),
804 abilityRecord->GetAbilityInfo().bundleName.c_str(),
805 abilityRecord->GetAbilityInfo().name.c_str());
806 }
807
GetCallerRecordList() const808 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
809 {
810 return callerList_;
811 }
812
GetCallerRecord() const813 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
814 {
815 if (callerList_.empty()) {
816 return nullptr;
817 }
818 return callerList_.back()->GetCaller();
819 }
820
821 #ifdef SUPPORT_GRAPHICS
AddWindowInfo(int windowToken)822 void AbilityRecord::AddWindowInfo(int windowToken)
823 {
824 windowInfo_ = std::make_shared<WindowInfo>(windowToken);
825 isWindowAttached_ = true;
826 }
827
RemoveWindowInfo()828 void AbilityRecord::RemoveWindowInfo()
829 {
830 windowInfo_.reset();
831 }
832 #endif
833
IsConnectListEmpty()834 bool AbilityRecord::IsConnectListEmpty()
835 {
836 return connRecordList_.empty();
837 }
838
GetWindowInfo() const839 std::shared_ptr<WindowInfo> AbilityRecord::GetWindowInfo() const
840 {
841 return windowInfo_;
842 }
843
GetConnectingRecord() const844 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
845 {
846 auto connect =
847 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
848 return record->GetConnectState() == ConnectionState::CONNECTING;
849 });
850 return (connect != connRecordList_.end()) ? *connect : nullptr;
851 }
852
GetConnectingRecordList()853 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
854 {
855 std::list<std::shared_ptr<ConnectionRecord>> connectingList;
856 for (auto record : connRecordList_) {
857 if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
858 connectingList.push_back(record);
859 }
860 }
861 return connectingList;
862 }
863
GetDisconnectingRecord() const864 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
865 {
866 auto connect =
867 std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
868 return record->GetConnectState() == ConnectionState::DISCONNECTING;
869 });
870 return (connect != connRecordList_.end()) ? *connect : nullptr;
871 }
872
GetAbilityTypeString(std::string & typeStr)873 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
874 {
875 AppExecFwk::AbilityType type = GetAbilityInfo().type;
876 switch (type) {
877 #ifdef SUPPORT_GRAPHICS
878 case AppExecFwk::AbilityType::PAGE: {
879 typeStr = "PAGE";
880 break;
881 }
882 #endif
883 case AppExecFwk::AbilityType::SERVICE: {
884 typeStr = "SERVICE";
885 break;
886 }
887 // for config.json type
888 case AppExecFwk::AbilityType::DATA: {
889 typeStr = "DATA";
890 break;
891 }
892 default: {
893 typeStr = "UNKNOWN";
894 break;
895 }
896 }
897 }
898
ConvertAbilityState(const AbilityState & state)899 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
900 {
901 auto it = stateToStrMap.find(state);
902 if (it != stateToStrMap.end()) {
903 return it->second;
904 }
905 return "INVALIDSTATE";
906 }
907
ConvertAppState(const AppState & state)908 std::string AbilityRecord::ConvertAppState(const AppState &state)
909 {
910 auto it = appStateToStrMap_.find(state);
911 if (it != appStateToStrMap_.end()) {
912 return it->second;
913 }
914 return "INVALIDSTATE";
915 }
916
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)917 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
918 {
919 auto it = convertStateMap.find(state);
920 if (it != convertStateMap.end()) {
921 return it->second;
922 }
923 return DEFAULT_INVAL_VALUE;
924 }
925
Dump(std::vector<std::string> & info)926 void AbilityRecord::Dump(std::vector<std::string> &info)
927 {
928 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
929 info.push_back(dumpInfo);
930 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
931 info.push_back(dumpInfo);
932 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
933 info.push_back(dumpInfo);
934 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
935 info.push_back(dumpInfo);
936 // get ability type(unknown/page/service/provider)
937 std::string typeStr;
938 GetAbilityTypeString(typeStr);
939 dumpInfo = " ability type [" + typeStr + "]";
940 info.push_back(dumpInfo);
941 std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
942 if (preAbility == nullptr) {
943 dumpInfo = " previous ability app name [NULL]" + LINE_SEPARATOR;
944 dumpInfo += " previous ability file name [NULL]";
945 } else {
946 dumpInfo =
947 " previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
948 dumpInfo += " previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
949 }
950 info.push_back(dumpInfo);
951 std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
952 if (nextAbility == nullptr) {
953 dumpInfo = " next ability app name [NULL]" + LINE_SEPARATOR;
954 dumpInfo += " next ability file name [NULL]";
955 } else {
956 dumpInfo =
957 " next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
958 dumpInfo += " next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
959 }
960 info.push_back(dumpInfo);
961 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
962 std::to_string(startTime_) + "]";
963 info.push_back(dumpInfo);
964 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
965 info.push_back(dumpInfo);
966 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
967 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
968 info.push_back(dumpInfo);
969
970 if (isLauncherRoot_) {
971 dumpInfo = " can restart num #" + std::to_string(restartCount_);
972 info.push_back(dumpInfo);
973 }
974 }
975
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)976 void AbilityRecord::DumpAbilityState(
977 std::vector<std::string> &info, bool isClient, const std::vector<std::string> ¶ms)
978 {
979 HILOG_INFO("%{public}s begin.", __func__);
980 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
981 info.push_back(dumpInfo);
982 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
983 info.push_back(dumpInfo);
984 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
985 info.push_back(dumpInfo);
986 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
987 info.push_back(dumpInfo);
988 std::string typeStr;
989 GetAbilityTypeString(typeStr);
990 dumpInfo = " ability type [" + typeStr + "]";
991 info.push_back(dumpInfo);
992
993 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
994 std::to_string(startTime_) + "]";
995 info.push_back(dumpInfo);
996 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
997 info.push_back(dumpInfo);
998 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
999 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1000 info.push_back(dumpInfo);
1001 dumpInfo = " callee connections: ";
1002 info.push_back(dumpInfo);
1003 if (callContainer_) {
1004 callContainer_->Dump(info);
1005 }
1006
1007 if (isLauncherRoot_) {
1008 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1009 info.push_back(dumpInfo);
1010 }
1011
1012 // add dump client info
1013 DumpClientInfo(info, params, isClient, params.empty());
1014 }
1015
SetStartTime()1016 void AbilityRecord::SetStartTime()
1017 {
1018 if (startTime_ == 0) {
1019 startTime_ = AbilityUtil::SystemTimeMillis();
1020 }
1021 }
1022
GetStartTime() const1023 int64_t AbilityRecord::GetStartTime() const
1024 {
1025 return startTime_;
1026 }
1027
DumpService(std::vector<std::string> & info,bool isClient) const1028 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
1029 {
1030 info.emplace_back(" AbilityRecord ID #" + std::to_string(GetRecordId()) + " state #" +
1031 AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1032 std::to_string(GetStartTime()) + "]");
1033 info.emplace_back(" main name [" + GetAbilityInfo().name + "]");
1034 info.emplace_back(" bundle name [" + GetAbilityInfo().bundleName + "]");
1035 info.emplace_back(" ability type [SERVICE]");
1036 info.emplace_back(" app state #" + AbilityRecord::ConvertAppState(appState_));
1037
1038 if (isLauncherRoot_) {
1039 info.emplace_back(" can restart num #" + std::to_string(restartCount_));
1040 }
1041
1042 info.emplace_back(" Connections: " + std::to_string(connRecordList_.size()));
1043 for (auto &&conn : connRecordList_) {
1044 if (conn) {
1045 conn->Dump(info);
1046 }
1047 }
1048 // add dump client info
1049 const std::vector<std::string> params;
1050 DumpClientInfo(info, params, isClient);
1051 }
1052
GetAbilityRecordInfo(AbilityRecordInfo & recordInfo)1053 void AbilityRecord::GetAbilityRecordInfo(AbilityRecordInfo &recordInfo)
1054 {
1055 recordInfo.elementName = want_.GetElement().GetURI();
1056 recordInfo.id = recordId_;
1057 recordInfo.appName = abilityInfo_.applicationName;
1058 recordInfo.mainName = abilityInfo_.name;
1059 recordInfo.abilityType = static_cast<int32_t>(abilityInfo_.type);
1060
1061 std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1062 if (preAbility) {
1063 recordInfo.previousAppName = preAbility->GetAbilityInfo().applicationName;
1064 recordInfo.previousMainName = preAbility->GetAbilityInfo().name;
1065 }
1066
1067 std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1068 if (nextAbility) {
1069 recordInfo.nextAppName = nextAbility->GetAbilityInfo().applicationName;
1070 recordInfo.nextMainName = nextAbility->GetAbilityInfo().name;
1071 }
1072
1073 recordInfo.state = static_cast<AbilityState>(currentState_);
1074 recordInfo.startTime = std::to_string(startTime_);
1075 recordInfo.ready = isReady_;
1076 recordInfo.windowAttached = isWindowAttached_;
1077 recordInfo.lanucher = isLauncherAbility_;
1078 }
1079
OnSchedulerDied(const wptr<IRemoteObject> & remote)1080 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
1081 {
1082 HILOG_WARN("On scheduler died.");
1083 auto mission = GetMission();
1084 if (mission) {
1085 HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
1086 }
1087 std::lock_guard<std::mutex> guard(lock_);
1088 CHECK_POINTER(scheduler_);
1089
1090 auto object = remote.promote();
1091 CHECK_POINTER(object);
1092
1093 if (object != scheduler_->AsObject()) {
1094 HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
1095 return;
1096 }
1097
1098 if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1099 auto schedulerObject = scheduler_->AsObject();
1100 if (schedulerObject != nullptr) {
1101 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1102 }
1103 }
1104 scheduler_.clear();
1105 CHECK_POINTER(lifecycleDeal_);
1106 lifecycleDeal_->SetScheduler(nullptr);
1107 isWindowAttached_ = false;
1108
1109 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1110 CHECK_POINTER(abilityManagerService);
1111
1112 auto handler = abilityManagerService->GetEventHandler();
1113 CHECK_POINTER(handler);
1114
1115 HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
1116 auto task = [abilityManagerService, ability = shared_from_this()]() {
1117 abilityManagerService->OnAbilityDied(ability);
1118 };
1119 handler->PostTask(task);
1120 auto uriTask = [want = want_, ability = shared_from_this()]() {
1121 ability->SaveResultToCallers(-1, &want);
1122 ability->SendResultToCallers();
1123 };
1124 handler->PostTask(uriTask);
1125 }
1126
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)1127 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
1128 {
1129 connRemoteObject_ = remoteObject;
1130 }
1131
GetConnRemoteObject() const1132 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
1133 {
1134 return connRemoteObject_;
1135 }
1136
AddStartId()1137 void AbilityRecord::AddStartId()
1138 {
1139 startId_++;
1140 }
GetStartId() const1141 int AbilityRecord::GetStartId() const
1142 {
1143 return startId_;
1144 }
1145
SetIsUninstallAbility()1146 void AbilityRecord::SetIsUninstallAbility()
1147 {
1148 isUninstall_ = true;
1149 }
1150
IsUninstallAbility() const1151 bool AbilityRecord::IsUninstallAbility() const
1152 {
1153 return isUninstall_;
1154 }
1155
SetKernalSystemAbility()1156 void AbilityRecord::SetKernalSystemAbility()
1157 {
1158 isKernalSystemAbility_ = true;
1159 }
1160
IsKernalSystemAbility() const1161 bool AbilityRecord::IsKernalSystemAbility() const
1162 {
1163 return isKernalSystemAbility_;
1164 }
1165
SetLauncherRoot()1166 void AbilityRecord::SetLauncherRoot()
1167 {
1168 isLauncherRoot_ = true;
1169 }
1170
IsLauncherRoot() const1171 bool AbilityRecord::IsLauncherRoot() const
1172 {
1173 return isLauncherRoot_;
1174 }
1175
IsAbilityState(const AbilityState & state) const1176 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
1177 {
1178 return (currentState_ == state);
1179 }
1180
IsActiveState() const1181 bool AbilityRecord::IsActiveState() const
1182 {
1183 return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
1184 IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND_NEW) ||
1185 IsAbilityState(AbilityState::FOREGROUNDING_NEW));
1186 }
1187
SendEvent(uint32_t msg,uint32_t timeOut)1188 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut)
1189 {
1190 if (want_.GetBoolParam(DEBUG_APP, false)) {
1191 HILOG_INFO("Is debug mode, no need to handle time out.");
1192 return;
1193 }
1194 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1195 CHECK_POINTER(handler);
1196
1197 g_abilityRecordEventId_++;
1198 eventId_ = g_abilityRecordEventId_;
1199 handler->SendEvent(msg, eventId_, timeOut);
1200 }
1201
1202 #ifdef SUPPORT_GRAPHICS
SupportMultWindow() const1203 bool AbilityRecord::SupportMultWindow() const
1204 {
1205 // LauncherAbility don't support multi window display.
1206 if (isLauncherAbility_) {
1207 return false;
1208 }
1209
1210 return true;
1211 }
1212
NotifyMultiWinModeChanged(const AbilityWindowConfiguration & winModeKey,bool flag)1213 void AbilityRecord::NotifyMultiWinModeChanged(const AbilityWindowConfiguration &winModeKey, bool flag)
1214 {
1215 HILOG_INFO("Notify multi window mode changed.");
1216 CHECK_POINTER(scheduler_);
1217 scheduler_->NotifyMultiWinModeChanged(static_cast<int32_t>(winModeKey), flag);
1218 }
1219 #endif
1220
SetInMovingState(bool isMoving)1221 void AbilityRecord::SetInMovingState(bool isMoving)
1222 {
1223 isInMovingState_ = isMoving;
1224 }
1225
GetInMovingState() const1226 bool AbilityRecord::GetInMovingState() const
1227 {
1228 return isInMovingState_;
1229 }
1230
IsToEnd() const1231 bool AbilityRecord::IsToEnd() const
1232 {
1233 return isToEnd_;
1234 }
SetToEnd(bool isToEnd)1235 void AbilityRecord::SetToEnd(bool isToEnd)
1236 {
1237 isToEnd_ = isToEnd;
1238 }
1239
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)1240 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
1241 {
1242 lifeCycleStateInfo_.setting = setting;
1243 }
1244
GetStartSetting() const1245 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
1246 {
1247 return lifeCycleStateInfo_.setting;
1248 }
1249
SetPowerState(const bool isPower)1250 void AbilityRecord::SetPowerState(const bool isPower)
1251 {
1252 isPowerState_ = isPower;
1253 }
1254
GetPowerState() const1255 bool AbilityRecord::GetPowerState() const
1256 {
1257 return isPowerState_;
1258 }
1259
SetRestarting(const bool isRestart)1260 void AbilityRecord::SetRestarting(const bool isRestart)
1261 {
1262 isRestarting_ = isRestart;
1263 HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
1264
1265 if (isLauncherRoot_ && IsLauncherAbility()) {
1266 restartCount_ = isRestart ? (--restartCount_) : restratMax_;
1267 HILOG_INFO("root launcher restart count: %{public}d", restartCount_);
1268 }
1269 }
1270
SetRestarting(const bool isRestart,int32_t canReStartCount)1271 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canReStartCount)
1272 {
1273 isRestarting_ = isRestart;
1274 HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canReStartCount);
1275
1276 if (isLauncherRoot_ && IsLauncherAbility()) {
1277 restartCount_ = isRestart ? canReStartCount : restratMax_;
1278 HILOG_INFO("root launcher restart count: %{public}d", restartCount_);
1279 }
1280 }
1281
GetRestartCount() const1282 int32_t AbilityRecord::GetRestartCount() const
1283 {
1284 return restartCount_;
1285 }
1286
IsRestarting() const1287 bool AbilityRecord::IsRestarting() const
1288 {
1289 return isRestarting_;
1290 }
1291
SetAppState(const AppState & state)1292 void AbilityRecord::SetAppState(const AppState &state)
1293 {
1294 appState_ = state;
1295 }
1296
GetAppState() const1297 AppState AbilityRecord::GetAppState() const
1298 {
1299 return appState_;
1300 }
1301
ClearFlag()1302 void AbilityRecord::ClearFlag()
1303 {
1304 isRestarting_ = false;
1305 isPowerState_ = false;
1306 isForceTerminate_ = false;
1307 isUninstall_ = false;
1308 isTerminating_ = false;
1309 isInMovingState_ = false;
1310 preAbilityRecord_.reset();
1311 nextAbilityRecord_.reset();
1312 backAbilityRecord_.reset();
1313 startTime_ = 0;
1314 appState_ = AppState::END;
1315 }
1316
1317 #ifdef SUPPORT_GRAPHICS
SetLockScreenState(const bool isLock)1318 void AbilityRecord::SetLockScreenState(const bool isLock)
1319 {
1320 isLockScreenState_ = isLock;
1321 }
1322
GetLockScreenState() const1323 bool AbilityRecord::GetLockScreenState() const
1324 {
1325 return isLockScreenState_;
1326 }
1327 #endif
1328
SetMovingBackgroundFlag(bool isMoving)1329 void AbilityRecord::SetMovingBackgroundFlag(bool isMoving)
1330 {
1331 isMovingBackground_ = isMoving;
1332 }
1333
IsMovingBackground() const1334 bool AbilityRecord::IsMovingBackground() const
1335 {
1336 return isMovingBackground_;
1337 }
1338
1339 #ifdef SUPPORT_GRAPHICS
SetLockScreenRoot()1340 void AbilityRecord::SetLockScreenRoot()
1341 {
1342 isLockScreenRoot_ = true;
1343 }
1344
IsLockScreenRoot() const1345 bool AbilityRecord::IsLockScreenRoot() const
1346 {
1347 return isLockScreenRoot_;
1348 }
1349
SetPowerStateLockScreen(const bool isPower)1350 void AbilityRecord::SetPowerStateLockScreen(const bool isPower)
1351 {
1352 isPowerStateLockScreen_ = isPower;
1353 }
1354
GetPowerStateLockScreen() const1355 bool AbilityRecord::GetPowerStateLockScreen() const
1356 {
1357 return isPowerStateLockScreen_;
1358 }
1359 #endif
1360
IsNewVersion()1361 bool AbilityRecord::IsNewVersion()
1362 {
1363 return compatibleVersion_ > API_VERSION_7;
1364 }
1365
SetLaunchReason(const LaunchReason & reason)1366 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
1367 {
1368 lifeCycleStateInfo_.launchParam.launchReason = reason;
1369 }
1370
SetLastExitReason(const LastExitReason & reason)1371 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
1372 {
1373 lifeCycleStateInfo_.launchParam.lastExitReason = reason;
1374 }
1375
NotifyContinuationResult(int32_t result)1376 void AbilityRecord::NotifyContinuationResult(int32_t result)
1377 {
1378 HILOG_INFO("NotifyContinuationResult.");
1379 CHECK_POINTER(lifecycleDeal_);
1380
1381 lifecycleDeal_->NotifyContinuationResult(result);
1382 }
1383
1384 #ifdef SUPPORT_GRAPHICS
GetOwnedMissionList() const1385 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
1386 {
1387 return missionList_.lock();
1388 }
1389
SetMissionList(const std::shared_ptr<MissionList> & missionList)1390 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
1391 {
1392 missionList_ = missionList;
1393 }
1394
SetUseNewMission()1395 void AbilityRecord::SetUseNewMission()
1396 {
1397 lifeCycleStateInfo_.useNewMission = true;
1398 }
1399
SetMission(const std::shared_ptr<Mission> & mission)1400 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
1401 {
1402 if (mission) {
1403 missionId_ = mission->GetMissionId();
1404 HILOG_INFO("SetMission come, missionId is %{public}d.", missionId_);
1405 }
1406 mission_ = mission;
1407 }
1408 #endif
1409
SetMinimizeReason(bool fromUser)1410 void AbilityRecord::SetMinimizeReason(bool fromUser)
1411 {
1412 minimizeReason_ = fromUser;
1413 }
1414
IsMinimizeFromUser() const1415 bool AbilityRecord::IsMinimizeFromUser() const
1416 {
1417 return minimizeReason_;
1418 }
1419
1420 #ifdef SUPPORT_GRAPHICS
GetMission() const1421 std::shared_ptr<Mission> AbilityRecord::GetMission() const
1422 {
1423 return mission_.lock();
1424 }
1425
GetMissionId() const1426 int32_t AbilityRecord::GetMissionId() const
1427 {
1428 return missionId_;
1429 }
1430 #endif
1431
SetSpecifiedFlag(const std::string & flag)1432 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
1433 {
1434 specifiedFlag_ = flag;
1435 }
1436
GetSpecifiedFlag() const1437 std::string AbilityRecord::GetSpecifiedFlag() const
1438 {
1439 return specifiedFlag_;
1440 }
1441
AbilityRecordNew(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode,int32_t apiVersion)1442 AbilityRecordNew::AbilityRecordNew(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
1443 const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode, int32_t apiVersion)
1444 : AbilityRecord(want, abilityInfo, applicationInfo, requestCode, apiVersion)
1445 {
1446 }
1447
~AbilityRecordNew()1448 AbilityRecordNew::~AbilityRecordNew()
1449 {
1450 }
1451
Activate()1452 void AbilityRecordNew::Activate()
1453 {
1454 ForegroundNew();
1455 }
1456
Inactivate()1457 void AbilityRecordNew::Inactivate()
1458 {
1459 HILOG_INFO("AbilityRecordNew Move to Inactivate.");
1460 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1461 if (handler == nullptr) {
1462 HILOG_ERROR("handler is nullptr or task is nullptr.");
1463 return;
1464 }
1465 SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
1466
1467 auto task = [token = token_]() {
1468 HILOG_DEBUG("AbilityRecordNew inactive done.");
1469 PacMap restoreData;
1470 DelayedSingleton<AbilityManagerService>::GetInstance()->AbilityTransitionDone(token,
1471 ABILITY_STATE_INACTIVE, restoreData);
1472 };
1473 handler->PostTask(task);
1474 }
1475
ForegroundNew()1476 void AbilityRecordNew::ForegroundNew()
1477 {
1478 HILOG_INFO("ForegroundingNew.");
1479 CHECK_POINTER(lifecycleDeal_);
1480
1481 SendEvent(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, AbilityManagerService::FOREGROUNDNEW_TIMEOUT);
1482
1483 // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1484 // earlier than above actions.
1485 currentState_ = AbilityState::FOREGROUNDING_NEW;
1486 lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_);
1487
1488 // update ability state to appMgr service when restart
1489 if (IsNewWant()) {
1490 sptr<Token> preToken = nullptr;
1491 if (GetPreAbilityRecord()) {
1492 preToken = GetPreAbilityRecord()->GetToken();
1493 }
1494 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1495 }
1496 }
1497
MoveToBackground(const Closure & task)1498 void AbilityRecordNew::MoveToBackground(const Closure &task)
1499 {
1500 BackgroundNew(task);
1501 }
1502
BackgroundNew(const Closure & task)1503 void AbilityRecordNew::BackgroundNew(const Closure &task)
1504 {
1505 HILOG_INFO("Move to backgroundNew.");
1506 CHECK_POINTER(lifecycleDeal_);
1507 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1508 if (handler && task) {
1509 if (!want_.GetBoolParam(DEBUG_APP, false)) {
1510 g_abilityRecordEventId_++;
1511 eventId_ = g_abilityRecordEventId_;
1512 // eventId_ is a unique id of the task.
1513 handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUNDNEW_TIMEOUT);
1514 } else {
1515 HILOG_INFO("Is debug mode, no need to handle time out.");
1516 }
1517 }
1518
1519 if (!IsTerminating() || IsRestarting()) {
1520 // schedule save ability state before moving to background.
1521 SaveAbilityState();
1522 }
1523
1524 // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1525 // earlier than above actions.
1526 currentState_ = AbilityState::BACKGROUNDING_NEW;
1527 lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
1528 }
1529
1530 // new version --start
IsStartedByCall() const1531 bool AbilityRecord::IsStartedByCall() const
1532 {
1533 return isStartedByCall_;
1534 }
1535
SetStartedByCall(const bool isFlag)1536 void AbilityRecord::SetStartedByCall(const bool isFlag)
1537 {
1538 isStartedByCall_ = isFlag;
1539 }
1540
IsStartToBackground() const1541 bool AbilityRecord::IsStartToBackground() const
1542 {
1543 return isStartToBackground_;
1544 }
1545
SetStartToBackground(const bool flag)1546 void AbilityRecord::SetStartToBackground(const bool flag)
1547 {
1548 isStartToBackground_ = flag;
1549 }
1550
CallRequest()1551 bool AbilityRecord::CallRequest()
1552 {
1553 HILOG_INFO("Call Request.");
1554 CHECK_POINTER_RETURN_BOOL(scheduler_);
1555 CHECK_POINTER_RETURN_BOOL(callContainer_);
1556
1557 // sync call request
1558 sptr<IRemoteObject> callStub = scheduler_->CallRequest();
1559 if (!callStub) {
1560 HILOG_ERROR("call request failed, callstub is nullptr.");
1561 return false;
1562 }
1563
1564 // complete call request
1565 return callContainer_->CallRequestDone(callStub);
1566 }
1567
Resolve(const AbilityRequest & abilityRequest)1568 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
1569 {
1570 auto callback = abilityRequest.connect;
1571 if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
1572 HILOG_ERROR("only startd by call type can create a call record.");
1573 return ResolveResultType::NG_INNER_ERROR;
1574 }
1575 if (!callContainer_) {
1576 callContainer_ = std::make_shared<CallContainer>();
1577 if (!callContainer_) {
1578 HILOG_ERROR("mark_shared error.");
1579 return ResolveResultType::NG_INNER_ERROR;
1580 }
1581 }
1582
1583 HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
1584 abilityRequest.callerUid,
1585 abilityRequest.abilityInfo.name.c_str());
1586
1587 std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
1588 if (!callRecord) {
1589 callRecord = CallRecord::CreateCallRecord(
1590 abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
1591 if (!callRecord) {
1592 HILOG_ERROR("mark_shared error.");
1593 return ResolveResultType::NG_INNER_ERROR;
1594 }
1595 }
1596
1597 callContainer_->AddCallRecord(callback, callRecord);
1598
1599 if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
1600 HILOG_DEBUG("this record has requested.");
1601 if (!callRecord->SchedulerConnectDone()) {
1602 HILOG_DEBUG("this callrecord has requested, but callback failed.");
1603 return ResolveResultType::NG_INNER_ERROR;
1604 }
1605 return ResolveResultType::OK_HAS_REMOTE_OBJ;
1606 }
1607
1608 callRecord->SetCallState(CallState::REQUESTING);
1609 return ResolveResultType::OK_NO_REMOTE_OBJ;
1610 }
1611
Release(const sptr<IAbilityConnection> & connect)1612 bool AbilityRecord::Release(const sptr<IAbilityConnection> & connect)
1613 {
1614 HILOG_DEBUG("ability release call record by callback.");
1615 CHECK_POINTER_RETURN_BOOL(callContainer_);
1616
1617 return callContainer_->RemoveCallRecord(connect);
1618 }
1619
IsNeedToCallRequest() const1620 bool AbilityRecord::IsNeedToCallRequest() const
1621 {
1622 HILOG_DEBUG("ability release call record by callback.");
1623 CHECK_POINTER_RETURN_BOOL(callContainer_);
1624
1625 return callContainer_->IsNeedToCallRequest();
1626 }
1627
ContinueAbility(const std::string & deviceId)1628 void AbilityRecord::ContinueAbility(const std::string& deviceId)
1629 {
1630 HILOG_INFO("ContinueAbility.");
1631 CHECK_POINTER(lifecycleDeal_);
1632
1633 lifecycleDeal_->ContinueAbility(deviceId);
1634 }
1635
SetSwitchingPause(bool state)1636 void AbilityRecord::SetSwitchingPause(bool state)
1637 {
1638 isSwitchingPause_ = state;
1639 }
1640
IsSwitchingPause()1641 bool AbilityRecord::IsSwitchingPause()
1642 {
1643 return isSwitchingPause_;
1644 }
1645
SetOwnerMissionUserId(int32_t userId)1646 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
1647 {
1648 ownerMissionUserId_ = userId;
1649 }
1650
GetOwnerMissionUserId()1651 int32_t AbilityRecord::GetOwnerMissionUserId()
1652 {
1653 return ownerMissionUserId_;
1654 }
1655
DumpSys(std::vector<std::string> & info,bool isClient)1656 void AbilityRecord::DumpSys(std::vector<std::string> &info, bool isClient)
1657 {
1658 std::string dumpInfo = " AbilityRecord ID #" + std::to_string(recordId_);
1659 info.push_back(dumpInfo);
1660 dumpInfo = " app name [" + GetAbilityInfo().applicationName + "]";
1661 info.push_back(dumpInfo);
1662 dumpInfo = " main name [" + GetAbilityInfo().name + "]";
1663 info.push_back(dumpInfo);
1664 dumpInfo = " bundle name [" + GetAbilityInfo().bundleName + "]";
1665 info.push_back(dumpInfo);
1666 std::string typeStr;
1667 GetAbilityTypeString(typeStr);
1668 dumpInfo = " ability type [" + typeStr + "]";
1669 info.push_back(dumpInfo);
1670 std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1671 if (preAbility == nullptr) {
1672 dumpInfo = " previous ability app name [NULL]" + LINE_SEPARATOR;
1673 dumpInfo += " previous ability file name [NULL]";
1674 } else {
1675 dumpInfo =
1676 " previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
1677 dumpInfo += " previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1678 }
1679 info.push_back(dumpInfo);
1680 std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1681 if (nextAbility == nullptr) {
1682 dumpInfo = " next ability app name [NULL]" + LINE_SEPARATOR;
1683 dumpInfo += " next ability file name [NULL]";
1684 } else {
1685 dumpInfo =
1686 " next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
1687 dumpInfo += " next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1688 }
1689 info.push_back(dumpInfo);
1690 dumpInfo = " state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + " start time [" +
1691 std::to_string(startTime_) + "]";
1692 info.push_back(dumpInfo);
1693 dumpInfo = " app state #" + AbilityRecord::ConvertAppState(appState_);
1694 info.push_back(dumpInfo);
1695 dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" +
1696 std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_);
1697 info.push_back(dumpInfo);
1698
1699 if (isLauncherRoot_ && IsNewVersion()) {
1700 dumpInfo = " can restart num #" + std::to_string(restartCount_);
1701 info.push_back(dumpInfo);
1702 }
1703 const std::vector<std::string> params;
1704 DumpClientInfo(info, params, isClient);
1705 }
1706
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const1707 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> ¶ms,
1708 bool isClient, bool dumpConfig) const
1709 {
1710 if (!isClient || !scheduler_ || !isReady_) {
1711 HILOG_ERROR("something nullptr.");
1712 return;
1713 }
1714 std::unique_lock<std::mutex> lock(dumpLock_);
1715 scheduler_->DumpAbilityInfo(params, info);
1716
1717 HILOG_INFO("Dump begin wait.");
1718 isDumpTimeout_ = false;
1719 std::chrono::milliseconds timeout { AbilityManagerService::DUMP_TIMEOUT };
1720 if (dumpCondition_.wait_for(lock, timeout) == std::cv_status::timeout) {
1721 isDumpTimeout_ = true;
1722 }
1723 HILOG_INFO("Dump done and begin parse.");
1724 if (!isDumpTimeout_) {
1725 std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
1726 for (auto one : dumpInfos_) {
1727 info.emplace_back(one);
1728 }
1729 }
1730
1731 if (!dumpConfig) {
1732 HILOG_INFO("not dumpConfig.");
1733 return;
1734 }
1735 AppExecFwk::Configuration config;
1736 if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
1737 info.emplace_back(" configuration: " + config.GetName());
1738 }
1739 }
1740
DumpAbilityInfoDone(std::vector<std::string> & infos)1741 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
1742 {
1743 HILOG_INFO("DumpAbilityInfoDone begin.");
1744 if (isDumpTimeout_) {
1745 HILOG_WARN("%{public}s, dump time out.", __func__);
1746 return;
1747 }
1748 {
1749 std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
1750 dumpInfos_.clear();
1751 for (auto info : infos) {
1752 dumpInfos_.emplace_back(info);
1753 }
1754 }
1755 dumpCondition_.notify_all();
1756 }
1757
GrantUriPermission(const Want & want)1758 void AbilityRecord::GrantUriPermission(const Want &want)
1759 {
1760 HILOG_DEBUG("AbilityRecord::GrantUriPermission is called.");
1761 auto flags = want.GetFlags();
1762 if (flags & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) {
1763 HILOG_INFO("Want to grant r/w permission of the uri");
1764 auto targetTokenId = abilityInfo_.applicationInfo.accessTokenId;
1765 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
1766 if (abilityMgr) {
1767 abilityMgr->GrantUriPermission(want, GetCurrentAccountId(), targetTokenId);
1768 }
1769 }
1770 }
1771
GetCurrentAccountId()1772 int AbilityRecord::GetCurrentAccountId()
1773 {
1774 std::vector<int32_t> osActiveAccountIds;
1775 ErrCode ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(osActiveAccountIds);
1776 if (ret != ERR_OK) {
1777 HILOG_ERROR("QueryActiveOsAccountIds failed.");
1778 return DEFAULT_USER_ID;
1779 }
1780
1781 if (osActiveAccountIds.empty()) {
1782 HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
1783 return DEFAULT_USER_ID;
1784 }
1785
1786 return osActiveAccountIds.front();
1787 }
1788
SetWindowMode(int32_t windowMode)1789 void AbilityRecord::SetWindowMode(int32_t windowMode)
1790 {
1791 want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
1792 }
1793
RemoveWindowMode()1794 void AbilityRecord::RemoveWindowMode()
1795 {
1796 want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
1797 }
1798 } // namespace AAFwk
1799 } // namespace OHOS
1800