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