1 /*
2 * Copyright (c) 2023-2024 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 "scene_board/ui_ability_lifecycle_manager.h"
17
18 #include "ability_manager_service.h"
19 #include "appfreeze_manager.h"
20 #include "app_exit_reason_data_manager.h"
21 #include "utils/app_mgr_util.h"
22 #include "app_utils.h"
23 #include "global_constant.h"
24 #include "hitrace_meter.h"
25 #include "permission_constants.h"
26 #include "process_options.h"
27 #include "start_window_option.h"
28 #include "scene_board/status_bar_delegate_manager.h"
29 #include "session_manager_lite.h"
30 #include "session/host/include/zidl/session_interface.h"
31 #include "startup_util.h"
32 #include "ui_extension_utils.h"
33 #ifdef SUPPORT_GRAPHICS
34 #include "ability_first_frame_state_observer_manager.h"
35 #endif
36
37 namespace OHOS {
38 using AbilityRuntime::FreezeUtil;
39 namespace AAFwk {
40 namespace {
41 constexpr const char* SEPARATOR = ":";
42 constexpr int32_t PREPARE_TERMINATE_TIMEOUT_MULTIPLE = 10;
43 constexpr const char* PARAM_MISSION_AFFINITY_KEY = "ohos.anco.param.missionAffinity";
44 constexpr const char* DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
45 constexpr const char* DMS_MISSION_ID = "dmsMissionId";
46 constexpr int DEFAULT_DMS_MISSION_ID = -1;
47 constexpr const char* PARAM_SPECIFIED_PROCESS_FLAG = "ohoSpecifiedProcessFlag";
48 constexpr const char* DMS_PROCESS_NAME = "distributedsched";
49 constexpr const char* DMS_PERSISTENT_ID = "ohos.dms.persistentId";
50 constexpr const char* IS_SHELL_CALL = "isShellCall";
51 #ifdef SUPPORT_ASAN
52 constexpr int KILL_TIMEOUT_MULTIPLE = 45;
53 #else
54 constexpr int KILL_TIMEOUT_MULTIPLE = 3;
55 #endif
56 constexpr int32_t DEFAULT_USER_ID = 0;
57 constexpr int32_t MAX_FIND_UIEXTENSION_CALLER_TIMES = 10;
58
MsgId2State(uint32_t msgId)59 FreezeUtil::TimeoutState MsgId2State(uint32_t msgId)
60 {
61 if (msgId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
62 return FreezeUtil::TimeoutState::LOAD;
63 } else if (msgId == AbilityManagerService::FOREGROUND_TIMEOUT_MSG) {
64 return FreezeUtil::TimeoutState::FOREGROUND;
65 } else if (msgId == AbilityManagerService::BACKGROUND_TIMEOUT_MSG) {
66 return FreezeUtil::TimeoutState::BACKGROUND;
67 }
68 return FreezeUtil::TimeoutState::UNKNOWN;
69 }
70
__anon77bfbb840202(const sptr<Token> &token, FreezeUtil::TimeoutState state) 71 auto g_deleteLifecycleEventTask = [](const sptr<Token> &token, FreezeUtil::TimeoutState state) {
72 CHECK_POINTER_LOG(token, "token is nullptr.");
73 FreezeUtil::LifecycleFlow flow = { token->AsObject(), state };
74 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
75 };
76 }
77
UIAbilityLifecycleManager(int32_t userId)78 UIAbilityLifecycleManager::UIAbilityLifecycleManager(int32_t userId): userId_(userId) {}
79
StartUIAbility(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,uint32_t sceneFlag,bool & isColdStart)80 int UIAbilityLifecycleManager::StartUIAbility(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
81 uint32_t sceneFlag, bool &isColdStart)
82 {
83 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
84 std::lock_guard<ffrt::mutex> guard(sessionLock_);
85 if (!CheckSessionInfo(sessionInfo)) {
86 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is invalid.");
87 return ERR_INVALID_VALUE;
88 }
89 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartUIAbility session:%{public}d. bundle:%{public}s, ability:%{public}s",
90 sessionInfo->persistentId, abilityRequest.abilityInfo.bundleName.c_str(),
91 abilityRequest.abilityInfo.name.c_str());
92 abilityRequest.sessionInfo = sessionInfo;
93 auto uiAbilityRecord = GenerateAbilityRecord(abilityRequest, sessionInfo, isColdStart);
94 CHECK_POINTER_AND_RETURN(uiAbilityRecord, ERR_INVALID_VALUE);
95 TAG_LOGD(AAFwkTag::ABILITYMGR, "StartUIAbility, specifyTokenId is %{public}u.", abilityRequest.specifyTokenId);
96 uiAbilityRecord->SetSpecifyTokenId(abilityRequest.specifyTokenId);
97 if (HandleStartSpecifiedCold(abilityRequest, sessionInfo, sceneFlag)) {
98 UpdateAbilityRecordLaunchReason(abilityRequest, uiAbilityRecord);
99 NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest);
100 AddCallerRecord(abilityRequest, sessionInfo, uiAbilityRecord);
101 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
102 return ERR_OK;
103 }
104
105 if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) {
106 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped.");
107 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
108 return ERR_OK;
109 } else {
110 TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is not FOREGROUND or BACKGROUND.");
111 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
112 }
113
114 UpdateAbilityRecordLaunchReason(abilityRequest, uiAbilityRecord);
115 NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest);
116 if (!uiAbilityRecord->IsReady() || sessionInfo->isNewWant) {
117 AddCallerRecord(abilityRequest, sessionInfo, uiAbilityRecord);
118 }
119 auto isShellCall = abilityRequest.want.GetBoolParam(IS_SHELL_CALL, false);
120 uint32_t callerTokenId = static_cast<uint32_t>(abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0));
121 uiAbilityRecord->ProcessForegroundAbility(callerTokenId, sceneFlag, isShellCall);
122 CheckSpecified(sessionInfo->tmpSpecifiedId, uiAbilityRecord);
123 SendKeyEvent(abilityRequest);
124 return ERR_OK;
125 }
126
GenerateAbilityRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,bool & isColdStart)127 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GenerateAbilityRecord(AbilityRequest &abilityRequest,
128 sptr<SessionInfo> sessionInfo, bool &isColdStart)
129 {
130 std::shared_ptr<AbilityRecord> uiAbilityRecord = nullptr;
131 auto iter = sessionAbilityMap_.find(sessionInfo->persistentId);
132 if (iter != sessionAbilityMap_.end()) {
133 TAG_LOGI(AAFwkTag::ABILITYMGR, "NewWant:%{public}d", sessionInfo->isNewWant);
134 uiAbilityRecord = iter->second;
135 if (uiAbilityRecord == nullptr || uiAbilityRecord->GetSessionInfo() == nullptr) {
136 TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord invalid");
137 return nullptr;
138 }
139 if (sessionInfo->sessionToken != uiAbilityRecord->GetSessionInfo()->sessionToken) {
140 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionToken invalid");
141 return nullptr;
142 }
143 uiAbilityRecord->SetIsNewWant(sessionInfo->isNewWant);
144 if (sessionInfo->isNewWant) {
145 uiAbilityRecord->SetWant(abilityRequest.want);
146 uiAbilityRecord->GetSessionInfo()->want.RemoveAllFd();
147 } else {
148 sessionInfo->want.CloseAllFd();
149 }
150 } else {
151 uiAbilityRecord = CreateAbilityRecord(abilityRequest, sessionInfo);
152 isColdStart = true;
153 UpdateProcessName(abilityRequest, uiAbilityRecord);
154 if (isSCBRecovery_) {
155 coldStartInSCBRecovery_.insert(sessionInfo->persistentId);
156 }
157 auto abilityInfo = abilityRequest.abilityInfo;
158 MoreAbilityNumbersSendEventInfo(
159 abilityRequest.userId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
160 sessionAbilityMap_.emplace(sessionInfo->persistentId, uiAbilityRecord);
161 }
162 return uiAbilityRecord;
163 }
164
CheckSessionInfo(sptr<SessionInfo> sessionInfo) const165 bool UIAbilityLifecycleManager::CheckSessionInfo(sptr<SessionInfo> sessionInfo) const
166 {
167 if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) {
168 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is invalid.");
169 return false;
170 }
171 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
172 auto descriptor = Str16ToStr8(sessionToken->GetDescriptor());
173 if (descriptor != "OHOS.ISession") {
174 TAG_LOGE(AAFwkTag::ABILITYMGR, "token's Descriptor: %{public}s", descriptor.c_str());
175 return false;
176 }
177 return true;
178 }
179
CreateAbilityRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo) const180 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::CreateAbilityRecord(AbilityRequest &abilityRequest,
181 sptr<SessionInfo> sessionInfo) const
182 {
183 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
184 TAG_LOGD(AAFwkTag::ABILITYMGR, "Create ability record.");
185 if (sessionInfo->startSetting != nullptr) {
186 TAG_LOGD(AAFwkTag::ABILITYMGR, "startSetting is valid.");
187 abilityRequest.startSetting = sessionInfo->startSetting;
188 }
189 auto uiAbilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
190 if (uiAbilityRecord == nullptr) {
191 TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord is invalid.");
192 return nullptr;
193 }
194 TAG_LOGD(AAFwkTag::ABILITYMGR, "user id: %{public}d.", userId_);
195 uiAbilityRecord->SetOwnerMissionUserId(userId_);
196 SetRevicerInfo(abilityRequest, uiAbilityRecord);
197 return uiAbilityRecord;
198 }
199
AddCallerRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,std::shared_ptr<AbilityRecord> uiAbilityRecord) const200 void UIAbilityLifecycleManager::AddCallerRecord(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
201 std::shared_ptr<AbilityRecord> uiAbilityRecord) const
202 {
203 if (sessionInfo == nullptr) {
204 TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is invalid.");
205 return;
206 }
207 CHECK_POINTER(uiAbilityRecord);
208 std::string srcAbilityId = "";
209 if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) {
210 std::string srcDeviceId = abilityRequest.want.GetStringParam(DMS_SRC_NETWORK_ID);
211 int missionId = abilityRequest.want.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID);
212 TAG_LOGD(AAFwkTag::ABILITYMGR, "Get srcNetWorkId = %{public}s, missionId = %{public}d", srcDeviceId.c_str(),
213 missionId);
214 Want *newWant = const_cast<Want*>(&abilityRequest.want);
215 newWant->RemoveParam(DMS_SRC_NETWORK_ID);
216 newWant->RemoveParam(DMS_MISSION_ID);
217 newWant->RemoveParam(Want::PARAM_RESV_FOR_RESULT);
218 srcAbilityId = srcDeviceId + "_" + std::to_string(missionId);
219 }
220 uiAbilityRecord->AddCallerRecord(sessionInfo->callerToken,
221 sessionInfo->requestCode, abilityRequest.want, srcAbilityId, sessionInfo->callingTokenId);
222 }
223
CheckSpecified(int32_t requestId,std::shared_ptr<AbilityRecord> uiAbilityRecord)224 void UIAbilityLifecycleManager::CheckSpecified(int32_t requestId, std::shared_ptr<AbilityRecord> uiAbilityRecord)
225 {
226 auto iter = specifiedFlagMap_.find(requestId);
227 if (iter != specifiedFlagMap_.end()) {
228 uiAbilityRecord->SetSpecifiedFlag(iter->second);
229 specifiedFlagMap_.erase(iter);
230 }
231 }
232
SendKeyEvent(const AbilityRequest & abilityRequest) const233 void UIAbilityLifecycleManager::SendKeyEvent(const AbilityRequest &abilityRequest) const
234 {
235 if (abilityRequest.abilityInfo.visible == false) {
236 EventInfo eventInfo;
237 eventInfo.abilityName = abilityRequest.abilityInfo.name;
238 eventInfo.bundleName = abilityRequest.abilityInfo.bundleName;
239 eventInfo.moduleName = abilityRequest.abilityInfo.moduleName;
240 EventReport::SendKeyEvent(EventName::START_PRIVATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
241 }
242 }
243
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)244 int UIAbilityLifecycleManager::AttachAbilityThread(const sptr<IAbilityScheduler> &scheduler,
245 const sptr<IRemoteObject> &token)
246 {
247 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
248 std::lock_guard<ffrt::mutex> guard(sessionLock_);
249 if (!IsContainsAbilityInner(token)) {
250 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not in running list");
251 return ERR_INVALID_VALUE;
252 }
253 auto&& abilityRecord = Token::GetAbilityRecordByToken(token);
254 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
255 TAG_LOGI(AAFwkTag::ABILITYMGR, "Lifecycle: name is %{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
256 SetLastExitReason(abilityRecord);
257
258 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
259 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
260 handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
261 abilityRecord->SetLoading(false);
262 FreezeUtil::LifecycleFlow flow = {token, FreezeUtil::TimeoutState::LOAD};
263 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
264
265 abilityRecord->SetScheduler(scheduler);
266 if (DoProcessAttachment(abilityRecord) != ERR_OK) {
267 TAG_LOGE(AAFwkTag::ABILITYMGR, "do process attachment failed, close the ability.");
268 TerminateSession(abilityRecord);
269 return ERR_INVALID_VALUE;
270 }
271 if (abilityRecord->IsStartedByCall()) {
272 if (abilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
273 abilityRecord->SetStartToForeground(true);
274 abilityRecord->PostForegroundTimeoutTask();
275 abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING);
276 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
277 } else {
278 abilityRecord->SetStartToBackground(true);
279 MoveToBackground(abilityRecord);
280 }
281 return ERR_OK;
282 }
283 if (abilityRecord->IsNeedToCallRequest()) {
284 abilityRecord->CallRequest();
285 }
286 abilityRecord->PostForegroundTimeoutTask();
287 abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING);
288 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
289 return ERR_OK;
290 }
291
OnAbilityRequestDone(const sptr<IRemoteObject> & token,int32_t state)292 void UIAbilityLifecycleManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, int32_t state)
293 {
294 TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability request state %{public}d done.", state);
295 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
296 std::lock_guard<ffrt::mutex> guard(sessionLock_);
297 AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
298 if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
299 auto abilityRecord = GetAbilityRecordByToken(token);
300 CHECK_POINTER(abilityRecord);
301 if (abilityRecord->IsTerminating()) {
302 TAG_LOGI(AAFwkTag::ABILITYMGR, "ability is on terminating");
303 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
304 CHECK_POINTER(handler);
305 handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
306 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
307 abilityRecord->SetPendingState(AbilityState::INITIAL);
308 CompleteTerminateLocked(abilityRecord);
309 return;
310 }
311 std::string element = abilityRecord->GetElementName().GetURI();
312 TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is %{public}s, start to foreground.", element.c_str());
313 abilityRecord->ForegroundAbility(abilityRecord->lifeCycleStateInfo_.sceneFlagBak);
314 }
315 }
316
AbilityTransactionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)317 int UIAbilityLifecycleManager::AbilityTransactionDone(const sptr<IRemoteObject> &token, int state,
318 const PacMap &saveData)
319 {
320 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
321 int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
322 std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
323 TAG_LOGD(AAFwkTag::ABILITYMGR, "AbilityTransactionDone, state: %{public}s.", abilityState.c_str());
324
325 std::lock_guard<ffrt::mutex> guard(sessionLock_);
326 auto abilityRecord = GetAbilityRecordByToken(token);
327 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
328 abilityRecord->RemoveSignatureInfo();
329 std::string element = abilityRecord->GetElementName().GetURI();
330 TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
331
332 if (targetState == AbilityState::BACKGROUND) {
333 abilityRecord->SaveAbilityState(saveData);
334 }
335
336 return DispatchState(abilityRecord, targetState);
337 }
338
AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> & token,const WindowConfig & windowConfig)339 int UIAbilityLifecycleManager::AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> &token,
340 const WindowConfig &windowConfig)
341 {
342 std::lock_guard<ffrt::mutex> guard(sessionLock_);
343 auto abilityRecord = GetAbilityRecordByToken(token);
344 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
345 abilityRecord->SaveAbilityWindowConfig(windowConfig);
346 return ERR_OK;
347 }
348
NotifySCBToStartUIAbility(AbilityRequest & abilityRequest)349 int UIAbilityLifecycleManager::NotifySCBToStartUIAbility(AbilityRequest &abilityRequest)
350 {
351 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
352 abilityRequest.want.SetParam(IS_SHELL_CALL, AAFwk::PermissionVerification::GetInstance()->IsShellCall());
353 std::lock_guard<ffrt::mutex> guard(sessionLock_);
354 // start ability with persistentId by dms
355 int32_t persistentId = abilityRequest.want.GetIntParam(DMS_PERSISTENT_ID, 0);
356 TAG_LOGD(AAFwkTag::ABILITYMGR, "NotifySCBToStartUIAbility, want with persistentId: %{public}d.", persistentId);
357 if (persistentId != 0 &&
358 AAFwk::PermissionVerification::GetInstance()->CheckSpecificSystemAbilityAccessPermission(DMS_PROCESS_NAME)) {
359 return StartWithPersistentIdByDistributed(abilityRequest, persistentId);
360 }
361
362 const auto &abilityInfo = abilityRequest.abilityInfo;
363 bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel);
364 auto requestId = GetRequestId();
365 // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'.
366 bool isNewProcessMode = abilityRequest.processOptions &&
367 ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode);
368 if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess()
369 && isUIAbility) {
370 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess");
371 auto specifiedRequest = std::make_shared<SpecifiedRequest>(requestId, abilityRequest);
372 specifiedRequest->isSpecifiedProcess = true;
373 AddSpecifiedRequest(specifiedRequest);
374 return ERR_OK;
375 }
376 auto isSpecified = (abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED);
377 if (isSpecified) {
378 auto specifiedRequest = std::make_shared<SpecifiedRequest>(requestId, abilityRequest);
379 specifiedRequest->preCreateProcessName = true;
380 AddSpecifiedRequest(specifiedRequest);
381 return ERR_OK;
382 }
383 auto sessionInfo = CreateSessionInfo(abilityRequest);
384 sessionInfo->requestCode = abilityRequest.requestCode;
385 sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse);
386 sessionInfo->userId = userId_;
387 sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
388 TAG_LOGI(
389 AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, userId_);
390 int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest);
391 sessionInfo->want.RemoveAllFd();
392 return ret;
393 }
394
NotifySCBToRecoveryAfterInterception(const AbilityRequest & abilityRequest)395 int32_t UIAbilityLifecycleManager::NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest)
396 {
397 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
398 std::lock_guard<ffrt::mutex> guard(sessionLock_);
399 const auto &abilityInfo = abilityRequest.abilityInfo;
400 bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel);
401 // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'.
402 bool isNewProcessMode = abilityRequest.processOptions &&
403 ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode);
404 if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess()
405 && isUIAbility) {
406 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess");
407 auto specifiedRequest = std::make_shared<SpecifiedRequest>(GetRequestId(), abilityRequest);
408 specifiedRequest->isSpecifiedProcess = true;
409 AddSpecifiedRequest(specifiedRequest);
410 return ERR_OK;
411 }
412 auto isSpecified = (abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED);
413 if (isSpecified) {
414 auto specifiedRequest = std::make_shared<SpecifiedRequest>(GetRequestId(), abilityRequest);
415 specifiedRequest->preCreateProcessName = true;
416 AddSpecifiedRequest(specifiedRequest);
417 return ERR_OK;
418 }
419 auto sessionInfo = CreateSessionInfo(abilityRequest);
420 sessionInfo->requestCode = abilityRequest.requestCode;
421 sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse);
422 sessionInfo->userId = userId_;
423 sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
424 sessionInfo->want.SetParam("ohos.ability.param.isSkipErmsFromSCB", true);
425 TAG_LOGI(
426 AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, userId_);
427 int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest);
428 sessionInfo->want.CloseAllFd();
429 return ret;
430 }
431
NotifySCBToPreStartUIAbility(const AbilityRequest & abilityRequest,sptr<SessionInfo> & sessionInfo)432 int UIAbilityLifecycleManager::NotifySCBToPreStartUIAbility(const AbilityRequest &abilityRequest,
433 sptr<SessionInfo> &sessionInfo)
434 {
435 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
436
437 std::lock_guard<ffrt::mutex> guard(sessionLock_);
438 sessionInfo = CreateSessionInfo(abilityRequest);
439 sessionInfo->requestCode = abilityRequest.requestCode;
440 sessionInfo->isAtomicService = true;
441 return NotifySCBPendingActivation(sessionInfo, abilityRequest);
442 }
443
DispatchState(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)444 int UIAbilityLifecycleManager::DispatchState(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
445 {
446 switch (state) {
447 case AbilityState::INITIAL: {
448 return DispatchTerminate(abilityRecord);
449 }
450 case AbilityState::BACKGROUND:
451 case AbilityState::BACKGROUND_FAILED: {
452 return DispatchBackground(abilityRecord);
453 }
454 case AbilityState::FOREGROUND: {
455 return DispatchForeground(abilityRecord, true);
456 }
457 case AbilityState::FOREGROUND_FAILED:
458 case AbilityState::FOREGROUND_INVALID_MODE:
459 case AbilityState::FOREGROUND_WINDOW_FREEZED: {
460 return DispatchForeground(abilityRecord, false, static_cast<AbilityState>(state));
461 }
462 default: {
463 TAG_LOGW(AAFwkTag::ABILITYMGR, "Don't support transiting state: %{public}d", state);
464 return ERR_INVALID_VALUE;
465 }
466 }
467 }
468
DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord,bool success,AbilityState state)469 int UIAbilityLifecycleManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord, bool success,
470 AbilityState state)
471 {
472 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
473 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
474 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
475 CHECK_POINTER_AND_RETURN_LOG(taskHandler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
476 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
477
478 if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
479 TAG_LOGE(AAFwkTag::ABILITYMGR,
480 "DispatchForeground Ability transition life state error. expect %{public}d, actual %{public}d",
481 AbilityState::FOREGROUNDING, abilityRecord->GetAbilityState());
482 return ERR_INVALID_VALUE;
483 }
484
485 TAG_LOGD(AAFwkTag::ABILITYMGR, "ForegroundLifecycle: end.");
486 handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
487 g_deleteLifecycleEventTask(abilityRecord->GetToken(), FreezeUtil::TimeoutState::FOREGROUND);
488 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid());
489 auto self(weak_from_this());
490 if (success) {
491 TAG_LOGD(AAFwkTag::ABILITYMGR, "foreground succeeded.");
492 auto task = [self, abilityRecord]() {
493 auto selfObj = self.lock();
494 if (!selfObj) {
495 TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr is invalid.");
496 return;
497 }
498 selfObj->CompleteForegroundSuccess(abilityRecord);
499 };
500 taskHandler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
501 } else {
502 auto task = [self, abilityRecord, state]() {
503 auto selfObj = self.lock();
504 if (!selfObj) {
505 TAG_LOGW(AAFwkTag::ABILITYMGR, "Mission list mgr is invalid.");
506 return;
507 }
508 if (state == AbilityState::FOREGROUND_WINDOW_FREEZED) {
509 TAG_LOGI(AAFwkTag::ABILITYMGR, "Window was freezed.");
510 if (abilityRecord != nullptr) {
511 abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
512 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
513 }
514 return;
515 }
516 selfObj->HandleForegroundFailed(abilityRecord, state);
517 };
518 taskHandler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
519 }
520 return ERR_OK;
521 }
522
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)523 int UIAbilityLifecycleManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
524 {
525 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
526 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
527 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
528
529 if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
530 TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability transition life state error. actual %{public}d",
531 abilityRecord->GetAbilityState());
532 return ERR_INVALID_VALUE;
533 }
534
535 TAG_LOGD(AAFwkTag::ABILITYMGR, "end.");
536 // remove background timeout task.
537 handler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
538 g_deleteLifecycleEventTask(abilityRecord->GetToken(), FreezeUtil::TimeoutState::BACKGROUND);
539 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid());
540 auto self(shared_from_this());
541 auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
542 handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
543
544 return ERR_OK;
545 }
546
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)547 int UIAbilityLifecycleManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
548 {
549 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
550 if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
551 TAG_LOGE(AAFwkTag::ABILITYMGR, "DispatchTerminate error, ability state is %{public}d",
552 abilityRecord->GetAbilityState());
553 return INNER_ERR;
554 }
555
556 // remove terminate timeout task.
557 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
558 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
559 handler->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
560 auto self(shared_from_this());
561 auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); };
562 handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
563
564 return ERR_OK;
565 }
566
CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)567 void UIAbilityLifecycleManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord)
568 {
569 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
570 std::lock_guard<ffrt::mutex> guard(sessionLock_);
571
572 CHECK_POINTER(abilityRecord);
573 // ability do not save window mode
574 abilityRecord->RemoveWindowMode();
575 std::string element = abilityRecord->GetElementName().GetURI();
576 TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s", element.c_str());
577 abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
578 abilityRecord->UpdateAbilityVisibilityState();
579
580 // new version. started by caller, scheduler call request
581 if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) {
582 TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing foreground state");
583 abilityRecord->CallRequest();
584 abilityRecord->SetStartToForeground(false);
585 }
586
587 if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
588 abilityRecord->SetMinimizeReason(true);
589 MoveToBackground(abilityRecord);
590 } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
591 TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup.");
592 abilityRecord->SetPendingState(AbilityState::INITIAL);
593 }
594 if (handler_ != nullptr && abilityRecord->GetSessionInfo() != nullptr) {
595 handler_->OnSessionMovedToFront(abilityRecord->GetSessionInfo()->persistentId);
596 }
597 }
598
HandleForegroundFailed(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)599 void UIAbilityLifecycleManager::HandleForegroundFailed(const std::shared_ptr<AbilityRecord> &ability,
600 AbilityState state)
601 {
602 TAG_LOGD(AAFwkTag::ABILITYMGR, "state: %{public}d.", static_cast<int32_t>(state));
603 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
604 std::lock_guard<ffrt::mutex> guard(sessionLock_);
605 if (ability == nullptr) {
606 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is nullptr.");
607 return;
608 }
609
610 if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) {
611 TAG_LOGE(AAFwkTag::ABILITYMGR, "this ability is not foregrounding state.");
612 return;
613 }
614
615 NotifySCBToHandleException(ability,
616 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleForegroundTimeout");
617 PrepareCloseUIAbility(ability, 0, nullptr, false);
618 CloseUIAbilityInner(ability);
619 }
620
GetAbilityRecordByToken(const sptr<IRemoteObject> & token) const621 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
622 const
623 {
624 if (token == nullptr) {
625 TAG_LOGE(AAFwkTag::ABILITYMGR, "nullptr.");
626 return nullptr;
627 }
628
629 for (auto ability : terminateAbilityList_) {
630 if (ability && token == ability->GetToken()->AsObject()) {
631 return ability;
632 }
633 }
634
635 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
636 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == token) {
637 return iter->second;
638 }
639 }
640 return nullptr;
641 }
642
643 #ifdef SUPPORT_GRAPHICS
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & token)644 void UIAbilityLifecycleManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &token)
645 {
646 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
647 if (token == nullptr) {
648 TAG_LOGE(AAFwkTag::ABILITYMGR, "nullptr.");
649 return;
650 }
651 std::lock_guard<ffrt::mutex> guard(sessionLock_);
652 if (!IsContainsAbilityInner(token)) {
653 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not in running list");
654 return;
655 }
656 auto abilityRecord = GetAbilityRecordByToken(token);
657 CHECK_POINTER(abilityRecord);
658 if (abilityRecord->IsCompleteFirstFrameDrawing()) {
659 TAG_LOGD(AAFwkTag::ABILITYMGR, "First frame drawing has completed.");
660 return;
661 }
662 abilityRecord->ReportAtomicServiceDrawnCompleteEvent();
663 abilityRecord->SetCompleteFirstFrameDrawing(true);
664 AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance().
665 HandleOnFirstFrameState(abilityRecord);
666 }
667 #endif
668
IsContainsAbility(const sptr<IRemoteObject> & token) const669 bool UIAbilityLifecycleManager::IsContainsAbility(const sptr<IRemoteObject> &token) const
670 {
671 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
672 std::lock_guard<ffrt::mutex> guard(sessionLock_);
673 return IsContainsAbilityInner(token);
674 }
675
IsContainsAbilityInner(const sptr<IRemoteObject> & token) const676 bool UIAbilityLifecycleManager::IsContainsAbilityInner(const sptr<IRemoteObject> &token) const
677 {
678 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
679 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == token) {
680 return true;
681 }
682 }
683 return false;
684 }
685
EraseAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)686 void UIAbilityLifecycleManager::EraseAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
687 {
688 if (abilityRecord == nullptr) {
689 return;
690 }
691
692 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
693 if (iter->second != nullptr && iter->second->GetToken()->AsObject() == abilityRecord->GetToken()->AsObject()) {
694 sessionAbilityMap_.erase(iter);
695 break;
696 }
697 }
698 }
699
GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo & abilityInfo)700 std::string UIAbilityLifecycleManager::GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo& abilityInfo)
701 {
702 static uint32_t index = 0;
703 std::string processName = abilityInfo.bundleName + SEPARATOR + abilityInfo.moduleName + SEPARATOR +
704 abilityInfo.name + SEPARATOR + std::to_string(index++);
705 TAG_LOGI(AAFwkTag::ABILITYMGR, "processName: %{public}s", processName.c_str());
706 return processName;
707 }
708
PreCreateProcessName(AbilityRequest & abilityRequest)709 void UIAbilityLifecycleManager::PreCreateProcessName(AbilityRequest &abilityRequest)
710 {
711 if (abilityRequest.processOptions == nullptr ||
712 !ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode)) {
713 TAG_LOGD(AAFwkTag::ABILITYMGR, "No need to pre create process name.");
714 return;
715 }
716 TAG_LOGI(AAFwkTag::ABILITYMGR, "create process name in advance.");
717 std::string processName = GenerateProcessNameForNewProcessMode(abilityRequest.abilityInfo);
718 abilityRequest.processOptions->processName = processName;
719 abilityRequest.abilityInfo.process = processName;
720 }
721
UpdateProcessName(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord)722 void UIAbilityLifecycleManager::UpdateProcessName(const AbilityRequest &abilityRequest,
723 std::shared_ptr<AbilityRecord> &abilityRecord)
724 {
725 if (abilityRecord == nullptr || abilityRequest.sessionInfo == nullptr ||
726 abilityRequest.sessionInfo->processOptions == nullptr ||
727 !ProcessOptions::IsNewProcessMode(abilityRequest.sessionInfo->processOptions->processMode)) {
728 TAG_LOGD(AAFwkTag::ABILITYMGR, "No need to update process name.");
729 return;
730 }
731 std::string processName;
732 if (!abilityRequest.sessionInfo->processOptions->processName.empty()) {
733 TAG_LOGD(AAFwkTag::ABILITYMGR, "The process name has been generated in advance.");
734 processName = abilityRequest.sessionInfo->processOptions->processName;
735 } else {
736 processName = GenerateProcessNameForNewProcessMode(abilityRequest.abilityInfo);
737 }
738 abilityRecord->SetProcessName(processName);
739 }
740
UpdateAbilityRecordLaunchReason(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord) const741 void UIAbilityLifecycleManager::UpdateAbilityRecordLaunchReason(
742 const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &abilityRecord) const
743 {
744 if (abilityRecord == nullptr) {
745 TAG_LOGW(AAFwkTag::ABILITYMGR, "input record is nullptr.");
746 return;
747 }
748
749 if (abilityRequest.IsAppRecovery() || abilityRecord->GetRecoveryInfo()) {
750 abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
751 return;
752 }
753
754 auto res = abilityRequest.IsContinuation();
755 if (res.first) {
756 abilityRecord->SetLaunchReason(res.second);
757 return;
758 }
759
760 if (abilityRequest.IsAcquireShareData()) {
761 abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_SHARE);
762 return;
763 }
764
765 abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
766 return;
767 }
768
GetUIAbilityRecordBySessionInfo(const sptr<SessionInfo> & sessionInfo)769 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetUIAbilityRecordBySessionInfo(
770 const sptr<SessionInfo> &sessionInfo)
771 {
772 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
773 std::lock_guard<ffrt::mutex> guard(sessionLock_);
774 CHECK_POINTER_AND_RETURN(sessionInfo, nullptr);
775 CHECK_POINTER_AND_RETURN(sessionInfo->sessionToken, nullptr);
776 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
777 std::string descriptor = Str16ToStr8(sessionToken->GetDescriptor());
778 if (descriptor != "OHOS.ISession") {
779 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, input token is not a sessionToken, token->GetDescriptor(): %{public}s",
780 descriptor.c_str());
781 return nullptr;
782 }
783
784 auto iter = sessionAbilityMap_.find(sessionInfo->persistentId);
785 if (iter != sessionAbilityMap_.end()) {
786 return iter->second;
787 }
788 return nullptr;
789 }
790
NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token)791 int32_t UIAbilityLifecycleManager::NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token)
792 {
793 TAG_LOGI(AAFwkTag::ABILITYMGR, "NotifySCBToMinimizeUIAbility.");
794 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
795 auto sceneSessionManager = Rosen::SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
796 CHECK_POINTER_AND_RETURN(sceneSessionManager, ERR_NULL_OBJECT);
797 Rosen::WSError ret = sceneSessionManager->PendingSessionToBackgroundForDelegator(token);
798 if (ret != Rosen::WSError::WS_OK) {
799 TAG_LOGE(AAFwkTag::ABILITYMGR,
800 "Call sceneSessionManager PendingSessionToBackgroundForDelegator error:%{public}d", ret);
801 }
802 return static_cast<int32_t>(ret);
803 }
804
MinimizeUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool fromUser,uint32_t sceneFlag)805 int UIAbilityLifecycleManager::MinimizeUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool fromUser,
806 uint32_t sceneFlag)
807 {
808 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
809 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
810 std::lock_guard<ffrt::mutex> guard(sessionLock_);
811 if (abilityRecord == nullptr) {
812 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null");
813 return ERR_INVALID_VALUE;
814 }
815 TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityInfoName:%{public}s", abilityRecord->GetAbilityInfo().name.c_str());
816 abilityRecord->SetMinimizeReason(fromUser);
817 abilityRecord->SetSceneFlag(sceneFlag);
818 if (abilityRecord->GetPendingState() != AbilityState::INITIAL) {
819 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped.");
820 abilityRecord->SetPendingState(AbilityState::BACKGROUND);
821 return ERR_OK;
822 }
823 if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
824 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability state is not foreground");
825 return ERR_OK;
826 }
827 abilityRecord->SetPendingState(AbilityState::BACKGROUND);
828 MoveToBackground(abilityRecord);
829 abilityRecord->SetSceneFlag(0);
830 return ERR_OK;
831 }
832
MoveToBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)833 void UIAbilityLifecycleManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
834 {
835 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
836 if (abilityRecord == nullptr) {
837 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null");
838 return;
839 }
840 abilityRecord->SetIsNewWant(false);
841 auto self(weak_from_this());
842 auto task = [abilityRecord, self]() {
843 auto selfObj = self.lock();
844 if (selfObj == nullptr) {
845 TAG_LOGW(AAFwkTag::ABILITYMGR, "UIAbilityLifecycleManager is invalid");
846 return;
847 }
848 TAG_LOGE(AAFwkTag::ABILITYMGR, "UIAbilityLifecycleManager move to background timeout");
849 selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
850 selfObj->CompleteBackground(abilityRecord);
851 };
852 abilityRecord->BackgroundAbility(task);
853 }
854
ResolveLocked(const AbilityRequest & abilityRequest)855 int UIAbilityLifecycleManager::ResolveLocked(const AbilityRequest &abilityRequest)
856 {
857 TAG_LOGI(AAFwkTag::ABILITYMGR, "ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
858
859 if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
860 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, resolve ability_name:", __func__);
861 return RESOLVE_CALL_ABILITY_INNER_ERR;
862 }
863
864 return CallAbilityLocked(abilityRequest);
865 }
866
IsAbilityStarted(AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & targetRecord)867 bool UIAbilityLifecycleManager::IsAbilityStarted(AbilityRequest &abilityRequest,
868 std::shared_ptr<AbilityRecord> &targetRecord)
869 {
870 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
871 std::lock_guard<ffrt::mutex> guard(sessionLock_);
872 bool reuse = false;
873 auto persistentId = GetPersistentIdByAbilityRequest(abilityRequest, reuse);
874 if (persistentId == 0) {
875 return false;
876 }
877 targetRecord = sessionAbilityMap_.at(persistentId);
878 if (targetRecord) {
879 targetRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
880 targetRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
881 }
882 return true;
883 }
884
CallAbilityLocked(const AbilityRequest & abilityRequest)885 int UIAbilityLifecycleManager::CallAbilityLocked(const AbilityRequest &abilityRequest)
886 {
887 TAG_LOGD(AAFwkTag::ABILITYMGR, "CallAbilityLocked");
888 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
889 std::lock_guard<ffrt::mutex> guard(sessionLock_);
890
891 // Get target uiAbility record.
892 std::shared_ptr<AbilityRecord> uiAbilityRecord;
893 bool reuse = false;
894 auto persistentId = GetPersistentIdByAbilityRequest(abilityRequest, reuse);
895 if (persistentId == 0) {
896 uiAbilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
897 uiAbilityRecord->SetOwnerMissionUserId(userId_);
898 SetRevicerInfo(abilityRequest, uiAbilityRecord);
899 } else {
900 uiAbilityRecord = sessionAbilityMap_.at(persistentId);
901 }
902 uiAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
903 uiAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
904 NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest);
905
906 // new version started by call type
907 const auto& abilityInfo = abilityRequest.abilityInfo;
908 auto ret = ResolveAbility(uiAbilityRecord, abilityRequest);
909 if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ) {
910 TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability has been resolved.");
911 if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
912 TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability needs to be switched to foreground.");
913 auto sessionInfo = CreateSessionInfo(abilityRequest);
914 sessionInfo->persistentId = persistentId;
915 sessionInfo->state = CallToState::FOREGROUND;
916 sessionInfo->reuse = reuse;
917 sessionInfo->uiAbilityId = uiAbilityRecord->GetAbilityRecordId();
918 sessionInfo->isAtomicService =
919 (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
920 if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) {
921 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped.");
922 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
923 return NotifySCBPendingActivation(sessionInfo, abilityRequest);
924 }
925 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
926 uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId);
927 return NotifySCBPendingActivation(sessionInfo, abilityRequest);
928 }
929 return ERR_OK;
930 } else if (ret == ResolveResultType::NG_INNER_ERROR) {
931 TAG_LOGE(AAFwkTag::ABILITYMGR, "resolve failed, error: %{public}d.", RESOLVE_CALL_ABILITY_INNER_ERR);
932 return RESOLVE_CALL_ABILITY_INNER_ERR;
933 }
934
935 auto sessionInfo = CreateSessionInfo(abilityRequest);
936 sessionInfo->persistentId = persistentId;
937 sessionInfo->reuse = reuse;
938 sessionInfo->uiAbilityId = uiAbilityRecord->GetAbilityRecordId();
939 sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
940 if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
941 sessionInfo->state = CallToState::FOREGROUND;
942 } else {
943 sessionInfo->state = CallToState::BACKGROUND;
944 sessionInfo->needClearInNotShowRecent = true;
945 }
946 TAG_LOGD(AAFwkTag::ABILITYMGR, "Notify scb's abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId);
947 tmpAbilityMap_.emplace(uiAbilityRecord->GetAbilityRecordId(), uiAbilityRecord);
948 return NotifySCBPendingActivation(sessionInfo, abilityRequest);
949 }
950
CallUIAbilityBySCB(const sptr<SessionInfo> & sessionInfo,bool & isColdStart)951 void UIAbilityLifecycleManager::CallUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo, bool &isColdStart)
952 {
953 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, CallUIAbilityBySCB");
954 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
955 std::lock_guard<ffrt::mutex> guard(sessionLock_);
956 CHECK_POINTER_LOG(sessionInfo, "sessionInfo is invalid.");
957 CHECK_POINTER_LOG(sessionInfo->sessionToken, "sessionToken is nullptr.");
958 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
959 auto descriptor = Str16ToStr8(sessionToken->GetDescriptor());
960 if (descriptor != "OHOS.ISession") {
961 TAG_LOGE(AAFwkTag::ABILITYMGR, "token's Descriptor: %{public}s", descriptor.c_str());
962 return;
963 }
964
965 TAG_LOGD(AAFwkTag::ABILITYMGR, "SCB output abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId);
966 auto search = tmpAbilityMap_.find(sessionInfo->uiAbilityId);
967 if (search == tmpAbilityMap_.end()) {
968 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not found UIAbility.");
969 return;
970 }
971 auto uiAbilityRecord = search->second;
972 CHECK_POINTER_LOG(uiAbilityRecord, "UIAbility not exist.");
973 auto sessionSearch = sessionAbilityMap_.find(sessionInfo->persistentId);
974 if (sessionSearch != sessionAbilityMap_.end()) {
975 TAG_LOGE(AAFwkTag::ABILITYMGR, "Session already exist.");
976 return;
977 }
978 isColdStart = true;
979
980 MoreAbilityNumbersSendEventInfo(sessionInfo->userId, sessionInfo->want.GetElement().GetBundleName(),
981 sessionInfo->want.GetElement().GetAbilityName(), sessionInfo->want.GetElement().GetModuleName());
982
983 sessionAbilityMap_.emplace(sessionInfo->persistentId, uiAbilityRecord);
984 tmpAbilityMap_.erase(search);
985 uiAbilityRecord->SetSessionInfo(sessionInfo);
986 if (sessionInfo->state == CallToState::BACKGROUND) {
987 TAG_LOGI(AAFwkTag::ABILITYMGR, "set pending BACKGROUND");
988 uiAbilityRecord->SetPendingState(AbilityState::BACKGROUND);
989 } else {
990 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
991 }
992 uiAbilityRecord->LoadAbility();
993 }
994
CreateSessionInfo(const AbilityRequest & abilityRequest) const995 sptr<SessionInfo> UIAbilityLifecycleManager::CreateSessionInfo(const AbilityRequest &abilityRequest) const
996 {
997 TAG_LOGD(AAFwkTag::ABILITYMGR, "Create session.");
998 sptr<SessionInfo> sessionInfo = new SessionInfo();
999 sessionInfo->callerToken = abilityRequest.callerToken;
1000 sessionInfo->want = abilityRequest.want;
1001 sessionInfo->processOptions = abilityRequest.processOptions;
1002 sessionInfo->startWindowOption = abilityRequest.startWindowOption;
1003 sessionInfo->supportWindowModes = abilityRequest.supportWindowModes;
1004 if (abilityRequest.startSetting != nullptr) {
1005 TAG_LOGD(AAFwkTag::ABILITYMGR, "Assign start setting to session.");
1006 sessionInfo->startSetting = abilityRequest.startSetting;
1007 }
1008 sessionInfo->callingTokenId = static_cast<uint32_t>(abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN,
1009 IPCSkeleton::GetCallingTokenID()));
1010 return sessionInfo;
1011 }
1012
NotifySCBPendingActivation(sptr<SessionInfo> & sessionInfo,const AbilityRequest & abilityRequest)1013 int UIAbilityLifecycleManager::NotifySCBPendingActivation(sptr<SessionInfo> &sessionInfo,
1014 const AbilityRequest &abilityRequest)
1015 {
1016 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
1017 TAG_LOGD(AAFwkTag::ABILITYMGR, "windowLeft=%{public}d,windowTop=%{public}d,"
1018 "windowHeight=%{public}d,windowWidth=%{public}d,windowMode=%{public}d,"
1019 "supportWindowModes.size=%{public}zu",
1020 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0),
1021 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0),
1022 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0),
1023 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0),
1024 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_MODE, 0),
1025 (sessionInfo->supportWindowModes).size());
1026 TAG_LOGI(AAFwkTag::ABILITYMGR, "appCloneIndex: %{public}d.",
1027 (sessionInfo->want).GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, 0));
1028 auto abilityRecord = GetAbilityRecordByToken(abilityRequest.callerToken);
1029 if (abilityRecord != nullptr && !abilityRecord->GetRestartAppFlag()) {
1030 auto callerSessionInfo = abilityRecord->GetSessionInfo();
1031 CHECK_POINTER_AND_RETURN(callerSessionInfo, ERR_INVALID_VALUE);
1032 CHECK_POINTER_AND_RETURN(callerSessionInfo->sessionToken, ERR_INVALID_VALUE);
1033 auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken);
1034 CheckCallerFromBackground(abilityRecord, sessionInfo);
1035 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for callerSession, target: %{public}s",
1036 sessionInfo->want.GetElement().GetAbilityName().c_str());
1037 return static_cast<int>(callerSession->PendingSessionActivation(sessionInfo));
1038 }
1039 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_);
1040 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
1041 sessionInfo->canStartAbilityFromBackground = true;
1042 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for rootSceneSession, target: %{public}s",
1043 sessionInfo->want.GetElement().GetAbilityName().c_str());
1044 return static_cast<int>(tmpSceneSession->PendingSessionActivation(sessionInfo));
1045 }
1046
ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest) const1047 int UIAbilityLifecycleManager::ResolveAbility(
1048 const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest) const
1049 {
1050 TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbilityRecord resolve call record.");
1051 CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR);
1052
1053 ResolveResultType result = targetAbility->Resolve(abilityRequest);
1054 switch (result) {
1055 case ResolveResultType::NG_INNER_ERROR:
1056 case ResolveResultType::OK_HAS_REMOTE_OBJ:
1057 return result;
1058 default:
1059 break;
1060 }
1061
1062 if (targetAbility->IsReady()) {
1063 TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility is ready, directly scheduler call request.");
1064 targetAbility->CallRequest();
1065 return ResolveResultType::OK_HAS_REMOTE_OBJ;
1066 }
1067
1068 TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility need to call request after lifecycle.");
1069 return result;
1070 }
1071
NotifyAbilityToken(const sptr<IRemoteObject> & token,const AbilityRequest & abilityRequest) const1072 void UIAbilityLifecycleManager::NotifyAbilityToken(const sptr<IRemoteObject> &token,
1073 const AbilityRequest &abilityRequest) const
1074 {
1075 auto abilityInfoCallback = iface_cast<AppExecFwk::IAbilityInfoCallback>(abilityRequest.abilityInfoCallback);
1076 if (abilityInfoCallback != nullptr) {
1077 abilityInfoCallback->NotifyAbilityToken(token, abilityRequest.want);
1078 }
1079 }
1080
PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability,uint32_t msgId,bool isHalf)1081 void UIAbilityLifecycleManager::PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability, uint32_t msgId, bool isHalf)
1082 {
1083 if (ability == nullptr) {
1084 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability is nullptr");
1085 return;
1086 }
1087 AppExecFwk::RunningProcessInfo processInfo = {};
1088 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1089 if (processInfo.pid_ == 0) {
1090 TAG_LOGE(AAFwkTag::ABILITYMGR, "the ability:%{public}s, app may fork fail or not running.",
1091 ability->GetAbilityInfo().name.data());
1092 return;
1093 }
1094 int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
1095 std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1096 if (!GetContentAndTypeId(msgId, msgContent, typeId)) {
1097 TAG_LOGW(AAFwkTag::ABILITYMGR, "msgId is invalid.");
1098 return;
1099 }
1100
1101 std::string eventName = isHalf ?
1102 AppExecFwk::AppFreezeType::LIFECYCLE_HALF_TIMEOUT : AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
1103 TAG_LOGW(AAFwkTag::ABILITYMGR,
1104 "%{public}s: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
1105 "msg: %{public}s",
1106 eventName.c_str(), processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1107 ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1108
1109 AppExecFwk::AppfreezeManager::ParamInfo info = {
1110 .typeId = typeId,
1111 .pid = processInfo.pid_,
1112 .eventName = eventName,
1113 .bundleName = ability->GetAbilityInfo().bundleName,
1114 };
1115 FreezeUtil::TimeoutState state = MsgId2State(msgId);
1116 if (state != FreezeUtil::TimeoutState::UNKNOWN) {
1117 FreezeUtil::LifecycleFlow flow;
1118 if (ability->GetToken() != nullptr) {
1119 flow.token = ability->GetToken()->AsObject();
1120 flow.state = state;
1121 }
1122 info.msg = msgContent + "\nserver:\n" + FreezeUtil::GetInstance().GetLifecycleEvent(flow)
1123 + "\nserver app:\n" + FreezeUtil::GetInstance().GetAppLifecycleEvent(processInfo.pid_);
1124 if (!isHalf) {
1125 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
1126 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(processInfo.pid_);
1127 }
1128 AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info, flow);
1129 } else {
1130 info.msg = msgContent;
1131 AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info);
1132 }
1133 }
1134
GetContentAndTypeId(uint32_t msgId,std::string & msgContent,int & typeId) const1135 bool UIAbilityLifecycleManager::GetContentAndTypeId(uint32_t msgId, std::string &msgContent, int &typeId) const
1136 {
1137 switch (msgId) {
1138 case AbilityManagerService::LOAD_TIMEOUT_MSG:
1139 msgContent += "load timeout.";
1140 typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1141 break;
1142 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1143 msgContent += "foreground timeout.";
1144 typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1145 break;
1146 case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1147 msgContent += "background timeout.";
1148 break;
1149 case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1150 msgContent += "terminate timeout.";
1151 break;
1152 default:
1153 return false;
1154 }
1155 return true;
1156 }
1157
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1158 void UIAbilityLifecycleManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1159 {
1160 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1161 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1162 if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1163 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability state is %{public}d, it can't complete background.",
1164 abilityRecord->GetAbilityState());
1165 return;
1166 }
1167 abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1168 // notify AppMS to update application state.
1169 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1170
1171 if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1172 abilityRecord->PostForegroundTimeoutTask();
1173 abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING);
1174 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
1175 } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1176 TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup.");
1177 abilityRecord->SetPendingState(AbilityState::INITIAL);
1178 }
1179
1180 // new version. started by caller, scheduler call request
1181 if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) {
1182 TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing background state");
1183 abilityRecord->CallRequest();
1184 abilityRecord->SetStartToBackground(false);
1185 }
1186
1187 // Abilities ahead of the one started were put in terminate list, we need to terminate them.
1188 auto self(shared_from_this());
1189 for (auto terminateAbility : terminateAbilityList_) {
1190 if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) {
1191 auto timeoutTask = [terminateAbility, self]() {
1192 TAG_LOGW(AAFwkTag::ABILITYMGR, "Terminate ability timeout after background.");
1193 self->DelayCompleteTerminate(terminateAbility);
1194 };
1195 terminateAbility->Terminate(timeoutTask);
1196 }
1197 }
1198 }
1199
BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,int resultCode,const Want * resultWant,int64_t callerRequestCode)1200 int32_t UIAbilityLifecycleManager::BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,
1201 int resultCode, const Want *resultWant, int64_t callerRequestCode)
1202 {
1203 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1204 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1205 if (abilityRecord == nullptr) {
1206 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord nullptr.");
1207 return ERR_INVALID_VALUE;
1208 }
1209 auto requestInfo = StartupUtil::ParseFullRequestCode(callerRequestCode);
1210 TAG_LOGI(AAFwkTag::ABILITYMGR, "pid:%{public}d, backFlag:%{public}d, requestCode:%{public}d.",
1211 requestInfo.pid, requestInfo.backFlag, requestInfo.requestCode);
1212 if (requestInfo.requestCode <= 0 || requestInfo.pid <= 0) {
1213 TAG_LOGE(AAFwkTag::ABILITYMGR, "Cant't find caller by requestCode.");
1214 return ERR_CALLER_NOT_EXISTS;
1215 }
1216 auto callerAbilityRecord = abilityRecord->GetCallerByRequestCode(requestInfo.requestCode, requestInfo.pid);
1217 if (callerAbilityRecord == nullptr) {
1218 TAG_LOGE(AAFwkTag::ABILITYMGR, "Caller not exists.");
1219 return ERR_CALLER_NOT_EXISTS;
1220 }
1221 auto abilityResult = std::make_shared<AbilityResult>(requestInfo.requestCode, resultCode, *resultWant);
1222 callerAbilityRecord->SendResultByBackToCaller(abilityResult);
1223 abilityRecord->RemoveCallerRequestCode(callerAbilityRecord, requestInfo.requestCode);
1224 if (!requestInfo.backFlag) {
1225 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not support back to caller");
1226 return ERR_NOT_SUPPORT_BACK_TO_CALLER;
1227 }
1228 if (callerAbilityRecord == abilityRecord) {
1229 TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is self");
1230 return ERR_OK;
1231 }
1232 auto tokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
1233 TAG_LOGD(AAFwkTag::ABILITYMGR, "tokenId: %{public}d.", tokenId);
1234 if (!abilityRecord->IsForeground() && !abilityRecord->GetAbilityForegroundingFlag() &&
1235 !PermissionVerification::GetInstance()->VerifyPermissionByTokenId(tokenId,
1236 PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND)) {
1237 TAG_LOGW(AAFwkTag::ABILITYMGR, "can't start ability from background.");
1238 return CHECK_PERMISSION_FAILED;
1239 }
1240 // find host of UI Extension
1241 auto foundCount = 0;
1242 while (((++foundCount) <= MAX_FIND_UIEXTENSION_CALLER_TIMES) && callerAbilityRecord &&
1243 UIExtensionUtils::IsUIExtension(callerAbilityRecord->GetAbilityInfo().extensionAbilityType)) {
1244 TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is uiExtension.");
1245 callerAbilityRecord = callerAbilityRecord->GetCallerRecord();
1246 }
1247 return BackToCallerAbilityWithResultLocked(abilityRecord->GetSessionInfo(), callerAbilityRecord);
1248 }
1249
BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo,std::shared_ptr<AbilityRecord> callerAbilityRecord)1250 int32_t UIAbilityLifecycleManager::BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo,
1251 std::shared_ptr<AbilityRecord> callerAbilityRecord)
1252 {
1253 TAG_LOGI(AAFwkTag::ABILITYMGR, "called.");
1254 if (currentSessionInfo == nullptr || currentSessionInfo->sessionToken == nullptr) {
1255 TAG_LOGI(AAFwkTag::ABILITYMGR, "currentSessionInfo is invalid.");
1256 return ERR_INVALID_VALUE;
1257 }
1258
1259 if (callerAbilityRecord == nullptr) {
1260 TAG_LOGI(AAFwkTag::ABILITYMGR, "callerAbility is invalid.");
1261 return ERR_INVALID_VALUE;
1262 }
1263
1264 auto callerSessionInfo = callerAbilityRecord->GetSessionInfo();
1265 if (callerSessionInfo == nullptr || callerSessionInfo->sessionToken == nullptr) {
1266 TAG_LOGI(AAFwkTag::ABILITYMGR, "callerSessionInfo is invalid.");
1267 return ERR_INVALID_VALUE;
1268 }
1269
1270 auto currentSession = iface_cast<Rosen::ISession>(currentSessionInfo->sessionToken);
1271 callerSessionInfo->isBackTransition = true;
1272 auto ret = static_cast<int>(currentSession->PendingSessionActivation(callerSessionInfo));
1273 callerSessionInfo->isBackTransition = false;
1274 return ret;
1275 }
1276
CloseUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool isClearSession)1277 int UIAbilityLifecycleManager::CloseUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1278 int resultCode, const Want *resultWant, bool isClearSession)
1279 {
1280 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1281 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1282 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1283 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1284 std::string element = abilityRecord->GetElementName().GetURI();
1285 TAG_LOGI(AAFwkTag::ABILITYMGR, "CloseUIAbility call: %{public}s", element.c_str());
1286 if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) {
1287 TAG_LOGI(AAFwkTag::ABILITYMGR, "ability is on terminating");
1288 return ERR_OK;
1289 }
1290 PrepareCloseUIAbility(abilityRecord, resultCode, resultWant, isClearSession);
1291 if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
1292 if (abilityRecord->GetScheduler() == nullptr) {
1293 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1294 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1295 handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1296 }
1297 terminateAbilityList_.remove(abilityRecord);
1298 return abilityRecord->TerminateAbility();
1299 }
1300 if (abilityRecord->IsDebug() && isClearSession) {
1301 TAG_LOGD(AAFwkTag::ABILITYMGR, "notify AppMS terminate");
1302 terminateAbilityList_.remove(abilityRecord);
1303 return abilityRecord->TerminateAbility();
1304 }
1305 if (abilityRecord->GetPendingState() != AbilityState::INITIAL) {
1306 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped");
1307 abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1308 return ERR_OK;
1309 }
1310 return CloseUIAbilityInner(abilityRecord);
1311 }
1312
PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord,int resultCode,const Want * resultWant,bool isClearSession)1313 void UIAbilityLifecycleManager::PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord,
1314 int resultCode, const Want *resultWant, bool isClearSession)
1315 {
1316 if (!abilityRecord) {
1317 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record null");
1318 return;
1319 }
1320 DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken(), isClearSession);
1321 abilityRecord->SetTerminatingState();
1322 abilityRecord->SetClearMissionFlag(isClearSession);
1323 // save result to caller AbilityRecord
1324 if (resultWant != nullptr) {
1325 Want* newWant = const_cast<Want*>(resultWant);
1326 newWant->RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
1327 abilityRecord->SaveResultToCallers(resultCode, newWant);
1328 } else {
1329 Want want;
1330 abilityRecord->SaveResultToCallers(-1, &want);
1331 }
1332 EraseAbilityRecord(abilityRecord);
1333 abilityRecord->SendResultToCallers();
1334 terminateAbilityList_.push_back(abilityRecord);
1335 }
1336
CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord)1337 int UIAbilityLifecycleManager::CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord)
1338 {
1339 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1340 if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1341 abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1342 MoveToBackground(abilityRecord);
1343 return ERR_OK;
1344 }
1345 // ability on background, schedule to terminate.
1346 if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1347 auto self(shared_from_this());
1348 auto task = [abilityRecord, self]() {
1349 TAG_LOGW(AAFwkTag::ABILITYMGR, "close ability by scb timeout");
1350 self->DelayCompleteTerminate(abilityRecord);
1351 };
1352 abilityRecord->Terminate(task);
1353 }
1354 return ERR_OK;
1355 }
1356
DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1357 void UIAbilityLifecycleManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1358 {
1359 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1360 CHECK_POINTER(handler);
1361
1362 PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1363
1364 auto timeoutTask = [self = shared_from_this(), abilityRecord]() {
1365 TAG_LOGI(AAFwkTag::ABILITYMGR, "emit delay complete terminate task!");
1366 self->CompleteTerminate(abilityRecord);
1367 };
1368 int killTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * KILL_TIMEOUT_MULTIPLE;
1369 handler->SubmitTask(timeoutTask, "DELAY_KILL_PROCESS", killTimeout);
1370 }
1371
CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1372 void UIAbilityLifecycleManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1373 {
1374 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1375 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1376 CompleteTerminateLocked(abilityRecord);
1377 }
1378
CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> & abilityRecord)1379 void UIAbilityLifecycleManager::CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> &abilityRecord)
1380 {
1381 CHECK_POINTER(abilityRecord);
1382 if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1383 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, %{public}s, ability is not terminating.", __func__);
1384 return;
1385 }
1386 abilityRecord->RemoveAbilityDeathRecipient();
1387
1388 // notify AppMS terminate
1389 if (abilityRecord->TerminateAbility() != ERR_OK) {
1390 // Don't return here
1391 TAG_LOGE(AAFwkTag::ABILITYMGR, "AppMS fail to terminate ability.");
1392 }
1393 abilityRecord->RevokeUriPermission();
1394 terminateAbilityList_.remove(abilityRecord);
1395 }
1396
GetPersistentIdByAbilityRequest(const AbilityRequest & abilityRequest,bool & reuse) const1397 int32_t UIAbilityLifecycleManager::GetPersistentIdByAbilityRequest(const AbilityRequest &abilityRequest,
1398 bool &reuse) const
1399 {
1400 if (abilityRequest.collaboratorType != CollaboratorType::DEFAULT_TYPE) {
1401 return GetReusedCollaboratorPersistentId(abilityRequest, reuse);
1402 }
1403
1404 if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
1405 return GetReusedSpecifiedPersistentId(abilityRequest, reuse);
1406 }
1407
1408 if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD) {
1409 return GetReusedStandardPersistentId(abilityRequest, reuse);
1410 }
1411
1412 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SINGLETON) {
1413 TAG_LOGW(AAFwkTag::ABILITYMGR, "Launch mode is not singleton.");
1414 return 0;
1415 }
1416
1417 reuse = true;
1418 for (const auto& [first, second] : sessionAbilityMap_) {
1419 if (CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::SINGLETON)) {
1420 TAG_LOGD(AAFwkTag::ABILITYMGR, "SINGLETON: find.");
1421 return first;
1422 }
1423 }
1424
1425 TAG_LOGD(AAFwkTag::ABILITYMGR, "Not find existed ui ability.");
1426 return 0;
1427 }
1428
GetReusedSpecifiedPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1429 int32_t UIAbilityLifecycleManager::GetReusedSpecifiedPersistentId(const AbilityRequest &abilityRequest,
1430 bool &reuse) const
1431 {
1432 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1433 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
1434 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not SPECIFIED.");
1435 return 0;
1436 }
1437
1438 reuse = true;
1439 // specified ability name and bundle name and module name and appIndex format is same as singleton.
1440 for (const auto& [first, second] : sessionAbilityMap_) {
1441 if (second->GetSpecifiedFlag() == abilityRequest.specifiedFlag &&
1442 CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::SPECIFIED)) {
1443 TAG_LOGD(AAFwkTag::ABILITYMGR, "SPECIFIED: find.");
1444 return first;
1445 }
1446 }
1447 return 0;
1448 }
1449
GetReusedStandardPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1450 int32_t UIAbilityLifecycleManager::GetReusedStandardPersistentId(const AbilityRequest &abilityRequest,
1451 bool &reuse) const
1452 {
1453 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1454 if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD) {
1455 TAG_LOGW(AAFwkTag::ABILITYMGR, "Not STANDARD.");
1456 return 0;
1457 }
1458
1459 if (!abilityRequest.startRecent) {
1460 TAG_LOGW(AAFwkTag::ABILITYMGR, "startRecent is false.");
1461 return 0;
1462 }
1463
1464 reuse = true;
1465 int64_t sessionTime = 0;
1466 int32_t persistentId = 0;
1467 for (const auto& [first, second] : sessionAbilityMap_) {
1468 if (CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::STANDARD) &&
1469 second->GetRestartTime() >= sessionTime) {
1470 persistentId = first;
1471 sessionTime = second->GetRestartTime();
1472 }
1473 }
1474 return persistentId;
1475 }
1476
GetReusedCollaboratorPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1477 int32_t UIAbilityLifecycleManager::GetReusedCollaboratorPersistentId(const AbilityRequest &abilityRequest,
1478 bool &reuse) const
1479 {
1480 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1481
1482 reuse = false;
1483 int64_t sessionTime = 0;
1484 int32_t persistentId = 0;
1485 for (const auto& [first, second] : sessionAbilityMap_) {
1486 if (second->GetCollaboratorType() != CollaboratorType::DEFAULT_TYPE &&
1487 abilityRequest.want.GetStringParam(PARAM_MISSION_AFFINITY_KEY) == second->GetMissionAffinity() &&
1488 second->GetRestartTime() >= sessionTime) {
1489 reuse = true;
1490 persistentId = first;
1491 sessionTime = second->GetRestartTime();
1492 }
1493 }
1494 return persistentId;
1495 }
1496
CheckProperties(const std::shared_ptr<AbilityRecord> & abilityRecord,const AbilityRequest & abilityRequest,AppExecFwk::LaunchMode launchMode) const1497 bool UIAbilityLifecycleManager::CheckProperties(const std::shared_ptr<AbilityRecord> &abilityRecord,
1498 const AbilityRequest &abilityRequest, AppExecFwk::LaunchMode launchMode) const
1499 {
1500 const auto& abilityInfo = abilityRecord->GetAbilityInfo();
1501 int32_t appIndex = 0;
1502 (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex);
1503 return abilityInfo.launchMode == launchMode && abilityRequest.abilityInfo.name == abilityInfo.name &&
1504 abilityRequest.abilityInfo.bundleName == abilityInfo.bundleName &&
1505 abilityRequest.abilityInfo.moduleName == abilityInfo.moduleName &&
1506 appIndex == abilityRecord->GetAppIndex();
1507 }
1508
OnTimeOut(uint32_t msgId,int64_t abilityRecordId,bool isHalf)1509 void UIAbilityLifecycleManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf)
1510 {
1511 TAG_LOGD(AAFwkTag::ABILITYMGR, "call, msgId is %{public}d", msgId);
1512 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1513 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1514 std::shared_ptr<AbilityRecord> abilityRecord;
1515 for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
1516 if (iter->second != nullptr && iter->second->GetAbilityRecordId() == abilityRecordId) {
1517 abilityRecord = iter->second;
1518 break;
1519 }
1520 }
1521 if (abilityRecord == nullptr) {
1522 for (auto abilityIter : terminateAbilityList_) {
1523 if (abilityIter && abilityIter->GetAbilityRecordId() == abilityRecordId) {
1524 abilityRecord = abilityIter;
1525 break;
1526 }
1527 }
1528 if (abilityRecord == nullptr) {
1529 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability record is nullptr");
1530 return;
1531 }
1532 }
1533 TAG_LOGD(AAFwkTag::ABILITYMGR, "call, msgId:%{public}d, name:%{public}s", msgId,
1534 abilityRecord->GetAbilityInfo().name.c_str());
1535 abilityRecord->RevokeUriPermission();
1536 PrintTimeOutLog(abilityRecord, msgId, isHalf);
1537 if (isHalf) {
1538 return;
1539 }
1540 switch (msgId) {
1541 case AbilityManagerService::LOAD_TIMEOUT_MSG:
1542 abilityRecord->SetLoading(false);
1543 HandleLoadTimeout(abilityRecord);
1544 break;
1545 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1546 HandleForegroundTimeout(abilityRecord);
1547 break;
1548 default:
1549 break;
1550 }
1551 }
1552
SetRootSceneSession(const sptr<IRemoteObject> & rootSceneSession)1553 void UIAbilityLifecycleManager::SetRootSceneSession(const sptr<IRemoteObject> &rootSceneSession)
1554 {
1555 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1556 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession);
1557 if (tmpSceneSession == nullptr) {
1558 TAG_LOGE(AAFwkTag::ABILITYMGR, "rootSceneSession is invalid.");
1559 return;
1560 }
1561 rootSceneSession_ = rootSceneSession;
1562 }
1563
NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t errorCode,const std::string & errorReason)1564 void UIAbilityLifecycleManager::NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> &abilityRecord,
1565 int32_t errorCode, const std::string& errorReason)
1566 {
1567 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1568 if (abilityRecord == nullptr) {
1569 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is nullptr");
1570 return;
1571 }
1572 auto sessionInfo = abilityRecord->GetSessionInfo();
1573 CHECK_POINTER(sessionInfo);
1574 CHECK_POINTER(sessionInfo->sessionToken);
1575 auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1576 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBToHandleException reason: %{public}s", errorReason.c_str());
1577 sptr<SessionInfo> info = abilityRecord->GetSessionInfo();
1578 info->errorCode = errorCode;
1579 info->errorReason = errorReason;
1580 session->NotifySessionException(info);
1581 EraseAbilityRecord(abilityRecord);
1582 }
1583
NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo,int32_t errorCode,const std::string & errorReason)1584 void UIAbilityLifecycleManager::NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo,
1585 int32_t errorCode, const std::string& errorReason)
1586 {
1587 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1588 CHECK_POINTER(sessionInfo);
1589 CHECK_POINTER(sessionInfo->sessionToken);
1590 auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1591 TAG_LOGI(AAFwkTag::ABILITYMGR, "call notifySessionException");
1592 sessionInfo->errorCode = errorCode;
1593 sessionInfo->errorReason = errorReason;
1594 session->NotifySessionException(sessionInfo);
1595 }
1596
HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & abilityRecord)1597 void UIAbilityLifecycleManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &abilityRecord)
1598 {
1599 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1600 if (abilityRecord == nullptr) {
1601 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability record is nullptr");
1602 return;
1603 }
1604 NotifySCBToHandleException(abilityRecord,
1605 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleLoadTimeout");
1606 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1607 }
1608
HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & abilityRecord)1609 void UIAbilityLifecycleManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &abilityRecord)
1610 {
1611 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1612 if (abilityRecord == nullptr) {
1613 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is nullptr");
1614 return;
1615 }
1616 if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
1617 TAG_LOGE(AAFwkTag::ABILITYMGR, "this ability is not foregrounding state");
1618 return;
1619 }
1620 NotifySCBToHandleException(abilityRecord,
1621 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_FOREGROUND_TIMEOUT), "handleForegroundTimeout");
1622 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1623 }
1624
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)1625 void UIAbilityLifecycleManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
1626 {
1627 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1628 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1629 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1630 if (abilityRecord == nullptr) {
1631 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ability record is nullptr");
1632 return;
1633 }
1634 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1635 CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
1636 if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
1637 handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1638 abilityRecord->SetLoading(false);
1639 }
1640 if (abilityRecord->GetAbilityState() == AbilityState::FOREGROUNDING) {
1641 handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1642 }
1643 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1644 CHECK_POINTER_LOG(taskHandler, "Get AbilityTaskHandler failed.");
1645 if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUNDING) {
1646 taskHandler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1647 }
1648
1649 terminateAbilityList_.push_back(abilityRecord);
1650 abilityRecord->SetAbilityState(AbilityState::TERMINATING);
1651 if (!abilityRecord->GetRestartAppFlag()) {
1652 NotifySCBToHandleException(abilityRecord, static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_DIED),
1653 "onAbilityDied");
1654 }
1655 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1656 DispatchTerminate(abilityRecord);
1657 }
1658
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag,int32_t requestId)1659 void UIAbilityLifecycleManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag,
1660 int32_t requestId)
1661 {
1662 TAG_LOGI(AAFwkTag::ABILITYMGR, "OnAcceptWantResponse, %{public}d", requestId);
1663 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1664 std::lock_guard guard(sessionLock_);
1665 auto request = GetSpecifiedRequest(requestId);
1666 if (request == nullptr) {
1667 TAG_LOGW(AAFwkTag::ABILITYMGR, "no request");
1668 return;
1669 }
1670 auto nextRequest = PopAndGetNextSpecified(requestId);
1671 if (nextRequest) {
1672 TaskHandlerWrap::GetFfrtHandler()->SubmitTask([nextRequest, pThis = shared_from_this()]() {
1673 std::lock_guard lock(pThis->sessionLock_);
1674 pThis->StartSpecifiedRequest(*nextRequest);
1675 });
1676 }
1677 if (request->isCold) {
1678 if (request->persistentId == 0) {
1679 TAG_LOGW(AAFwkTag::ABILITYMGR, "persistentId error for: %{public}d", requestId);
1680 PutSpecifiedFlag(requestId, flag);
1681 return;
1682 }
1683 if (HandleColdAcceptWantDone(want, flag, *request)) {
1684 return;
1685 }
1686 }
1687
1688 HandleLegacyAcceptWantDone(request->abilityRequest, requestId, flag, want);
1689 }
1690
HandleLegacyAcceptWantDone(AbilityRequest & abilityRequest,int32_t requestId,const std::string & flag,const AAFwk::Want & want)1691 void UIAbilityLifecycleManager::HandleLegacyAcceptWantDone(AbilityRequest &abilityRequest, int32_t requestId,
1692 const std::string &flag, const AAFwk::Want &want)
1693 {
1694 TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s.", want.GetElement().GetURI().c_str());
1695 auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
1696 if (!flag.empty()) {
1697 abilityRequest.specifiedFlag = flag;
1698 bool reuse = false;
1699 auto persistentId = GetReusedSpecifiedPersistentId(abilityRequest, reuse);
1700 if (persistentId != 0) {
1701 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
1702 auto iter = sessionAbilityMap_.find(persistentId);
1703 if (iter == sessionAbilityMap_.end()) {
1704 TAG_LOGE(AAFwkTag::ABILITYMGR, "OnAcceptWantResponse Unexpected Error");
1705 return;
1706 }
1707 TAG_LOGI(AAFwkTag::ABILITYMGR, "find specified ability, session:%{public}d", persistentId);
1708 abilityRecord = iter->second;
1709 CHECK_POINTER_LOG(abilityRecord, "OnAcceptWantResponse abilityRecord null");
1710 abilityRecord->SetWant(abilityRequest.want);
1711 abilityRecord->SetIsNewWant(true);
1712 UpdateAbilityRecordLaunchReason(abilityRequest, abilityRecord);
1713 MoveAbilityToFront(abilityRequest, abilityRecord, callerAbility);
1714 NotifyRestartSpecifiedAbility(abilityRequest, abilityRecord->GetToken());
1715 return;
1716 }
1717 }
1718 NotifyStartSpecifiedAbility(abilityRequest, want);
1719 StartAbilityBySpecifed(abilityRequest, callerAbility, requestId);
1720 }
1721
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want,int32_t requestId)1722 void UIAbilityLifecycleManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want, int32_t requestId)
1723 {
1724 std::lock_guard lock(sessionLock_);
1725 auto curRequest = GetSpecifiedRequest(requestId);
1726 if (curRequest == nullptr) {
1727 return;
1728 }
1729 TAG_LOGI(AAFwkTag::ABILITYMGR, "SpecifiedAbilityTimeout %{public}d", requestId);
1730 if (curRequest->persistentId != 0) {
1731 auto iter = sessionAbilityMap_.find(curRequest->persistentId);
1732 if (iter != sessionAbilityMap_.end() && iter->second != nullptr) {
1733 auto abilityRecord = iter->second;
1734 NotifySCBToHandleException(abilityRecord,
1735 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleLoadTimeout");
1736 }
1737 }
1738
1739 auto nextRequest = PopAndGetNextSpecified(requestId);
1740 if (nextRequest) {
1741 StartSpecifiedRequest(*nextRequest);
1742 }
1743 }
1744
OnStartSpecifiedProcessResponse(const AAFwk::Want & want,const std::string & flag,int32_t requestId)1745 void UIAbilityLifecycleManager::OnStartSpecifiedProcessResponse(const AAFwk::Want &want, const std::string &flag,
1746 int32_t requestId)
1747 {
1748 TAG_LOGI(AAFwkTag::ABILITYMGR, "OnStartSpecifiedProcessResponse, %{public}d, %{public}s",
1749 requestId, want.GetElement().GetURI().c_str());
1750 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1751 std::lock_guard guard(sessionLock_);
1752 auto request = GetSpecifiedRequest(requestId);
1753 if (request == nullptr) {
1754 TAG_LOGW(AAFwkTag::ABILITYMGR, "no request");
1755 return;
1756 }
1757
1758 auto &abilityRequest = request->abilityRequest;
1759 abilityRequest.want.SetParam(PARAM_SPECIFIED_PROCESS_FLAG, flag);
1760 if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
1761 request->isSpecifiedProcess = false;
1762 StartSpecifiedRequest(*request);
1763 return;
1764 }
1765 auto nextRequest = PopAndGetNextSpecified(requestId);
1766 if (nextRequest) {
1767 TaskHandlerWrap::GetFfrtHandler()->SubmitTask([nextRequest, pThis = shared_from_this()]() {
1768 std::lock_guard lock(pThis->sessionLock_);
1769 pThis->StartSpecifiedRequest(*nextRequest);
1770 });
1771 }
1772 auto sessionInfo = CreateSessionInfo(abilityRequest);
1773 sessionInfo->requestCode = abilityRequest.requestCode;
1774 sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse);
1775 sessionInfo->userId = abilityRequest.userId;
1776 sessionInfo->isAtomicService =
1777 (abilityRequest.abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
1778 TAG_LOGI(AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId,
1779 abilityRequest.userId);
1780 NotifySCBPendingActivation(sessionInfo, abilityRequest);
1781 }
1782
OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want & want,int32_t requestId)1783 void UIAbilityLifecycleManager::OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want &want, int32_t requestId)
1784 {
1785 TAG_LOGI(AAFwkTag::ABILITYMGR, "OnStartSpecifiedProcessTimeoutResponse %{public}d", requestId);
1786 std::lock_guard guard(sessionLock_);
1787 auto nextRequest = PopAndGetNextSpecified(requestId);
1788 if (nextRequest) {
1789 StartSpecifiedRequest(*nextRequest);
1790 }
1791 }
1792
StartSpecifiedAbilityBySCB(const Want & want)1793 void UIAbilityLifecycleManager::StartSpecifiedAbilityBySCB(const Want &want)
1794 {
1795 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1796 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1797 AbilityRequest abilityRequest;
1798 int result = DelayedSingleton<AbilityManagerService>::GetInstance()->GenerateAbilityRequest(
1799 want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_);
1800 if (result != ERR_OK) {
1801 TAG_LOGE(AAFwkTag::ABILITYMGR, "cannot find generate ability request");
1802 return;
1803 }
1804 abilityRequest.isFromIcon = true;
1805 std::lock_guard guard(sessionLock_);
1806 AddSpecifiedRequest(std::make_shared<SpecifiedRequest>(GetRequestId(), abilityRequest));
1807 }
1808
NotifyRestartSpecifiedAbility(const AbilityRequest & request,const sptr<IRemoteObject> & token)1809 void UIAbilityLifecycleManager::NotifyRestartSpecifiedAbility(const AbilityRequest &request,
1810 const sptr<IRemoteObject> &token)
1811 {
1812 if (request.abilityInfoCallback == nullptr) {
1813 return;
1814 }
1815 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
1816 = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback);
1817 if (abilityInfoCallback != nullptr) {
1818 TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
1819 abilityInfoCallback->NotifyRestartSpecifiedAbility(token);
1820 }
1821 }
1822
NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)1823 void UIAbilityLifecycleManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want)
1824 {
1825 if (abilityRequest.abilityInfoCallback == nullptr) {
1826 return;
1827 }
1828
1829 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
1830 = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
1831 if (abilityInfoCallback != nullptr) {
1832 Want newWant = want;
1833 int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type);
1834 newWant.SetParam("abilityType", type);
1835 sptr<Want> extraParam = new (std::nothrow) Want();
1836 abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant,
1837 abilityRequest.requestCode, extraParam);
1838 int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
1839 if (procCode != 0) {
1840 abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
1841 }
1842 int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
1843 if (tokenCode != 0) {
1844 abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
1845 }
1846 }
1847 }
1848
MoveAbilityToFront(const AbilityRequest & abilityRequest,const std::shared_ptr<AbilityRecord> & abilityRecord,std::shared_ptr<AbilityRecord> callerAbility,std::shared_ptr<StartOptions> startOptions)1849 int UIAbilityLifecycleManager::MoveAbilityToFront(const AbilityRequest &abilityRequest,
1850 const std::shared_ptr<AbilityRecord> &abilityRecord, std::shared_ptr<AbilityRecord> callerAbility,
1851 std::shared_ptr<StartOptions> startOptions)
1852 {
1853 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1854 if (!abilityRecord) {
1855 TAG_LOGE(AAFwkTag::ABILITYMGR, "get target ability record failed");
1856 return ERR_INVALID_VALUE;
1857 }
1858 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
1859 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
1860 sessionInfo->want = abilityRequest.want;
1861 sessionInfo->callerToken = abilityRequest.callerToken;
1862 sessionInfo->requestCode = abilityRequest.requestCode;
1863 sessionInfo->processOptions = nullptr;
1864 sessionInfo->startWindowOption = nullptr;
1865 sessionInfo->isFromIcon = abilityRequest.isFromIcon;
1866 SendSessionInfoToSCB(callerAbility, sessionInfo);
1867 abilityRecord->RemoveWindowMode();
1868 if (startOptions != nullptr) {
1869 abilityRecord->SetWindowMode(startOptions->GetWindowMode());
1870 }
1871 return ERR_OK;
1872 }
1873
SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> & callerAbility,sptr<SessionInfo> & sessionInfo)1874 int UIAbilityLifecycleManager::SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> &callerAbility,
1875 sptr<SessionInfo> &sessionInfo)
1876 {
1877 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
1878 TAG_LOGD(AAFwkTag::ABILITYMGR, "call"
1879 "windowLeft=%{public}d,windowTop=%{public}d,"
1880 "windowHeight=%{public}d,windowWidth=%{public}d",
1881 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0),
1882 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0),
1883 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0),
1884 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0));
1885 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_);
1886 if (callerAbility != nullptr) {
1887 auto callerSessionInfo = callerAbility->GetSessionInfo();
1888 if (callerSessionInfo != nullptr && callerSessionInfo->sessionToken != nullptr) {
1889 auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken);
1890 CheckCallerFromBackground(callerAbility, sessionInfo);
1891 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for callerSession, target: %{public}s",
1892 sessionInfo->want.GetElement().GetAbilityName().c_str());
1893 callerSession->PendingSessionActivation(sessionInfo);
1894 } else {
1895 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
1896 sessionInfo->canStartAbilityFromBackground = true;
1897 TAG_LOGI(AAFwkTag::ABILITYMGR, "NotifySCBPendingActivation for rootSceneSession, target:%{public}s",
1898 sessionInfo->want.GetElement().GetAbilityName().c_str());
1899 tmpSceneSession->PendingSessionActivation(sessionInfo);
1900 }
1901 } else {
1902 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
1903 sessionInfo->canStartAbilityFromBackground = true;
1904 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for rootSceneSession, target: %{public}s",
1905 sessionInfo->want.GetElement().GetAbilityName().c_str());
1906 tmpSceneSession->PendingSessionActivation(sessionInfo);
1907 }
1908 return ERR_OK;
1909 }
1910
StartAbilityBySpecifed(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & callerAbility,int32_t requestId)1911 int UIAbilityLifecycleManager::StartAbilityBySpecifed(const AbilityRequest &abilityRequest,
1912 std::shared_ptr<AbilityRecord> &callerAbility, int32_t requestId)
1913 {
1914 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1915 sptr<SessionInfo> sessionInfo = new SessionInfo();
1916 sessionInfo->callerToken = abilityRequest.callerToken;
1917 sessionInfo->want = abilityRequest.want;
1918 sessionInfo->requestCode = abilityRequest.requestCode;
1919 sessionInfo->processOptions = abilityRequest.processOptions;
1920 sessionInfo->startWindowOption = abilityRequest.startWindowOption;
1921 sessionInfo->isFromIcon = abilityRequest.isFromIcon;
1922 sessionInfo->tmpSpecifiedId = requestId;
1923 PutSpecifiedFlag(requestId, abilityRequest.specifiedFlag);
1924 SendSessionInfoToSCB(callerAbility, sessionInfo);
1925 return ERR_OK;
1926 }
1927
CallRequestDone(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<IRemoteObject> & callStub)1928 void UIAbilityLifecycleManager::CallRequestDone(const std::shared_ptr<AbilityRecord> &abilityRecord,
1929 const sptr<IRemoteObject> &callStub)
1930 {
1931 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1932 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1933 if (abilityRecord == nullptr) {
1934 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null.");
1935 return;
1936 }
1937 if (callStub == nullptr) {
1938 TAG_LOGE(AAFwkTag::ABILITYMGR, "call stub is null.");
1939 return;
1940 }
1941 abilityRecord->CallRequestDone(callStub);
1942 }
1943
ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)1944 int UIAbilityLifecycleManager::ReleaseCallLocked(
1945 const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
1946 {
1947 TAG_LOGD(AAFwkTag::ABILITYMGR, "release call ability.");
1948 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1949 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
1950 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
1951
1952 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1953
1954 auto abilityRecords = GetAbilityRecordsByNameInner(element);
1955 auto isExist = [connect] (const std::shared_ptr<AbilityRecord> &abilityRecord) {
1956 return abilityRecord->IsExistConnection(connect);
1957 };
1958 auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist);
1959 if (findRecord == abilityRecords.end()) {
1960 TAG_LOGE(AAFwkTag::ABILITYMGR, "not found ability record by callback.");
1961 return RELEASE_CALL_ABILITY_INNER_ERR;
1962 }
1963 auto abilityRecord = *findRecord;
1964 CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR);
1965
1966 if (!abilityRecord->ReleaseCall(connect)) {
1967 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability release call record failed.");
1968 return RELEASE_CALL_ABILITY_INNER_ERR;
1969 }
1970 return ERR_OK;
1971 }
1972
OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)1973 void UIAbilityLifecycleManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord)
1974 {
1975 TAG_LOGI(AAFwkTag::ABILITYMGR, "On callConnect died.");
1976 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1977 CHECK_POINTER(callRecord);
1978 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1979
1980 AppExecFwk::ElementName element = callRecord->GetTargetServiceName();
1981 auto abilityRecords = GetAbilityRecordsByNameInner(element);
1982 auto isExist = [callRecord] (const std::shared_ptr<AbilityRecord> &abilityRecord) {
1983 return abilityRecord->IsExistConnection(callRecord->GetConCallBack());
1984 };
1985 auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist);
1986 if (findRecord == abilityRecords.end()) {
1987 TAG_LOGE(AAFwkTag::ABILITYMGR, "not found ability record by callback");
1988 return;
1989 }
1990 auto abilityRecord = *findRecord;
1991 CHECK_POINTER(abilityRecord);
1992 abilityRecord->ReleaseCall(callRecord->GetConCallBack());
1993 }
1994
GetAbilityRecordsByName(const AppExecFwk::ElementName & element)1995 std::vector<std::shared_ptr<AbilityRecord>> UIAbilityLifecycleManager::GetAbilityRecordsByName(
1996 const AppExecFwk::ElementName &element)
1997 {
1998 std::lock_guard<ffrt::mutex> guard(sessionLock_);
1999 return GetAbilityRecordsByNameInner(element);
2000 }
2001
GetAbilityRecordsByNameInner(const AppExecFwk::ElementName & element)2002 std::vector<std::shared_ptr<AbilityRecord>> UIAbilityLifecycleManager::GetAbilityRecordsByNameInner(
2003 const AppExecFwk::ElementName &element)
2004 {
2005 std::vector<std::shared_ptr<AbilityRecord>> records;
2006 for (const auto& [first, second] : sessionAbilityMap_) {
2007 auto &abilityInfo = second->GetAbilityInfo();
2008 AppExecFwk::ElementName localElement(abilityInfo.deviceId, abilityInfo.bundleName,
2009 abilityInfo.name, abilityInfo.moduleName);
2010 AppExecFwk::ElementName localElementNoModuleName(abilityInfo.deviceId,
2011 abilityInfo.bundleName, abilityInfo.name);
2012 if (localElement == element || localElementNoModuleName == element) {
2013 TAG_LOGD(AAFwkTag::ABILITYMGR, "find element %{public}s", localElement.GetURI().c_str());
2014 records.push_back(second);
2015 }
2016 }
2017 return records;
2018 }
2019
GetSessionIdByAbilityToken(const sptr<IRemoteObject> & token)2020 int32_t UIAbilityLifecycleManager::GetSessionIdByAbilityToken(const sptr<IRemoteObject> &token)
2021 {
2022 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2023 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2024 for (const auto& [first, second] : sessionAbilityMap_) {
2025 if (second && second->GetToken()->AsObject() == token) {
2026 return first;
2027 }
2028 }
2029 TAG_LOGE(AAFwkTag::ABILITYMGR, "not find");
2030 return 0;
2031 }
2032
SetRevicerInfo(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord) const2033 void UIAbilityLifecycleManager::SetRevicerInfo(const AbilityRequest &abilityRequest,
2034 std::shared_ptr<AbilityRecord> &abilityRecord) const
2035 {
2036 CHECK_POINTER(abilityRecord);
2037 const auto &abilityInfo = abilityRequest.abilityInfo;
2038 std::string abilityName = abilityInfo.name;
2039 auto isStandard = abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && !abilityRequest.startRecent;
2040 if (isStandard && abilityRequest.sessionInfo != nullptr) {
2041 // Support standard launch type.
2042 auto persistentId = abilityRequest.sessionInfo->persistentId;
2043 abilityName += std::to_string(abilityRequest.sessionInfo->persistentId);
2044 }
2045
2046 bool hasRecoverInfo = false;
2047 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2048 GetAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, abilityName,
2049 hasRecoverInfo);
2050 abilityRecord->UpdateRecoveryInfo(hasRecoverInfo);
2051 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2052 DeleteAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, abilityName);
2053 }
2054
SetLastExitReason(std::shared_ptr<AbilityRecord> & abilityRecord) const2055 void UIAbilityLifecycleManager::SetLastExitReason(std::shared_ptr<AbilityRecord> &abilityRecord) const
2056 {
2057 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2058 if (abilityRecord == nullptr) {
2059 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2060 return;
2061 }
2062
2063 if (abilityRecord->GetAbilityInfo().bundleName.empty()) {
2064 TAG_LOGE(AAFwkTag::ABILITYMGR, "bundleName is empty.");
2065 return;
2066 }
2067
2068 auto sessionInfo = abilityRecord->GetSessionInfo();
2069 if (sessionInfo == nullptr) {
2070 TAG_LOGE(AAFwkTag::ABILITYMGR, "Session info invalid.");
2071 return;
2072 }
2073
2074 std::string abilityName = abilityRecord->GetAbilityInfo().name;
2075 if (abilityRecord->GetAbilityInfo().launchMode == AppExecFwk::LaunchMode::STANDARD) {
2076 abilityName += std::to_string(sessionInfo->persistentId);
2077 }
2078
2079 ExitReason exitReason;
2080 bool isSetReason;
2081 auto accessTokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
2082 DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->GetAppExitReason(
2083 abilityRecord->GetAbilityInfo().bundleName, accessTokenId, abilityName, isSetReason, exitReason);
2084
2085 if (isSetReason) {
2086 TAG_LOGD(AAFwkTag::ABILITYMGR, "Set last exit reason, ability: %{public}s, reason: %{public}d.",
2087 abilityName.c_str(), exitReason.reason);
2088 abilityRecord->SetLastExitReason(exitReason);
2089 }
2090 }
2091
PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)2092 bool UIAbilityLifecycleManager::PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
2093 {
2094 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2095 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2096 if (abilityRecord == nullptr) {
2097 TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null");
2098 return false;
2099 }
2100 TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityInfoName:%{public}s", abilityRecord->GetAbilityInfo().name.c_str());
2101 if (!CheckPrepareTerminateEnable(abilityRecord)) {
2102 TAG_LOGD(AAFwkTag::ABILITYMGR, "Not support prepare terminate.");
2103 return false;
2104 }
2105 // execute onPrepareToTerminate util timeout
2106 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
2107 if (taskHandler == nullptr) {
2108 TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to get AbilityTaskHandler.");
2109 return false;
2110 }
2111 auto promise = std::make_shared<std::promise<bool>>();
2112 auto future = promise->get_future();
2113 auto task = [promise, abilityRecord]() {
2114 promise->set_value(abilityRecord->PrepareTerminateAbility());
2115 };
2116 taskHandler->SubmitTask(task);
2117 int prepareTerminateTimeout =
2118 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * PREPARE_TERMINATE_TIMEOUT_MULTIPLE;
2119 std::future_status status = future.wait_for(std::chrono::milliseconds(prepareTerminateTimeout));
2120 if (status == std::future_status::timeout) {
2121 TAG_LOGE(AAFwkTag::ABILITYMGR, "onPrepareToTerminate timeout.");
2122 return false;
2123 }
2124 return future.get();
2125 }
2126
CheckPrepareTerminateEnable(const std::shared_ptr<AbilityRecord> & abilityRecord)2127 bool UIAbilityLifecycleManager::CheckPrepareTerminateEnable(const std::shared_ptr<AbilityRecord> &abilityRecord)
2128 {
2129 if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
2130 TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability record is not exist or is on terminating.");
2131 return false;
2132 }
2133 auto type = abilityRecord->GetAbilityInfo().type;
2134 bool isStageBasedModel = abilityRecord->GetAbilityInfo().isStageBasedModel;
2135 if (!isStageBasedModel || type != AppExecFwk::AbilityType::PAGE) {
2136 TAG_LOGD(AAFwkTag::ABILITYMGR, "ability mode not support.");
2137 return false;
2138 }
2139 auto tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
2140 if (!AAFwk::PermissionVerification::GetInstance()->VerifyPrepareTerminatePermission(tokenId)) {
2141 TAG_LOGD(AAFwkTag::ABILITYMGR, "failed, please apply permission ohos.permission.PREPARE_APP_TERMINATE");
2142 return false;
2143 }
2144 return true;
2145 }
2146
SetSessionHandler(const sptr<ISessionHandler> & handler)2147 void UIAbilityLifecycleManager::SetSessionHandler(const sptr<ISessionHandler> &handler)
2148 {
2149 handler_ = handler;
2150 }
2151
GetAbilityRecordsById(int32_t sessionId) const2152 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetAbilityRecordsById(int32_t sessionId) const
2153 {
2154 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2155 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2156 auto search = sessionAbilityMap_.find(sessionId);
2157 if (search == sessionAbilityMap_.end()) {
2158 TAG_LOGI(AAFwkTag::ABILITYMGR, "sessionId is invalid.");
2159 return nullptr;
2160 }
2161 return search->second;
2162 }
2163
GetActiveAbilityList(int32_t uid,std::vector<std::string> & abilityList,int32_t pid)2164 void UIAbilityLifecycleManager::GetActiveAbilityList(int32_t uid, std::vector<std::string> &abilityList, int32_t pid)
2165 {
2166 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2167 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2168 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call.");
2169 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2170 if (abilityRecord == nullptr) {
2171 TAG_LOGW(AAFwkTag::ABILITYMGR, "second is nullptr.");
2172 continue;
2173 }
2174 if (!CheckPid(abilityRecord, pid)) {
2175 continue;
2176 }
2177 const auto &abilityInfo = abilityRecord->GetAbilityInfo();
2178 if (abilityInfo.applicationInfo.uid == uid && !abilityInfo.name.empty()) {
2179 std::string abilityName = abilityInfo.name;
2180 if (abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD &&
2181 abilityRecord->GetSessionInfo() != nullptr) {
2182 abilityName += std::to_string(abilityRecord->GetSessionInfo()->persistentId);
2183 }
2184 TAG_LOGD(AAFwkTag::ABILITYMGR, "find ability name is %{public}s.", abilityName.c_str());
2185 abilityList.push_back(abilityName);
2186 }
2187 }
2188 if (!abilityList.empty()) {
2189 sort(abilityList.begin(), abilityList.end());
2190 abilityList.erase(unique(abilityList.begin(), abilityList.end()), abilityList.end());
2191 }
2192 }
2193
CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord,const int32_t pid) const2194 bool UIAbilityLifecycleManager::CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord, const int32_t pid) const
2195 {
2196 CHECK_POINTER_RETURN_BOOL(abilityRecord);
2197 return pid == NO_PID || abilityRecord->GetPid() == pid;
2198 }
2199
CheckAbilityNumber(const std::string & bundleName,const std::string & abilityName,const std::string & moduleName) const2200 int32_t UIAbilityLifecycleManager::CheckAbilityNumber(
2201 const std::string &bundleName, const std::string &abilityName, const std::string &moduleName) const
2202 {
2203 int32_t checkAbilityNumber = 0;
2204
2205 for (auto [persistentId, record] : sessionAbilityMap_) {
2206 auto recordAbilityInfo = record->GetAbilityInfo();
2207 if (bundleName == recordAbilityInfo.bundleName && abilityName == recordAbilityInfo.name &&
2208 moduleName == recordAbilityInfo.moduleName) {
2209 // check ability number created previously and add new one.
2210 checkAbilityNumber += 1;
2211 }
2212 }
2213
2214 return checkAbilityNumber;
2215 }
2216
MoreAbilityNumbersSendEventInfo(int32_t userId,const std::string & bundleName,const std::string & abilityName,const std::string & moduleName)2217 void UIAbilityLifecycleManager::MoreAbilityNumbersSendEventInfo(
2218 int32_t userId, const std::string &bundleName, const std::string &abilityName, const std::string &moduleName)
2219 {
2220 int32_t checkAbilityNumber = 0;
2221 checkAbilityNumber = CheckAbilityNumber(bundleName, abilityName, moduleName);
2222 TAG_LOGD(AAFwkTag::ABILITYMGR, "Check ability number:%{public}d", checkAbilityNumber);
2223
2224 if (checkAbilityNumber >= 1) {
2225 EventInfo eventInfo;
2226 eventInfo.userId = userId;
2227 eventInfo.abilityName = abilityName;
2228 eventInfo.bundleName = bundleName;
2229 eventInfo.moduleName = moduleName;
2230 // get ability number created previously and add new one.
2231 eventInfo.abilityNumber = checkAbilityNumber + 1;
2232 EventReport::SendAbilityEvent(EventName::START_STANDARD_ABILITIES, HiSysEventType::BEHAVIOR, eventInfo);
2233 }
2234 }
2235
OnAppStateChanged(const AppInfo & info)2236 void UIAbilityLifecycleManager::OnAppStateChanged(const AppInfo &info)
2237 {
2238 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2239 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2240 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
2241 if (info.state == AppState::TERMINATED || info.state == AppState::END) {
2242 for (const auto& abilityRecord : terminateAbilityList_) {
2243 if (abilityRecord == nullptr) {
2244 TAG_LOGW(AAFwkTag::ABILITYMGR, "the abilityRecord is nullptr.");
2245 continue;
2246 }
2247 if (info.processName == abilityRecord->GetAbilityInfo().process ||
2248 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
2249 abilityRecord->SetAppState(info.state);
2250 }
2251 }
2252 return;
2253 }
2254 if (info.state == AppState::COLD_START) {
2255 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2256 if (abilityRecord == nullptr) {
2257 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2258 continue;
2259 }
2260 if (info.processName == abilityRecord->GetAbilityInfo().process ||
2261 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
2262 abilityRecord->SetColdStartFlag(true);
2263 break;
2264 }
2265 }
2266 return;
2267 }
2268 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2269 if (abilityRecord == nullptr) {
2270 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2271 continue;
2272 }
2273 if (info.processName == abilityRecord->GetAbilityInfo().process ||
2274 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
2275 abilityRecord->SetAppState(info.state);
2276 }
2277 }
2278 }
2279
UninstallApp(const std::string & bundleName,int32_t uid)2280 void UIAbilityLifecycleManager::UninstallApp(const std::string &bundleName, int32_t uid)
2281 {
2282 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2283 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2284 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call.");
2285 for (auto it = sessionAbilityMap_.begin(); it != sessionAbilityMap_.end();) {
2286 if (it->second == nullptr) {
2287 it++;
2288 continue;
2289 }
2290 auto &abilityInfo = it->second->GetAbilityInfo();
2291 if (abilityInfo.bundleName == bundleName && it->second->GetUid() == uid) {
2292 std::string abilityName = abilityInfo.name;
2293 auto sessionInfo = it->second->GetSessionInfo();
2294 if (abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && sessionInfo != nullptr) {
2295 abilityName += std::to_string(sessionInfo->persistentId);
2296 }
2297 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2298 DeleteAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName,
2299 abilityName);
2300 }
2301 it++;
2302 }
2303 }
2304
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm) const2305 void UIAbilityLifecycleManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm) const
2306 {
2307 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2308 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2309 TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
2310 for (auto [sessionId, abilityRecord] : sessionAbilityMap_) {
2311 if (abilityRecord == nullptr) {
2312 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2313 continue;
2314 }
2315 if (isPerm) {
2316 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2317 } else {
2318 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2319 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2320 if (callingTokenId == tokenID) {
2321 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2322 }
2323 }
2324 }
2325 }
2326
Dump(std::vector<std::string> & info)2327 void UIAbilityLifecycleManager::Dump(std::vector<std::string> &info)
2328 {
2329 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call begin.");
2330 std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked;
2331 {
2332 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2333 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2334 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2335 sessionAbilityMapLocked[sessionId] = abilityRecord;
2336 }
2337 }
2338
2339 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2340 info.push_back(dumpInfo);
2341 dumpInfo = " current mission lists:{";
2342 info.push_back(dumpInfo);
2343
2344 for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) {
2345 if (abilityRecord == nullptr) {
2346 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2347 continue;
2348 }
2349
2350 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2351 dumpInfo = " Mission ID #" + std::to_string(sessionId);
2352 if (sessionInfo) {
2353 dumpInfo += " mission name #[" + sessionInfo->sessionName + "]";
2354 }
2355 dumpInfo += " lockedState #" + std::to_string(abilityRecord->GetLockedState());
2356 dumpInfo += " mission affinity #[" + abilityRecord->GetMissionAffinity() + "]";
2357 info.push_back(dumpInfo);
2358
2359 abilityRecord->Dump(info);
2360
2361 dumpInfo = " }";
2362 info.push_back(dumpInfo);
2363 }
2364 }
2365
DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)2366 void UIAbilityLifecycleManager::DumpMissionList(
2367 std::vector<std::string> &info, bool isClient, const std::string &args)
2368 {
2369 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call start.");
2370 std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked;
2371 {
2372 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2373 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2374 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2375 sessionAbilityMapLocked[sessionId] = abilityRecord;
2376 }
2377 }
2378 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2379 info.push_back(dumpInfo);
2380 dumpInfo = " current mission lists:{";
2381 info.push_back(dumpInfo);
2382
2383 for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) {
2384 if (abilityRecord == nullptr) {
2385 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2386 continue;
2387 }
2388 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2389 dumpInfo = " Mission ID #" + std::to_string(sessionId);
2390 if (sessionInfo) {
2391 dumpInfo += " mission name #[" + sessionInfo->sessionName + "]";
2392 }
2393 dumpInfo += " lockedState #" + std::to_string(abilityRecord->GetLockedState());
2394 dumpInfo += " mission affinity #[" + abilityRecord->GetMissionAffinity() + "]";
2395 info.push_back(dumpInfo);
2396
2397 std::vector<std::string> params;
2398 abilityRecord->DumpAbilityState(info, isClient, params);
2399
2400 dumpInfo = " }";
2401 info.push_back(dumpInfo);
2402 }
2403 }
2404
DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)2405 void UIAbilityLifecycleManager::DumpMissionListByRecordId(std::vector<std::string> &info, bool isClient,
2406 int32_t abilityRecordId, const std::vector<std::string> ¶ms)
2407 {
2408 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call.");
2409 std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked;
2410 {
2411 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2412 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2413 for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2414 sessionAbilityMapLocked[sessionId] = abilityRecord;
2415 }
2416 }
2417 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2418 info.push_back(dumpInfo);
2419 dumpInfo = " current mission lists:{";
2420 info.push_back(dumpInfo);
2421
2422 for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) {
2423 if (abilityRecord == nullptr) {
2424 TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
2425 continue;
2426 }
2427 if (abilityRecord->GetAbilityRecordId() != abilityRecordId) {
2428 continue;
2429 }
2430 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2431 dumpInfo = " Mission ID #" + std::to_string(sessionId);
2432 if (sessionInfo) {
2433 dumpInfo += " mission name #[" + sessionInfo->sessionName + "]";
2434 }
2435 dumpInfo += " lockedState #" + std::to_string(abilityRecord->GetLockedState());
2436 dumpInfo += " mission affinity #[" + abilityRecord->GetMissionAffinity() + "]";
2437 info.push_back(dumpInfo);
2438
2439 abilityRecord->DumpAbilityState(info, isClient, params);
2440
2441 dumpInfo = " }";
2442 info.push_back(dumpInfo);
2443 }
2444 }
2445
MoveMissionToFront(int32_t sessionId,std::shared_ptr<StartOptions> startOptions)2446 int UIAbilityLifecycleManager::MoveMissionToFront(int32_t sessionId, std::shared_ptr<StartOptions> startOptions)
2447 {
2448 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2449 auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_);
2450 CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
2451 std::shared_ptr<AbilityRecord> abilityRecord = GetAbilityRecordsById(sessionId);
2452 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2453 if (startOptions != nullptr) {
2454 abilityRecord->SetWindowMode(startOptions->GetWindowMode());
2455 }
2456 sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2457 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2458 sessionInfo->processOptions = nullptr;
2459 sessionInfo->startWindowOption = nullptr;
2460 TAG_LOGI(AAFwkTag::ABILITYMGR, "Call PendingSessionActivation by rootSceneSession."
2461 "windowLeft=%{public}d,windowTop=%{public}d,"
2462 "windowHeight=%{public}d,windowWidth=%{public}d",
2463 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0),
2464 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0),
2465 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0),
2466 (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0));
2467 sessionInfo->canStartAbilityFromBackground = true;
2468 return static_cast<int>(tmpSceneSession->PendingSessionActivation(sessionInfo));
2469 }
2470
GetStatusBarDelegateManager()2471 std::shared_ptr<StatusBarDelegateManager> UIAbilityLifecycleManager::GetStatusBarDelegateManager()
2472 {
2473 std::lock_guard<ffrt::mutex> lock(statusBarDelegateManagerLock_);
2474 if (statusBarDelegateManager_ == nullptr) {
2475 statusBarDelegateManager_ = std::make_shared<StatusBarDelegateManager>();
2476 }
2477 return statusBarDelegateManager_;
2478 }
2479
RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)2480 int32_t UIAbilityLifecycleManager::RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)
2481 {
2482 auto statusBarDelegateManager = GetStatusBarDelegateManager();
2483 CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE);
2484 return statusBarDelegateManager->RegisterStatusBarDelegate(delegate);
2485 }
2486
IsCallerInStatusBar()2487 bool UIAbilityLifecycleManager::IsCallerInStatusBar()
2488 {
2489 auto statusBarDelegateManager = GetStatusBarDelegateManager();
2490 CHECK_POINTER_AND_RETURN(statusBarDelegateManager, false);
2491 return statusBarDelegateManager->IsCallerInStatusBar();
2492 }
2493
DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)2494 int32_t UIAbilityLifecycleManager::DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)
2495 {
2496 auto statusBarDelegateManager = GetStatusBarDelegateManager();
2497 CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE);
2498 return statusBarDelegateManager->DoProcessAttachment(abilityRecord);
2499 }
2500
TryPrepareTerminateByPids(const std::vector<int32_t> & pids)2501 int32_t UIAbilityLifecycleManager::TryPrepareTerminateByPids(const std::vector<int32_t>& pids)
2502 {
2503 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2504 TAG_LOGI(AAFwkTag::ABILITYMGR, "do prepare terminate.");
2505 IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->BlockProcessCacheByPids(pids));
2506 for (const auto& pid: pids) {
2507 std::unordered_set<std::shared_ptr<AbilityRecord>> abilitysToTerminate;
2508 std::vector<sptr<IRemoteObject>> tokens;
2509 IN_PROCESS_CALL_WITHOUT_RET(
2510 DelayedSingleton<AppScheduler>::GetInstance()->GetAbilityRecordsByProcessID(pid, tokens));
2511 for (const auto& token: tokens) {
2512 auto abilityRecord = Token::GetAbilityRecordByToken(token);
2513 if (PrepareTerminateAbility(abilityRecord)) {
2514 TAG_LOGI(AAFwkTag::ABILITYMGR, "Terminate is blocked.");
2515 continue;
2516 }
2517 abilitysToTerminate.emplace(abilityRecord);
2518 }
2519 for (const auto& abilityRecord: abilitysToTerminate) {
2520 TerminateSession(abilityRecord);
2521 }
2522 }
2523 TAG_LOGI(AAFwkTag::ABILITYMGR, "end.");
2524 return ERR_OK;
2525 }
2526
BatchCloseUIAbility(const std::unordered_set<std::shared_ptr<AbilityRecord>> & abilitySet)2527 void UIAbilityLifecycleManager::BatchCloseUIAbility(
2528 const std::unordered_set<std::shared_ptr<AbilityRecord>>& abilitySet)
2529 {
2530 auto closeTask = [ self = shared_from_this(), abilitySet]() {
2531 TAG_LOGI(AAFwkTag::ABILITYMGR, "The abilities need to be closed.");
2532 if (self == nullptr) {
2533 TAG_LOGE(AAFwkTag::ABILITYMGR, "The manager is nullptr.");
2534 return;
2535 }
2536 for (const auto& ability : abilitySet) {
2537 self->CloseUIAbility(ability, -1, nullptr, false);
2538 }
2539 };
2540 auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
2541 if (taskHandler != nullptr) {
2542 taskHandler->SubmitTask(closeTask, TaskQoS::USER_INTERACTIVE);
2543 }
2544 }
2545
TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord)2546 void UIAbilityLifecycleManager::TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord)
2547 {
2548 CHECK_POINTER(abilityRecord);
2549 auto sessionInfo = abilityRecord->GetSessionInfo();
2550 CHECK_POINTER(sessionInfo);
2551 CHECK_POINTER(sessionInfo->sessionToken);
2552 auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
2553 CHECK_POINTER(session);
2554 TAG_LOGI(AAFwkTag::ABILITYMGR, "call TerminateSession, session id: %{public}d", sessionInfo->persistentId);
2555 session->TerminateSession(sessionInfo);
2556 }
2557
ChangeAbilityVisibility(sptr<IRemoteObject> token,bool isShow)2558 int UIAbilityLifecycleManager::ChangeAbilityVisibility(sptr<IRemoteObject> token, bool isShow)
2559 {
2560 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2561 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2562 auto abilityRecord = GetAbilityRecordByToken(token);
2563 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2564 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2565 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2566 if (callingTokenId != tokenID) {
2567 TAG_LOGE(AAFwkTag::ABILITYMGR, "Is not self.");
2568 return ERR_NATIVE_NOT_SELF_APPLICATION;
2569 }
2570 auto sessionInfo = abilityRecord->GetSessionInfo();
2571 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2572 if (sessionInfo->processOptions == nullptr ||
2573 !ProcessOptions::IsAttachToStatusBarMode(sessionInfo->processOptions->processMode)) {
2574 TAG_LOGE(AAFwkTag::ABILITYMGR, "Process options check failed.");
2575 return ERR_START_OPTIONS_CHECK_FAILED;
2576 }
2577 auto callerSessionInfo = abilityRecord->GetSessionInfo();
2578 CHECK_POINTER_AND_RETURN(callerSessionInfo, ERR_INVALID_VALUE);
2579 CHECK_POINTER_AND_RETURN(callerSessionInfo->sessionToken, ERR_INVALID_VALUE);
2580 auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken);
2581 return static_cast<int>(callerSession->ChangeSessionVisibilityWithStatusBar(callerSessionInfo, isShow));
2582 }
2583
ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo,bool isShow)2584 int UIAbilityLifecycleManager::ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo, bool isShow)
2585 {
2586 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2587 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2588 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2589 auto iter = sessionAbilityMap_.find(sessionInfo->persistentId);
2590 if (iter == sessionAbilityMap_.end()) {
2591 TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability not found.");
2592 return ERR_NATIVE_ABILITY_NOT_FOUND;
2593 }
2594 std::shared_ptr<AbilityRecord> uiAbilityRecord = iter->second;
2595 CHECK_POINTER_AND_RETURN(uiAbilityRecord, ERR_INVALID_VALUE);
2596 auto state = uiAbilityRecord->GetAbilityVisibilityState();
2597 if (state == AbilityVisibilityState::UNSPECIFIED || state == AbilityVisibilityState::INITIAL) {
2598 TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability visibility state check failed.");
2599 return ERR_NATIVE_ABILITY_STATE_CHECK_FAILED;
2600 }
2601 TAG_LOGI(AAFwkTag::ABILITYMGR, "Change ability visibility state to: %{public}d", isShow);
2602 if (isShow) {
2603 uiAbilityRecord->SetAbilityVisibilityState(AbilityVisibilityState::FOREGROUND_SHOW);
2604 uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId);
2605 } else {
2606 uiAbilityRecord->SetAbilityVisibilityState(AbilityVisibilityState::FOREGROUND_HIDE);
2607 }
2608 return ERR_OK;
2609 }
2610
UpdateSessionInfoBySCB(std::list<SessionInfo> & sessionInfos,std::vector<int32_t> & sessionIds)2611 int32_t UIAbilityLifecycleManager::UpdateSessionInfoBySCB(std::list<SessionInfo> &sessionInfos,
2612 std::vector<int32_t> &sessionIds)
2613 {
2614 std::unordered_set<std::shared_ptr<AbilityRecord>> abilitySet;
2615 {
2616 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2617 isSCBRecovery_ = false;
2618 for (auto [sessionId, abilityRecord] : sessionAbilityMap_) {
2619 bool isFind = false;
2620 for (auto iter = sessionInfos.begin(); iter != sessionInfos.end(); iter++) {
2621 if (iter->persistentId == sessionId) {
2622 abilityRecord->UpdateSessionInfo(iter->sessionToken);
2623 sessionInfos.erase(iter);
2624 isFind = true;
2625 break;
2626 }
2627 }
2628 if (!isFind && coldStartInSCBRecovery_.count(sessionId) == 0) {
2629 abilitySet.emplace(abilityRecord);
2630 }
2631 }
2632 coldStartInSCBRecovery_.clear();
2633 }
2634 for (const auto &info : sessionInfos) {
2635 sessionIds.emplace_back(info.persistentId);
2636 }
2637
2638 BatchCloseUIAbility(abilitySet);
2639 TAG_LOGI(AAFwkTag::ABILITYMGR, "The end of updating session info.");
2640 return ERR_OK;
2641 }
2642
SignRestartAppFlag(int32_t uid,bool isAppRecovery)2643 void UIAbilityLifecycleManager::SignRestartAppFlag(int32_t uid, bool isAppRecovery)
2644 {
2645 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2646 auto tempSessionAbilityMap = sessionAbilityMap_;
2647 for (auto &[sessionId, abilityRecord] : tempSessionAbilityMap) {
2648 if (abilityRecord == nullptr || abilityRecord->GetUid() != uid) {
2649 continue;
2650 }
2651 abilityRecord->SetRestartAppFlag(true);
2652 std::string reason = "onAbilityDied";
2653 if (isAppRecovery) {
2654 reason = "appRecovery";
2655 }
2656 NotifySCBToHandleException(abilityRecord, static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_DIED),
2657 reason);
2658 }
2659 }
2660
CompleteFirstFrameDrawing(int32_t sessionId) const2661 void UIAbilityLifecycleManager::CompleteFirstFrameDrawing(int32_t sessionId) const
2662 {
2663 TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2664 #ifdef SUPPORT_GRAPHICS
2665 auto abilityRecord = GetAbilityRecordsById(sessionId);
2666 if (abilityRecord == nullptr) {
2667 TAG_LOGW(AAFwkTag::ABILITYMGR, "CompleteFirstFrameDrawing, get AbilityRecord by sessionId failed.");
2668 return;
2669 }
2670 abilityRecord->ReportAtomicServiceDrawnCompleteEvent();
2671 abilityRecord->SetCompleteFirstFrameDrawing(true);
2672 AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance().
2673 HandleOnFirstFrameState(abilityRecord);
2674 #endif
2675 }
2676
StartWithPersistentIdByDistributed(const AbilityRequest & abilityRequest,int32_t persistentId)2677 int UIAbilityLifecycleManager::StartWithPersistentIdByDistributed(const AbilityRequest &abilityRequest,
2678 int32_t persistentId)
2679 {
2680 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartWithPersistentIdByDistributed, called");
2681 auto sessionInfo = CreateSessionInfo(abilityRequest);
2682 sessionInfo->requestCode = abilityRequest.requestCode;
2683 sessionInfo->persistentId = persistentId;
2684 sessionInfo->userId = userId_;
2685 sessionInfo->isAtomicService =
2686 (abilityRequest.abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
2687 return NotifySCBPendingActivation(sessionInfo, abilityRequest);
2688 }
2689
GetAbilityStateByPersistentId(int32_t persistentId,bool & state)2690 int32_t UIAbilityLifecycleManager::GetAbilityStateByPersistentId(int32_t persistentId, bool &state)
2691 {
2692 TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2693 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2694 auto iter = sessionAbilityMap_.find(persistentId);
2695 if (iter != sessionAbilityMap_.end()) {
2696 std::shared_ptr<AbilityRecord> uiAbilityRecord = iter->second;
2697 if (uiAbilityRecord && uiAbilityRecord->GetPendingState() == AbilityState::INITIAL) {
2698 state = true;
2699 return ERR_OK;
2700 }
2701 }
2702 state = false;
2703 return ERR_INVALID_VALUE;
2704 }
2705
CleanUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)2706 int32_t UIAbilityLifecycleManager::CleanUIAbility(
2707 const std::shared_ptr<AbilityRecord> &abilityRecord)
2708 {
2709 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2710 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2711 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2712 std::string element = abilityRecord->GetElementName().GetURI();
2713 if (DelayedSingleton<AppScheduler>::GetInstance()->CleanAbilityByUserRequest(abilityRecord->GetToken())) {
2714 TAG_LOGI(AAFwkTag::ABILITYMGR, "user clean ability: %{public}s success", element.c_str());
2715 return ERR_OK;
2716 }
2717 TAG_LOGI(AAFwkTag::ABILITYMGR,
2718 "can not force kill when user request clean ability, schedule lifecycle:%{public}s", element.c_str());
2719 return CloseUIAbility(abilityRecord, -1, nullptr, true);
2720 }
2721
CheckCallerFromBackground(std::shared_ptr<AbilityRecord> callerAbility,sptr<SessionInfo> & sessionInfo)2722 void UIAbilityLifecycleManager::CheckCallerFromBackground(
2723 std::shared_ptr<AbilityRecord> callerAbility, sptr<SessionInfo> &sessionInfo)
2724 {
2725 CHECK_POINTER(callerAbility);
2726 CHECK_POINTER(sessionInfo);
2727 TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2728 auto permission = AAFwk::PermissionVerification::GetInstance();
2729 bool hasPermission =
2730 permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND) ||
2731 permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILIIES_FROM_BACKGROUND);
2732
2733 sessionInfo->canStartAbilityFromBackground = hasPermission;
2734 TAG_LOGD(AAFwkTag::ABILITYMGR, "CheckCallerFromBackground: %{public}d", sessionInfo->canStartAbilityFromBackground);
2735 }
2736
EnableListForSCBRecovery()2737 void UIAbilityLifecycleManager::EnableListForSCBRecovery()
2738 {
2739 std::lock_guard<ffrt::mutex> guard(sessionLock_);
2740 isSCBRecovery_ = true;
2741 coldStartInSCBRecovery_.clear();
2742 }
2743
AddSpecifiedRequest(std::shared_ptr<SpecifiedRequest> request)2744 void UIAbilityLifecycleManager::AddSpecifiedRequest(std::shared_ptr<SpecifiedRequest> request)
2745 {
2746 if (!request) {
2747 return;
2748 }
2749
2750 auto &abilityRequest = request->abilityRequest;
2751 TAG_LOGI(AAFwkTag::ABILITYMGR, "AddSpecifiedRequest: %{public}d, %{public}s", request->requestId,
2752 abilityRequest.want.GetElement().GetURI().c_str());
2753 auto instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
2754 auto accessTokenIdStr = std::to_string(abilityRequest.abilityInfo.applicationInfo.accessTokenId);
2755 auto &list = specifiedRequestList_[accessTokenIdStr + instanceKey];
2756 list.push_back(request);
2757 if (list.size() == 1) {
2758 StartSpecifiedRequest(*request);
2759 }
2760 }
2761
StartSpecifiedRequest(SpecifiedRequest & specifiedRequest)2762 void UIAbilityLifecycleManager::StartSpecifiedRequest(SpecifiedRequest &specifiedRequest)
2763 {
2764 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedRequest: %{public}d", specifiedRequest.requestId);
2765 auto &request = specifiedRequest.abilityRequest;
2766
2767 if (specifiedRequest.isSpecifiedProcess) {
2768 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedProcess(request.want,
2769 request.abilityInfo, specifiedRequest.requestId);
2770 } else {
2771 if (specifiedRequest.preCreateProcessName) {
2772 PreCreateProcessName(request);
2773 }
2774
2775 if (!IsSpecifiedModuleLoaded(request)) {
2776 specifiedRequest.isCold = true;
2777 auto sessionInfo = CreateSessionInfo(request);
2778 sessionInfo->requestCode = request.requestCode;
2779 sessionInfo->userId = userId_;
2780 sessionInfo->tmpSpecifiedId = specifiedRequest.requestId;
2781 TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedRequest cold");
2782 NotifySCBPendingActivation(sessionInfo, request);
2783 sessionInfo->want.RemoveAllFd();
2784 }
2785 DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility(request.want,
2786 request.abilityInfo, specifiedRequest.requestId);
2787 }
2788
2789 auto timeoutTask = [requestId = specifiedRequest.requestId, wThis = weak_from_this()]() {
2790 auto pThis = wThis.lock();
2791 if (pThis) {
2792 pThis->OnStartSpecifiedAbilityTimeoutResponse(Want(), requestId);
2793 }
2794 };
2795 TaskHandlerWrap::GetFfrtHandler()->SubmitTaskJust(timeoutTask, "SpecifiedFinalTimeout",
2796 GlobalConstant::TIMEOUT_UNIT_TIME * GlobalConstant::COLDSTART_TIMEOUT_MULTIPLE);
2797 }
2798
PopAndGetNextSpecified(int32_t requestId)2799 std::shared_ptr<SpecifiedRequest> UIAbilityLifecycleManager::PopAndGetNextSpecified(int32_t requestId)
2800 {
2801 for (auto iter = specifiedRequestList_.begin(); iter != specifiedRequestList_.end(); ++iter) {
2802 auto &list = iter->second;
2803 if (!list.empty() && list.front()->requestId == requestId) {
2804 list.pop_front();
2805 if (list.empty()) {
2806 TAG_LOGI(AAFwkTag::ABILITYMGR, "empty list");
2807 specifiedRequestList_.erase(iter);
2808 return nullptr;
2809 } else {
2810 return list.front();
2811 }
2812 }
2813 }
2814 TAG_LOGI(AAFwkTag::ABILITYMGR, "unknown request: %{public}d", requestId);
2815 return nullptr;
2816 }
2817
IsSpecifiedModuleLoaded(const AbilityRequest & abilityRequest)2818 bool UIAbilityLifecycleManager::IsSpecifiedModuleLoaded(const AbilityRequest &abilityRequest)
2819 {
2820 auto appMgr = AppMgrUtil::GetAppMgr();
2821 if (appMgr == nullptr) {
2822 TAG_LOGW(AAFwkTag::ABILITYMGR, "AppMgrUtil::GetAppMgr failed");
2823 return false;
2824 }
2825 bool appExist = false;
2826 auto ret = IN_PROCESS_CALL(appMgr->IsSpecifiedModuleLoaded(abilityRequest.want,
2827 abilityRequest.abilityInfo, appExist));
2828 return ret == ERR_OK && appExist;
2829 }
2830
HandleStartSpecifiedCold(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,uint32_t sceneFlag)2831 bool UIAbilityLifecycleManager::HandleStartSpecifiedCold(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
2832 uint32_t sceneFlag)
2833 {
2834 if (!sessionInfo) {
2835 return false;
2836 }
2837 const auto &abilityInfo = abilityRequest.abilityInfo;
2838 if (abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
2839 return false;
2840 }
2841
2842 auto request = GetSpecifiedRequest(sessionInfo->tmpSpecifiedId);
2843 if (request == nullptr || !request->isCold) {
2844 return false;
2845 }
2846
2847 TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleStartSpecifiedCold: %{public}d, persitentId: %{public}d",
2848 request->requestId, sessionInfo->persistentId);
2849 request->persistentId = sessionInfo->persistentId;
2850 request->sceneFlag = sceneFlag;
2851 request->callingTokenId = sessionInfo->callingTokenId;
2852 return true;
2853 }
2854
HandleColdAcceptWantDone(const AAFwk::Want & want,const std::string & flag,const SpecifiedRequest & specifiedRequest)2855 bool UIAbilityLifecycleManager::HandleColdAcceptWantDone(const AAFwk::Want &want, const std::string &flag,
2856 const SpecifiedRequest &specifiedRequest)
2857 {
2858 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2859 auto iter = sessionAbilityMap_.find(specifiedRequest.persistentId);
2860 if (iter == sessionAbilityMap_.end() || !(iter->second) ||
2861 !(iter->second->GetSpecifiedFlag().empty())) {
2862 return false;
2863 }
2864
2865 TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleColdAcceptWantDone: %{public}d, session:%{public}d",
2866 specifiedRequest.requestId, specifiedRequest.persistentId);
2867 auto uiAbilityRecord = iter->second;
2868 uiAbilityRecord->SetSpecifiedFlag(flag);
2869 auto isShellCall = specifiedRequest.abilityRequest.want.GetBoolParam(IS_SHELL_CALL, false);
2870 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
2871 uiAbilityRecord->ProcessForegroundAbility(specifiedRequest.callingTokenId,
2872 specifiedRequest.sceneFlag, isShellCall);
2873 SendKeyEvent(specifiedRequest.abilityRequest);
2874 return true;
2875 }
2876
GetSpecifiedRequest(int32_t requestId)2877 std::shared_ptr<SpecifiedRequest> UIAbilityLifecycleManager::GetSpecifiedRequest(int32_t requestId)
2878 {
2879 for (const auto &[key, list] : specifiedRequestList_) {
2880 if (!list.empty() && list.front()->requestId == requestId) {
2881 return list.front();
2882 }
2883 }
2884 return nullptr;
2885 }
2886
PutSpecifiedFlag(int32_t requestId,const std::string & flag)2887 void UIAbilityLifecycleManager::PutSpecifiedFlag(int32_t requestId, const std::string &flag)
2888 {
2889 specifiedFlagMap_[requestId] = flag;
2890 auto timeoutTask = [requestId, pThis = shared_from_this()]() {
2891 std::lock_guard lock(pThis->sessionLock_);
2892 pThis->specifiedFlagMap_.erase(requestId);
2893 };
2894 TaskHandlerWrap::GetFfrtHandler()->SubmitTaskJust(timeoutTask, "PutSpecifiedFlagTimeout",
2895 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * GlobalConstant::COLDSTART_TIMEOUT_MULTIPLE);
2896 }
2897 } // namespace AAFwk
2898 } // namespace OHOS