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