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> ¶ms)
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