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