• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 "ability_permission_util.h"
20 #include "ability_record_death_manager.h"
21 #include "appfreeze_manager.h"
22 #include "app_exit_reason_data_manager.h"
23 #include "app_mgr_util.h"
24 #include "app_utils.h"
25 #include "ffrt.h"
26 #include "global_constant.h"
27 #include "hitrace_meter.h"
28 #include "permission_constants.h"
29 #include "process_options.h"
30 #include "server_constant.h"
31 #include "start_window_option.h"
32 #include "scene_board/status_bar_delegate_manager.h"
33 #include "session_manager_lite.h"
34 #include "session/host/include/zidl/session_interface.h"
35 #include "startup_util.h"
36 #include "ui_extension_utils.h"
37 #include "ability_stage_constant.h"
38 #ifdef SUPPORT_GRAPHICS
39 #include "ability_first_frame_state_observer_manager.h"
40 #endif
41 #include "hidden_start_observer_manager.h"
42 
43 namespace OHOS {
44 using AbilityRuntime::FreezeUtil;
45 using namespace AbilityRuntime::ServerConstant;
46 namespace AAFwk {
47 namespace {
48 constexpr const char* SEPARATOR = ":";
49 constexpr const char* PARAM_MISSION_AFFINITY_KEY = "ohos.anco.param.missionAffinity";
50 constexpr const char* DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
51 constexpr const char* DMS_MISSION_ID = "dmsMissionId";
52 constexpr int DEFAULT_DMS_MISSION_ID = -1;
53 constexpr const char* PARAM_SPECIFIED_PROCESS_FLAG = "ohoSpecifiedProcessFlag";
54 constexpr const char* DMS_PROCESS_NAME = "distributedsched";
55 constexpr const char* DMS_PERSISTENT_ID = "ohos.dms.persistentId";
56 constexpr const char* IS_SHELL_CALL = "isShellCall";
57 #ifdef SUPPORT_ASAN
58 constexpr int KILL_TIMEOUT_MULTIPLE = 45;
59 #else
60 constexpr int KILL_TIMEOUT_MULTIPLE = 3;
61 #endif
62 constexpr int32_t DEFAULT_USER_ID = 0;
63 constexpr int32_t MAX_FIND_UIEXTENSION_CALLER_TIMES = 10;
64 constexpr int32_t START_UI_ABILITY_PER_SECOND_UPPER_LIMIT = 20;
65 constexpr int32_t API20 = 20;
66 constexpr int32_t API_VERSION_MOD = 100;
67 constexpr const char* IS_CALLING_FROM_DMS = "supportCollaborativeCallingFromDmsInAAFwk";
68 constexpr int REMOVE_STARTING_BUNDLE_TIMEOUT_MICRO_SECONDS = 5000000; // 5s
69 
MsgId2State(uint32_t msgId)70 FreezeUtil::TimeoutState MsgId2State(uint32_t msgId)
71 {
72     if (msgId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
73         return FreezeUtil::TimeoutState::LOAD;
74     } else if (msgId == AbilityManagerService::FOREGROUND_TIMEOUT_MSG) {
75         return FreezeUtil::TimeoutState::FOREGROUND;
76     } else if (msgId == AbilityManagerService::BACKGROUND_TIMEOUT_MSG) {
77         return FreezeUtil::TimeoutState::BACKGROUND;
78     }
79     return FreezeUtil::TimeoutState::UNKNOWN;
80 }
81 
__anon3330e3c20202(const sptr<Token> &token) 82 auto g_deleteLifecycleEventTask = [](const sptr<Token> &token) {
83     CHECK_POINTER_LOG(token, "token is nullptr.");
84     FreezeUtil::GetInstance().DeleteLifecycleEvent(token->AsObject());
85 };
86 
CompareTwoRequest(const AbilityRequest & left,const AbilityRequest & right)87 bool CompareTwoRequest(const AbilityRequest &left, const AbilityRequest &right)
88 {
89     int32_t leftIndex = 0;
90     (void)AbilityRuntime::StartupUtil::GetAppIndex(left.want, leftIndex);
91     int32_t rightIndex = 0;
92     (void)AbilityRuntime::StartupUtil::GetAppIndex(right.want, rightIndex);
93 
94     auto LeftInstanceKey = left.want.GetStringParam(Want::APP_INSTANCE_KEY);
95     auto RightInstanceKey = right.want.GetStringParam(Want::APP_INSTANCE_KEY);
96 
97     return leftIndex == rightIndex && LeftInstanceKey == RightInstanceKey &&
98         left.abilityInfo.name == right.abilityInfo.name &&
99         left.abilityInfo.bundleName == right.abilityInfo.bundleName &&
100         left.abilityInfo.moduleName == right.abilityInfo.moduleName;
101 }
102 }
103 
UIAbilityLifecycleManager(int32_t userId)104 UIAbilityLifecycleManager::UIAbilityLifecycleManager(int32_t userId): userId_(userId) {}
105 
IsBundleStarting(pid_t pid)106 bool UIAbilityLifecycleManager::IsBundleStarting(pid_t pid)
107 {
108     std::lock_guard<std::mutex> guard(startingPidsMutex_);
109     for (auto iter = startingPids_.begin(); iter != startingPids_.end(); iter++) {
110         if (*iter == pid) {
111             return true;
112         }
113     }
114     TAG_LOGW(AAFwkTag::ABILITYMGR, "not found");
115     return false;
116 }
117 
AddStartingPid(pid_t pid)118 void UIAbilityLifecycleManager::AddStartingPid(pid_t pid)
119 {
120     if (IsBundleStarting(pid)) {
121         TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}d already exists", pid);
122         return;
123     }
124     {
125         std::lock_guard<std::mutex> guard(startingPidsMutex_);
126         startingPids_.push_back(pid);
127     }
128     ffrt::task_attr attr;
129     attr.delay(REMOVE_STARTING_BUNDLE_TIMEOUT_MICRO_SECONDS);
130     std::weak_ptr<UIAbilityLifecycleManager> weakPtr = shared_from_this();
131     ffrt::submit([weakPtr, pid]() {
132         auto uiAbilityManager = weakPtr.lock();
133         if (uiAbilityManager == nullptr) {
134             TAG_LOGE(AAFwkTag::ABILITYMGR, "null uiAbilityManager");
135             return;
136         }
137         uiAbilityManager->RemoveStartingPid(pid);
138         }, attr);
139 }
140 
RemoveStartingPid(pid_t pid)141 void UIAbilityLifecycleManager::RemoveStartingPid(pid_t pid)
142 {
143     std::lock_guard<std::mutex> guard(startingPidsMutex_);
144     for (auto iter = startingPids_.begin(); iter != startingPids_.end(); iter++) {
145         if (*iter == pid) {
146             startingPids_.erase(iter);
147             return;
148         }
149     }
150     TAG_LOGW(AAFwkTag::ABILITYMGR, "%{public}d not found", pid);
151 }
152 
RecordPidKilling(pid_t pid,const std::string & reason)153 void UIAbilityLifecycleManager::RecordPidKilling(pid_t pid, const std::string &reason)
154 {
155     std::lock_guard<ffrt::mutex> guard(sessionLock_);
156     for (const auto& [first, second] : sessionAbilityMap_) {
157         if (second && pid == second->GetPid()) {
158             second->SetKillReason(reason);
159         }
160     }
161 }
162 
MarkStartingFlag(const AbilityRequest & abilityRequest)163 void UIAbilityLifecycleManager::MarkStartingFlag(const AbilityRequest &abilityRequest)
164 {
165     for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
166         if (iter->second == nullptr || iter->second->GetPid() <= 0 ||
167             iter->second->GetAbilityInfo().bundleName != abilityRequest.abilityInfo.bundleName) {
168             continue;
169         }
170         AddStartingPid(iter->second->GetPid());
171     }
172 }
173 
StartUIAbility(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,uint32_t sceneFlag,bool & isColdStart)174 int UIAbilityLifecycleManager::StartUIAbility(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
175     uint32_t sceneFlag, bool &isColdStart)
176 {
177     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
178     std::lock_guard<ffrt::mutex> guard(sessionLock_);
179     if (!CheckSessionInfo(sessionInfo)) {
180         TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo invalid");
181         return ERR_INVALID_VALUE;
182     }
183     auto isCallBySCB = sessionInfo->want.GetBoolParam(ServerConstant::IS_CALL_BY_SCB, true);
184     sessionInfo->want.RemoveParam(ServerConstant::IS_CALL_BY_SCB);
185     TAG_LOGI(AAFwkTag::ABILITYMGR, "StartUIAbility session:%{public}d. bundle:%{public}s, ability:%{public}s, "
186         "instanceKey:%{public}s, requestId: %{public}d, isCallBySCB: %{public}d", sessionInfo->persistentId,
187         abilityRequest.abilityInfo.bundleName.c_str(), abilityRequest.abilityInfo.name.c_str(),
188         sessionInfo->instanceKey.c_str(), sessionInfo->requestId, isCallBySCB);
189     RemoveAbilityRequest(sessionInfo->requestId);
190     abilityRequest.sessionInfo = sessionInfo;
191     auto uiAbilityRecord = GenerateAbilityRecord(abilityRequest, sessionInfo, isColdStart);
192     CHECK_POINTER_AND_RETURN(uiAbilityRecord, ERR_INVALID_VALUE);
193     MarkStartingFlag(abilityRequest);
194     auto want = uiAbilityRecord->GetWant();
195     if (want.GetBoolParam(IS_CALLING_FROM_DMS, false) && !(sessionInfo->isNewWant)) {
196         want.RemoveParam(IS_CALLING_FROM_DMS);
197         uiAbilityRecord->SetWant(want);
198     }
199     TAG_LOGD(AAFwkTag::ABILITYMGR, "StartUIAbility");
200     uiAbilityRecord->SetSpecifyTokenId(abilityRequest.specifyTokenId);
201     UpdateAbilityRecordLaunchReason(abilityRequest, uiAbilityRecord);
202     NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest);
203     if (HandleStartSpecifiedCold(abilityRequest, sessionInfo, sceneFlag)) {
204         AddCallerRecord(abilityRequest, sessionInfo, uiAbilityRecord);
205         uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
206         return ERR_OK;
207     }
208 
209     if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) {
210         TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped");
211         uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
212         return ERR_OK;
213     } else {
214         TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is not FOREGROUND or BACKGROUND.");
215         uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
216     }
217 
218     if (!uiAbilityRecord->IsReady() || sessionInfo->isNewWant) {
219         AddCallerRecord(abilityRequest, sessionInfo, uiAbilityRecord);
220     }
221     auto isShellCall = abilityRequest.want.GetBoolParam(IS_SHELL_CALL, false);
222     uint32_t callerTokenId = static_cast<uint32_t>(abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0));
223     uiAbilityRecord->ProcessForegroundAbility(callerTokenId, sceneFlag, isShellCall);
224     CheckSpecified(sessionInfo->requestId, uiAbilityRecord);
225     SendKeyEvent(abilityRequest);
226     return ERR_OK;
227 }
228 
GenerateAbilityRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,bool & isColdStart)229 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GenerateAbilityRecord(AbilityRequest &abilityRequest,
230     sptr<SessionInfo> sessionInfo, bool &isColdStart)
231 {
232     std::shared_ptr<AbilityRecord> uiAbilityRecord = nullptr;
233     auto iter = sessionAbilityMap_.find(sessionInfo->persistentId);
234     bool isLowMemKill = (iter != sessionAbilityMap_.end()) &&
235         (iter->second != nullptr) && (iter->second->GetKillReason() == GlobalConstant::LOW_MEMORY_KILL);
236     if (iter == sessionAbilityMap_.end() || isLowMemKill) {
237         uiAbilityRecord = FindRecordFromTmpMap(abilityRequest);
238         if (uiAbilityRecord == nullptr) {
239             uiAbilityRecord = CreateAbilityRecord(abilityRequest, sessionInfo);
240         }
241         isColdStart = true;
242         UpdateProcessName(abilityRequest, uiAbilityRecord);
243         if (isSCBRecovery_) {
244             coldStartInSCBRecovery_.insert(sessionInfo->persistentId);
245         }
246         auto abilityInfo = abilityRequest.abilityInfo;
247         if (abilityInfo.applicationInfo.multiAppMode.multiAppModeType == AppExecFwk::MultiAppModeType::MULTI_INSTANCE &&
248             abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
249             auto appMgr = AppMgrUtil::GetAppMgr();
250             if (appMgr == nullptr) {
251                 TAG_LOGW(AAFwkTag::ABILITYMGR, "AppMgrUtil::GetAppMgr failed");
252                 return uiAbilityRecord;
253             }
254             IN_PROCESS_CALL_WITHOUT_RET(
255                 appMgr->UpdateInstanceKeyBySpecifiedId(sessionInfo->requestId, sessionInfo->instanceKey));
256         }
257         MoreAbilityNumbersSendEventInfo(
258             abilityRequest.userId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
259         if (isLowMemKill) {
260             TAG_LOGI(AAFwkTag::ABILITYMGR, "killed by low-mem, created a new record, "
261                 "replacing old record id=%{public}s, new record id=%{public}s",
262                 std::to_string(sessionAbilityMap_[sessionInfo->persistentId]->GetAbilityRecordId()).c_str(),
263                 std::to_string(uiAbilityRecord->GetAbilityRecordId()).c_str());
264             lowMemKillAbilityMap_.emplace(sessionInfo->persistentId, sessionAbilityMap_[sessionInfo->persistentId]);
265             sessionAbilityMap_[sessionInfo->persistentId] = uiAbilityRecord;
266         } else {
267             sessionAbilityMap_.emplace(sessionInfo->persistentId, uiAbilityRecord);
268         }
269     } else {
270         TAG_LOGI(AAFwkTag::ABILITYMGR, "NewWant:%{public}d", sessionInfo->isNewWant);
271         uiAbilityRecord = iter->second;
272         if (uiAbilityRecord == nullptr || uiAbilityRecord->GetSessionInfo() == nullptr) {
273             TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord invalid");
274             return nullptr;
275         }
276         if (sessionInfo->sessionToken != uiAbilityRecord->GetSessionInfo()->sessionToken) {
277             TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionToken invalid");
278             return nullptr;
279         }
280         abilityRequest.want.RemoveParam(Want::PARAMS_REAL_CALLER_KEY);
281         uiAbilityRecord->SetIsNewWant(sessionInfo->isNewWant);
282         if (sessionInfo->isNewWant) {
283             uiAbilityRecord->SetWant(abilityRequest.want);
284             uiAbilityRecord->GetSessionInfo()->want.RemoveAllFd();
285         } else {
286             sessionInfo->want.CloseAllFd();
287         }
288     }
289     return uiAbilityRecord;
290 }
291 
FindRecordFromTmpMap(const AbilityRequest & abilityRequest)292 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::FindRecordFromTmpMap(
293     const AbilityRequest &abilityRequest)
294 {
295     int32_t appIndex = 0;
296     (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex);
297     auto instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
298     for (const auto &[recordId, abilityRecord] : tmpAbilityMap_) {
299         if (abilityRecord) {
300             const auto &info = abilityRecord->GetAbilityInfo();
301             if (info.name == abilityRequest.abilityInfo.name &&
302                 info.bundleName == abilityRequest.abilityInfo.bundleName &&
303                 info.moduleName == abilityRequest.abilityInfo.moduleName &&
304                 appIndex == abilityRecord->GetAppIndex() && instanceKey == abilityRecord->GetInstanceKey()) {
305                 return abilityRecord;
306             }
307         }
308     }
309     return nullptr;
310 }
311 
CheckSessionInfo(sptr<SessionInfo> sessionInfo) const312 bool UIAbilityLifecycleManager::CheckSessionInfo(sptr<SessionInfo> sessionInfo) const
313 {
314     if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) {
315         TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo invalid");
316         return false;
317     }
318     auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
319     CHECK_POINTER_AND_RETURN(sessionToken, false);
320     auto descriptor = Str16ToStr8(sessionToken->GetDescriptor());
321     if (descriptor != "OHOS.ISession") {
322         TAG_LOGE(AAFwkTag::ABILITYMGR, "token's Descriptor: %{public}s", descriptor.c_str());
323         return false;
324     }
325     std::string callerKey = sessionInfo->want.GetStringParam(Want::PARAMS_REAL_CALLER_KEY);
326     bool isCallerKilling = IN_PROCESS_CALL(DelayedSingleton<AppScheduler>::GetInstance()->IsCallerKilling(callerKey));
327     if (isCallerKilling) {
328         TAG_LOGE(AAFwkTag::ABILITYMGR, "caller is killing");
329         return false;
330     }
331     return true;
332 }
333 
CreateAbilityRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo) const334 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::CreateAbilityRecord(AbilityRequest &abilityRequest,
335     sptr<SessionInfo> sessionInfo) const
336 {
337     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
338     TAG_LOGD(AAFwkTag::ABILITYMGR, "Create ability record.");
339     if (sessionInfo->startSetting != nullptr) {
340         TAG_LOGD(AAFwkTag::ABILITYMGR, "startSetting is valid.");
341         abilityRequest.startSetting = sessionInfo->startSetting;
342     }
343     auto uiAbilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
344     if (uiAbilityRecord == nullptr) {
345         TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord invalid");
346         return nullptr;
347     }
348     TAG_LOGD(AAFwkTag::ABILITYMGR, "user id: %{public}d.", userId_);
349     uiAbilityRecord->SetOwnerMissionUserId(userId_);
350     SetReceiverInfo(abilityRequest, uiAbilityRecord);
351     return uiAbilityRecord;
352 }
353 
AddCallerRecord(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,std::shared_ptr<AbilityRecord> uiAbilityRecord) const354 void UIAbilityLifecycleManager::AddCallerRecord(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
355     std::shared_ptr<AbilityRecord> uiAbilityRecord) const
356 {
357     if (sessionInfo == nullptr) {
358         TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo invalid");
359         return;
360     }
361     CHECK_POINTER(uiAbilityRecord);
362     std::string srcAbilityId = "";
363     if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) {
364         std::string srcDeviceId = abilityRequest.want.GetStringParam(DMS_SRC_NETWORK_ID);
365         int missionId = abilityRequest.want.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID);
366         TAG_LOGD(AAFwkTag::ABILITYMGR, "Get srcNetWorkId = %{public}s, missionId = %{public}d", srcDeviceId.c_str(),
367             missionId);
368         Want *newWant = const_cast<Want*>(&abilityRequest.want);
369         newWant->RemoveParam(DMS_SRC_NETWORK_ID);
370         newWant->RemoveParam(DMS_MISSION_ID);
371         newWant->RemoveParam(Want::PARAM_RESV_FOR_RESULT);
372         srcAbilityId = srcDeviceId + "_" + std::to_string(missionId);
373     }
374     uiAbilityRecord->AddCallerRecord(sessionInfo->callerToken,
375         sessionInfo->requestCode, abilityRequest.want, srcAbilityId, sessionInfo->callingTokenId);
376 }
377 
CheckSpecified(int32_t requestId,std::shared_ptr<AbilityRecord> uiAbilityRecord)378 void UIAbilityLifecycleManager::CheckSpecified(int32_t requestId, std::shared_ptr<AbilityRecord> uiAbilityRecord)
379 {
380     auto iter = specifiedFlagMap_.find(requestId);
381     if (iter != specifiedFlagMap_.end()) {
382         UpdateSpecifiedFlag(uiAbilityRecord, iter->second);
383         uiAbilityRecord->SetSpecifiedFlag(iter->second);
384         specifiedFlagMap_.erase(iter);
385     }
386 }
387 
SendKeyEvent(const AbilityRequest & abilityRequest) const388 void UIAbilityLifecycleManager::SendKeyEvent(const AbilityRequest &abilityRequest) const
389 {
390     if (abilityRequest.abilityInfo.visible == false) {
391         EventInfo eventInfo;
392         eventInfo.abilityName = abilityRequest.abilityInfo.name;
393         eventInfo.bundleName = abilityRequest.abilityInfo.bundleName;
394         eventInfo.moduleName = abilityRequest.abilityInfo.moduleName;
395         EventReport::SendKeyEvent(EventName::START_PRIVATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
396     }
397 }
398 
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)399 int UIAbilityLifecycleManager::AttachAbilityThread(const sptr<IAbilityScheduler> &scheduler,
400     const sptr<IRemoteObject> &token)
401 {
402     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
403     if (!IsContainsAbility(token)) {
404         TAG_LOGW(AAFwkTag::ABILITYMGR, "Not in running list");
405         return ERR_INVALID_VALUE;
406     }
407     auto&& abilityRecord = Token::GetAbilityRecordByToken(token);
408     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
409     abilityRecord->SetPid(IPCSkeleton::GetCallingPid());
410     int32_t processAttachResult = DoProcessAttachment(abilityRecord);
411 
412     std::lock_guard<ffrt::mutex> guard(sessionLock_);
413     TAG_LOGI(AAFwkTag::ABILITYMGR, "lifecycle name: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
414     SetLastExitReason(abilityRecord);
415 
416     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
417     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
418     abilityRecord->RemoveLoadTimeoutTask();
419     abilityRecord->SetLoading(false);
420     FreezeUtil::GetInstance().DeleteLifecycleEvent(token);
421 
422     abilityRecord->SetScheduler(scheduler);
423     if (DoProcessAttachment(abilityRecord) != ERR_OK) {
424         TAG_LOGE(AAFwkTag::ABILITYMGR, "process attachment failed, close ability");
425         TerminateSession(abilityRecord);
426         return ERR_INVALID_VALUE;
427     }
428     if (abilityRecord->IsStartedByCall()) {
429         if (abilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
430             abilityRecord->SetStartToForeground(true);
431             abilityRecord->PostForegroundTimeoutTask();
432             abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING);
433             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
434         } else {
435             abilityRecord->SetStartToBackground(true);
436             MoveToBackground(abilityRecord);
437         }
438         return ERR_OK;
439     }
440     if (abilityRecord->IsNeedToCallRequest()) {
441         abilityRecord->CallRequest();
442     }
443     abilityRecord->PostForegroundTimeoutTask();
444     abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING);
445     DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
446     return ERR_OK;
447 }
448 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,int32_t state)449 void UIAbilityLifecycleManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, int32_t state)
450 {
451     TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability request state %{public}d done.", state);
452     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
453     AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
454     if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
455         std::lock_guard<ffrt::mutex> guard(sessionLock_);
456         auto abilityRecord = GetAbilityRecordByToken(token);
457         CHECK_POINTER(abilityRecord);
458         if (abilityRecord->IsTerminating()) {
459             TAG_LOGI(AAFwkTag::ABILITYMGR, "ability on terminating");
460             auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
461             CHECK_POINTER(handler);
462             abilityRecord->RemoveForegroundTimeoutTask();
463             DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
464             abilityRecord->SetPendingState(AbilityState::INITIAL);
465             CompleteTerminateLocked(abilityRecord);
466             return;
467         }
468         std::string element = abilityRecord->GetElementName().GetURI();
469         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is %{public}s, start to foreground.", element.c_str());
470         abilityRecord->ForegroundAbility(abilityRecord->lifeCycleStateInfo_.sceneFlagBak);
471     }
472 }
473 
AbilityTransactionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)474 int UIAbilityLifecycleManager::AbilityTransactionDone(const sptr<IRemoteObject> &token, int state,
475     const PacMap &saveData)
476 {
477     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
478     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
479     std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
480     TAG_LOGD(AAFwkTag::ABILITYMGR, "AbilityTransactionDone, state: %{public}s.", abilityState.c_str());
481 
482     std::lock_guard<ffrt::mutex> guard(sessionLock_);
483     auto abilityRecord = GetAbilityRecordByToken(token);
484     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
485     abilityRecord->RemoveSignatureInfo();
486     std::string element = abilityRecord->GetElementName().GetURI();
487     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
488 
489     if (targetState == AbilityState::BACKGROUND) {
490         abilityRecord->SaveAbilityState(saveData);
491     }
492 
493     return DispatchState(abilityRecord, targetState);
494 }
495 
AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> & token,const WindowConfig & windowConfig)496 int UIAbilityLifecycleManager::AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> &token,
497     const WindowConfig &windowConfig)
498 {
499     std::lock_guard<ffrt::mutex> guard(sessionLock_);
500     auto abilityRecord = GetAbilityRecordByToken(token);
501     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
502     abilityRecord->SaveAbilityWindowConfig(windowConfig);
503     return ERR_OK;
504 }
505 
AddStartCallerTimestamp(int32_t callerUid)506 bool UIAbilityLifecycleManager::AddStartCallerTimestamp(int32_t callerUid)
507 {
508     int64_t curTimeNs = AbilityUtil::GetSysTimeNs();
509     int64_t aSecondEarlier = curTimeNs - AbilityUtil::NANOSECONDS;
510     if (callerUid < 0) {
511         callerUid = IPCSkeleton::GetCallingUid();
512     }
513     std::lock_guard<ffrt::mutex> guard(startUIAbilityCallerTimestampsLock_);
514     if (startUIAbilityCallerTimestamps_.find(callerUid) == startUIAbilityCallerTimestamps_.end()) {
515         startUIAbilityCallerTimestamps_[callerUid] = { curTimeNs };
516         return true;
517     }
518     std::vector<int64_t> &callerTimestamps = startUIAbilityCallerTimestamps_[callerUid];
519     auto it = callerTimestamps.begin();
520     while (it != callerTimestamps.end() && *it < aSecondEarlier) {
521         it = callerTimestamps.erase(it);
522     }
523     if (callerTimestamps.size() >= START_UI_ABILITY_PER_SECOND_UPPER_LIMIT) {
524         TAG_LOGE(AAFwkTag::ABILITYMGR, "caller %{public}d exceeds limit", callerUid);
525         return false;
526     }
527     callerTimestamps.emplace_back(curTimeNs);
528     return true;
529 }
530 
NotifySCBToStartUIAbility(AbilityRequest & abilityRequest)531 int UIAbilityLifecycleManager::NotifySCBToStartUIAbility(AbilityRequest &abilityRequest)
532 {
533     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
534     if (!AddStartCallerTimestamp(abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_UID, -1))) {
535         return ERR_INVALID_VALUE;
536     }
537     abilityRequest.want.SetParam(IS_SHELL_CALL, AAFwk::PermissionVerification::GetInstance()->IsShellCall());
538     std::string callerKey = std::to_string(IPCSkeleton::GetCallingPid()) + ":" +
539         std::to_string(IPCSkeleton::GetCallingUid());
540     bool isCallerKilling = IN_PROCESS_CALL(DelayedSingleton<AppScheduler>::GetInstance()->IsCallerKilling(callerKey));
541     if (isCallerKilling) {
542         TAG_LOGE(AAFwkTag::ABILITYMGR, "caller is killing");
543         return ERR_INVALID_VALUE;
544     }
545     abilityRequest.want.SetParam(Want::PARAMS_REAL_CALLER_KEY, callerKey);
546     std::lock_guard<ffrt::mutex> guard(sessionLock_);
547     // start ability with persistentId by dms
548     int32_t persistentId = abilityRequest.want.GetIntParam(DMS_PERSISTENT_ID, 0);
549     TAG_LOGD(AAFwkTag::ABILITYMGR, "NotifySCBToStartUIAbility, want with persistentId: %{public}d.", persistentId);
550     if (persistentId != 0 &&
551         AAFwk::PermissionVerification::GetInstance()->CheckSpecificSystemAbilityAccessPermission(DMS_PROCESS_NAME)) {
552         return StartWithPersistentIdByDistributed(abilityRequest, persistentId);
553     }
554 
555     const auto &abilityInfo = abilityRequest.abilityInfo;
556     bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel);
557     auto requestId = GetRequestId();
558     // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'.
559     bool isNewProcessMode = abilityRequest.processOptions &&
560         ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode);
561     if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess()
562         && isUIAbility) {
563         TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess");
564         auto specifiedRequest = std::make_shared<SpecifiedRequest>(requestId, abilityRequest);
565         specifiedRequest->specifiedProcessState = SpecifiedProcessState::STATE_PROCESS;
566         AddSpecifiedRequest(specifiedRequest);
567         return ERR_OK;
568     }
569     auto isSpecified = (abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED);
570     if (isSpecified) {
571         auto specifiedRequest = std::make_shared<SpecifiedRequest>(requestId, abilityRequest);
572         specifiedRequest->preCreateProcessName = true;
573         AddSpecifiedRequest(specifiedRequest);
574         return ERR_OK;
575     }
576 
577     auto sessionInfo = CreateSessionInfo(abilityRequest);
578     sessionInfo->requestCode = abilityRequest.requestCode;
579     sessionInfo->requestId = requestId;
580     auto isCreating = abilityRequest.want.GetBoolParam(Want::CREATE_APP_INSTANCE_KEY, false);
581     if (abilityInfo.applicationInfo.multiAppMode.multiAppModeType != AppExecFwk::MultiAppModeType::MULTI_INSTANCE ||
582         !isCreating) {
583         sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse);
584     }
585     sessionInfo->userId = userId_;
586     sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
587     TAG_LOGI(AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d, requestId: %{public}d",
588         sessionInfo->persistentId, userId_, requestId);
589     int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest);
590     sessionInfo->want.RemoveAllFd();
591     return ret;
592 }
593 
NotifySCBToRecoveryAfterInterception(const AbilityRequest & abilityRequest)594 int32_t UIAbilityLifecycleManager::NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest)
595 {
596     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
597     std::lock_guard<ffrt::mutex> guard(sessionLock_);
598     const auto &abilityInfo = abilityRequest.abilityInfo;
599     bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel);
600     // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'.
601     bool isNewProcessMode = abilityRequest.processOptions &&
602         ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode);
603     if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess()
604         && isUIAbility) {
605         TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess");
606         auto specifiedRequest = std::make_shared<SpecifiedRequest>(GetRequestId(), abilityRequest);
607         specifiedRequest->specifiedProcessState = SpecifiedProcessState::STATE_PROCESS;
608         AddSpecifiedRequest(specifiedRequest);
609         return ERR_OK;
610     }
611     auto isSpecified = (abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED);
612     if (isSpecified) {
613         auto specifiedRequest = std::make_shared<SpecifiedRequest>(GetRequestId(), abilityRequest);
614         specifiedRequest->preCreateProcessName = true;
615         AddSpecifiedRequest(specifiedRequest);
616         return ERR_OK;
617     }
618     auto sessionInfo = CreateSessionInfo(abilityRequest);
619     sessionInfo->requestCode = abilityRequest.requestCode;
620     sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse);
621     sessionInfo->userId = userId_;
622     sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
623     sessionInfo->want.SetParam("ohos.ability.params.isSkipErmsFromSCB", true);
624     TAG_LOGI(
625         AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, userId_);
626     int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest);
627     sessionInfo->want.CloseAllFd();
628     return ret;
629 }
630 
NotifySCBToPreStartUIAbility(const AbilityRequest & abilityRequest,sptr<SessionInfo> & sessionInfo)631 int UIAbilityLifecycleManager::NotifySCBToPreStartUIAbility(const AbilityRequest &abilityRequest,
632     sptr<SessionInfo> &sessionInfo)
633 {
634     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
635 
636     std::lock_guard<ffrt::mutex> guard(sessionLock_);
637     sessionInfo = CreateSessionInfo(abilityRequest);
638     sessionInfo->requestCode = abilityRequest.requestCode;
639     sessionInfo->isAtomicService = true;
640     return NotifySCBPendingActivation(sessionInfo, abilityRequest);
641 }
642 
DispatchState(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)643 int UIAbilityLifecycleManager::DispatchState(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
644 {
645     switch (state) {
646         case AbilityState::INITIAL: {
647             return DispatchTerminate(abilityRecord);
648         }
649         case AbilityState::BACKGROUND:
650         case AbilityState::BACKGROUND_FAILED: {
651             return DispatchBackground(abilityRecord);
652         }
653         case AbilityState::FOREGROUND: {
654             return DispatchForeground(abilityRecord, true);
655         }
656         case AbilityState::FOREGROUND_FAILED:
657         case AbilityState::FOREGROUND_INVALID_MODE:
658         case AbilityState::FOREGROUND_WINDOW_FREEZED: {
659             return DispatchForeground(abilityRecord, false, static_cast<AbilityState>(state));
660         }
661         default: {
662             TAG_LOGW(AAFwkTag::ABILITYMGR, "no support transiting state: %{public}d", state);
663             return ERR_INVALID_VALUE;
664         }
665     }
666 }
667 
DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord,bool success,AbilityState state)668 int UIAbilityLifecycleManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord, bool success,
669     AbilityState state)
670 {
671     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
672     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
673     auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
674     CHECK_POINTER_AND_RETURN_LOG(taskHandler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
675     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
676 
677     RemoveStartingPid(abilityRecord->GetPid());
678 
679     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
680         TAG_LOGE(AAFwkTag::ABILITYMGR,
681             "dispatchForeground ability transition error, expect %{public}d, actual %{public}d",
682             AbilityState::FOREGROUNDING, abilityRecord->GetAbilityState());
683         return ERR_INVALID_VALUE;
684     }
685 
686     TAG_LOGD(AAFwkTag::ABILITYMGR, "ForegroundLifecycle: end.");
687     abilityRecord->RemoveForegroundTimeoutTask();
688     g_deleteLifecycleEventTask(abilityRecord->GetToken());
689     FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid());
690     auto self(weak_from_this());
691     if (success) {
692         TAG_LOGD(AAFwkTag::ABILITYMGR, "foreground succeeded.");
693         auto task = [self, abilityRecord]() {
694             auto selfObj = self.lock();
695             if (!selfObj) {
696                 TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr invalid");
697                 return;
698             }
699             selfObj->CompleteForegroundSuccess(abilityRecord);
700         };
701         taskHandler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
702     } else {
703         auto task = [self, abilityRecord, state]() {
704             auto selfObj = self.lock();
705             if (!selfObj) {
706                 TAG_LOGW(AAFwkTag::ABILITYMGR, "mission list mgr invalid");
707                 return;
708             }
709             if (state == AbilityState::FOREGROUND_WINDOW_FREEZED) {
710                 TAG_LOGI(AAFwkTag::ABILITYMGR, "window freezed");
711                 if (abilityRecord != nullptr) {
712                     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
713                     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
714                 }
715                 return;
716             }
717             selfObj->HandleForegroundFailed(abilityRecord, state);
718         };
719         taskHandler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
720     }
721     return ERR_OK;
722 }
723 
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)724 int UIAbilityLifecycleManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
725 {
726     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
727     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
728     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
729 
730     if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
731         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability transition error, actual %{public}d",
732             abilityRecord->GetAbilityState());
733         return ERR_INVALID_VALUE;
734     }
735 
736     TAG_LOGD(AAFwkTag::ABILITYMGR, "end.");
737     // remove background timeout task.
738     handler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
739     g_deleteLifecycleEventTask(abilityRecord->GetToken());
740     FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid());
741     auto self(shared_from_this());
742     auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
743     handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
744 
745     return ERR_OK;
746 }
747 
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)748 int UIAbilityLifecycleManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
749 {
750     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
751     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
752         TAG_LOGE(AAFwkTag::ABILITYMGR, "error, abilityState: %{public}d",
753             abilityRecord->GetAbilityState());
754         return INNER_ERR;
755     }
756 
757     // remove terminate timeout task.
758     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
759     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
760     handler->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
761     auto self(shared_from_this());
762     auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); };
763     handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
764 
765     return ERR_OK;
766 }
767 
CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)768 void UIAbilityLifecycleManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord)
769 {
770     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
771     std::lock_guard<ffrt::mutex> guard(sessionLock_);
772 
773     CHECK_POINTER(abilityRecord);
774     // ability do not save window mode
775     abilityRecord->RemoveWindowMode();
776     std::string element = abilityRecord->GetElementName().GetURI();
777     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s", element.c_str());
778     abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
779     abilityRecord->UpdateAbilityVisibilityState();
780 
781     // new version. started by caller, scheduler call request
782     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) {
783         TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing foreground state");
784         abilityRecord->CallRequest();
785         abilityRecord->SetStartToForeground(false);
786     }
787 
788     if (abilityRecord->IsNewWant()) {
789         TAG_LOGD(AAFwkTag::ABILITYMGR, "has new want");
790         abilityRecord->ForegroundAbility();
791     } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
792         abilityRecord->SetMinimizeReason(true);
793         MoveToBackground(abilityRecord);
794     } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
795         TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup.");
796         abilityRecord->SetPendingState(AbilityState::INITIAL);
797     }
798     if (handler_ != nullptr && abilityRecord->GetSessionInfo() != nullptr) {
799         TAG_LOGD(AAFwkTag::ABILITYMGR, "OnSessionMovedToFront() called");
800         handler_->OnSessionMovedToFront(abilityRecord->GetSessionInfo()->persistentId);
801     }
802 }
803 
HandleForegroundFailed(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)804 void UIAbilityLifecycleManager::HandleForegroundFailed(const std::shared_ptr<AbilityRecord> &ability,
805     AbilityState state)
806 {
807     TAG_LOGD(AAFwkTag::ABILITYMGR, "state: %{public}d.", static_cast<int32_t>(state));
808     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
809     std::lock_guard<ffrt::mutex> guard(sessionLock_);
810     if (ability == nullptr) {
811         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
812         return;
813     }
814 
815     if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) {
816         TAG_LOGE(AAFwkTag::ABILITYMGR, "not foregrounding");
817         return;
818     }
819 
820     NotifySCBToHandleException(ability,
821         static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleForegroundTimeout");
822     PrepareCloseUIAbility(ability, 0, nullptr, false);
823     CloseUIAbilityInner(ability);
824 }
825 
GetAbilityRecordByToken(const sptr<IRemoteObject> & token) const826 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
827     const
828 {
829     if (token == nullptr) {
830         TAG_LOGE(AAFwkTag::ABILITYMGR, "null");
831         return nullptr;
832     }
833 
834     for (auto ability : terminateAbilityList_) {
835         if (ability && token == ability->GetToken()->AsObject()) {
836             return ability;
837         }
838     }
839 
840     for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
841         if (iter->second != nullptr && iter->second->GetToken()->AsObject() == token) {
842             return iter->second;
843         }
844     }
845     return nullptr;
846 }
847 
848 #ifdef SUPPORT_SCREEN
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & token)849 void UIAbilityLifecycleManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &token)
850 {
851     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
852     if (token == nullptr) {
853         TAG_LOGE(AAFwkTag::ABILITYMGR, "null");
854         return;
855     }
856     std::lock_guard<ffrt::mutex> guard(sessionLock_);
857     if (!IsContainsAbilityInner(token)) {
858         TAG_LOGW(AAFwkTag::ABILITYMGR, "Not in running list");
859         return;
860     }
861     auto abilityRecord = GetAbilityRecordByToken(token);
862     CHECK_POINTER(abilityRecord);
863     if (abilityRecord->IsCompleteFirstFrameDrawing()) {
864         TAG_LOGD(AAFwkTag::ABILITYMGR, "First frame drawing has completed.");
865         return;
866     }
867     abilityRecord->ReportAtomicServiceDrawnCompleteEvent();
868     abilityRecord->SetCompleteFirstFrameDrawing(true);
869     AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance().
870         HandleOnFirstFrameState(abilityRecord);
871 }
872 #endif
873 
IsContainsAbility(const sptr<IRemoteObject> & token) const874 bool UIAbilityLifecycleManager::IsContainsAbility(const sptr<IRemoteObject> &token) const
875 {
876     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
877     std::lock_guard<ffrt::mutex> guard(sessionLock_);
878     return IsContainsAbilityInner(token);
879 }
880 
IsContainsAbilityInner(const sptr<IRemoteObject> & token) const881 bool UIAbilityLifecycleManager::IsContainsAbilityInner(const sptr<IRemoteObject> &token) const
882 {
883     for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
884         if (iter->second != nullptr && iter->second->GetToken()->AsObject() == token) {
885             return true;
886         }
887     }
888     return false;
889 }
890 
EraseAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)891 void UIAbilityLifecycleManager::EraseAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
892 {
893     if (abilityRecord == nullptr) {
894         return;
895     }
896 
897     for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
898         if (iter->second != nullptr && iter->second->GetToken()->AsObject() == abilityRecord->GetToken()->AsObject()) {
899             sessionAbilityMap_.erase(iter);
900             AbilityRecordDeathManager::GetInstance().AddRecordToDeadList(abilityRecord);
901             break;
902         }
903     }
904     for (auto iter = lowMemKillAbilityMap_.begin(); iter != lowMemKillAbilityMap_.end(); iter++) {
905         if (iter->second != nullptr && iter->second->GetToken()->AsObject() == abilityRecord->GetToken()->AsObject()) {
906             lowMemKillAbilityMap_.erase(iter);
907             AbilityRecordDeathManager::GetInstance().AddRecordToDeadList(abilityRecord);
908             break;
909         }
910     }
911     callRequestCache_.erase(abilityRecord);
912 }
913 
GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo & abilityInfo)914 std::string UIAbilityLifecycleManager::GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo& abilityInfo)
915 {
916     static uint32_t index = 0;
917     std::string processName = abilityInfo.bundleName + SEPARATOR + abilityInfo.moduleName + SEPARATOR +
918         abilityInfo.name + SEPARATOR + std::to_string(index++);
919     TAG_LOGI(AAFwkTag::ABILITYMGR, "processName: %{public}s", processName.c_str());
920     return processName;
921 }
922 
PreCreateProcessName(AbilityRequest & abilityRequest)923 void UIAbilityLifecycleManager::PreCreateProcessName(AbilityRequest &abilityRequest)
924 {
925     if (abilityRequest.processOptions == nullptr ||
926         !ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode)) {
927         TAG_LOGD(AAFwkTag::ABILITYMGR, "No need to pre create process name.");
928         return;
929     }
930     TAG_LOGI(AAFwkTag::ABILITYMGR, "create process name in advance");
931     std::string processName = GenerateProcessNameForNewProcessMode(abilityRequest.abilityInfo);
932     abilityRequest.processOptions->processName = processName;
933     abilityRequest.abilityInfo.process = processName;
934 }
935 
UpdateProcessName(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord)936 void UIAbilityLifecycleManager::UpdateProcessName(const AbilityRequest &abilityRequest,
937     std::shared_ptr<AbilityRecord> &abilityRecord)
938 {
939     if (abilityRecord == nullptr || abilityRequest.sessionInfo == nullptr ||
940         abilityRequest.sessionInfo->processOptions == nullptr ||
941         !ProcessOptions::IsNewProcessMode(abilityRequest.sessionInfo->processOptions->processMode)) {
942         TAG_LOGD(AAFwkTag::ABILITYMGR, "No need to update process name.");
943         return;
944     }
945     std::string processName;
946     if (!abilityRequest.sessionInfo->processOptions->processName.empty()) {
947         TAG_LOGD(AAFwkTag::ABILITYMGR, "The process name has been generated in advance.");
948         processName = abilityRequest.sessionInfo->processOptions->processName;
949     } else {
950         processName = GenerateProcessNameForNewProcessMode(abilityRequest.abilityInfo);
951     }
952     abilityRecord->SetProcessName(processName);
953     abilityRecord->SetCallerSetProcess(true);
954 }
955 
UpdateAbilityRecordLaunchReason(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord) const956 void UIAbilityLifecycleManager::UpdateAbilityRecordLaunchReason(
957     const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &abilityRecord) const
958 {
959     if (abilityRecord == nullptr) {
960         TAG_LOGW(AAFwkTag::ABILITYMGR, "null input record");
961         return;
962     }
963 
964     std::string value = abilityRequest.want.GetStringParam(Want::PARM_LAUNCH_REASON_MESSAGE);
965     if (!value.empty()) {
966         TAG_LOGD(AAFwkTag::ABILITYMGR, "set launchReasonMessage:%{public}s", value.c_str());
967         abilityRecord->SetLaunchReasonMessage(value);
968     }
969     if (abilityRequest.IsAppRecovery() || abilityRecord->GetRecoveryInfo()) {
970         abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
971         return;
972     }
973 
974     auto res = abilityRequest.IsContinuation();
975     if (res.first) {
976         abilityRecord->SetLaunchReason(res.second);
977         return;
978     }
979 
980     if (abilityRequest.IsAcquireShareData()) {
981         abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_SHARE);
982         return;
983     }
984 
985     abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
986     return;
987 }
988 
GetUIAbilityRecordBySessionInfo(const sptr<SessionInfo> & sessionInfo)989 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetUIAbilityRecordBySessionInfo(
990     const sptr<SessionInfo> &sessionInfo)
991 {
992     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
993     std::lock_guard<ffrt::mutex> guard(sessionLock_);
994     CHECK_POINTER_AND_RETURN(sessionInfo, nullptr);
995     CHECK_POINTER_AND_RETURN(sessionInfo->sessionToken, nullptr);
996     auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
997     CHECK_POINTER_AND_RETURN(sessionToken, nullptr);
998     std::string descriptor = Str16ToStr8(sessionToken->GetDescriptor());
999     if (descriptor != "OHOS.ISession") {
1000         TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, descriptor: %{public}s",
1001             descriptor.c_str());
1002         return nullptr;
1003     }
1004 
1005     auto iter = sessionAbilityMap_.find(sessionInfo->persistentId);
1006     if (iter != sessionAbilityMap_.end()) {
1007         return iter->second;
1008     }
1009     return nullptr;
1010 }
1011 
NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token)1012 int32_t UIAbilityLifecycleManager::NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token)
1013 {
1014     TAG_LOGI(AAFwkTag::ABILITYMGR, "notifySCBToMinimizeUIAbility");
1015     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1016     auto sceneSessionManager = Rosen::SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
1017     CHECK_POINTER_AND_RETURN(sceneSessionManager, ERR_NULL_OBJECT);
1018     Rosen::WSError ret = sceneSessionManager->PendingSessionToBackgroundForDelegator(token);
1019     if (ret != Rosen::WSError::WS_OK) {
1020         TAG_LOGE(AAFwkTag::ABILITYMGR,
1021             "call error:%{public}d", ret);
1022     }
1023     return static_cast<int32_t>(ret);
1024 }
1025 
MinimizeUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool fromUser,uint32_t sceneFlag)1026 int UIAbilityLifecycleManager::MinimizeUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool fromUser,
1027     uint32_t sceneFlag)
1028 {
1029     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1030     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1031     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1032     if (abilityRecord == nullptr) {
1033         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1034         return ERR_INVALID_VALUE;
1035     }
1036     TAG_LOGI(AAFwkTag::ABILITYMGR, "infoName:%{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1037     abilityRecord->SetMinimizeReason(fromUser);
1038     abilityRecord->SetSceneFlag(sceneFlag);
1039     if (abilityRecord->GetPendingState() != AbilityState::INITIAL) {
1040         TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped");
1041         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1042         return ERR_OK;
1043     }
1044     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
1045         TAG_LOGE(AAFwkTag::ABILITYMGR, "not foreground: %{public}d",
1046             abilityRecord->GetAbilityState());
1047         return ERR_OK;
1048     }
1049     abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1050     MoveToBackground(abilityRecord);
1051     abilityRecord->SetSceneFlag(0);
1052     return ERR_OK;
1053 }
1054 
MoveToBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1055 void UIAbilityLifecycleManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1056 {
1057     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1058     if (abilityRecord == nullptr) {
1059         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1060         return;
1061     }
1062     abilityRecord->SetIsNewWant(false);
1063     auto self(weak_from_this());
1064     auto task = [abilityRecord, self]() {
1065         auto selfObj = self.lock();
1066         if (selfObj == nullptr) {
1067             TAG_LOGW(AAFwkTag::ABILITYMGR, "UIAbilityLifecycleManager invalid");
1068             return;
1069         }
1070         TAG_LOGE(AAFwkTag::ABILITYMGR, "move to background timeout");
1071         selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
1072         selfObj->CompleteBackground(abilityRecord);
1073     };
1074     abilityRecord->BackgroundAbility(task);
1075 }
1076 
ResolveLocked(const AbilityRequest & abilityRequest)1077 int UIAbilityLifecycleManager::ResolveLocked(const AbilityRequest &abilityRequest)
1078 {
1079     TAG_LOGI(AAFwkTag::ABILITYMGR, "ByCall, ability:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
1080 
1081     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
1082         TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, resolve ability_name:", __func__);
1083         return RESOLVE_CALL_ABILITY_INNER_ERR;
1084     }
1085 
1086     return CallAbilityLocked(abilityRequest);
1087 }
1088 
IsAbilityStarted(AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & targetRecord)1089 bool UIAbilityLifecycleManager::IsAbilityStarted(AbilityRequest &abilityRequest,
1090     std::shared_ptr<AbilityRecord> &targetRecord)
1091 {
1092     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1093     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1094     bool reuse = false;
1095     auto persistentId = GetPersistentIdByAbilityRequest(abilityRequest, reuse);
1096     if (persistentId == 0) {
1097         return false;
1098     }
1099     targetRecord = sessionAbilityMap_.at(persistentId);
1100     if (targetRecord && targetRecord->GetScheduler() != nullptr) {
1101         targetRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
1102         targetRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
1103         return true;
1104     }
1105 
1106     return false;
1107 }
1108 
CallAbilityLocked(const AbilityRequest & abilityRequest)1109 int UIAbilityLifecycleManager::CallAbilityLocked(const AbilityRequest &abilityRequest)
1110 {
1111     TAG_LOGD(AAFwkTag::ABILITYMGR, "CallAbilityLocked");
1112     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1113     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1114 
1115     // Get target uiAbility record.
1116     std::shared_ptr<AbilityRecord> uiAbilityRecord;
1117     bool reuse = false;
1118     auto persistentId = GetPersistentIdByAbilityRequest(abilityRequest, reuse);
1119     if (persistentId == 0) {
1120         uiAbilityRecord = FindRecordFromTmpMap(abilityRequest);
1121         if (uiAbilityRecord != nullptr) {
1122             TAG_LOGI(AAFwkTag::ABILITYMGR, "cache call request");
1123             callRequestCache_[uiAbilityRecord].push_back(abilityRequest);
1124             return ERR_OK;
1125         }
1126         uiAbilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
1127         uiAbilityRecord->SetOwnerMissionUserId(userId_);
1128         SetReceiverInfo(abilityRequest, uiAbilityRecord);
1129     } else {
1130         uiAbilityRecord = sessionAbilityMap_.at(persistentId);
1131     }
1132     uiAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
1133     uiAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
1134 
1135 #ifdef SUPPORT_UPMS
1136     if (InsightIntentExecuteParam::IsInsightIntentExecute(abilityRequest.want)) {
1137         uiAbilityRecord->GrantUriPermission();
1138     }
1139 #endif // SUPPORT_UPMS
1140 
1141     std::string value = abilityRequest.want.GetStringParam(Want::PARM_LAUNCH_REASON_MESSAGE);
1142     if (!value.empty()) {
1143         TAG_LOGD(AAFwkTag::ABILITYMGR, "set launchReasonMessage:%{public}s", value.c_str());
1144         uiAbilityRecord->SetLaunchReasonMessage(value);
1145     }
1146     NotifyAbilityToken(uiAbilityRecord->GetToken(), abilityRequest);
1147 
1148     // new version started by call type
1149     const auto& abilityInfo = abilityRequest.abilityInfo;
1150     auto ret = ResolveAbility(uiAbilityRecord, abilityRequest);
1151     if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ || (ret == ResolveResultType::OK_NO_REMOTE_OBJ &&
1152         persistentId != 0)) {
1153         TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability has been resolved: %{public}d", ret);
1154         if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
1155             TAG_LOGI(AAFwkTag::ABILITYMGR, "target ability needs to be switched to foreground.");
1156             auto sessionInfo = CreateSessionInfo(abilityRequest);
1157             if ((persistentId != 0) && abilityRequest.want.GetBoolParam(IS_CALLING_FROM_DMS, false)) {
1158                 HandleForegroundCollaborate(abilityRequest, uiAbilityRecord);
1159             }
1160             sessionInfo->persistentId = persistentId;
1161             sessionInfo->state = CallToState::FOREGROUND;
1162             sessionInfo->reuse = reuse;
1163             sessionInfo->uiAbilityId = uiAbilityRecord->GetAbilityRecordId();
1164             sessionInfo->isAtomicService =
1165                 (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
1166             if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) {
1167                 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped");
1168                 uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1169                 return NotifySCBPendingActivation(sessionInfo, abilityRequest);
1170             }
1171             uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1172             uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId);
1173             return NotifySCBPendingActivation(sessionInfo, abilityRequest);
1174         } else {
1175             if ((persistentId != 0) && abilityRequest.want.GetBoolParam(IS_CALLING_FROM_DMS, false)) {
1176                 uiAbilityRecord->ScheduleCollaborate(abilityRequest.want);
1177             }
1178         }
1179         return ERR_OK;
1180     } else if (ret == ResolveResultType::NG_INNER_ERROR) {
1181         TAG_LOGE(AAFwkTag::ABILITYMGR, "resolve failed, error: %{public}d", RESOLVE_CALL_ABILITY_INNER_ERR);
1182         return RESOLVE_CALL_ABILITY_INNER_ERR;
1183     }
1184 
1185     auto sessionInfo = CreateSessionInfo(abilityRequest);
1186     sessionInfo->persistentId = persistentId;
1187     sessionInfo->reuse = reuse;
1188     sessionInfo->uiAbilityId = uiAbilityRecord->GetAbilityRecordId();
1189     sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
1190     sessionInfo->requestId = GetRequestId();
1191     if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
1192         sessionInfo->state = CallToState::FOREGROUND;
1193     } else {
1194         sessionInfo->state = CallToState::BACKGROUND;
1195         sessionInfo->needClearInNotShowRecent = true;
1196     }
1197     TAG_LOGD(AAFwkTag::ABILITYMGR, "Notify scb's abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId);
1198     tmpAbilityMap_.emplace(sessionInfo->requestId, uiAbilityRecord);
1199     PostCallTimeoutTask(uiAbilityRecord);
1200     return NotifySCBPendingActivation(sessionInfo, abilityRequest);
1201 }
1202 
PostCallTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)1203 void UIAbilityLifecycleManager::PostCallTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)
1204 {
1205     CHECK_POINTER(abilityRecord);
1206     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1207     CHECK_POINTER(handler);
1208 
1209     std::weak_ptr<AbilityRecord> weakRecord(abilityRecord);
1210     auto timeoutTask = [self = shared_from_this(), weakRecord]() {
1211         auto abilityRecord = weakRecord.lock();
1212         if (!abilityRecord) {
1213             return;
1214         }
1215 
1216         std::lock_guard guard(self->sessionLock_);
1217         for (auto it = self->tmpAbilityMap_.begin(); it != self->tmpAbilityMap_.end(); ++it) {
1218             if (abilityRecord == it->second) {
1219                 TAG_LOGW(AAFwkTag::ABILITYMGR, "CallUIAbilityBySCB timeout: %{public}s",
1220                     abilityRecord->GetURI().c_str());
1221                 self->tmpAbilityMap_.erase(it);
1222                 self->callRequestCache_.erase(abilityRecord);
1223                 return;
1224             }
1225         }
1226     };
1227 
1228     int timeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() *
1229         GlobalConstant::COLDSTART_TIMEOUT_MULTIPLE;
1230     handler->SubmitTaskJust(timeoutTask, "CallTimeout", timeout);
1231 }
1232 
CallUIAbilityBySCB(const sptr<SessionInfo> & sessionInfo,bool & isColdStart)1233 void UIAbilityLifecycleManager::CallUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo, bool &isColdStart)
1234 {
1235     TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, CallUIAbilityBySCB");
1236     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1237     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1238     CHECK_POINTER_LOG(sessionInfo, "sessionInfo is invalid.");
1239     CHECK_POINTER_LOG(sessionInfo->sessionToken, "sessionToken is nullptr.");
1240     auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1241     CHECK_POINTER_LOG(sessionToken, "sessionToken is nullptr.");
1242     auto descriptor = Str16ToStr8(sessionToken->GetDescriptor());
1243     if (descriptor != "OHOS.ISession") {
1244         TAG_LOGE(AAFwkTag::ABILITYMGR, "token's Descriptor: %{public}s", descriptor.c_str());
1245         return;
1246     }
1247 
1248     TAG_LOGD(AAFwkTag::ABILITYMGR, "SCB output abilityId is %{public}" PRIu64 ".", sessionInfo->uiAbilityId);
1249     auto search = tmpAbilityMap_.find(sessionInfo->requestId);
1250     if (search == tmpAbilityMap_.end()) {
1251         if (sessionInfo->uiAbilityId == 0 && tmpAbilityMap_.size() == 1) {
1252             search = tmpAbilityMap_.begin();
1253         } else {
1254             TAG_LOGW(AAFwkTag::ABILITYMGR, "not find UIAbility");
1255             return;
1256         }
1257     }
1258     auto uiAbilityRecord = search->second;
1259     tmpAbilityMap_.erase(search);
1260     CHECK_POINTER_LOG(uiAbilityRecord, "UIAbility not exist.");
1261     auto sessionSearch = sessionAbilityMap_.find(sessionInfo->persistentId);
1262     if (sessionSearch != sessionAbilityMap_.end()) {
1263         // ability could be in loading state, waiting for callback
1264         TAG_LOGI(AAFwkTag::ABILITYMGR, "session exist");
1265         return;
1266     }
1267     isColdStart = true;
1268 
1269     MoreAbilityNumbersSendEventInfo(sessionInfo->userId, sessionInfo->want.GetElement().GetBundleName(),
1270         sessionInfo->want.GetElement().GetAbilityName(), sessionInfo->want.GetElement().GetModuleName());
1271 
1272     sessionAbilityMap_.emplace(sessionInfo->persistentId, uiAbilityRecord);
1273     uiAbilityRecord->SetSessionInfo(sessionInfo);
1274     if (sessionInfo->state == CallToState::BACKGROUND) {
1275         TAG_LOGI(AAFwkTag::ABILITYMGR, "set pending BACKGROUND");
1276         uiAbilityRecord->SetPendingState(AbilityState::BACKGROUND);
1277     } else {
1278         uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1279     }
1280     uiAbilityRecord->LoadAbility();
1281 }
1282 
CreateSessionInfo(const AbilityRequest & abilityRequest) const1283 sptr<SessionInfo> UIAbilityLifecycleManager::CreateSessionInfo(const AbilityRequest &abilityRequest) const
1284 {
1285     TAG_LOGD(AAFwkTag::ABILITYMGR, "Create session.");
1286     sptr<SessionInfo> sessionInfo = new SessionInfo();
1287     sessionInfo->callerToken = abilityRequest.callerToken;
1288     sessionInfo->want = abilityRequest.want;
1289     sessionInfo->processOptions = abilityRequest.processOptions;
1290     sessionInfo->startWindowOption = abilityRequest.startWindowOption;
1291     sessionInfo->supportWindowModes = abilityRequest.supportWindowModes;
1292     if (abilityRequest.startSetting != nullptr) {
1293         TAG_LOGD(AAFwkTag::ABILITYMGR, "Assign start setting to session.");
1294         sessionInfo->startSetting = abilityRequest.startSetting;
1295     }
1296     sessionInfo->callingTokenId = static_cast<uint32_t>(abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN,
1297         IPCSkeleton::GetCallingTokenID()));
1298     sessionInfo->instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
1299     return sessionInfo;
1300 }
1301 
NotifySCBPendingActivation(sptr<SessionInfo> & sessionInfo,const AbilityRequest & abilityRequest)1302 int UIAbilityLifecycleManager::NotifySCBPendingActivation(sptr<SessionInfo> &sessionInfo,
1303     const AbilityRequest &abilityRequest)
1304 {
1305     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
1306     TAG_LOGD(AAFwkTag::ABILITYMGR, "windowLeft=%{public}d,windowTop=%{public}d,"
1307         "windowHeight=%{public}d,windowWidth=%{public}d,windowMode=%{public}d,"
1308         "supportWindowModes.size=%{public}zu,minWindowWidth=%{public}d,"
1309         "minWindowHeight=%{public}d,maxWindowWidth=%{public}d,maxWindowHeight=%{public}d,"
1310         "specifiedFlag=%{public}s",
1311         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0),
1312         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0),
1313         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0),
1314         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0),
1315         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_MODE, 0),
1316         (sessionInfo->supportWindowModes).size(),
1317         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MIN_WINDOW_WIDTH, 0),
1318         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MIN_WINDOW_HEIGHT, 0),
1319         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MAX_WINDOW_WIDTH, 0),
1320         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MAX_WINDOW_HEIGHT, 0),
1321         sessionInfo->specifiedFlag.c_str());
1322     bool hasStartWindowOption = (sessionInfo->startWindowOption != nullptr);
1323     bool hasStartWindow = hasStartWindowOption ? sessionInfo->startWindowOption->hasStartWindow : false;
1324     std::string backgroundColor =
1325         hasStartWindowOption ? sessionInfo->startWindowOption->startWindowBackgroundColor : "";
1326     TAG_LOGI(AAFwkTag::ABILITYMGR, "appCloneIndex:%{public}d, instanceKey:%{public}s, "
1327         "hasStartWindow:%{public}d, backgroundColor:%{public}s",
1328         (sessionInfo->want).GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, 0), sessionInfo->instanceKey.c_str(),
1329         hasStartWindow, backgroundColor.c_str());
1330     auto abilityRecord = GetAbilityRecordByToken(abilityRequest.callerToken);
1331     if (abilityRecord != nullptr && !abilityRecord->GetRestartAppFlag()) {
1332         auto callerSessionInfo = abilityRecord->GetSessionInfo();
1333         CHECK_POINTER_AND_RETURN(callerSessionInfo, ERR_INVALID_VALUE);
1334         CHECK_POINTER_AND_RETURN(callerSessionInfo->sessionToken, ERR_INVALID_VALUE);
1335         auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken);
1336         CHECK_POINTER_AND_RETURN(callerSession, ERR_INVALID_VALUE);
1337         CheckCallerFromBackground(abilityRecord, sessionInfo);
1338         TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for callerSession, target: %{public}s",
1339             sessionInfo->want.GetElement().GetAbilityName().c_str());
1340         return static_cast<int>(callerSession->PendingSessionActivation(sessionInfo));
1341     }
1342     auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_);
1343     CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
1344     sessionInfo->canStartAbilityFromBackground = true;
1345     TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for rootSceneSession, target: %{public}s",
1346         sessionInfo->want.GetElement().GetAbilityName().c_str());
1347     return static_cast<int>(tmpSceneSession->PendingSessionActivation(sessionInfo));
1348 }
1349 
ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest) const1350 int UIAbilityLifecycleManager::ResolveAbility(
1351     const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest) const
1352 {
1353     TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbilityRecord resolve call record.");
1354     CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR);
1355 
1356     ResolveResultType result = targetAbility->Resolve(abilityRequest);
1357     switch (result) {
1358         case ResolveResultType::NG_INNER_ERROR:
1359         case ResolveResultType::OK_HAS_REMOTE_OBJ:
1360             return result;
1361         default:
1362             break;
1363     }
1364 
1365     if (targetAbility->IsReady()) {
1366         TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility is ready, directly scheduler call request.");
1367         targetAbility->CallRequest();
1368         return ResolveResultType::OK_HAS_REMOTE_OBJ;
1369     }
1370 
1371     TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility need to call request after lifecycle.");
1372     return result;
1373 }
1374 
NotifyAbilityToken(const sptr<IRemoteObject> & token,const AbilityRequest & abilityRequest) const1375 void UIAbilityLifecycleManager::NotifyAbilityToken(const sptr<IRemoteObject> &token,
1376     const AbilityRequest &abilityRequest) const
1377 {
1378     auto abilityInfoCallback = iface_cast<AppExecFwk::IAbilityInfoCallback>(abilityRequest.abilityInfoCallback);
1379     if (abilityInfoCallback != nullptr) {
1380         abilityInfoCallback->NotifyAbilityToken(token, abilityRequest.want);
1381     }
1382 }
1383 
PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability,uint32_t msgId,bool isHalf)1384 void UIAbilityLifecycleManager::PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability, uint32_t msgId, bool isHalf)
1385 {
1386     CHECK_POINTER_LOG(ability, "null ability");
1387     AppExecFwk::RunningProcessInfo processInfo = {};
1388     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1389     if (processInfo.pid_ == 0) {
1390         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability:%{public}s, app fork fail/ not run",
1391             ability->GetAbilityInfo().name.data());
1392         return;
1393     }
1394     int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
1395     std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1396     if (!GetContentAndTypeId(msgId, msgContent, typeId)) {
1397         TAG_LOGW(AAFwkTag::ABILITYMGR, "msgId invalid");
1398         return;
1399     }
1400 
1401     std::string eventName = isHalf ?
1402         AppExecFwk::AppFreezeType::LIFECYCLE_HALF_TIMEOUT : AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
1403     TAG_LOGW(AAFwkTag::ABILITYMGR, "%{public}s: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, "
1404         "abilityName: %{public}s, msg: %{public}s",
1405         eventName.c_str(), processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1406         ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1407 
1408     AppExecFwk::AppfreezeManager::ParamInfo info = {
1409         .typeId = typeId,
1410         .pid = processInfo.pid_,
1411         .eventName = eventName,
1412         .bundleName = ability->GetAbilityInfo().bundleName,
1413     };
1414     FreezeUtil::TimeoutState state = MsgId2State(msgId);
1415     FreezeUtil::LifecycleFlow flow;
1416     if (state != FreezeUtil::TimeoutState::UNKNOWN) {
1417         if (ability->GetToken() != nullptr) {
1418             flow.token = ability->GetToken()->AsObject();
1419             flow.state = state;
1420         }
1421         info.msg = msgContent + "\nserver actions for ability:\n" +
1422             FreezeUtil::GetInstance().GetLifecycleEvent(flow.token)
1423             + "\nserver actions for app:\n" + FreezeUtil::GetInstance().GetAppLifecycleEvent(processInfo.pid_);
1424         if (!isHalf) {
1425             FreezeUtil::GetInstance().DeleteLifecycleEvent(flow.token);
1426             FreezeUtil::GetInstance().DeleteAppLifecycleEvent(processInfo.pid_);
1427         }
1428     } else {
1429         info.msg = msgContent;
1430     }
1431     AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info, flow);
1432 }
1433 
GetContentAndTypeId(uint32_t msgId,std::string & msgContent,int & typeId) const1434 bool UIAbilityLifecycleManager::GetContentAndTypeId(uint32_t msgId, std::string &msgContent, int &typeId) const
1435 {
1436     switch (msgId) {
1437         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1438             msgContent += "load timeout.";
1439             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1440             break;
1441         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1442             msgContent += "foreground timeout.";
1443             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1444             break;
1445         case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1446             msgContent += "background timeout.";
1447             break;
1448         case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1449             msgContent += "terminate timeout.";
1450             break;
1451         default:
1452             return false;
1453     }
1454     return true;
1455 }
1456 
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1457 void UIAbilityLifecycleManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1458 {
1459     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1460     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1461     CHECK_POINTER(abilityRecord);
1462     if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1463         TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, state: %{public}d, not complete background",
1464             abilityRecord->GetAbilityState());
1465         return;
1466     }
1467     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1468     // notify AppMS to update application state.
1469     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1470 
1471     if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1472         abilityRecord->PostForegroundTimeoutTask();
1473         abilityRecord->SetAbilityState(AbilityState::FOREGROUNDING);
1474         DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
1475     } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1476         TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup.");
1477         abilityRecord->SetPendingState(AbilityState::INITIAL);
1478     }
1479 
1480     // new version. started by caller, scheduler call request
1481     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) {
1482         TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing background state");
1483         abilityRecord->CallRequest();
1484         abilityRecord->SetStartToBackground(false);
1485     }
1486 
1487     // Abilities ahead of the one started were put in terminate list, we need to terminate them.
1488     auto self(shared_from_this());
1489     for (auto terminateAbility : terminateAbilityList_) {
1490         if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) {
1491             auto timeoutTask = [terminateAbility, self]() {
1492                 TAG_LOGW(AAFwkTag::ABILITYMGR, "terminate ability timeout");
1493                 self->DelayCompleteTerminate(terminateAbility);
1494             };
1495             terminateAbility->Terminate(timeoutTask);
1496         }
1497     }
1498 }
1499 
BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,int resultCode,const Want * resultWant,int64_t callerRequestCode)1500 int32_t UIAbilityLifecycleManager::BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,
1501     int resultCode, const Want *resultWant, int64_t callerRequestCode)
1502 {
1503     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1504     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1505     if (abilityRecord == nullptr) {
1506         TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
1507         return ERR_INVALID_VALUE;
1508     }
1509     auto requestInfo = StartupUtil::ParseFullRequestCode(callerRequestCode);
1510     TAG_LOGI(AAFwkTag::ABILITYMGR, "pid:%{public}d, backFlag:%{public}d, requestCode:%{public}d",
1511         requestInfo.pid, requestInfo.backFlag, requestInfo.requestCode);
1512     if (requestInfo.requestCode <= 0 || requestInfo.pid <= 0) {
1513         TAG_LOGE(AAFwkTag::ABILITYMGR, "no find caller by requestCode");
1514         return ERR_CALLER_NOT_EXISTS;
1515     }
1516     auto callerAbilityRecord = abilityRecord->GetCallerByRequestCode(requestInfo.requestCode, requestInfo.pid);
1517     if (callerAbilityRecord == nullptr) {
1518         TAG_LOGE(AAFwkTag::ABILITYMGR, "caller not exist");
1519         return ERR_CALLER_NOT_EXISTS;
1520     }
1521     auto abilityResult = std::make_shared<AbilityResult>(requestInfo.requestCode, resultCode, *resultWant);
1522     callerAbilityRecord->SendResultByBackToCaller(abilityResult);
1523     abilityRecord->RemoveCallerRequestCode(callerAbilityRecord, requestInfo.requestCode);
1524     if (!requestInfo.backFlag) {
1525         TAG_LOGW(AAFwkTag::ABILITYMGR, "not back to caller");
1526         return ERR_NOT_SUPPORT_BACK_TO_CALLER;
1527     }
1528     if (callerAbilityRecord == abilityRecord) {
1529         TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is self");
1530         return ERR_OK;
1531     }
1532     auto tokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
1533     TAG_LOGD(AAFwkTag::ABILITYMGR, "tokenId: %{public}d.", tokenId);
1534     if (!abilityRecord->IsForeground() && !abilityRecord->GetAbilityForegroundingFlag() &&
1535         !PermissionVerification::GetInstance()->VerifyPermissionByTokenId(tokenId,
1536         PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND)) {
1537         TAG_LOGW(AAFwkTag::ABILITYMGR, "no call ability");
1538         return CHECK_PERMISSION_FAILED;
1539     }
1540     // find host of UI Extension
1541     auto foundCount = 0;
1542     while (((++foundCount) <= MAX_FIND_UIEXTENSION_CALLER_TIMES) && callerAbilityRecord &&
1543         UIExtensionUtils::IsUIExtension(callerAbilityRecord->GetAbilityInfo().extensionAbilityType)) {
1544         TAG_LOGI(AAFwkTag::ABILITYMGR, "caller uiExtension");
1545         callerAbilityRecord = callerAbilityRecord->GetCallerRecord();
1546     }
1547     return BackToCallerAbilityWithResultLocked(abilityRecord->GetSessionInfo(), callerAbilityRecord);
1548 }
1549 
BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo,std::shared_ptr<AbilityRecord> callerAbilityRecord)1550 int32_t UIAbilityLifecycleManager::BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo,
1551     std::shared_ptr<AbilityRecord> callerAbilityRecord)
1552 {
1553     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
1554     if (currentSessionInfo == nullptr || currentSessionInfo->sessionToken == nullptr) {
1555         TAG_LOGI(AAFwkTag::ABILITYMGR, "currentSessionInfo invalid");
1556         return ERR_INVALID_VALUE;
1557     }
1558 
1559     if (callerAbilityRecord == nullptr) {
1560         TAG_LOGI(AAFwkTag::ABILITYMGR, "callerAbility invalid");
1561         return ERR_INVALID_VALUE;
1562     }
1563 
1564     auto callerSessionInfo = callerAbilityRecord->GetSessionInfo();
1565     if (callerSessionInfo == nullptr || callerSessionInfo->sessionToken == nullptr) {
1566         TAG_LOGI(AAFwkTag::ABILITYMGR, "callerSessionInfo invalid");
1567         return ERR_INVALID_VALUE;
1568     }
1569 
1570     auto currentSession = iface_cast<Rosen::ISession>(currentSessionInfo->sessionToken);
1571     callerSessionInfo->isBackTransition = true;
1572     auto ret = static_cast<int>(currentSession->PendingSessionActivation(callerSessionInfo));
1573     callerSessionInfo->isBackTransition = false;
1574     return ret;
1575 }
1576 
CloseUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool isClearSession)1577 int UIAbilityLifecycleManager::CloseUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1578     int resultCode, const Want *resultWant, bool isClearSession)
1579 {
1580     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1581     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1582     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1583     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1584     std::string element = abilityRecord->GetElementName().GetURI();
1585     TAG_LOGI(AAFwkTag::ABILITYMGR, "CloseUIAbility call: %{public}s", element.c_str());
1586     if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) {
1587         TAG_LOGI(AAFwkTag::ABILITYMGR, "ability on terminating");
1588         return ERR_OK;
1589     }
1590     PrepareCloseUIAbility(abilityRecord, resultCode, resultWant, isClearSession);
1591     if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
1592         if (abilityRecord->GetScheduler() == nullptr) {
1593             auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1594             CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1595             abilityRecord->RemoveLoadTimeoutTask();
1596         }
1597         terminateAbilityList_.remove(abilityRecord);
1598         return abilityRecord->TerminateAbility();
1599     }
1600     if (abilityRecord->IsDebug() && isClearSession) {
1601         TAG_LOGD(AAFwkTag::ABILITYMGR, "notify AppMS terminate");
1602         terminateAbilityList_.remove(abilityRecord);
1603         return abilityRecord->TerminateAbility();
1604     }
1605     if (abilityRecord->GetPendingState() != AbilityState::INITIAL) {
1606         TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped");
1607         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1608         return ERR_OK;
1609     }
1610     return CloseUIAbilityInner(abilityRecord);
1611 }
1612 
PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord,int resultCode,const Want * resultWant,bool isClearSession)1613 void UIAbilityLifecycleManager::PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord,
1614     int resultCode, const Want *resultWant, bool isClearSession)
1615 {
1616     if (!abilityRecord) {
1617         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record null");
1618         return;
1619     }
1620     DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken(), isClearSession);
1621     abilityRecord->SetTerminatingState();
1622     abilityRecord->SetClearMissionFlag(isClearSession);
1623     // save result to caller AbilityRecord
1624     if (resultWant != nullptr) {
1625         Want* newWant = const_cast<Want*>(resultWant);
1626         newWant->RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
1627         abilityRecord->SaveResultToCallers(resultCode, newWant);
1628     } else {
1629         Want want;
1630         abilityRecord->SaveResultToCallers(-1, &want);
1631     }
1632     EraseAbilityRecord(abilityRecord);
1633     abilityRecord->SendResultToCallers();
1634     terminateAbilityList_.push_back(abilityRecord);
1635 }
1636 
CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord)1637 int UIAbilityLifecycleManager::CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord)
1638 {
1639     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1640     if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1641         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1642         MoveToBackground(abilityRecord);
1643         return ERR_OK;
1644     }
1645     // ability on background, schedule to terminate.
1646     if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1647         auto self(shared_from_this());
1648         auto task = [abilityRecord, self]() {
1649             TAG_LOGW(AAFwkTag::ABILITYMGR, "close ability by scb timeout");
1650             self->DelayCompleteTerminate(abilityRecord);
1651         };
1652         abilityRecord->Terminate(task);
1653     }
1654     return ERR_OK;
1655 }
1656 
DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1657 void UIAbilityLifecycleManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1658 {
1659     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1660     CHECK_POINTER(handler);
1661 
1662     PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1663 
1664     auto timeoutTask = [self = shared_from_this(), abilityRecord]() {
1665         TAG_LOGI(AAFwkTag::ABILITYMGR, "delay complete terminate task");
1666         self->CompleteTerminate(abilityRecord);
1667     };
1668     int killTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * KILL_TIMEOUT_MULTIPLE;
1669     handler->SubmitTaskJust(timeoutTask, "DELAY_KILL_PROCESS", killTimeout);
1670 }
1671 
CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1672 void UIAbilityLifecycleManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1673 {
1674     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1675     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1676 
1677     CompleteTerminateLocked(abilityRecord);
1678 }
1679 
CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> & abilityRecord)1680 void UIAbilityLifecycleManager::CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> &abilityRecord)
1681 {
1682     CHECK_POINTER(abilityRecord);
1683     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1684         TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, %{public}s, ability not terminating", __func__);
1685         return;
1686     }
1687     abilityRecord->RemoveAbilityDeathRecipient();
1688 
1689     // notify AppMS terminate
1690     if (abilityRecord->TerminateAbility() != ERR_OK) {
1691         // Don't return here
1692         TAG_LOGE(AAFwkTag::ABILITYMGR, "appMS fail to terminate ability");
1693     }
1694     terminateAbilityList_.remove(abilityRecord);
1695 }
1696 
GetPersistentIdByAbilityRequest(const AbilityRequest & abilityRequest,bool & reuse) const1697 int32_t UIAbilityLifecycleManager::GetPersistentIdByAbilityRequest(const AbilityRequest &abilityRequest,
1698     bool &reuse) const
1699 {
1700     if (abilityRequest.collaboratorType != CollaboratorType::DEFAULT_TYPE) {
1701         return GetReusedCollaboratorPersistentId(abilityRequest, reuse);
1702     }
1703 
1704     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
1705         return GetReusedSpecifiedPersistentId(abilityRequest, reuse);
1706     }
1707 
1708     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD) {
1709         return GetReusedStandardPersistentId(abilityRequest, reuse);
1710     }
1711 
1712     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SINGLETON) {
1713         TAG_LOGW(AAFwkTag::ABILITYMGR, "launch not singleton");
1714         return 0;
1715     }
1716 
1717     reuse = true;
1718     for (const auto& [first, second] : sessionAbilityMap_) {
1719         if (CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::SINGLETON)) {
1720             TAG_LOGD(AAFwkTag::ABILITYMGR, "SINGLETON: find.");
1721             return first;
1722         }
1723     }
1724 
1725     TAG_LOGD(AAFwkTag::ABILITYMGR, "Not find existed ui ability.");
1726     return 0;
1727 }
1728 
GetReusedSpecifiedPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1729 int32_t UIAbilityLifecycleManager::GetReusedSpecifiedPersistentId(const AbilityRequest &abilityRequest,
1730     bool &reuse) const
1731 {
1732     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1733     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
1734         TAG_LOGW(AAFwkTag::ABILITYMGR, "not SPECIFIED");
1735         return 0;
1736     }
1737 
1738     reuse = true;
1739     // specified ability name and bundle name and module name and appIndex format is same as singleton.
1740     for (const auto& [first, second] : sessionAbilityMap_) {
1741         if (second->GetSpecifiedFlag() == abilityRequest.specifiedFlag &&
1742             CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::SPECIFIED)) {
1743             TAG_LOGD(AAFwkTag::ABILITYMGR, "SPECIFIED: find.");
1744             return first;
1745         }
1746     }
1747     return 0;
1748 }
1749 
GetReusedStandardPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1750 int32_t UIAbilityLifecycleManager::GetReusedStandardPersistentId(const AbilityRequest &abilityRequest,
1751     bool &reuse) const
1752 {
1753     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1754     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD) {
1755         TAG_LOGW(AAFwkTag::ABILITYMGR, "not STANDARD");
1756         return 0;
1757     }
1758 
1759     if (!abilityRequest.startRecent) {
1760         TAG_LOGW(AAFwkTag::ABILITYMGR, "startRecent false");
1761         return 0;
1762     }
1763 
1764     reuse = true;
1765     int64_t sessionTime = 0;
1766     int32_t persistentId = 0;
1767     for (const auto& [first, second] : sessionAbilityMap_) {
1768         if (CheckProperties(second, abilityRequest, AppExecFwk::LaunchMode::STANDARD) &&
1769             second->GetRestartTime() >= sessionTime) {
1770             persistentId = first;
1771             sessionTime = second->GetRestartTime();
1772         }
1773     }
1774     return persistentId;
1775 }
1776 
GetReusedCollaboratorPersistentId(const AbilityRequest & abilityRequest,bool & reuse) const1777 int32_t UIAbilityLifecycleManager::GetReusedCollaboratorPersistentId(const AbilityRequest &abilityRequest,
1778     bool &reuse) const
1779 {
1780     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
1781 
1782     reuse = false;
1783     int64_t sessionTime = 0;
1784     int32_t persistentId = 0;
1785     for (const auto& [first, second] : sessionAbilityMap_) {
1786         if (second->GetCollaboratorType() != CollaboratorType::DEFAULT_TYPE &&
1787             abilityRequest.want.GetStringParam(PARAM_MISSION_AFFINITY_KEY) == second->GetMissionAffinity() &&
1788             second->GetRestartTime() >= sessionTime) {
1789             reuse = true;
1790             persistentId = first;
1791             sessionTime = second->GetRestartTime();
1792         }
1793     }
1794     return persistentId;
1795 }
1796 
CheckProperties(const std::shared_ptr<AbilityRecord> & abilityRecord,const AbilityRequest & abilityRequest,AppExecFwk::LaunchMode launchMode) const1797 bool UIAbilityLifecycleManager::CheckProperties(const std::shared_ptr<AbilityRecord> &abilityRecord,
1798     const AbilityRequest &abilityRequest, AppExecFwk::LaunchMode launchMode) const
1799 {
1800     CHECK_POINTER_RETURN_BOOL(abilityRecord);
1801     const auto& abilityInfo = abilityRecord->GetAbilityInfo();
1802     int32_t appIndex = 0;
1803     (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex);
1804     auto instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
1805     return abilityInfo.launchMode == launchMode && abilityRequest.abilityInfo.name == abilityInfo.name &&
1806         abilityRequest.abilityInfo.bundleName == abilityInfo.bundleName &&
1807         abilityRequest.abilityInfo.moduleName == abilityInfo.moduleName &&
1808         appIndex == abilityRecord->GetAppIndex() && instanceKey == abilityRecord->GetInstanceKey();
1809 }
1810 
OnTimeOut(uint32_t msgId,int64_t abilityRecordId,bool isHalf)1811 void UIAbilityLifecycleManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf)
1812 {
1813     TAG_LOGD(AAFwkTag::ABILITYMGR, "call, msgId is %{public}d", msgId);
1814     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1815     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1816     std::shared_ptr<AbilityRecord> abilityRecord;
1817     for (auto iter = sessionAbilityMap_.begin(); iter != sessionAbilityMap_.end(); iter++) {
1818         if (iter->second != nullptr && iter->second->GetAbilityRecordId() == abilityRecordId) {
1819             abilityRecord = iter->second;
1820             break;
1821         }
1822     }
1823     if (abilityRecord == nullptr) {
1824         for (auto abilityIter : terminateAbilityList_) {
1825             if (abilityIter && abilityIter->GetAbilityRecordId() == abilityRecordId) {
1826                 abilityRecord = abilityIter;
1827                 break;
1828             }
1829         }
1830         if (abilityRecord == nullptr) {
1831             TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1832             return;
1833         }
1834     }
1835     TAG_LOGD(AAFwkTag::ABILITYMGR, "call, msgId:%{public}d, name:%{public}s", msgId,
1836         abilityRecord->GetAbilityInfo().name.c_str());
1837     PrintTimeOutLog(abilityRecord, msgId, isHalf);
1838     if (isHalf) {
1839         return;
1840     }
1841     switch (msgId) {
1842         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1843             abilityRecord->SetLoading(false);
1844             HandleLoadTimeout(abilityRecord);
1845             break;
1846         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1847             HandleForegroundTimeout(abilityRecord);
1848             break;
1849         default:
1850             break;
1851     }
1852 }
1853 
SetRootSceneSession(const sptr<IRemoteObject> & rootSceneSession)1854 void UIAbilityLifecycleManager::SetRootSceneSession(const sptr<IRemoteObject> &rootSceneSession)
1855 {
1856     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1857     auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession);
1858     if (tmpSceneSession == nullptr) {
1859         TAG_LOGE(AAFwkTag::ABILITYMGR, "rootSceneSession invalid");
1860         return;
1861     }
1862     rootSceneSession_ = rootSceneSession;
1863 }
1864 
NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t errorCode,const std::string & errorReason,bool needClearCallerLink)1865 void UIAbilityLifecycleManager::NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> &abilityRecord,
1866     int32_t errorCode, const std::string& errorReason, bool needClearCallerLink)
1867 {
1868     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1869     if (abilityRecord == nullptr) {
1870         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1871         return;
1872     }
1873     auto sessionInfo = abilityRecord->GetSessionInfo();
1874     CHECK_POINTER(sessionInfo);
1875     CHECK_POINTER(sessionInfo->sessionToken);
1876     auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1877     CHECK_POINTER(session);
1878     TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBToHandleException reason: %{public}s", errorReason.c_str());
1879     sptr<SessionInfo> info = abilityRecord->GetSessionInfo();
1880     info->errorCode = errorCode;
1881     info->errorReason = errorReason;
1882     Rosen::ExceptionInfo exceptionInfo;
1883     exceptionInfo.needClearCallerLink = needClearCallerLink;
1884     session->NotifySessionException(info, exceptionInfo);
1885     EraseAbilityRecord(abilityRecord);
1886 }
1887 
NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo,int32_t errorCode,const std::string & errorReason)1888 void UIAbilityLifecycleManager::NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo,
1889     int32_t errorCode, const std::string& errorReason)
1890 {
1891     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1892     CHECK_POINTER(sessionInfo);
1893     CHECK_POINTER(sessionInfo->sessionToken);
1894     auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1895     CHECK_POINTER(session);
1896     TAG_LOGI(AAFwkTag::ABILITYMGR,
1897         "call notifySessionException, errorReason: %{public}s", errorReason.c_str());
1898     sessionInfo->errorCode = errorCode;
1899     sessionInfo->errorReason = errorReason;
1900     Rosen::ExceptionInfo exceptionInfo;
1901     session->NotifySessionException(sessionInfo, exceptionInfo);
1902 }
1903 
HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & abilityRecord)1904 void UIAbilityLifecycleManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &abilityRecord)
1905 {
1906     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1907     if (abilityRecord == nullptr) {
1908         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1909         return;
1910     }
1911     NotifySCBToHandleException(abilityRecord,
1912         static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleLoadTimeout");
1913     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1914 }
1915 
HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & abilityRecord)1916 void UIAbilityLifecycleManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &abilityRecord)
1917 {
1918     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
1919     if (abilityRecord == nullptr) {
1920         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1921         return;
1922     }
1923     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
1924         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not foregrounding");
1925         return;
1926     }
1927     NotifySCBToHandleException(abilityRecord,
1928         static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_FOREGROUND_TIMEOUT), "handleForegroundTimeout");
1929     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1930 }
1931 
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)1932 void UIAbilityLifecycleManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
1933 {
1934     TAG_LOGD(AAFwkTag::ABILITYMGR, "call OnAbilityDied");
1935     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1936     CancelPrepareTerminate(abilityRecord);
1937     std::lock_guard<ffrt::mutex> guard(sessionLock_);
1938     if (abilityRecord == nullptr) {
1939         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
1940         return;
1941     }
1942     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1943     CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
1944     if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
1945         abilityRecord->RemoveLoadTimeoutTask();
1946         abilityRecord->SetLoading(false);
1947     }
1948     if (abilityRecord->GetAbilityState() == AbilityState::FOREGROUNDING) {
1949         abilityRecord->RemoveForegroundTimeoutTask();
1950     }
1951     auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
1952     CHECK_POINTER_LOG(taskHandler, "Get AbilityTaskHandler failed.");
1953     if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUNDING) {
1954         taskHandler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1955     }
1956 
1957     terminateAbilityList_.push_back(abilityRecord);
1958     abilityRecord->SetAbilityState(AbilityState::TERMINATING);
1959     if (abilityRecord->GetKillForPermissionUpdateFlag()) {
1960         bool needClearCallerLink = false;
1961         NotifySCBToHandleException(abilityRecord,
1962             static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_PERMISSION_UPDATE),
1963             "kill process for permission update", needClearCallerLink);
1964     } else if (abilityRecord->GetKillReason() == GlobalConstant::LOW_MEMORY_KILL) {
1965         TAG_LOGI(AAFwkTag::ABILITYMGR, "kill by low memory");
1966         NotifySCBToHandleException(abilityRecord,
1967             static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOW_MEMORY_KILL),
1968             abilityRecord->GetKillReason());
1969     } else if (!abilityRecord->GetRestartAppFlag()) {
1970         NotifySCBToHandleException(abilityRecord, static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_DIED),
1971             "onAbilityDied");
1972     }
1973     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1974     DispatchTerminate(abilityRecord);
1975 }
1976 
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag,int32_t requestId)1977 void UIAbilityLifecycleManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag,
1978     int32_t requestId)
1979 {
1980     TAG_LOGI(AAFwkTag::ABILITYMGR, "OnAcceptWantResponse, %{public}d", requestId);
1981     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1982     std::lock_guard guard(sessionLock_);
1983     auto request = GetSpecifiedRequest(requestId);
1984     if (request == nullptr) {
1985         TAG_LOGW(AAFwkTag::ABILITYMGR, "no request");
1986         return;
1987     }
1988     auto nextRequest = PopAndGetNextSpecified(requestId);
1989     if (nextRequest) {
1990         TaskHandlerWrap::GetFfrtHandler()->SubmitTask([nextRequest, pThis = shared_from_this()]() {
1991             std::lock_guard lock(pThis->sessionLock_);
1992             pThis->StartSpecifiedRequest(*nextRequest);
1993             });
1994     }
1995     if (request->isCold) {
1996         if (request->persistentId == 0) {
1997             TAG_LOGW(AAFwkTag::ABILITYMGR, "persistentId error for: %{public}d", requestId);
1998             PutSpecifiedFlag(requestId, flag);
1999             return;
2000         }
2001         if (HandleColdAcceptWantDone(want, flag, *request)) {
2002             return;
2003         }
2004     }
2005 
2006     HandleLegacyAcceptWantDone(request->abilityRequest, requestId, flag, want);
2007 }
2008 
HandleLegacyAcceptWantDone(AbilityRequest & abilityRequest,int32_t requestId,const std::string & flag,const AAFwk::Want & want)2009 void UIAbilityLifecycleManager::HandleLegacyAcceptWantDone(AbilityRequest &abilityRequest, int32_t requestId,
2010     const std::string &flag, const AAFwk::Want &want)
2011 {
2012     TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s", want.GetElement().GetURI().c_str());
2013     auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2014     if (!flag.empty()) {
2015         abilityRequest.specifiedFlag = flag;
2016         bool reuse = false;
2017         auto persistentId = GetReusedSpecifiedPersistentId(abilityRequest, reuse);
2018         if (persistentId != 0) {
2019             std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2020             auto iter = sessionAbilityMap_.find(persistentId);
2021             if (iter == sessionAbilityMap_.end()) {
2022                 TAG_LOGE(AAFwkTag::ABILITYMGR, "OnAcceptWantResponse Unexpected Error");
2023                 return;
2024             }
2025             TAG_LOGI(AAFwkTag::ABILITYMGR, "find specified ability, session:%{public}d", persistentId);
2026             abilityRecord = iter->second;
2027             CHECK_POINTER_LOG(abilityRecord, "OnAcceptWantResponse abilityRecord null");
2028             abilityRecord->SetWant(abilityRequest.want);
2029             abilityRecord->SetIsNewWant(true);
2030             UpdateAbilityRecordLaunchReason(abilityRequest, abilityRecord);
2031             MoveAbilityToFront(abilityRequest, abilityRecord, callerAbility);
2032             NotifyRestartSpecifiedAbility(abilityRequest, abilityRecord->GetToken());
2033             return;
2034         }
2035     }
2036     NotifyStartSpecifiedAbility(abilityRequest, want);
2037     StartAbilityBySpecifed(abilityRequest, callerAbility, requestId, flag);
2038 }
2039 
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want,int32_t requestId)2040 void UIAbilityLifecycleManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want, int32_t requestId)
2041 {
2042     TAG_LOGI(AAFwkTag::ABILITYMGR, "SpecifiedAbilityTimeout %{public}d", requestId);
2043     OnStartSpecifiedFailed(requestId);
2044 }
2045 
OnStartSpecifiedFailed(int32_t requestId)2046 void UIAbilityLifecycleManager::OnStartSpecifiedFailed(int32_t requestId)
2047 {
2048     std::lock_guard lock(sessionLock_);
2049     auto curRequest = GetSpecifiedRequest(requestId);
2050     if (curRequest == nullptr) {
2051         return;
2052     }
2053     TAG_LOGI(AAFwkTag::ABILITYMGR, "OnStartSpecifiedFailed %{public}d", requestId);
2054     if (curRequest->persistentId != 0) {
2055         auto iter = sessionAbilityMap_.find(curRequest->persistentId);
2056         if (iter != sessionAbilityMap_.end() && iter->second != nullptr) {
2057             auto abilityRecord = iter->second;
2058             NotifySCBToHandleException(abilityRecord,
2059                 static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_LOAD_TIMEOUT), "handleLoadTimeout");
2060         }
2061     }
2062 
2063     auto nextRequest = PopAndGetNextSpecified(requestId);
2064     if (nextRequest) {
2065         StartSpecifiedRequest(*nextRequest);
2066     }
2067 }
2068 
OnStartSpecifiedProcessResponse(const AAFwk::Want & want,const std::string & flag,int32_t requestId)2069 void UIAbilityLifecycleManager::OnStartSpecifiedProcessResponse(const AAFwk::Want &want, const std::string &flag,
2070     int32_t requestId)
2071 {
2072     TAG_LOGI(AAFwkTag::ABILITYMGR, "OnStartSpecifiedProcessResponse, %{public}d, %{public}s",
2073         requestId, want.GetElement().GetURI().c_str());
2074     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2075     std::lock_guard guard(sessionLock_);
2076     auto request = GetSpecifiedRequest(requestId);
2077     if (request == nullptr) {
2078         TAG_LOGW(AAFwkTag::ABILITYMGR, "no request");
2079         return;
2080     }
2081 
2082     auto &abilityRequest = request->abilityRequest;
2083     abilityRequest.want.SetParam(PARAM_SPECIFIED_PROCESS_FLAG, flag);
2084     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
2085         request->specifiedProcessState = SpecifiedProcessState::STATE_ABILITY;
2086         StartSpecifiedRequest(*request);
2087         return;
2088     }
2089     auto nextRequest = PopAndGetNextSpecified(requestId);
2090     if (nextRequest) {
2091         TaskHandlerWrap::GetFfrtHandler()->SubmitTask([nextRequest, pThis = shared_from_this()]() {
2092             std::lock_guard lock(pThis->sessionLock_);
2093             pThis->StartSpecifiedRequest(*nextRequest);
2094             });
2095     }
2096     auto sessionInfo = CreateSessionInfo(abilityRequest);
2097     sessionInfo->requestCode = abilityRequest.requestCode;
2098     sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse);
2099     sessionInfo->userId = abilityRequest.userId;
2100     sessionInfo->isAtomicService =
2101         (abilityRequest.abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
2102     TAG_LOGI(AAFwkTag::ABILITYMGR, "reused sessionId: %{public}d, userId: %{public}d", sessionInfo->persistentId,
2103         abilityRequest.userId);
2104     NotifySCBPendingActivation(sessionInfo, abilityRequest);
2105 }
2106 
OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want & want,int32_t requestId)2107 void UIAbilityLifecycleManager::OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want &want, int32_t requestId)
2108 {
2109     TAG_LOGI(AAFwkTag::ABILITYMGR, "OnStartSpecifiedProcessTimeoutResponse %{public}d", requestId);
2110     std::lock_guard guard(sessionLock_);
2111     auto nextRequest = PopAndGetNextSpecified(requestId);
2112     if (nextRequest) {
2113         StartSpecifiedRequest(*nextRequest);
2114     }
2115 }
2116 
StartSpecifiedAbilityBySCB(const Want & want)2117 void UIAbilityLifecycleManager::StartSpecifiedAbilityBySCB(const Want &want)
2118 {
2119     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2120     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2121     AbilityRequest abilityRequest;
2122     int result = DelayedSingleton<AbilityManagerService>::GetInstance()->GenerateAbilityRequest(
2123         want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_);
2124     if (result != ERR_OK) {
2125         TAG_LOGE(AAFwkTag::ABILITYMGR, "no find request");
2126         return;
2127     }
2128     abilityRequest.isFromIcon = true;
2129     std::lock_guard guard(sessionLock_);
2130     AddSpecifiedRequest(std::make_shared<SpecifiedRequest>(GetRequestId(), abilityRequest));
2131 }
2132 
NotifyRestartSpecifiedAbility(const AbilityRequest & request,const sptr<IRemoteObject> & token)2133 void UIAbilityLifecycleManager::NotifyRestartSpecifiedAbility(const AbilityRequest &request,
2134     const sptr<IRemoteObject> &token)
2135 {
2136     if (request.abilityInfoCallback == nullptr) {
2137         return;
2138     }
2139     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2140         = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback);
2141     if (abilityInfoCallback != nullptr) {
2142         TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2143         abilityInfoCallback->NotifyRestartSpecifiedAbility(token);
2144     }
2145 }
2146 
NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)2147 void UIAbilityLifecycleManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want)
2148 {
2149     if (abilityRequest.abilityInfoCallback == nullptr) {
2150         return;
2151     }
2152 
2153     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2154         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
2155     if (abilityInfoCallback != nullptr) {
2156         Want newWant = want;
2157         int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type);
2158         newWant.SetParam("abilityType", type);
2159         sptr<Want> extraParam = new (std::nothrow) Want();
2160         CHECK_POINTER(extraParam);
2161         abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant,
2162             abilityRequest.requestCode, extraParam);
2163         int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
2164         if (procCode != 0) {
2165             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
2166         }
2167         int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
2168         if (tokenCode != 0) {
2169             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
2170         }
2171     }
2172 }
2173 
MoveAbilityToFront(const AbilityRequest & abilityRequest,const std::shared_ptr<AbilityRecord> & abilityRecord,std::shared_ptr<AbilityRecord> callerAbility,std::shared_ptr<StartOptions> startOptions)2174 int UIAbilityLifecycleManager::MoveAbilityToFront(const AbilityRequest &abilityRequest,
2175     const std::shared_ptr<AbilityRecord> &abilityRecord, std::shared_ptr<AbilityRecord> callerAbility,
2176     std::shared_ptr<StartOptions> startOptions)
2177 {
2178     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2179     if (!abilityRecord) {
2180         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record failed");
2181         return ERR_INVALID_VALUE;
2182     }
2183     sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2184     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2185     sessionInfo->want = abilityRequest.want;
2186     sessionInfo->callerToken = abilityRequest.callerToken;
2187     sessionInfo->requestCode = abilityRequest.requestCode;
2188     sessionInfo->processOptions = nullptr;
2189     if (AppUtils::GetInstance().IsStartOptionsWithProcessOptions() &&
2190         abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
2191         sessionInfo->processOptions = abilityRequest.processOptions;
2192     }
2193     sessionInfo->startWindowOption = nullptr;
2194     sessionInfo->isFromIcon = abilityRequest.isFromIcon;
2195     SendSessionInfoToSCB(callerAbility, sessionInfo);
2196     abilityRecord->RemoveWindowMode();
2197     if (startOptions != nullptr) {
2198         abilityRecord->SetWindowMode(startOptions->GetWindowMode());
2199     }
2200     return ERR_OK;
2201 }
2202 
SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> & callerAbility,sptr<SessionInfo> & sessionInfo)2203 int UIAbilityLifecycleManager::SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> &callerAbility,
2204     sptr<SessionInfo> &sessionInfo)
2205 {
2206     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2207     TAG_LOGD(AAFwkTag::ABILITYMGR, "call"
2208         "windowLeft=%{public}d,windowTop=%{public}d,"
2209         "windowHeight=%{public}d,windowWidth=%{public}d,"
2210         "minWindowWidth=%{public}d,minWindowHeight=%{public}d,"
2211         "maxWindowWidth=%{public}d,mixWindowHeight=%{public}d,"
2212         "specifiedFlag=%{public}s",
2213         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0),
2214         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0),
2215         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0),
2216         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0),
2217         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MIN_WINDOW_WIDTH, 0),
2218         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MIN_WINDOW_HEIGHT, 0),
2219         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MAX_WINDOW_WIDTH, 0),
2220         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_MAX_WINDOW_HEIGHT, 0),
2221         sessionInfo->specifiedFlag.c_str());
2222     auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_);
2223     if (callerAbility != nullptr) {
2224         auto callerSessionInfo = callerAbility->GetSessionInfo();
2225         if (callerSessionInfo != nullptr && callerSessionInfo->sessionToken != nullptr) {
2226             auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken);
2227             CHECK_POINTER_AND_RETURN(callerSession, ERR_INVALID_VALUE);
2228             CheckCallerFromBackground(callerAbility, sessionInfo);
2229             TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for callerSession, target: %{public}s",
2230                 sessionInfo->want.GetElement().GetAbilityName().c_str());
2231             callerSession->PendingSessionActivation(sessionInfo);
2232         } else {
2233             CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
2234             sessionInfo->canStartAbilityFromBackground = true;
2235             TAG_LOGI(AAFwkTag::ABILITYMGR, "NotifySCBPendingActivation for rootSceneSession, target:%{public}s",
2236                 sessionInfo->want.GetElement().GetAbilityName().c_str());
2237             tmpSceneSession->PendingSessionActivation(sessionInfo);
2238         }
2239     } else {
2240         CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
2241         sessionInfo->canStartAbilityFromBackground = true;
2242         TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call, NotifySCBPendingActivation for rootSceneSession, target: %{public}s",
2243             sessionInfo->want.GetElement().GetAbilityName().c_str());
2244         tmpSceneSession->PendingSessionActivation(sessionInfo);
2245     }
2246     return ERR_OK;
2247 }
2248 
StartAbilityBySpecifed(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & callerAbility,int32_t requestId,const std::string & flag)2249 int UIAbilityLifecycleManager::StartAbilityBySpecifed(const AbilityRequest &abilityRequest,
2250     std::shared_ptr<AbilityRecord> &callerAbility, int32_t requestId, const std::string &flag)
2251 {
2252     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2253     sptr<SessionInfo> sessionInfo = new SessionInfo();
2254     sessionInfo->callerToken = abilityRequest.callerToken;
2255     sessionInfo->want = abilityRequest.want;
2256     sessionInfo->requestCode = abilityRequest.requestCode;
2257     sessionInfo->processOptions = abilityRequest.processOptions;
2258     sessionInfo->startWindowOption = abilityRequest.startWindowOption;
2259     sessionInfo->instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
2260     sessionInfo->isFromIcon = abilityRequest.isFromIcon;
2261     sessionInfo->requestId = requestId;
2262     sessionInfo->specifiedFlag = flag;
2263     TAG_LOGI(AAFwkTag::ABILITYMGR, "specified flag:%{public}s", flag.c_str());
2264     PutSpecifiedFlag(requestId, abilityRequest.specifiedFlag);
2265     SendSessionInfoToSCB(callerAbility, sessionInfo);
2266     return ERR_OK;
2267 }
2268 
CallRequestDone(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<IRemoteObject> & callStub)2269 void UIAbilityLifecycleManager::CallRequestDone(const std::shared_ptr<AbilityRecord> &abilityRecord,
2270     const sptr<IRemoteObject> &callStub)
2271 {
2272     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2273     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2274     if (abilityRecord == nullptr) {
2275         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ability record");
2276         return;
2277     }
2278     if (callStub == nullptr) {
2279         TAG_LOGE(AAFwkTag::ABILITYMGR, "null call stub");
2280         return;
2281     }
2282     abilityRecord->CallRequestDone(callStub);
2283 
2284     auto iter = callRequestCache_.find(abilityRecord);
2285     if (iter == callRequestCache_.end()) {
2286         return;
2287     }
2288     auto requestList = std::move(iter->second);
2289     callRequestCache_.erase(iter);
2290     auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
2291     if (taskHandler == nullptr) {
2292         return;
2293     }
2294     auto wThis = weak_from_this();
2295     for (const auto &request : requestList) {
2296         auto task = [request, wThis]() {
2297             auto pThis = wThis.lock();
2298             if (pThis) {
2299                 pThis->CallAbilityLocked(request);
2300             }
2301         };
2302         taskHandler->SubmitTask(task);
2303     }
2304 }
2305 
ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)2306 int UIAbilityLifecycleManager::ReleaseCallLocked(
2307     const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
2308 {
2309     TAG_LOGD(AAFwkTag::ABILITYMGR, "release call ability.");
2310     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2311     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2312     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2313 
2314     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2315 
2316     auto abilityRecords = GetAbilityRecordsByNameInner(element);
2317     auto isExist = [connect] (const std::shared_ptr<AbilityRecord> &abilityRecord) {
2318         if (abilityRecord == nullptr) {
2319             return false;
2320         }
2321         return abilityRecord->IsExistConnection(connect);
2322     };
2323     auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist);
2324     if (findRecord == abilityRecords.end()) {
2325         TAG_LOGE(AAFwkTag::ABILITYMGR, "not find record");
2326         return RELEASE_CALL_ABILITY_INNER_ERR;
2327     }
2328     auto abilityRecord = *findRecord;
2329     CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR);
2330 
2331     if (!abilityRecord->ReleaseCall(connect)) {
2332         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability release call failed");
2333         return RELEASE_CALL_ABILITY_INNER_ERR;
2334     }
2335     return ERR_OK;
2336 }
2337 
OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)2338 void UIAbilityLifecycleManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord)
2339 {
2340     TAG_LOGI(AAFwkTag::ABILITYMGR, "on callConnect died");
2341     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2342     CHECK_POINTER(callRecord);
2343     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2344 
2345     AppExecFwk::ElementName element = callRecord->GetTargetServiceName();
2346     auto abilityRecords = GetAbilityRecordsByNameInner(element);
2347     auto isExist = [callRecord] (const std::shared_ptr<AbilityRecord> &abilityRecord) {
2348         if (abilityRecord == nullptr) {
2349             return false;
2350         }
2351         return abilityRecord->IsExistConnection(callRecord->GetConCallBack());
2352     };
2353     auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist);
2354     if (findRecord == abilityRecords.end()) {
2355         TAG_LOGE(AAFwkTag::ABILITYMGR, "not find record");
2356         return;
2357     }
2358     auto abilityRecord = *findRecord;
2359     CHECK_POINTER(abilityRecord);
2360     abilityRecord->ReleaseCall(callRecord->GetConCallBack());
2361 }
2362 
GetAbilityRecordsByName(const AppExecFwk::ElementName & element)2363 std::vector<std::shared_ptr<AbilityRecord>> UIAbilityLifecycleManager::GetAbilityRecordsByName(
2364     const AppExecFwk::ElementName &element)
2365 {
2366     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2367     return GetAbilityRecordsByNameInner(element);
2368 }
2369 
GetAbilityRecordsByNameInner(const AppExecFwk::ElementName & element)2370 std::vector<std::shared_ptr<AbilityRecord>> UIAbilityLifecycleManager::GetAbilityRecordsByNameInner(
2371     const AppExecFwk::ElementName &element)
2372 {
2373     std::vector<std::shared_ptr<AbilityRecord>> records;
2374     for (const auto& [first, second] : sessionAbilityMap_) {
2375         auto &abilityInfo = second->GetAbilityInfo();
2376         AppExecFwk::ElementName localElement(abilityInfo.deviceId, abilityInfo.bundleName,
2377             abilityInfo.name, abilityInfo.moduleName);
2378         AppExecFwk::ElementName localElementNoModuleName(abilityInfo.deviceId,
2379             abilityInfo.bundleName, abilityInfo.name);
2380         if (localElement == element || localElementNoModuleName == element) {
2381             TAG_LOGD(AAFwkTag::ABILITYMGR, "find element %{public}s", localElement.GetURI().c_str());
2382             records.push_back(second);
2383         }
2384     }
2385     return records;
2386 }
2387 
GetSessionIdByAbilityToken(const sptr<IRemoteObject> & token)2388 int32_t UIAbilityLifecycleManager::GetSessionIdByAbilityToken(const sptr<IRemoteObject> &token)
2389 {
2390     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2391     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2392     for (const auto& [first, second] : sessionAbilityMap_) {
2393         if (second && second->GetToken()->AsObject() == token) {
2394             return first;
2395         }
2396     }
2397     TAG_LOGE(AAFwkTag::ABILITYMGR, "not find");
2398     return 0;
2399 }
2400 
SetReceiverInfo(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord) const2401 void UIAbilityLifecycleManager::SetReceiverInfo(const AbilityRequest &abilityRequest,
2402     std::shared_ptr<AbilityRecord> &abilityRecord) const
2403 {
2404     CHECK_POINTER(abilityRecord);
2405     const auto &abilityInfo = abilityRequest.abilityInfo;
2406     std::string abilityName = abilityInfo.name;
2407     auto isStandard = abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && !abilityRequest.startRecent;
2408     if (isStandard && abilityRequest.sessionInfo != nullptr) {
2409         // Support standard launch type.
2410         auto persistentId = abilityRequest.sessionInfo->persistentId;
2411         abilityName += std::to_string(abilityRequest.sessionInfo->persistentId);
2412     }
2413 
2414     bool hasRecoverInfo = false;
2415     (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2416         GetAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, abilityName,
2417         hasRecoverInfo);
2418     abilityRecord->UpdateRecoveryInfo(hasRecoverInfo);
2419     (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2420         DeleteAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName, abilityName);
2421 }
2422 
SetLastExitReason(std::shared_ptr<AbilityRecord> & abilityRecord) const2423 void UIAbilityLifecycleManager::SetLastExitReason(std::shared_ptr<AbilityRecord> &abilityRecord) const
2424 {
2425     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2426     if (abilityRecord == nullptr) {
2427         TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
2428         return;
2429     }
2430 
2431     if (abilityRecord->GetAbilityInfo().bundleName.empty()) {
2432         TAG_LOGE(AAFwkTag::ABILITYMGR, "bundleName empty");
2433         return;
2434     }
2435 
2436     auto sessionInfo = abilityRecord->GetSessionInfo();
2437     if (sessionInfo == nullptr) {
2438         TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo invalid");
2439         return;
2440     }
2441 
2442     std::string abilityName = abilityRecord->GetAbilityInfo().name;
2443     if (abilityRecord->GetAbilityInfo().launchMode == AppExecFwk::LaunchMode::STANDARD) {
2444         abilityName += std::to_string(sessionInfo->persistentId);
2445     }
2446 
2447     ExitReason exitReason;
2448     bool isSetReason;
2449     auto accessTokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
2450     AppExecFwk::RunningProcessInfo processInfo;
2451     int64_t time_stamp = 0;
2452     bool withKillMsg = false;
2453     DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->GetAppExitReason(
2454         abilityRecord->GetAbilityInfo().bundleName, accessTokenId, abilityName, isSetReason, exitReason,
2455         processInfo, time_stamp, withKillMsg);
2456 
2457     if (isSetReason) {
2458         TAG_LOGD(AAFwkTag::ABILITYMGR, "Set last exit reason, ability: %{public}s, reason: %{public}d.",
2459             abilityName.c_str(), exitReason.reason);
2460         abilityRecord->SetLastExitReason(exitReason, processInfo, time_stamp, withKillMsg);
2461     }
2462 }
2463 
PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool isSCBCall)2464 bool UIAbilityLifecycleManager::PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
2465     bool isSCBCall)
2466 {
2467     TAG_LOGD(AAFwkTag::ABILITYMGR, "call PrepareTerminateAbility");
2468     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2469     if (AbilityPermissionUtil::GetInstance().CheckPrepareTerminateEnable(abilityRecord) != ERR_OK) {
2470         TAG_LOGD(AAFwkTag::ABILITYMGR, "Not support prepare terminate.");
2471         return false;
2472     }
2473     TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityInfoName:%{public}s", abilityRecord->GetAbilityInfo().name.c_str());
2474     return abilityRecord->PrepareTerminateAbility(isSCBCall);
2475 }
2476 
PrepareTerminateAbilityDone(std::shared_ptr<AbilityRecord> abilityRecord,bool isTerminate)2477 void UIAbilityLifecycleManager::PrepareTerminateAbilityDone(std::shared_ptr<AbilityRecord> abilityRecord,
2478     bool isTerminate)
2479 {
2480     TAG_LOGD(AAFwkTag::ABILITYMGR, "call PrepareTerminateAbilityDone");
2481     CHECK_POINTER(abilityRecord);
2482     abilityRecord->PrepareTerminateAbilityDone(isTerminate);
2483 }
2484 
SetSessionHandler(const sptr<ISessionHandler> & handler)2485 void UIAbilityLifecycleManager::SetSessionHandler(const sptr<ISessionHandler> &handler)
2486 {
2487     handler_ = handler;
2488 }
2489 
GetAbilityRecordsById(int32_t sessionId) const2490 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::GetAbilityRecordsById(int32_t sessionId) const
2491 {
2492     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2493     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2494     auto search = sessionAbilityMap_.find(sessionId);
2495     if (search == sessionAbilityMap_.end()) {
2496         TAG_LOGI(AAFwkTag::ABILITYMGR, "sessionId invalid");
2497         return nullptr;
2498     }
2499     return search->second;
2500 }
2501 
GetActiveAbilityList(int32_t uid,std::vector<std::string> & abilityList,int32_t pid)2502 void UIAbilityLifecycleManager::GetActiveAbilityList(int32_t uid, std::vector<std::string> &abilityList, int32_t pid)
2503 {
2504     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2505     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2506     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call");
2507     for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2508         if (abilityRecord == nullptr) {
2509             TAG_LOGW(AAFwkTag::ABILITYMGR, "null second");
2510             continue;
2511         }
2512         if (!CheckPid(abilityRecord, pid)) {
2513             continue;
2514         }
2515         const auto &abilityInfo = abilityRecord->GetAbilityInfo();
2516         if (abilityInfo.applicationInfo.uid == uid && !abilityInfo.name.empty()) {
2517             std::string abilityName = abilityInfo.name;
2518             if (abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD &&
2519                 abilityRecord->GetSessionInfo() != nullptr) {
2520                 abilityName += std::to_string(abilityRecord->GetSessionInfo()->persistentId);
2521             }
2522             TAG_LOGD(AAFwkTag::ABILITYMGR, "find ability name is %{public}s.", abilityName.c_str());
2523             abilityList.push_back(abilityName);
2524         }
2525     }
2526     if (!abilityList.empty()) {
2527         sort(abilityList.begin(), abilityList.end());
2528         abilityList.erase(unique(abilityList.begin(), abilityList.end()), abilityList.end());
2529     }
2530 }
2531 
CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord,const int32_t pid) const2532 bool UIAbilityLifecycleManager::CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord, const int32_t pid) const
2533 {
2534     CHECK_POINTER_RETURN_BOOL(abilityRecord);
2535     return pid == NO_PID || abilityRecord->GetPid() == pid;
2536 }
2537 
CheckAbilityNumber(const std::string & bundleName,const std::string & abilityName,const std::string & moduleName) const2538 int32_t UIAbilityLifecycleManager::CheckAbilityNumber(
2539     const std::string &bundleName, const std::string &abilityName, const std::string &moduleName) const
2540 {
2541     int32_t checkAbilityNumber = 0;
2542 
2543     for (auto [persistentId, record] : sessionAbilityMap_) {
2544         auto recordAbilityInfo = record->GetAbilityInfo();
2545         if (bundleName == recordAbilityInfo.bundleName && abilityName == recordAbilityInfo.name &&
2546             moduleName == recordAbilityInfo.moduleName) {
2547             // check ability number created previously and add new one.
2548             checkAbilityNumber += 1;
2549         }
2550     }
2551 
2552     return checkAbilityNumber;
2553 }
2554 
MoreAbilityNumbersSendEventInfo(int32_t userId,const std::string & bundleName,const std::string & abilityName,const std::string & moduleName)2555 void UIAbilityLifecycleManager::MoreAbilityNumbersSendEventInfo(
2556     int32_t userId, const std::string &bundleName, const std::string &abilityName, const std::string &moduleName)
2557 {
2558     int32_t checkAbilityNumber = 0;
2559     checkAbilityNumber = CheckAbilityNumber(bundleName, abilityName, moduleName);
2560     TAG_LOGD(AAFwkTag::ABILITYMGR, "Check ability number:%{public}d", checkAbilityNumber);
2561 
2562     if (checkAbilityNumber >= 1) {
2563         EventInfo eventInfo;
2564         eventInfo.userId = userId;
2565         eventInfo.abilityName = abilityName;
2566         eventInfo.bundleName = bundleName;
2567         eventInfo.moduleName = moduleName;
2568         // get ability number created previously and add new one.
2569         eventInfo.abilityNumber = checkAbilityNumber + 1;
2570         EventReport::SendAbilityEvent(EventName::START_STANDARD_ABILITIES, HiSysEventType::BEHAVIOR, eventInfo);
2571     }
2572 }
2573 
OnAppStateChanged(const AppInfo & info)2574 void UIAbilityLifecycleManager::OnAppStateChanged(const AppInfo &info)
2575 {
2576     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2577     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2578     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
2579     if (info.state == AppState::TERMINATED || info.state == AppState::END) {
2580         for (const auto& abilityRecord : terminateAbilityList_) {
2581             if (abilityRecord == nullptr) {
2582                 TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2583                 continue;
2584             }
2585             if (info.bundleName == abilityRecord->GetApplicationInfo().bundleName &&
2586                 info.appIndex == abilityRecord->GetAppIndex() && info.instanceKey == abilityRecord->GetInstanceKey()) {
2587                 abilityRecord->SetAppState(info.state);
2588             }
2589         }
2590         return;
2591     }
2592     if (info.state == AppState::COLD_START) {
2593         for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2594             if (abilityRecord == nullptr) {
2595                 TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2596                 continue;
2597             }
2598             if (info.bundleName == abilityRecord->GetApplicationInfo().bundleName &&
2599                 info.appIndex == abilityRecord->GetAppIndex() && info.instanceKey == abilityRecord->GetInstanceKey()) {
2600 #ifdef SUPPORT_SCREEN
2601                 abilityRecord->SetColdStartFlag(true);
2602 #endif // SUPPORT_SCREEN
2603                 break;
2604             }
2605         }
2606         return;
2607     }
2608     for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2609         if (abilityRecord == nullptr) {
2610             TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2611             continue;
2612         }
2613         if (info.bundleName == abilityRecord->GetApplicationInfo().bundleName &&
2614             info.appIndex == abilityRecord->GetAppIndex() && info.instanceKey == abilityRecord->GetInstanceKey()) {
2615             abilityRecord->SetAppState(info.state);
2616         }
2617     }
2618 }
2619 
UninstallApp(const std::string & bundleName,int32_t uid)2620 void UIAbilityLifecycleManager::UninstallApp(const std::string &bundleName, int32_t uid)
2621 {
2622     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2623     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2624     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call");
2625     for (auto it = sessionAbilityMap_.begin(); it != sessionAbilityMap_.end();) {
2626         if (it->second == nullptr) {
2627             it++;
2628             continue;
2629         }
2630         auto &abilityInfo = it->second->GetAbilityInfo();
2631         if (abilityInfo.bundleName == bundleName && it->second->GetUid() == uid) {
2632             std::string abilityName = abilityInfo.name;
2633             auto sessionInfo = it->second->GetSessionInfo();
2634             if (abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD && sessionInfo != nullptr) {
2635                 abilityName += std::to_string(sessionInfo->persistentId);
2636             }
2637             (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2638                 DeleteAbilityRecoverInfo(abilityInfo.applicationInfo.accessTokenId, abilityInfo.moduleName,
2639                 abilityName);
2640         }
2641         it++;
2642     }
2643 
2644     for (auto it = startAbilityCheckMap_.begin(); it != startAbilityCheckMap_.end();) {
2645         const auto &request = it->second;
2646         if (request && request->appInfo.uid == uid) {
2647             it = startAbilityCheckMap_.erase(it);
2648         } else {
2649             ++it;
2650         }
2651     }
2652 }
2653 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm) const2654 void UIAbilityLifecycleManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm) const
2655 {
2656     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2657     std::lock_guard<ffrt::mutex> guard(sessionLock_);
2658     TAG_LOGD(AAFwkTag::ABILITYMGR, "Call.");
2659     for (auto [sessionId, abilityRecord] : sessionAbilityMap_) {
2660         if (abilityRecord == nullptr) {
2661             TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2662             continue;
2663         }
2664         if (isPerm) {
2665             DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2666         } else {
2667             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2668             auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2669             if (callingTokenId == tokenID) {
2670                 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2671             }
2672         }
2673     }
2674 }
2675 
Dump(std::vector<std::string> & info)2676 void UIAbilityLifecycleManager::Dump(std::vector<std::string> &info)
2677 {
2678     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
2679     std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked;
2680     {
2681         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2682         std::lock_guard<ffrt::mutex> guard(sessionLock_);
2683         for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2684             sessionAbilityMapLocked[sessionId] = abilityRecord;
2685         }
2686     }
2687 
2688     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2689     info.push_back(dumpInfo);
2690     dumpInfo = "  current mission lists:{";
2691     info.push_back(dumpInfo);
2692 
2693     for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) {
2694         if (abilityRecord == nullptr) {
2695             TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2696             continue;
2697         }
2698 
2699         sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2700         dumpInfo = "    Mission ID #" + std::to_string(sessionId);
2701         if (sessionInfo) {
2702             dumpInfo += "  mission name #[" + sessionInfo->sessionName + "]";
2703         }
2704         dumpInfo += "  lockedState #" + std::to_string(abilityRecord->GetLockedState());
2705         dumpInfo += "  mission affinity #[" + abilityRecord->GetMissionAffinity() + "]";
2706         info.push_back(dumpInfo);
2707 
2708         abilityRecord->Dump(info);
2709     }
2710     dumpInfo = " }";
2711     info.push_back(dumpInfo);
2712 }
2713 
DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)2714 void UIAbilityLifecycleManager::DumpMissionList(
2715     std::vector<std::string> &info, bool isClient, const std::string &args)
2716 {
2717     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
2718     std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked;
2719     {
2720         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2721         std::lock_guard<ffrt::mutex> guard(sessionLock_);
2722         for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2723             sessionAbilityMapLocked[sessionId] = abilityRecord;
2724         }
2725     }
2726     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2727     info.push_back(dumpInfo);
2728     dumpInfo = "  current mission lists:{";
2729     info.push_back(dumpInfo);
2730 
2731     for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) {
2732         if (abilityRecord == nullptr) {
2733             TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2734             continue;
2735         }
2736         sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2737         dumpInfo = "    Mission ID #" + std::to_string(sessionId);
2738         if (sessionInfo) {
2739             dumpInfo += "  mission name #[" + sessionInfo->sessionName + "]";
2740         }
2741         dumpInfo += "  lockedState #" + std::to_string(abilityRecord->GetLockedState());
2742         dumpInfo += "  mission affinity #[" + abilityRecord->GetMissionAffinity() + "]";
2743         info.push_back(dumpInfo);
2744 
2745         std::vector<std::string> params;
2746         abilityRecord->DumpAbilityState(info, isClient, params);
2747     }
2748     dumpInfo = " }";
2749     info.push_back(dumpInfo);
2750 }
2751 
DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)2752 void UIAbilityLifecycleManager::DumpMissionListByRecordId(std::vector<std::string> &info, bool isClient,
2753     int32_t abilityRecordId, const std::vector<std::string> &params)
2754 {
2755     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
2756     std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMapLocked;
2757     {
2758         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2759         std::lock_guard<ffrt::mutex> guard(sessionLock_);
2760         for (const auto& [sessionId, abilityRecord] : sessionAbilityMap_) {
2761             sessionAbilityMapLocked[sessionId] = abilityRecord;
2762         }
2763     }
2764     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2765     info.push_back(dumpInfo);
2766     dumpInfo = "  current mission lists:{";
2767     info.push_back(dumpInfo);
2768 
2769     for (const auto& [sessionId, abilityRecord] : sessionAbilityMapLocked) {
2770         if (abilityRecord == nullptr) {
2771             TAG_LOGW(AAFwkTag::ABILITYMGR, "null abilityRecord");
2772             continue;
2773         }
2774         if (abilityRecord->GetAbilityRecordId() != abilityRecordId) {
2775             continue;
2776         }
2777         sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2778         dumpInfo = "    Mission ID #" + std::to_string(sessionId);
2779         if (sessionInfo) {
2780             dumpInfo += "  mission name #[" + sessionInfo->sessionName + "]";
2781         }
2782         dumpInfo += "  lockedState #" + std::to_string(abilityRecord->GetLockedState());
2783         dumpInfo += "  mission affinity #[" + abilityRecord->GetMissionAffinity() + "]";
2784         info.push_back(dumpInfo);
2785 
2786         abilityRecord->DumpAbilityState(info, isClient, params);
2787     }
2788     dumpInfo = " }";
2789     info.push_back(dumpInfo);
2790 }
2791 
MoveMissionToFront(int32_t sessionId,std::shared_ptr<StartOptions> startOptions)2792 int UIAbilityLifecycleManager::MoveMissionToFront(int32_t sessionId, std::shared_ptr<StartOptions> startOptions)
2793 {
2794     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2795     auto tmpSceneSession = iface_cast<Rosen::ISession>(rootSceneSession_);
2796     CHECK_POINTER_AND_RETURN(tmpSceneSession, ERR_INVALID_VALUE);
2797     std::shared_ptr<AbilityRecord> abilityRecord = GetAbilityRecordsById(sessionId);
2798     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2799     if (startOptions != nullptr) {
2800         abilityRecord->SetWindowMode(startOptions->GetWindowMode());
2801     }
2802     sptr<SessionInfo> sessionInfo = abilityRecord->GetSessionInfo();
2803     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2804     sessionInfo->processOptions = nullptr;
2805     sessionInfo->startWindowOption = nullptr;
2806     TAG_LOGI(AAFwkTag::ABILITYMGR, "call PendingSessionActivation by rootSceneSession"
2807         "windowLeft=%{public}d,windowTop=%{public}d,"
2808         "windowHeight=%{public}d,windowWidth=%{public}d",
2809         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_LEFT, 0),
2810         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_TOP, 0),
2811         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_HEIGHT, 0),
2812         (sessionInfo->want).GetIntParam(Want::PARAM_RESV_WINDOW_WIDTH, 0));
2813     sessionInfo->canStartAbilityFromBackground = true;
2814     return static_cast<int>(tmpSceneSession->PendingSessionActivation(sessionInfo));
2815 }
2816 
GetStatusBarDelegateManager()2817 std::shared_ptr<StatusBarDelegateManager> UIAbilityLifecycleManager::GetStatusBarDelegateManager()
2818 {
2819     std::lock_guard<ffrt::mutex> lock(statusBarDelegateManagerLock_);
2820     if (statusBarDelegateManager_ == nullptr) {
2821         statusBarDelegateManager_ = std::make_shared<StatusBarDelegateManager>();
2822     }
2823     return statusBarDelegateManager_;
2824 }
2825 
RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)2826 int32_t UIAbilityLifecycleManager::RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)
2827 {
2828     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2829     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE);
2830     return statusBarDelegateManager->RegisterStatusBarDelegate(delegate);
2831 }
2832 
IsCallerInStatusBar(const std::string & instanceKey)2833 bool UIAbilityLifecycleManager::IsCallerInStatusBar(const std::string &instanceKey)
2834 {
2835     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2836     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, false);
2837     return statusBarDelegateManager->IsCallerInStatusBar(instanceKey);
2838 }
2839 
IsInStatusBar(uint32_t accessTokenId,bool isMultiInstance)2840 bool UIAbilityLifecycleManager::IsInStatusBar(uint32_t accessTokenId, bool isMultiInstance)
2841 {
2842     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2843     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, false);
2844     return statusBarDelegateManager->IsInStatusBar(accessTokenId, isMultiInstance);
2845 }
2846 
IsSupportStatusBar()2847 bool UIAbilityLifecycleManager::IsSupportStatusBar()
2848 {
2849     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2850     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, false);
2851     return statusBarDelegateManager->IsSupportStatusBar();
2852 }
2853 
DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)2854 int32_t UIAbilityLifecycleManager::DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)
2855 {
2856     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2857     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE);
2858     return statusBarDelegateManager->DoProcessAttachment(abilityRecord);
2859 }
2860 
DoCallerProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)2861 int32_t UIAbilityLifecycleManager::DoCallerProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)
2862 {
2863     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2864     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE);
2865     return statusBarDelegateManager->DoCallerProcessAttachment(abilityRecord);
2866 }
2867 
DoCallerProcessDetachment(std::shared_ptr<AbilityRecord> abilityRecord)2868 int32_t UIAbilityLifecycleManager::DoCallerProcessDetachment(std::shared_ptr<AbilityRecord> abilityRecord)
2869 {
2870     auto statusBarDelegateManager = GetStatusBarDelegateManager();
2871     CHECK_POINTER_AND_RETURN(statusBarDelegateManager, ERR_INVALID_VALUE);
2872     return statusBarDelegateManager->DoCallerProcessDetachment(abilityRecord);
2873 }
2874 
CheckPrepareTerminateTokens(const std::vector<sptr<IRemoteObject>> & tokens,uint32_t & tokenId,std::map<std::string,std::vector<sptr<IRemoteObject>>> & tokensPerModuleName)2875 bool UIAbilityLifecycleManager::CheckPrepareTerminateTokens(const std::vector<sptr<IRemoteObject>> &tokens,
2876     uint32_t &tokenId, std::map<std::string, std::vector<sptr<IRemoteObject>>> &tokensPerModuleName)
2877 {
2878     if (!AppUtils::GetInstance().IsStartOptionsWithAnimation()) {
2879         TAG_LOGE(AAFwkTag::ABILITYMGR, "Not supported device");
2880         return false;
2881     }
2882     if (tokens.empty()) {
2883         TAG_LOGW(AAFwkTag::ABILITYMGR, "empty tokens");
2884         return false;
2885     }
2886     for (auto token: tokens) {
2887         auto abilityRecord = Token::GetAbilityRecordByToken(token);
2888         if (abilityRecord == nullptr) {
2889             continue;
2890         }
2891         tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
2892         auto moduleName = abilityRecord->GetAbilityInfo().moduleName;
2893         if (tokensPerModuleName.find(moduleName) == tokensPerModuleName.end()) {
2894             tokensPerModuleName[moduleName] = {};
2895         }
2896         tokensPerModuleName[moduleName].push_back(token);
2897     }
2898     if (tokenId == 0 || !AAFwk::PermissionVerification::GetInstance()->VerifyPrepareTerminatePermission(tokenId)) {
2899         TAG_LOGE(AAFwkTag::ABILITYMGR, "invalid tokenId or no permission ohos.permission.PREPARE_APP_TERMINATE");
2900         return false;
2901     }
2902     return true;
2903 }
2904 
HandleAbilityStageOnPrepareTerminationTimeout(int32_t pid,const std::string & moduleName,const std::vector<sptr<IRemoteObject>> & tokens)2905 void UIAbilityLifecycleManager::HandleAbilityStageOnPrepareTerminationTimeout(
2906     int32_t pid, const std::string &moduleName, const std::vector<sptr<IRemoteObject>> &tokens)
2907 {
2908     TAG_LOGE(AAFwkTag::ABILITYMGR, "handle abilityStage.onPrepareTermination timeout, token size=%{public}zu",
2909         tokens.size());
2910     for (auto token: tokens) {
2911         TerminateSession(Token::GetAbilityRecordByToken(token));
2912     }
2913     auto iter = std::find_if(prepareTerminateByPidRecords_.begin(), prepareTerminateByPidRecords_.end(),
2914         [pid, _moduleName = moduleName](const std::shared_ptr<PrepareTerminateByPidRecord> &record) {
2915         return record->pid_ == pid && record->moduleName_ == _moduleName;
2916     });
2917     if (iter != prepareTerminateByPidRecords_.end()) {
2918         prepareTerminateByPidRecords_.erase(iter);
2919     }
2920 }
2921 
PrepareTerminateAppAndGetRemainingInner(int32_t pid,const std::string & moduleName,const std::vector<sptr<IRemoteObject>> & tokens)2922 std::vector<sptr<IRemoteObject>> UIAbilityLifecycleManager::PrepareTerminateAppAndGetRemainingInner(
2923     int32_t pid, const std::string &moduleName, const std::vector<sptr<IRemoteObject>> &tokens)
2924 {
2925     std::vector<sptr<IRemoteObject>> remainingTokens;
2926     // execute onPrepareTerminate until timeout
2927     std::unique_lock<std::mutex> lock(isTryPrepareTerminateByPidsDoneMutex_);
2928     auto iter = std::find_if(prepareTerminateByPidRecords_.begin(), prepareTerminateByPidRecords_.end(),
2929         [pid, _moduleName = moduleName](const std::shared_ptr<PrepareTerminateByPidRecord> &record) {
2930         return record->pid_ == pid && record->moduleName_ == _moduleName;
2931     });
2932     if (iter != prepareTerminateByPidRecords_.end()) {
2933         TAG_LOGE(AAFwkTag::ABILITYMGR, "record with (pid=%{public}d,moduleName=%{public}s) already exists",
2934             pid, moduleName.c_str());
2935         return remainingTokens;
2936     }
2937     std::shared_ptr<PrepareTerminateByPidRecord> record = std::make_shared<PrepareTerminateByPidRecord>(
2938         pid, moduleName, false, 0, false);
2939     prepareTerminateByPidRecords_.push_back(record);
2940     auto condition = [record] {
2941         if (record == nullptr) {
2942             TAG_LOGE(AAFwkTag::ABILITYMGR, "null record");
2943             return false;
2944         }
2945         return record->isTryPrepareTerminateByPidsDone_.load();
2946     };
2947     auto task = [pid, _moduleName = moduleName]() {
2948         DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminateApp(pid, _moduleName);
2949     };
2950     ffrt::submit(task);
2951     if (!isTryPrepareTerminateByPidsCv_.wait_for(lock,
2952         std::chrono::milliseconds(GlobalConstant::PREPARE_TERMINATE_TIMEOUT_TIME), condition)) {
2953         TAG_LOGE(AAFwkTag::ABILITYMGR, "wait timeout, kill immediately");
2954         HandleAbilityStageOnPrepareTerminationTimeout(pid, moduleName, tokens);
2955     } else if (!record->isExist_) {
2956         TAG_LOGE(AAFwkTag::ABILITYMGR, "onPrepareTermination/onPrepareTerminationAsync not exist");
2957         remainingTokens.insert(remainingTokens.end(), tokens.begin(), tokens.end());
2958     } else if (static_cast<AppExecFwk::PrepareTermination>(record->prepareTermination_) ==
2959         AppExecFwk::PrepareTermination::CANCEL) {
2960         TAG_LOGI(AAFwkTag::ABILITYMGR, "PrepareTerminate cancel");
2961     } else {
2962         // Terminate immediately by default
2963         TAG_LOGI(AAFwkTag::ABILITYMGR, "PrepareTerminate immediately");
2964         for (auto token: tokens) {
2965             TerminateSession(Token::GetAbilityRecordByToken(token));
2966         }
2967     }
2968     return remainingTokens;
2969 }
2970 
PrepareTerminateAppAndGetRemaining(int32_t pid,const std::vector<sptr<IRemoteObject>> & tokens)2971 std::vector<sptr<IRemoteObject>> UIAbilityLifecycleManager::PrepareTerminateAppAndGetRemaining(
2972     int32_t pid, const std::vector<sptr<IRemoteObject>> &tokens)
2973 {
2974     uint32_t tokenId = 0;
2975     std::map<std::string, std::vector<sptr<IRemoteObject>>> tokensPerModuleName;
2976     if (!CheckPrepareTerminateTokens(tokens, tokenId, tokensPerModuleName)) {
2977         TAG_LOGE(AAFwkTag::ABILITYMGR, "CheckPrepareTerminateTokens failed");
2978         return tokens;
2979     }
2980     std::vector<sptr<IRemoteObject>> remainingTokens;
2981     for (const auto& [moduleName, _tokens] : tokensPerModuleName) {
2982         auto _remainingTokens = PrepareTerminateAppAndGetRemainingInner(pid, moduleName, _tokens);
2983         if (!_remainingTokens.empty()) {
2984             remainingTokens.insert(remainingTokens.end(), _remainingTokens.begin(), _remainingTokens.end());
2985         }
2986     }
2987     return remainingTokens;
2988 }
2989 
TryPrepareTerminateByPids(const std::vector<int32_t> & pids)2990 int32_t UIAbilityLifecycleManager::TryPrepareTerminateByPids(const std::vector<int32_t>& pids)
2991 {
2992     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2993     TAG_LOGI(AAFwkTag::ABILITYMGR, "prepare terminate app");
2994     IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->BlockProcessCacheByPids(pids));
2995     for (const auto &pid : pids) {
2996         std::unordered_set<std::shared_ptr<AbilityRecord>> abilitysToTerminate;
2997         std::vector<sptr<IRemoteObject>> tokens;
2998         IN_PROCESS_CALL_WITHOUT_RET(
2999             DelayedSingleton<AppScheduler>::GetInstance()->GetAbilityRecordsByProcessID(pid, tokens));
3000         for (const auto &token : PrepareTerminateAppAndGetRemaining(pid, tokens)) {
3001             auto abilityRecord = Token::GetAbilityRecordByToken(token);
3002             if (PrepareTerminateAbility(abilityRecord, true)) {
3003                 TAG_LOGI(AAFwkTag::ABILITYMGR, "terminate blocked");
3004                 continue;
3005             }
3006             abilitysToTerminate.emplace(abilityRecord);
3007         }
3008         for (const auto &abilityRecord : abilitysToTerminate) {
3009             TerminateSession(abilityRecord);
3010         }
3011     }
3012     TAG_LOGI(AAFwkTag::ABILITYMGR, "end.");
3013     return ERR_OK;
3014 }
3015 
TryPrepareTerminateByPidsDone(const std::string & moduleName,int32_t prepareTermination,bool isExist)3016 void UIAbilityLifecycleManager::TryPrepareTerminateByPidsDone(const std::string &moduleName,
3017     int32_t prepareTermination, bool isExist)
3018 {
3019     auto pid = IPCSkeleton::GetCallingPid();
3020     TAG_LOGD(AAFwkTag::ABILITYMGR, "call TryPrepareTerminateByPidsDone, pid=%{public}d", pid);
3021     std::unique_lock<std::mutex> lock(isTryPrepareTerminateByPidsDoneMutex_);
3022     auto iter = std::find_if(prepareTerminateByPidRecords_.begin(), prepareTerminateByPidRecords_.end(),
3023         [pid, _moduleName = moduleName](const std::shared_ptr<PrepareTerminateByPidRecord> &record) {
3024         return record->pid_ == pid && record->moduleName_ == _moduleName;
3025     });
3026     if (iter == prepareTerminateByPidRecords_.end()) {
3027         TAG_LOGE(AAFwkTag::ABILITYMGR, "record with (pid=%{public}d,moduleName=%{public}s) not exist",
3028             pid, moduleName.c_str());
3029         return;
3030     }
3031     if ((*iter) == nullptr) {
3032         TAG_LOGE(AAFwkTag::ABILITYMGR, "record is nullptr");
3033         prepareTerminateByPidRecords_.erase(iter);
3034         return;
3035     }
3036     (*iter)->prepareTermination_ = prepareTermination;
3037     (*iter)->isExist_ = isExist;
3038     (*iter)->isTryPrepareTerminateByPidsDone_.store(true);
3039     isTryPrepareTerminateByPidsCv_.notify_one();
3040     prepareTerminateByPidRecords_.erase(iter);
3041 }
3042 
CancelPrepareTerminate(std::shared_ptr<AbilityRecord> abilityRecord)3043 void UIAbilityLifecycleManager::CancelPrepareTerminate(std::shared_ptr<AbilityRecord> abilityRecord)
3044 {
3045     CHECK_POINTER(abilityRecord);
3046     auto abilityInfo = abilityRecord->GetAbilityInfo();
3047     TAG_LOGI(AAFwkTag::ABILITYMGR,
3048         "canceling PrepareTerminate,bundle=%{public}s,module=%{public}s,ability=%{public}s",
3049         abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
3050     std::unique_lock<std::mutex> lock(isTryPrepareTerminateByPidsDoneMutex_);
3051     auto iter = std::find_if(prepareTerminateByPidRecords_.begin(), prepareTerminateByPidRecords_.end(),
3052         [pid = abilityRecord->GetPid(), moduleName = abilityInfo.moduleName](
3053             const std::shared_ptr<PrepareTerminateByPidRecord> &record) {
3054         return record->pid_ == pid && record->moduleName_ == moduleName;
3055     });
3056     if (iter == prepareTerminateByPidRecords_.end()) {
3057         TAG_LOGI(AAFwkTag::ABILITYMGR, "record with (pid=%{public}d,moduleName=%{public}s) not exist",
3058             abilityRecord->GetPid(), abilityInfo.moduleName.c_str());
3059         return;
3060     }
3061     if ((*iter) == nullptr) {
3062         TAG_LOGE(AAFwkTag::ABILITYMGR, "record is nullptr");
3063         prepareTerminateByPidRecords_.erase(iter);
3064         return;
3065     }
3066     // no need to terminate again, return cancel by default
3067     (*iter)->prepareTermination_ = static_cast<int32_t>(AppExecFwk::PrepareTermination::CANCEL);
3068     (*iter)->isExist_ = true;
3069     (*iter)->isTryPrepareTerminateByPidsDone_.store(true);
3070     isTryPrepareTerminateByPidsCv_.notify_one();
3071     prepareTerminateByPidRecords_.erase(iter);
3072 }
3073 
BatchCloseUIAbility(const std::unordered_set<std::shared_ptr<AbilityRecord>> & abilitySet)3074 void UIAbilityLifecycleManager::BatchCloseUIAbility(
3075     const std::unordered_set<std::shared_ptr<AbilityRecord>>& abilitySet)
3076 {
3077     auto closeTask = [ self = shared_from_this(), abilitySet]() {
3078         TAG_LOGI(AAFwkTag::ABILITYMGR, "abilities must close");
3079         if (self == nullptr) {
3080             TAG_LOGE(AAFwkTag::ABILITYMGR, "null manager");
3081             return;
3082         }
3083         for (const auto& ability : abilitySet) {
3084             self->CloseUIAbility(ability, -1, nullptr, false);
3085         }
3086     };
3087     auto taskHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
3088     if (taskHandler != nullptr) {
3089         taskHandler->SubmitTask(closeTask, TaskQoS::USER_INTERACTIVE);
3090     }
3091 }
3092 
TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord)3093 void UIAbilityLifecycleManager::TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord)
3094 {
3095     CHECK_POINTER(abilityRecord);
3096     auto sessionInfo = abilityRecord->GetSessionInfo();
3097     CHECK_POINTER(sessionInfo);
3098     CHECK_POINTER(sessionInfo->sessionToken);
3099     auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
3100     CHECK_POINTER(session);
3101     TAG_LOGI(AAFwkTag::ABILITYMGR, "call TerminateSession, session id: %{public}d", sessionInfo->persistentId);
3102     session->TerminateSession(sessionInfo);
3103 }
3104 
ChangeAbilityVisibility(sptr<IRemoteObject> token,bool isShow)3105 int UIAbilityLifecycleManager::ChangeAbilityVisibility(sptr<IRemoteObject> token, bool isShow)
3106 {
3107     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3108     std::shared_ptr<AbilityRecord> abilityRecord;
3109     {
3110         std::lock_guard<ffrt::mutex> guard(sessionLock_);
3111         abilityRecord = GetAbilityRecordByToken(token);
3112     }
3113     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
3114     if (IPCSkeleton::GetCallingTokenID() != abilityRecord->GetApplicationInfo().accessTokenId) {
3115         TAG_LOGE(AAFwkTag::ABILITYMGR, "not self");
3116         return ERR_NATIVE_NOT_SELF_APPLICATION;
3117     }
3118     auto sessionInfo = abilityRecord->GetSessionInfo();
3119     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
3120 
3121     do {
3122         if (HiddenStartObserverManager::GetInstance().IsHiddenStart(abilityRecord->GetApplicationInfo().uid)) {
3123             if (!IsCallerInStatusBar(abilityRecord->GetInstanceKey())) {
3124                 TAG_LOGI(AAFwkTag::ABILITYMGR, "no status bar while detaching.");
3125                 break;
3126             }
3127             auto ret = DoCallerProcessDetachment(abilityRecord);
3128             if (ret != ERR_OK) {
3129                 TAG_LOGE(AAFwkTag::ABILITYMGR, "caller detach to status bar failed, ret: %{public}d", ret);
3130                 return ERR_START_OPTIONS_CHECK_FAILED;
3131             }
3132             TAG_LOGI(AAFwkTag::ABILITYMGR, "Hidden start allowed by observer.");
3133             break;
3134         }
3135         if (!IsCallerInStatusBar(abilityRecord->GetInstanceKey()) && sessionInfo->processOptions != nullptr &&
3136             !ProcessOptions::IsNoAttachmentMode(sessionInfo->processOptions->processMode) &&
3137             !sessionInfo->processOptions->isRestartKeepAlive) {
3138             TAG_LOGE(AAFwkTag::ABILITYMGR, "caller not add to status bar");
3139             return ERR_START_OPTIONS_CHECK_FAILED;
3140         }
3141         if (sessionInfo->processOptions == nullptr ||
3142             (!ProcessOptions::IsAttachToStatusBarMode(sessionInfo->processOptions->processMode) &&
3143             !ProcessOptions::IsNoAttachmentMode(sessionInfo->processOptions->processMode) &&
3144             !sessionInfo->processOptions->isRestartKeepAlive)) {
3145             auto ret = DoCallerProcessAttachment(abilityRecord);
3146             if (ret != ERR_OK) {
3147                 TAG_LOGE(AAFwkTag::ABILITYMGR, "caller attach to status bar failed, ret: %{public}d", ret);
3148                 return ERR_START_OPTIONS_CHECK_FAILED;
3149             }
3150         }
3151     } while (false);
3152 
3153     auto callerSessionInfo = abilityRecord->GetSessionInfo();
3154     CHECK_POINTER_AND_RETURN(callerSessionInfo, ERR_INVALID_VALUE);
3155     CHECK_POINTER_AND_RETURN(callerSessionInfo->sessionToken, ERR_INVALID_VALUE);
3156     auto callerSession = iface_cast<Rosen::ISession>(callerSessionInfo->sessionToken);
3157     TAG_LOGI(AAFwkTag::ABILITYMGR, "got callerSession, call ChangeSessionVisibilityWithStatusBar()");
3158     CHECK_POINTER_AND_RETURN(callerSession, ERR_INVALID_VALUE);
3159     return static_cast<int>(callerSession->ChangeSessionVisibilityWithStatusBar(callerSessionInfo, isShow));
3160 }
3161 
ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo,bool isShow)3162 int UIAbilityLifecycleManager::ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo, bool isShow)
3163 {
3164     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3165     std::lock_guard<ffrt::mutex> guard(sessionLock_);
3166     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
3167     auto iter = sessionAbilityMap_.find(sessionInfo->persistentId);
3168     if (iter == sessionAbilityMap_.end()) {
3169         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not found");
3170         return ERR_NATIVE_ABILITY_NOT_FOUND;
3171     }
3172     std::shared_ptr<AbilityRecord> uiAbilityRecord = iter->second;
3173     CHECK_POINTER_AND_RETURN(uiAbilityRecord, ERR_INVALID_VALUE);
3174     TAG_LOGI(AAFwkTag::ABILITYMGR, "change ability visibility: %{public}d", isShow);
3175     if (isShow) {
3176         uiAbilityRecord->SetAbilityVisibilityState(AbilityVisibilityState::FOREGROUND_SHOW);
3177 #ifdef SUPPORT_SCREEN
3178         if (uiAbilityRecord->GetPendingState() != AbilityState::INITIAL) {
3179             TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state: FOREGROUND/ BACKGROUND, dropped");
3180             uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
3181             return ERR_OK;
3182         } else {
3183             TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is not FOREGROUND or BACKGROUND.");
3184             uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
3185         }
3186         uiAbilityRecord->ProcessForegroundAbility(sessionInfo->callingTokenId);
3187 #endif // SUPPORT_SCREEN
3188     } else {
3189         uiAbilityRecord->SetAbilityVisibilityState(AbilityVisibilityState::FOREGROUND_HIDE);
3190     }
3191     return ERR_OK;
3192 }
3193 
UpdateSessionInfoBySCB(std::list<SessionInfo> & sessionInfos,std::vector<int32_t> & sessionIds)3194 int32_t UIAbilityLifecycleManager::UpdateSessionInfoBySCB(std::list<SessionInfo> &sessionInfos,
3195     std::vector<int32_t> &sessionIds)
3196 {
3197     std::unordered_set<std::shared_ptr<AbilityRecord>> abilitySet;
3198     {
3199         std::lock_guard<ffrt::mutex> guard(sessionLock_);
3200         isSCBRecovery_ = false;
3201         for (auto [sessionId, abilityRecord] : sessionAbilityMap_) {
3202             bool isFind = false;
3203             for (auto iter = sessionInfos.begin(); iter != sessionInfos.end(); iter++) {
3204                 if (iter->persistentId == sessionId) {
3205                     abilityRecord->UpdateSessionInfo(iter->sessionToken);
3206                     sessionInfos.erase(iter);
3207                     isFind = true;
3208                     break;
3209                 }
3210             }
3211             if (!isFind && coldStartInSCBRecovery_.count(sessionId) == 0) {
3212                 abilitySet.emplace(abilityRecord);
3213             }
3214         }
3215         coldStartInSCBRecovery_.clear();
3216     }
3217     for (const auto &info : sessionInfos) {
3218         sessionIds.emplace_back(info.persistentId);
3219     }
3220 
3221     BatchCloseUIAbility(abilitySet);
3222     TAG_LOGI(AAFwkTag::ABILITYMGR, "end of updating sessionInfo");
3223     return ERR_OK;
3224 }
3225 
SignRestartAppFlag(int32_t uid,const std::string & instanceKey,bool isAppRecovery)3226 void UIAbilityLifecycleManager::SignRestartAppFlag(int32_t uid, const std::string &instanceKey, bool isAppRecovery)
3227 {
3228     std::lock_guard<ffrt::mutex> guard(sessionLock_);
3229     auto tempSessionAbilityMap = sessionAbilityMap_;
3230     for (auto &[sessionId, abilityRecord] : tempSessionAbilityMap) {
3231         if (abilityRecord == nullptr || abilityRecord->GetUid() != uid ||
3232             abilityRecord->GetInstanceKey() != instanceKey) {
3233             continue;
3234         }
3235         abilityRecord->SetRestartAppFlag(true);
3236         std::string reason = "onAbilityDied";
3237         if (isAppRecovery) {
3238             reason = "appRecovery";
3239         }
3240         NotifySCBToHandleException(abilityRecord, static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_DIED),
3241             reason);
3242     }
3243 }
3244 
CompleteFirstFrameDrawing(int32_t sessionId) const3245 void UIAbilityLifecycleManager::CompleteFirstFrameDrawing(int32_t sessionId) const
3246 {
3247     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
3248     auto abilityRecord = GetAbilityRecordsById(sessionId);
3249     if (abilityRecord == nullptr) {
3250         TAG_LOGW(AAFwkTag::ABILITYMGR, "completeFirstFrameDrawing, get AbilityRecord by sessionId failed");
3251         return;
3252     }
3253     abilityRecord->ReportAtomicServiceDrawnCompleteEvent();
3254 #ifdef SUPPORT_SCREEN
3255     abilityRecord->SetCompleteFirstFrameDrawing(true);
3256     AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance().
3257         HandleOnFirstFrameState(abilityRecord);
3258 #endif // SUPPORT_SCREEN
3259 }
3260 
StartWithPersistentIdByDistributed(const AbilityRequest & abilityRequest,int32_t persistentId)3261 int UIAbilityLifecycleManager::StartWithPersistentIdByDistributed(const AbilityRequest &abilityRequest,
3262     int32_t persistentId)
3263 {
3264     TAG_LOGI(AAFwkTag::ABILITYMGR, "StartWithPersistentIdByDistributed, called");
3265     auto sessionInfo = CreateSessionInfo(abilityRequest);
3266     sessionInfo->requestCode = abilityRequest.requestCode;
3267     sessionInfo->persistentId = persistentId;
3268     sessionInfo->userId = userId_;
3269     sessionInfo->isAtomicService =
3270         (abilityRequest.abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE);
3271     return NotifySCBPendingActivation(sessionInfo, abilityRequest);
3272 }
3273 
GetAbilityStateByPersistentId(int32_t persistentId,bool & state)3274 int32_t UIAbilityLifecycleManager::GetAbilityStateByPersistentId(int32_t persistentId, bool &state)
3275 {
3276     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
3277     std::lock_guard<ffrt::mutex> guard(sessionLock_);
3278     auto iter = sessionAbilityMap_.find(persistentId);
3279     if (iter != sessionAbilityMap_.end()) {
3280         std::shared_ptr<AbilityRecord> uiAbilityRecord = iter->second;
3281         if (uiAbilityRecord && uiAbilityRecord->GetPendingState() == AbilityState::INITIAL) {
3282             state = true;
3283             return ERR_OK;
3284         }
3285     }
3286     state = false;
3287     return ERR_INVALID_VALUE;
3288 }
3289 
CleanUIAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)3290 int32_t UIAbilityLifecycleManager::CleanUIAbility(
3291     const std::shared_ptr<AbilityRecord> &abilityRecord)
3292 {
3293     TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
3294     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
3295     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3296     std::string element = abilityRecord->GetElementName().GetURI();
3297     if (DelayedSingleton<AppScheduler>::GetInstance()->CleanAbilityByUserRequest(abilityRecord->GetToken())) {
3298         TAG_LOGI(AAFwkTag::ABILITYMGR, "user clean ability: %{public}s success", element.c_str());
3299         return ERR_OK;
3300     }
3301     TAG_LOGI(AAFwkTag::ABILITYMGR,
3302         "can not force kill when user request clean ability, schedule lifecycle:%{public}s", element.c_str());
3303     return CloseUIAbility(abilityRecord, -1, nullptr, true);
3304 }
3305 
CheckCallerFromBackground(std::shared_ptr<AbilityRecord> callerAbility,sptr<SessionInfo> & sessionInfo)3306 void UIAbilityLifecycleManager::CheckCallerFromBackground(
3307     std::shared_ptr<AbilityRecord> callerAbility, sptr<SessionInfo> &sessionInfo)
3308 {
3309     CHECK_POINTER(callerAbility);
3310     CHECK_POINTER(sessionInfo);
3311     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
3312     auto permission = AAFwk::PermissionVerification::GetInstance();
3313     bool hasPermission =
3314         permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND) ||
3315         permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILIIES_FROM_BACKGROUND);
3316 
3317     sessionInfo->canStartAbilityFromBackground = hasPermission;
3318     TAG_LOGD(AAFwkTag::ABILITYMGR, "CheckCallerFromBackground: %{public}d", sessionInfo->canStartAbilityFromBackground);
3319 }
3320 
EnableListForSCBRecovery()3321 void UIAbilityLifecycleManager::EnableListForSCBRecovery()
3322 {
3323     std::lock_guard<ffrt::mutex> guard(sessionLock_);
3324     isSCBRecovery_ = true;
3325     coldStartInSCBRecovery_.clear();
3326 }
3327 
FindRecordFromSessionMap(const AbilityRequest & abilityRequest)3328 std::shared_ptr<AbilityRecord> UIAbilityLifecycleManager::FindRecordFromSessionMap(
3329     const AbilityRequest &abilityRequest)
3330 {
3331     int32_t appIndex = 0;
3332     (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex);
3333     auto instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
3334     for (const auto &[sessionId, abilityRecord] : sessionAbilityMap_) {
3335         if (abilityRecord) {
3336             const auto &info = abilityRecord->GetAbilityInfo();
3337             if (info.name == abilityRequest.abilityInfo.name &&
3338                 info.bundleName == abilityRequest.abilityInfo.bundleName &&
3339                 info.moduleName == abilityRequest.abilityInfo.moduleName &&
3340                 appIndex == abilityRecord->GetAppIndex() && instanceKey == abilityRecord->GetInstanceKey()) {
3341                 return abilityRecord;
3342             }
3343         }
3344     }
3345     return nullptr;
3346 }
3347 
HasAbilityRequest(const AbilityRequest & abilityRequest)3348 bool UIAbilityLifecycleManager::HasAbilityRequest(const AbilityRequest &abilityRequest)
3349 {
3350     for (const auto &[requestId, item] : startAbilityCheckMap_) {
3351         if (item && CompareTwoRequest(*item, abilityRequest)) {
3352             return true;
3353         }
3354     }
3355     return false;
3356 }
3357 
AddAbilityRequest(const AbilityRequest & abilityRequest,int32_t requestId)3358 void UIAbilityLifecycleManager::AddAbilityRequest(const AbilityRequest &abilityRequest, int32_t requestId)
3359 {
3360     auto newRequest = std::make_shared<AbilityRequest>(abilityRequest);
3361     startAbilityCheckMap_.emplace(requestId, newRequest);
3362     TaskHandlerWrap::GetFfrtHandler()->SubmitTask([wThis = weak_from_this(), requestId]() {
3363         auto pThis = wThis.lock();
3364         if (pThis) {
3365             std::lock_guard guard(pThis->sessionLock_);
3366             if (pThis->startAbilityCheckMap_.erase(requestId)) {
3367                 TAG_LOGI(AAFwkTag::ABILITYMGR, "scb call timeout: %{public}d", requestId);
3368             }
3369         }
3370         }, GlobalConstant::CONCURRENT_START_TIMEOUT * GlobalConstant::TIMEOUT_UNIT_TIME);
3371 }
3372 
RemoveAbilityRequest(int32_t requestId)3373 void UIAbilityLifecycleManager::RemoveAbilityRequest(int32_t requestId)
3374 {
3375     if (requestId != 0 && startAbilityCheckMap_.erase(requestId)) {
3376         TAG_LOGD(AAFwkTag::ABILITYMGR, "RemoveAbilityRequest: %{public}d", requestId);
3377     }
3378 }
3379 
AddSpecifiedRequest(std::shared_ptr<SpecifiedRequest> request)3380 void UIAbilityLifecycleManager::AddSpecifiedRequest(std::shared_ptr<SpecifiedRequest> request)
3381 {
3382     if (!request) {
3383         return;
3384     }
3385 
3386     auto &abilityRequest = request->abilityRequest;
3387     TAG_LOGI(AAFwkTag::ABILITYMGR, "AddSpecifiedRequest: %{public}d, %{public}s", request->requestId,
3388         abilityRequest.want.GetElement().GetURI().c_str());
3389     auto instanceKey = abilityRequest.want.GetStringParam(Want::APP_INSTANCE_KEY);
3390     auto accessTokenIdStr = std::to_string(abilityRequest.abilityInfo.applicationInfo.accessTokenId);
3391     auto &list = specifiedRequestList_[accessTokenIdStr + instanceKey];
3392     list.push_back(request);
3393     if (list.size() == 1) {
3394         StartSpecifiedRequest(*request);
3395     }
3396 }
3397 
StartSpecifiedRequest(SpecifiedRequest & specifiedRequest)3398 void UIAbilityLifecycleManager::StartSpecifiedRequest(SpecifiedRequest &specifiedRequest)
3399 {
3400     TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedRequest: %{public}d", specifiedRequest.requestId);
3401     auto &request = specifiedRequest.abilityRequest;
3402 
3403     if (specifiedRequest.specifiedProcessState == SpecifiedProcessState::STATE_PROCESS) {
3404         DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedProcess(request.want,
3405             request.abilityInfo, specifiedRequest.requestId);
3406     } else {
3407         if (specifiedRequest.preCreateProcessName) {
3408             PreCreateProcessName(request);
3409         }
3410 
3411         if (specifiedRequest.specifiedProcessState == SpecifiedProcessState::STATE_NONE &&
3412             !IsSpecifiedModuleLoaded(request)) {
3413             specifiedRequest.isCold = true;
3414             auto sessionInfo = CreateSessionInfo(request);
3415             sessionInfo->requestCode = request.requestCode;
3416             sessionInfo->userId = userId_;
3417             sessionInfo->requestId = specifiedRequest.requestId;
3418             sessionInfo->isFromIcon = request.isFromIcon;
3419             TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedRequest cold");
3420             NotifySCBPendingActivation(sessionInfo, request);
3421             sessionInfo->want.RemoveAllFd();
3422         }
3423         DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility(request.want,
3424             request.abilityInfo, specifiedRequest.requestId);
3425     }
3426 
3427     auto timeoutTask = [requestId = specifiedRequest.requestId, wThis = weak_from_this()]() {
3428         auto pThis = wThis.lock();
3429         if (pThis) {
3430             pThis->OnStartSpecifiedFailed(requestId);
3431         }
3432     };
3433     TaskHandlerWrap::GetFfrtHandler()->SubmitTaskJust(timeoutTask, "SpecifiedFinalTimeout",
3434         GlobalConstant::TIMEOUT_UNIT_TIME * GlobalConstant::COLDSTART_TIMEOUT_MULTIPLE);
3435 }
3436 
PopAndGetNextSpecified(int32_t requestId)3437 std::shared_ptr<SpecifiedRequest> UIAbilityLifecycleManager::PopAndGetNextSpecified(int32_t requestId)
3438 {
3439     for (auto iter = specifiedRequestList_.begin(); iter != specifiedRequestList_.end(); ++iter) {
3440         auto &list = iter->second;
3441         if (!list.empty() && list.front()->requestId == requestId) {
3442             list.pop_front();
3443             if (list.empty()) {
3444                 TAG_LOGI(AAFwkTag::ABILITYMGR, "empty list");
3445                 specifiedRequestList_.erase(iter);
3446                 return nullptr;
3447             } else {
3448                 return list.front();
3449             }
3450         }
3451     }
3452     TAG_LOGI(AAFwkTag::ABILITYMGR, "unknown request: %{public}d", requestId);
3453     return nullptr;
3454 }
3455 
IsSpecifiedModuleLoaded(const AbilityRequest & abilityRequest)3456 bool UIAbilityLifecycleManager::IsSpecifiedModuleLoaded(const AbilityRequest &abilityRequest)
3457 {
3458     auto appMgr = AppMgrUtil::GetAppMgr();
3459     if (appMgr == nullptr) {
3460         TAG_LOGW(AAFwkTag::ABILITYMGR, "AppMgrUtil::GetAppMgr failed");
3461         return false;
3462     }
3463     bool appExist = false;
3464     auto ret = IN_PROCESS_CALL(appMgr->IsSpecifiedModuleLoaded(abilityRequest.want,
3465         abilityRequest.abilityInfo, appExist));
3466     return ret == ERR_OK && appExist;
3467 }
3468 
HandleStartSpecifiedCold(AbilityRequest & abilityRequest,sptr<SessionInfo> sessionInfo,uint32_t sceneFlag)3469 bool UIAbilityLifecycleManager::HandleStartSpecifiedCold(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
3470     uint32_t sceneFlag)
3471 {
3472     if (!sessionInfo) {
3473         return false;
3474     }
3475     const auto &abilityInfo = abilityRequest.abilityInfo;
3476     if (abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
3477         return false;
3478     }
3479 
3480     auto request = GetSpecifiedRequest(sessionInfo->requestId);
3481     if (request == nullptr || !request->isCold) {
3482         return false;
3483     }
3484 
3485     TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleStartSpecifiedCold: %{public}d, persitentId: %{public}d",
3486         request->requestId, sessionInfo->persistentId);
3487     request->persistentId = sessionInfo->persistentId;
3488     request->sceneFlag = sceneFlag;
3489     request->callingTokenId = sessionInfo->callingTokenId;
3490     return true;
3491 }
3492 
HandleColdAcceptWantDone(const AAFwk::Want & want,const std::string & flag,const SpecifiedRequest & specifiedRequest)3493 bool UIAbilityLifecycleManager::HandleColdAcceptWantDone(const AAFwk::Want &want, const std::string &flag,
3494     const SpecifiedRequest &specifiedRequest)
3495 {
3496     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3497     auto iter = sessionAbilityMap_.find(specifiedRequest.persistentId);
3498     if (iter == sessionAbilityMap_.end() || !(iter->second) ||
3499         !(iter->second->GetSpecifiedFlag().empty())) {
3500         return false;
3501     }
3502 
3503     TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleColdAcceptWantDone: %{public}d, session:%{public}d",
3504         specifiedRequest.requestId, specifiedRequest.persistentId);
3505     auto uiAbilityRecord = iter->second;
3506     CHECK_POINTER_AND_RETURN(uiAbilityRecord, false);
3507     UpdateSpecifiedFlag(uiAbilityRecord, flag);
3508     uiAbilityRecord->SetSpecifiedFlag(flag);
3509     auto isShellCall = specifiedRequest.abilityRequest.want.GetBoolParam(IS_SHELL_CALL, false);
3510     uiAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
3511     uiAbilityRecord->ProcessForegroundAbility(specifiedRequest.callingTokenId,
3512         specifiedRequest.sceneFlag, isShellCall);
3513     SendKeyEvent(specifiedRequest.abilityRequest);
3514     return true;
3515 }
3516 
GetSpecifiedRequest(int32_t requestId)3517 std::shared_ptr<SpecifiedRequest> UIAbilityLifecycleManager::GetSpecifiedRequest(int32_t requestId)
3518 {
3519     for (const auto &[key, list] : specifiedRequestList_) {
3520         if (!list.empty() && list.front()->requestId == requestId) {
3521             return list.front();
3522         }
3523     }
3524     return nullptr;
3525 }
3526 
PutSpecifiedFlag(int32_t requestId,const std::string & flag)3527 void UIAbilityLifecycleManager::PutSpecifiedFlag(int32_t requestId, const std::string &flag)
3528 {
3529     specifiedFlagMap_[requestId] = flag;
3530     auto timeoutTask = [requestId, pThis = shared_from_this()]() {
3531         std::lock_guard lock(pThis->sessionLock_);
3532         pThis->specifiedFlagMap_.erase(requestId);
3533     };
3534     TaskHandlerWrap::GetFfrtHandler()->SubmitTaskJust(timeoutTask, "PutSpecifiedFlagTimeout",
3535         AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * GlobalConstant::COLDSTART_TIMEOUT_MULTIPLE);
3536 }
3537 
SetKillForPermissionUpdateFlag(uint32_t accessTokenId)3538 void UIAbilityLifecycleManager::SetKillForPermissionUpdateFlag(uint32_t accessTokenId)
3539 {
3540     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3541     std::lock_guard<ffrt::mutex> guard(sessionLock_);
3542     for (auto it = sessionAbilityMap_.begin(); it != sessionAbilityMap_.end(); it++) {
3543         if (it->second == nullptr) {
3544             continue;
3545         }
3546         auto &abilityInfo = it->second->GetAbilityInfo();
3547         auto &applicationInfo = it->second->GetApplicationInfo();
3548         if (applicationInfo.accessTokenId == accessTokenId &&
3549             applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE &&
3550             abilityInfo.type == AppExecFwk::AbilityType::PAGE) {
3551                 it->second->SetKillForPermissionUpdateFlag(true);
3552         }
3553     }
3554 }
3555 
HandleForegroundCollaborate(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> abilityRecord)3556 void UIAbilityLifecycleManager::HandleForegroundCollaborate(
3557     const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> abilityRecord)
3558 {
3559     abilityRecord->SetWant(abilityRequest.want);
3560     if (abilityRecord->GetAbilityState() == AbilityState::FOREGROUND) {
3561         abilityRecord->ScheduleCollaborate(abilityRequest.want);
3562     }
3563 }
3564 
UpdateSpecifiedFlag(std::shared_ptr<AbilityRecord> uiAbilityRecord,const std::string & flag)3565 bool UIAbilityLifecycleManager::UpdateSpecifiedFlag(std::shared_ptr<AbilityRecord> uiAbilityRecord,
3566     const std::string &flag)
3567 {
3568     if (uiAbilityRecord == nullptr) {
3569         TAG_LOGE(AAFwkTag::ABILITYMGR, "uiAbilityRecord is nullptr");
3570         return false;
3571     }
3572     auto sessionInfo = uiAbilityRecord->GetSessionInfo();
3573     if (sessionInfo == nullptr) {
3574         TAG_LOGE(AAFwkTag::ABILITYMGR, "sessionInfo is nullptr");
3575         return false;
3576     }
3577     auto session = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
3578     if (session == nullptr) {
3579         TAG_LOGE(AAFwkTag::ABILITYMGR, "session is nullptr");
3580         return false;
3581     }
3582     session->UpdateFlag(flag);
3583     TAG_LOGD(AAFwkTag::ABILITYMGR, "call session UpdateFlag, specifiedFlag: %{public}s", flag.c_str());
3584     return true;
3585 }
3586 }  // namespace AAFwk
3587 }  // namespace OHOS