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