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