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