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