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