1/*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "ability_connect_manager.h"
17
18#include <regex>
19
20#include "ability_manager_service.h"
21#include "ability_permission_util.h"
22#include "ability_resident_process_rdb.h"
23#include "appfreeze_manager.h"
24#include "app_exit_reason_data_manager.h"
25#include "assert_fault_callback_death_mgr.h"
26#include "global_constant.h"
27#include "hitrace_meter.h"
28#include "int_wrapper.h"
29#include "multi_instance_utils.h"
30#include "res_sched_util.h"
31#include "session/host/include/zidl/session_interface.h"
32#include "startup_util.h"
33#include "ui_extension_utils.h"
34#include "ui_service_extension_connection_constants.h"
35#include "cache_extension_utils.h"
36#include "datetime_ex.h"
37#include "init_reboot.h"
38
39namespace OHOS {
40namespace AAFwk {
41namespace {
42constexpr char EVENT_KEY_UID[] = "UID";
43constexpr char EVENT_KEY_PID[] = "PID";
44constexpr char EVENT_KEY_MESSAGE[] = "MSG";
45constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
46constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
47const std::string DEBUG_APP = "debugApp";
48const std::string FRS_APP_INDEX = "ohos.extra.param.key.frs_index";
49const std::string FRS_BUNDLE_NAME = "com.ohos.formrenderservice";
50const std::string UIEXTENSION_ABILITY_ID = "ability.want.params.uiExtensionAbilityId";
51const std::string UIEXTENSION_ROOT_HOST_PID = "ability.want.params.uiExtensionRootHostPid";
52const std::string MAX_UINT64_VALUE = "18446744073709551615";
53const std::string IS_PRELOAD_UIEXTENSION_ABILITY = "ability.want.params.is_preload_uiextension_ability";
54const std::string SEPARATOR = ":";
55#ifdef SUPPORT_ASAN
56const int LOAD_TIMEOUT_MULTIPLE = 150;
57const int CONNECT_TIMEOUT_MULTIPLE = 45;
58const int COMMAND_TIMEOUT_MULTIPLE = 75;
59const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 75;
60#else
61const int LOAD_TIMEOUT_MULTIPLE = 10;
62const int CONNECT_TIMEOUT_MULTIPLE = 10;
63const int COMMAND_TIMEOUT_MULTIPLE = 5;
64const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 5;
65#endif
66const int32_t AUTO_DISCONNECT_INFINITY = -1;
67constexpr const char* FROZEN_WHITE_DIALOG = "com.huawei.hmos.huaweicast";
68constexpr char BUNDLE_NAME_DIALOG[] = "com.ohos.amsdialog";
69constexpr char ABILITY_NAME_ASSERT_FAULT_DIALOG[] = "AssertFaultDialog";
70constexpr const char* WANT_PARAMS_APP_RESTART_FLAG = "ohos.aafwk.app.restart";
71
72const std::string XIAOYI_BUNDLE_NAME = "com.huawei.hmos.vassistant";
73
74bool IsSpecialAbility(const AppExecFwk::AbilityInfo &abilityInfo)
75{
76    std::vector<std::pair<std::string, std::string>> trustAbilities{
77        { AbilityConfig::SCENEBOARD_BUNDLE_NAME, AbilityConfig::SCENEBOARD_ABILITY_NAME },
78        { AbilityConfig::SYSTEM_UI_BUNDLE_NAME, AbilityConfig::SYSTEM_UI_ABILITY_NAME },
79        { AbilityConfig::LAUNCHER_BUNDLE_NAME, AbilityConfig::LAUNCHER_ABILITY_NAME }
80    };
81    for (const auto &pair : trustAbilities) {
82        if (pair.first == abilityInfo.bundleName && pair.second == abilityInfo.name) {
83            return true;
84        }
85    }
86    return false;
87}
88}
89
90AbilityConnectManager::AbilityConnectManager(int userId) : userId_(userId)
91{
92    uiExtensionAbilityRecordMgr_ = std::make_unique<AbilityRuntime::ExtensionRecordManager>(userId);
93}
94
95AbilityConnectManager::~AbilityConnectManager()
96{}
97
98int AbilityConnectManager::StartAbility(const AbilityRequest &abilityRequest)
99{
100    std::lock_guard guard(serialMutex_);
101    return StartAbilityLocked(abilityRequest);
102}
103
104int AbilityConnectManager::TerminateAbility(const sptr<IRemoteObject> &token)
105{
106    std::lock_guard guard(serialMutex_);
107    return TerminateAbilityInner(token);
108}
109
110int AbilityConnectManager::TerminateAbilityInner(const sptr<IRemoteObject> &token)
111{
112    auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
113    if (abilityRecord == nullptr) {
114        abilityRecord = GetExtensionByTokenFromAbilityCache(token);
115    }
116    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
117    std::string element = abilityRecord->GetURI();
118    TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate ability, ability is %{public}s.", element.c_str());
119    if (IsUIExtensionAbility(abilityRecord)) {
120        if (!abilityRecord->IsConnectListEmpty()) {
121            TAG_LOGD(AAFwkTag::ABILITYMGR, "exist connection, don't terminate");
122            return ERR_OK;
123        } else if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND) ||
124            abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING) ||
125            abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
126            TAG_LOGD(AAFwkTag::ABILITYMGR, "current ability is active");
127            DoBackgroundAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo());
128            MoveToTerminatingMap(abilityRecord);
129            return ERR_OK;
130        }
131    }
132    MoveToTerminatingMap(abilityRecord);
133    return TerminateAbilityLocked(token);
134}
135
136int AbilityConnectManager::StopServiceAbility(const AbilityRequest &abilityRequest)
137{
138    TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
139    std::lock_guard guard(serialMutex_);
140    return StopServiceAbilityLocked(abilityRequest);
141}
142
143int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityRequest)
144{
145    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
146    TAG_LOGD(AAFwkTag::ABILITYMGR, "ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
147
148    int32_t ret = AbilityPermissionUtil::GetInstance().CheckMultiInstanceKeyForExtension(abilityRequest);
149    if (ret != ERR_OK) {
150        //  Do not distinguishing specific error codes
151        return ERR_INVALID_VALUE;
152    }
153
154    std::shared_ptr<AbilityRecord> targetService;
155    bool isLoadedAbility = false;
156    if (UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType)) {
157        auto callerAbilityRecord = AAFwk::Token::GetAbilityRecordByToken(abilityRequest.callerToken);
158        if (callerAbilityRecord == nullptr) {
159            TAG_LOGE(AAFwkTag::ABILITYMGR, "null callerAbilityRecord");
160            return ERR_NULL_OBJECT;
161        }
162        std::string hostBundleName = callerAbilityRecord->GetAbilityInfo().bundleName;
163        ret = GetOrCreateExtensionRecord(abilityRequest, false, hostBundleName, targetService, isLoadedAbility);
164        if (ret != ERR_OK) {
165            TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, ret: %{public}d", ret);
166            return ret;
167        }
168    } else {
169        GetOrCreateServiceRecord(abilityRequest, false, targetService, isLoadedAbility);
170    }
171    CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
172    TAG_LOGI(AAFwkTag::ABILITYMGR, "StartAbility:%{public}s", targetService->GetURI().c_str());
173
174    targetService->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
175
176    targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_EXTENSION);
177
178    targetService->DoBackgroundAbilityWindowDelayed(false);
179
180    targetService->SetSessionInfo(abilityRequest.sessionInfo);
181
182    if (IsUIExtensionAbility(targetService) && abilityRequest.sessionInfo && abilityRequest.sessionInfo->sessionToken) {
183        auto &remoteObj = abilityRequest.sessionInfo->sessionToken;
184        {
185            std::lock_guard guard(uiExtensionMapMutex_);
186            uiExtensionMap_[remoteObj] = UIExtWindowMapValType(targetService, abilityRequest.sessionInfo);
187        }
188        AddUIExtWindowDeathRecipient(remoteObj);
189    }
190
191    ret = ReportXiaoYiToRSSIfNeeded(abilityRequest.abilityInfo);
192    if (ret != ERR_OK) {
193        return ret;
194    }
195
196    if (!isLoadedAbility) {
197        TAG_LOGD(AAFwkTag::ABILITYMGR, "Target service has not been loaded.");
198        SetLastExitReason(abilityRequest, targetService);
199        if (IsUIExtensionAbility(targetService)) {
200            targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
201        }
202        targetService->GrantUriPermissionForServiceExtension();
203        LoadAbility(targetService);
204    } else if (targetService->IsAbilityState(AbilityState::ACTIVE) && !IsUIExtensionAbility(targetService)) {
205        // It may have been started through connect
206        targetService->SetWant(abilityRequest.want);
207        targetService->GrantUriPermissionForServiceExtension();
208        CommandAbility(targetService);
209    } else if (IsUIExtensionAbility(targetService)) {
210        DoForegroundUIExtension(targetService, abilityRequest);
211    } else {
212        TAG_LOGI(AAFwkTag::ABILITYMGR, "targetService activating");
213        EnqueueStartServiceReq(abilityRequest);
214        return ERR_OK;
215    }
216    return ERR_OK;
217}
218
219void AbilityConnectManager::SetLastExitReason(
220    const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &targetRecord)
221{
222    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
223    if (targetRecord == nullptr || !UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType)) {
224        TAG_LOGD(AAFwkTag::ABILITYMGR, "Failed to set UIExtensionAbility last exit reason.");
225        return;
226    }
227    auto appExitReasonDataMgr = DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance();
228    if (appExitReasonDataMgr == nullptr) {
229        TAG_LOGE(AAFwkTag::ABILITYMGR, "null appExitReasonDataMgr");
230        return;
231    }
232
233    ExitReason exitReason = { REASON_UNKNOWN, "" };
234    const std::string keyEx = targetRecord->GetAbilityInfo().bundleName + SEPARATOR +
235                              targetRecord->GetAbilityInfo().moduleName + SEPARATOR +
236                              targetRecord->GetAbilityInfo().name;
237    if (!appExitReasonDataMgr->GetUIExtensionAbilityExitReason(keyEx, exitReason)) {
238        TAG_LOGD(AAFwkTag::ABILITYMGR, "There is no record of UIExtensionAbility's last exit reason in the database.");
239        return;
240    }
241    targetRecord->SetLastExitReason(exitReason);
242}
243
244void AbilityConnectManager::DoForegroundUIExtension(std::shared_ptr<AbilityRecord> abilityRecord,
245    const AbilityRequest &abilityRequest)
246{
247    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
248    CHECK_POINTER(abilityRecord);
249    CHECK_POINTER(abilityRequest.sessionInfo);
250    auto abilitystateStr = abilityRecord->ConvertAbilityState(abilityRecord->GetAbilityState());
251    TAG_LOGI(AAFwkTag::ABILITYMGR,
252        "foreground ability: %{public}s, persistentId: %{public}d, abilityState: %{public}s",
253        abilityRecord->GetURI().c_str(), abilityRequest.sessionInfo->persistentId, abilitystateStr.c_str());
254    if (abilityRecord->IsReady() && !abilityRecord->IsAbilityState(AbilityState::INACTIVATING) &&
255        !abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING) &&
256        !abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING) &&
257        abilityRecord->IsAbilityWindowReady()) {
258        if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
259            abilityRecord->SetWant(abilityRequest.want);
260            CommandAbilityWindow(abilityRecord, abilityRequest.sessionInfo, WIN_CMD_FOREGROUND);
261            return;
262        } else {
263            abilityRecord->SetWant(abilityRequest.want);
264            abilityRecord->PostUIExtensionAbilityTimeoutTask(AbilityManagerService::FOREGROUND_TIMEOUT_MSG);
265            DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
266            return;
267        }
268    }
269    EnqueueStartServiceReq(abilityRequest, abilityRecord->GetURI());
270}
271
272void AbilityConnectManager::EnqueueStartServiceReq(const AbilityRequest &abilityRequest, const std::string &serviceUri)
273{
274    std::lock_guard guard(startServiceReqListLock_);
275    auto abilityUri = abilityRequest.want.GetElement().GetURI();
276    if (!serviceUri.empty()) {
277        abilityUri = serviceUri;
278    }
279    TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityUri: %{public}s", abilityUri.c_str());
280    auto reqListIt = startServiceReqList_.find(abilityUri);
281    if (reqListIt != startServiceReqList_.end()) {
282        reqListIt->second->push_back(abilityRequest);
283    } else {
284        auto reqList = std::make_shared<std::list<AbilityRequest>>();
285        reqList->push_back(abilityRequest);
286        startServiceReqList_.emplace(abilityUri, reqList);
287
288        CHECK_POINTER(taskHandler_);
289        auto callback = [abilityUri, connectManager = shared_from_this()]() {
290            std::lock_guard guard{connectManager->startServiceReqListLock_};
291            auto exist = connectManager->startServiceReqList_.erase(abilityUri);
292            if (exist) {
293                TAG_LOGE(AAFwkTag::ABILITYMGR, "Target service %{public}s start timeout", abilityUri.c_str());
294            }
295        };
296
297        int connectTimeout =
298            AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
299        taskHandler_->SubmitTask(callback, std::string("start_service_timeout:") + abilityUri,
300            connectTimeout);
301    }
302}
303
304int AbilityConnectManager::TerminateAbilityLocked(const sptr<IRemoteObject> &token)
305{
306    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
307    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
308    auto abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
309    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
310
311    if (abilityRecord->IsTerminating()) {
312        TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is on terminating.");
313        return ERR_OK;
314    }
315
316    if (!abilityRecord->GetConnectRecordList().empty()) {
317        TAG_LOGI(AAFwkTag::ABILITYMGR, "target service connected");
318        auto connectRecordList = abilityRecord->GetConnectRecordList();
319        HandleTerminateDisconnectTask(connectRecordList);
320    }
321
322    auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
323        TAG_LOGW(AAFwkTag::ABILITYMGR, "disconnect timeout");
324        connectManager->HandleStopTimeoutTask(abilityRecord);
325    };
326    abilityRecord->Terminate(timeoutTask);
327    if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
328        AddUIExtensionAbilityRecordToTerminatedList(abilityRecord);
329    } else {
330        RemoveUIExtensionAbilityRecord(abilityRecord);
331    }
332
333    return ERR_OK;
334}
335
336int AbilityConnectManager::StopServiceAbilityLocked(const AbilityRequest &abilityRequest)
337{
338    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
339    TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
340    AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, GenerateBundleName(abilityRequest),
341        abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
342    std::string serviceKey = element.GetURI();
343    if (FRS_BUNDLE_NAME == abilityRequest.abilityInfo.bundleName) {
344        serviceKey = serviceKey + std::to_string(abilityRequest.want.GetIntParam(FRS_APP_INDEX, 0));
345    }
346    auto abilityRecord = GetServiceRecordByElementName(serviceKey);
347    if (abilityRecord == nullptr) {
348        abilityRecord = AbilityCacheManager::GetInstance().Get(abilityRequest);
349        AddToServiceMap(serviceKey, abilityRecord);
350    }
351    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
352
353    if (abilityRecord->IsTerminating()) {
354        TAG_LOGI(AAFwkTag::ABILITYMGR, "ability terminating");
355        return ERR_OK;
356    }
357
358    if (!abilityRecord->GetConnectRecordList().empty()) {
359        TAG_LOGI(AAFwkTag::ABILITYMGR, "post disconnect task");
360        auto connectRecordList = abilityRecord->GetConnectRecordList();
361        HandleTerminateDisconnectTask(connectRecordList);
362    }
363
364    TerminateRecord(abilityRecord);
365    EventInfo eventInfo = BuildEventInfo(abilityRecord);
366    EventReport::SendStopServiceEvent(EventName::STOP_SERVICE, eventInfo);
367    return ERR_OK;
368}
369
370int32_t AbilityConnectManager::GetOrCreateExtensionRecord(const AbilityRequest &abilityRequest, bool isCreatedByConnect,
371    const std::string &hostBundleName, std::shared_ptr<AbilityRecord> &extensionRecord, bool &isLoaded)
372{
373    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
374    AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
375        abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
376    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
377    if (uiExtensionAbilityRecordMgr_->IsBelongToManager(abilityRequest.abilityInfo)) {
378        int32_t ret = uiExtensionAbilityRecordMgr_->GetOrCreateExtensionRecord(
379            abilityRequest, hostBundleName, extensionRecord, isLoaded);
380        if (ret != ERR_OK) {
381            return ret;
382        }
383        extensionRecord->SetCreateByConnectMode(isCreatedByConnect);
384        std::string extensionRecordKey = element.GetURI() + std::to_string(extensionRecord->GetUIExtensionAbilityId());
385        extensionRecord->SetURI(extensionRecordKey);
386        TAG_LOGD(AAFwkTag::ABILITYMGR, "Service map add, hostBundleName:%{public}s, key: %{public}s",
387            hostBundleName.c_str(), extensionRecordKey.c_str());
388        AddToServiceMap(extensionRecordKey, extensionRecord);
389        if (IsAbilityNeedKeepAlive(extensionRecord)) {
390            extensionRecord->SetRestartTime(abilityRequest.restartTime);
391            extensionRecord->SetRestartCount(abilityRequest.restartCount);
392        }
393        return ERR_OK;
394    }
395    return ERR_INVALID_VALUE;
396}
397
398void AbilityConnectManager::GetOrCreateServiceRecord(const AbilityRequest &abilityRequest,
399    const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
400{
401    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
402    // lifecycle is not complete when window extension is reused
403    bool noReuse = UIExtensionUtils::IsWindowExtension(abilityRequest.abilityInfo.extensionAbilityType);
404    AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, GenerateBundleName(abilityRequest),
405        abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
406    std::string serviceKey = element.GetURI();
407    if (FRS_BUNDLE_NAME == abilityRequest.abilityInfo.bundleName) {
408        serviceKey = element.GetURI() + std::to_string(abilityRequest.want.GetIntParam(FRS_APP_INDEX, 0));
409    }
410    {
411        std::lock_guard lock(serviceMapMutex_);
412        auto serviceMapIter = serviceMap_.find(serviceKey);
413        targetService = serviceMapIter == serviceMap_.end() ? nullptr : serviceMapIter->second;
414    }
415    if (targetService == nullptr &&
416        CacheExtensionUtils::IsCacheExtensionType(abilityRequest.abilityInfo.extensionAbilityType)) {
417        targetService = AbilityCacheManager::GetInstance().Get(abilityRequest);
418        if (targetService != nullptr) {
419            AddToServiceMap(serviceKey, targetService);
420        }
421    }
422    if (noReuse && targetService) {
423        if (IsSpecialAbility(abilityRequest.abilityInfo)) {
424            TAG_LOGI(AAFwkTag::ABILITYMGR, "removing ability: %{public}s", element.GetURI().c_str());
425        }
426        std::lock_guard lock(serviceMapMutex_);
427        serviceMap_.erase(serviceKey);
428    }
429    isLoadedAbility = true;
430    if (noReuse || targetService == nullptr) {
431        targetService = AbilityRecord::CreateAbilityRecord(abilityRequest);
432        CHECK_POINTER(targetService);
433        targetService->SetOwnerMissionUserId(userId_);
434        if (isCreatedByConnect) {
435            targetService->SetCreateByConnectMode();
436        }
437        if (abilityRequest.abilityInfo.name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
438            targetService->SetLauncherRoot();
439            targetService->SetRestartTime(abilityRequest.restartTime);
440            targetService->SetRestartCount(abilityRequest.restartCount);
441        } else if (IsAbilityNeedKeepAlive(targetService)) {
442            targetService->SetRestartTime(abilityRequest.restartTime);
443            targetService->SetRestartCount(abilityRequest.restartCount);
444        }
445        if (MultiInstanceUtils::IsMultiInstanceApp(abilityRequest.appInfo)) {
446            targetService->SetInstanceKey(MultiInstanceUtils::GetValidExtensionInstanceKey(abilityRequest));
447        }
448        AddToServiceMap(serviceKey, targetService);
449        isLoadedAbility = false;
450    }
451}
452
453void AbilityConnectManager::GetConnectRecordListFromMap(
454    const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
455{
456    std::lock_guard lock(connectMapMutex_);
457    auto connectMapIter = connectMap_.find(connect->AsObject());
458    if (connectMapIter != connectMap_.end()) {
459        connectRecordList = connectMapIter->second;
460    }
461}
462
463int32_t AbilityConnectManager::GetOrCreateTargetServiceRecord(
464    const AbilityRequest &abilityRequest, const sptr<UIExtensionAbilityConnectInfo> &connectInfo,
465    std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
466{
467    if (UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType) && connectInfo != nullptr) {
468        int32_t ret = GetOrCreateExtensionRecord(
469            abilityRequest, true, connectInfo->hostBundleName, targetService, isLoadedAbility);
470        if (ret != ERR_OK || targetService == nullptr) {
471            TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOrCreateExtensionRecord fail");
472            return ERR_NULL_OBJECT;
473        }
474        connectInfo->uiExtensionAbilityId = targetService->GetUIExtensionAbilityId();
475        TAG_LOGD(AAFwkTag::ABILITYMGR, "UIExtensionAbility id %{public}d.", connectInfo->uiExtensionAbilityId);
476    } else {
477        GetOrCreateServiceRecord(abilityRequest, true, targetService, isLoadedAbility);
478    }
479    CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
480    return ERR_OK;
481}
482
483int AbilityConnectManager::PreloadUIExtensionAbilityLocked(const AbilityRequest &abilityRequest,
484    std::string &hostBundleName)
485{
486    std::lock_guard guard(serialMutex_);
487    return PreloadUIExtensionAbilityInner(abilityRequest, hostBundleName);
488}
489
490int AbilityConnectManager::PreloadUIExtensionAbilityInner(const AbilityRequest &abilityRequest,
491    std::string &hostBundleName)
492{
493    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
494    if (!UIExtensionUtils::IsUIExtension(abilityRequest.abilityInfo.extensionAbilityType)) {
495        TAG_LOGE(AAFwkTag::ABILITYMGR, "can't preload non-uiextension type");
496        return ERR_WRONG_INTERFACE_CALL;
497    }
498    int32_t ret = AbilityPermissionUtil::GetInstance().CheckMultiInstanceKeyForExtension(abilityRequest);
499    if (ret != ERR_OK) {
500        //  Do not distinguishing specific error codes
501        return ERR_INVALID_VALUE;
502    }
503    std::shared_ptr<ExtensionRecord> extensionRecord = nullptr;
504    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
505    int32_t extensionRecordId = INVALID_EXTENSION_RECORD_ID;
506    ret = uiExtensionAbilityRecordMgr_->CreateExtensionRecord(abilityRequest, hostBundleName,
507        extensionRecord, extensionRecordId);
508    if (ret != ERR_OK) {
509        TAG_LOGE(AAFwkTag::ABILITYMGR, "CreateExtensionRecord ERR");
510        return ret;
511    }
512    CHECK_POINTER_AND_RETURN(extensionRecord, ERR_NULL_OBJECT);
513    std::shared_ptr<AbilityRecord> targetService = extensionRecord->abilityRecord_;
514    AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
515        abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
516    std::string extensionRecordKey = element.GetURI() + std::to_string(targetService->GetUIExtensionAbilityId());
517    targetService->SetURI(extensionRecordKey);
518    AddToServiceMap(extensionRecordKey, targetService);
519    LoadAbility(targetService);
520    return ERR_OK;
521}
522
523int AbilityConnectManager::UnloadUIExtensionAbility(const std::shared_ptr<AAFwk::AbilityRecord> &abilityRecord,
524    std::string &hostBundleName)
525{
526    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
527    //Get preLoadUIExtensionInfo
528    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
529    auto preLoadUIExtensionInfo = std::make_tuple(abilityRecord->GetWant().GetElement().GetAbilityName(),
530        abilityRecord->GetWant().GetElement().GetBundleName(),
531        abilityRecord->GetWant().GetElement().GetModuleName(), hostBundleName);
532    //delete preLoadUIExtensionMap
533    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
534    auto extensionRecordId = abilityRecord->GetUIExtensionAbilityId();
535    uiExtensionAbilityRecordMgr_->RemovePreloadUIExtensionRecordById(preLoadUIExtensionInfo, extensionRecordId);
536    //terminate preload uiextension
537    auto token = abilityRecord->GetToken();
538    auto result = TerminateAbilityInner(token);
539    if (result != ERR_OK) {
540        TAG_LOGE(AAFwkTag::ABILITYMGR, "terminate error");
541        return result;
542    }
543    return ERR_OK;
544}
545
546void AbilityConnectManager::ReportEventToRSS(const AppExecFwk::AbilityInfo &abilityInfo,
547    const std::shared_ptr<AbilityRecord> abilityRecord, sptr<IRemoteObject> callerToken)
548{
549    if (taskHandler_ == nullptr) {
550        TAG_LOGD(AAFwkTag::ABILITYMGR, "taskHandler_ null");
551        return;
552    }
553
554    std::string reason = ResSchedUtil::GetInstance().GetThawReasonByAbilityType(abilityInfo);
555    const int32_t uid = abilityInfo.applicationInfo.uid;
556    const std::string bundleName = abilityInfo.applicationInfo.bundleName;
557    const int32_t pid = (abilityRecord->GetPid() > 0) ? abilityRecord->GetPid() : -1;
558    auto callerAbility = Token::GetAbilityRecordByToken(callerToken);
559    const int32_t callerPid = (callerAbility != nullptr) ? callerAbility->GetPid() : IPCSkeleton::GetCallingPid();
560    TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}d_%{public}s_%{public}d reason=%{public}s callerPid=%{public}d", uid,
561        bundleName.c_str(), pid, reason.c_str(), callerPid);
562    taskHandler_->SubmitTask([uid, bundleName, reason, pid, callerPid]() {
563        ResSchedUtil::GetInstance().ReportEventToRSS(uid, bundleName, reason, pid, callerPid);
564    });
565}
566
567int AbilityConnectManager::ConnectAbilityLocked(const AbilityRequest &abilityRequest,
568    const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, sptr<SessionInfo> sessionInfo,
569    sptr<UIExtensionAbilityConnectInfo> connectInfo)
570{
571    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
572    CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
573    auto connectObject = connect->AsObject();
574    std::lock_guard guard(serialMutex_);
575
576    // 1. get target service ability record, and check whether it has been loaded.
577    int32_t ret = AbilityPermissionUtil::GetInstance().CheckMultiInstanceKeyForExtension(abilityRequest);
578    if (ret != ERR_OK) {
579        //  Do not distinguishing specific error codes
580        return ERR_INVALID_VALUE;
581    }
582    std::shared_ptr<AbilityRecord> targetService;
583    bool isLoadedAbility = false;
584    ret = GetOrCreateTargetServiceRecord(abilityRequest, connectInfo, targetService, isLoadedAbility);
585    if (ret != ERR_OK) {
586        return ret;
587    }
588    if (abilityRequest.abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::REMOTE_NOTIFICATION) {
589        ReportEventToRSS(abilityRequest.abilityInfo, targetService, callerToken);
590    }
591    // 2. get target connectRecordList, and check whether this callback has been connected.
592    ConnectListType connectRecordList;
593    GetConnectRecordListFromMap(connect, connectRecordList);
594    bool isCallbackConnected = !connectRecordList.empty();
595    // 3. If this service ability and callback has been connected, There is no need to connect repeatedly
596    if (isLoadedAbility && (isCallbackConnected) && IsAbilityConnected(targetService, connectRecordList)) {
597        TAG_LOGI(AAFwkTag::ABILITYMGR, "Service/callback connected");
598        return ERR_OK;
599    }
600
601    // 4. Other cases , need to connect the service ability
602    auto connectRecord = ConnectionRecord::CreateConnectionRecord(callerToken, targetService, connect);
603    CHECK_POINTER_AND_RETURN(connectRecord, ERR_INVALID_VALUE);
604    connectRecord->AttachCallerInfo();
605    connectRecord->SetConnectState(ConnectionState::CONNECTING);
606    if (targetService->GetAbilityInfo().extensionAbilityType == AppExecFwk::ExtensionAbilityType::UI_SERVICE) {
607        connectRecord->SetConnectWant(abilityRequest.want);
608    }
609    targetService->AddConnectRecordToList(connectRecord);
610    targetService->SetSessionInfo(sessionInfo);
611    connectRecordList.push_back(connectRecord);
612    AddConnectObjectToMap(connectObject, connectRecordList, isCallbackConnected);
613    targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_CONNECT_EXTENSION);
614
615    if (UIExtensionUtils::IsWindowExtension(targetService->GetAbilityInfo().extensionAbilityType)
616        && abilityRequest.sessionInfo) {
617        std::lock_guard guard(windowExtensionMapMutex_);
618        windowExtensionMap_.emplace(connectObject,
619            WindowExtMapValType(targetService->GetApplicationInfo().accessTokenId, abilityRequest.sessionInfo));
620    }
621
622    auto &abilityInfo = abilityRequest.abilityInfo;
623    ret = ReportXiaoYiToRSSIfNeeded(abilityInfo);
624    if (ret != ERR_OK) {
625        return ret;
626    }
627
628    if (!isLoadedAbility) {
629        LoadAbility(targetService);
630    } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
631        targetService->SetWant(abilityRequest.want);
632        HandleActiveAbility(targetService, connectRecord);
633    } else {
634        TAG_LOGI(AAFwkTag::ABILITYMGR, "TargetService activing");
635        targetService->SaveConnectWant(abilityRequest.want);
636    }
637    return ret;
638}
639
640void AbilityConnectManager::HandleActiveAbility(std::shared_ptr<AbilityRecord> &targetService,
641    std::shared_ptr<ConnectionRecord> &connectRecord)
642{
643    TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called.", __func__);
644    if (targetService == nullptr) {
645        TAG_LOGW(AAFwkTag::ABILITYMGR, "null targetService");
646        return;
647    }
648    AppExecFwk::ExtensionAbilityType extType = targetService->GetAbilityInfo().extensionAbilityType;
649    bool isAbilityUIServiceExt = (extType == AppExecFwk::ExtensionAbilityType::UI_SERVICE);
650    if (isAbilityUIServiceExt) {
651        if (connectRecord != nullptr) {
652            Want want = connectRecord->GetConnectWant();
653            int connectRecordId = connectRecord->GetRecordId();
654            ConnectUIServiceExtAbility(targetService, connectRecordId, want);
655        }
656        targetService->RemoveSignatureInfo();
657        return;
658    }
659
660    if (targetService->GetConnectRecordList().size() > 1) {
661        targetService->RemoveSignatureInfo();
662        if (taskHandler_ != nullptr && targetService->GetConnRemoteObject()) {
663            auto task = [connectRecord]() { connectRecord->CompleteConnect(ERR_OK); };
664            taskHandler_->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
665        } else {
666            TAG_LOGI(AAFwkTag::ABILITYMGR, "connecting");
667        }
668    } else {
669        ConnectAbility(targetService);
670    }
671}
672
673int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)
674{
675    std::lock_guard guard(serialMutex_);
676    return DisconnectAbilityLocked(connect, false);
677}
678
679int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect, bool callerDied)
680{
681    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
682    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
683
684    // 1. check whether callback was connected.
685    ConnectListType connectRecordList;
686    GetConnectRecordListFromMap(connect, connectRecordList);
687    if (connectRecordList.empty()) {
688        TAG_LOGE(AAFwkTag::ABILITYMGR, "recordList empty");
689        return CONNECTION_NOT_EXIST;
690    }
691
692    // 2. schedule disconnect to target service
693    int result = ERR_OK;
694    ConnectListType list;
695    for (auto &connectRecord : connectRecordList) {
696        if (connectRecord) {
697            auto abilityRecord = connectRecord->GetAbilityRecord();
698            CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
699            TAG_LOGD(AAFwkTag::ABILITYMGR, "abilityName: %{public}s, bundleName: %{public}s",
700                abilityRecord->GetAbilityInfo().name.c_str(), abilityRecord->GetAbilityInfo().bundleName.c_str());
701            if (abilityRecord->GetAbilityInfo().type == AbilityType::EXTENSION) {
702                RemoveExtensionDelayDisconnectTask(connectRecord);
703            }
704            if (connectRecord->GetCallerTokenId() != IPCSkeleton::GetCallingTokenID() &&
705                static_cast<uint32_t>(IPCSkeleton::GetSelfTokenID() != IPCSkeleton::GetCallingTokenID())) {
706                TAG_LOGW(AAFwkTag::ABILITYMGR, "inconsistent caller");
707                continue;
708            }
709
710            result = DisconnectRecordNormal(list, connectRecord, callerDied);
711            if (result != ERR_OK && callerDied) {
712                DisconnectRecordForce(list, connectRecord);
713                result = ERR_OK;
714            }
715
716            if (result != ERR_OK) {
717                TAG_LOGE(AAFwkTag::ABILITYMGR, "fail , ret = %{public}d", result);
718                break;
719            } else {
720                EventInfo eventInfo = BuildEventInfo(abilityRecord);
721                EventReport::SendDisconnectServiceEvent(EventName::DISCONNECT_SERVICE, eventInfo);
722            }
723        }
724    }
725    for (auto&& connectRecord : list) {
726        RemoveConnectionRecordFromMap(connectRecord);
727    }
728
729    return result;
730}
731
732void AbilityConnectManager::TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)
733{
734    TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
735    if (!GetExtensionByIdFromServiceMap(abilityRecord->GetRecordId()) &&
736        !AbilityCacheManager::GetInstance().FindRecordByToken(abilityRecord->GetToken())) {
737        return;
738    }
739    auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
740        TAG_LOGW(AAFwkTag::ABILITYMGR, "disconnect timeout");
741        connectManager->HandleStopTimeoutTask(abilityRecord);
742    };
743
744    MoveToTerminatingMap(abilityRecord);
745    abilityRecord->Terminate(timeoutTask);
746}
747
748int AbilityConnectManager::DisconnectRecordNormal(ConnectListType &list,
749    std::shared_ptr<ConnectionRecord> connectRecord, bool callerDied) const
750{
751    auto result = connectRecord->DisconnectAbility();
752    if (result != ERR_OK) {
753        TAG_LOGE(AAFwkTag::ABILITYMGR, "fail:%{public}d", result);
754        return result;
755    }
756
757    if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
758        TAG_LOGW(AAFwkTag::ABILITYMGR, "DisconnectRecordNormal disconnect record:%{public}d",
759            connectRecord->GetRecordId());
760        connectRecord->CompleteDisconnect(ERR_OK, callerDied);
761        list.emplace_back(connectRecord);
762    }
763    return ERR_OK;
764}
765
766void AbilityConnectManager::DisconnectRecordForce(ConnectListType &list,
767    std::shared_ptr<ConnectionRecord> connectRecord)
768{
769    auto abilityRecord = connectRecord->GetAbilityRecord();
770    if (abilityRecord == nullptr) {
771        TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
772        return;
773    }
774    abilityRecord->RemoveConnectRecordFromList(connectRecord);
775    connectRecord->CompleteDisconnect(ERR_OK, true);
776    list.emplace_back(connectRecord);
777    bool isUIService = (abilityRecord->GetAbilityInfo().extensionAbilityType ==
778        AppExecFwk::ExtensionAbilityType::UI_SERVICE);
779    if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0 && !isUIService) {
780        TAG_LOGW(AAFwkTag::ABILITYMGR, "force terminate ability record state: %{public}d",
781            abilityRecord->GetAbilityState());
782        TerminateRecord(abilityRecord);
783    }
784}
785
786int AbilityConnectManager::AttachAbilityThreadLocked(
787    const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
788{
789    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
790    std::lock_guard guard(serialMutex_);
791    auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
792    if (abilityRecord == nullptr) {
793        abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
794        if (abilityRecord != nullptr) {
795            TAG_LOGW(AAFwkTag::ABILITYMGR, "Ability:%{public}s, user:%{public}d",
796                abilityRecord->GetURI().c_str(), userId_);
797        }
798        auto tmpRecord = Token::GetAbilityRecordByToken(token);
799        if (tmpRecord && tmpRecord != abilityRecord) {
800            TAG_LOGW(AAFwkTag::ABILITYMGR, "Token:%{public}s, user:%{public}d",
801                tmpRecord->GetURI().c_str(), userId_);
802        }
803        if (!IsUIExtensionAbility(abilityRecord)) {
804            abilityRecord = nullptr;
805        }
806    }
807    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
808    std::string element = abilityRecord->GetURI();
809    TAG_LOGI(AAFwkTag::ABILITYMGR, "ability:%{public}s", element.c_str());
810    if (taskHandler_ != nullptr) {
811        int recordId = abilityRecord->GetRecordId();
812        std::string taskName = std::string("LoadTimeout_") + std::to_string(recordId);
813        taskHandler_->CancelTask(taskName);
814    }
815    if (eventHandler_) {
816        abilityRecord->RemoveLoadTimeoutTask();
817    }
818    if (abilityRecord->IsSceneBoard()) {
819        TAG_LOGI(AAFwkTag::ABILITYMGR, "attach Ability: %{public}s", element.c_str());
820        sceneBoardTokenId_ = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
821    }
822    abilityRecord->SetScheduler(scheduler);
823    abilityRecord->RemoveSpecifiedWantParam(UIEXTENSION_ABILITY_ID);
824    abilityRecord->RemoveSpecifiedWantParam(UIEXTENSION_ROOT_HOST_PID);
825    if (IsUIExtensionAbility(abilityRecord) && !abilityRecord->IsCreateByConnect()
826        && !abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
827        abilityRecord->PostUIExtensionAbilityTimeoutTask(AbilityManagerService::FOREGROUND_TIMEOUT_MSG);
828        DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
829    } else {
830        TAG_LOGD(AAFwkTag::ABILITYMGR, "Inactivate");
831        abilityRecord->Inactivate();
832    }
833    return ERR_OK;
834}
835
836void AbilityConnectManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
837{
838    TAG_LOGD(AAFwkTag::ABILITYMGR, "state: %{public}d", state);
839    std::lock_guard guard(serialMutex_);
840    AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
841    if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
842        auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
843        CHECK_POINTER(abilityRecord);
844        if (!IsUIExtensionAbility(abilityRecord)) {
845            TAG_LOGE(AAFwkTag::ABILITYMGR, "Not ui extension");
846            return;
847        }
848        if (abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
849            TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord foregrounding");
850            return;
851        }
852        std::string element = abilityRecord->GetURI();
853        TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is %{public}s, start to foreground.", element.c_str());
854        abilityRecord->GrantUriPermissionForUIExtension();
855        abilityRecord->ForegroundUIExtensionAbility();
856    }
857}
858
859void AbilityConnectManager::OnAppStateChanged(const AppInfo &info)
860{
861    auto serviceMap = GetServiceMap();
862    std::for_each(serviceMap.begin(), serviceMap.end(), [&info](ServiceMapType::reference service) {
863        if (service.second && (info.processName == service.second->GetAbilityInfo().process ||
864                                  info.processName == service.second->GetApplicationInfo().bundleName)) {
865            auto appName = service.second->GetApplicationInfo().name;
866            auto uid = service.second->GetAbilityInfo().applicationInfo.uid;
867            auto isExist = [&appName, &uid](
868                               const AppData &appData) { return appData.appName == appName && appData.uid == uid; };
869            auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
870            if (iter != info.appData.end()) {
871                service.second->SetAppState(info.state);
872            }
873        }
874    });
875
876    auto cacheAbilityList = AbilityCacheManager::GetInstance().GetAbilityList();
877    std::for_each(cacheAbilityList.begin(), cacheAbilityList.end(), [&info](std::shared_ptr<AbilityRecord> &service) {
878        if (service && (info.processName == service->GetAbilityInfo().process ||
879            info.processName == service->GetApplicationInfo().bundleName)) {
880            auto appName = service->GetApplicationInfo().name;
881            auto uid = service->GetAbilityInfo().applicationInfo.uid;
882            auto isExist = [&appName, &uid](const AppData &appData) {
883                return appData.appName == appName && appData.uid == uid;
884            };
885            auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
886            if (iter != info.appData.end()) {
887                service->SetAppState(info.state);
888            }
889        }
890    });
891}
892
893int AbilityConnectManager::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)
894{
895    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
896    std::lock_guard guard(serialMutex_);
897    int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
898    std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
899    std::shared_ptr<AbilityRecord> abilityRecord;
900    if (targetState == AbilityState::INACTIVE) {
901        abilityRecord = GetExtensionByTokenFromServiceMap(token);
902    } else if (targetState == AbilityState::FOREGROUND || targetState == AbilityState::BACKGROUND) {
903        abilityRecord = GetExtensionByTokenFromServiceMap(token);
904        if (abilityRecord == nullptr) {
905            abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
906        }
907    } else if (targetState == AbilityState::INITIAL) {
908        abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
909    }
910
911    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
912    std::string element = abilityRecord->GetURI();
913    TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called, ability:%{public}s, state:%{public}s",
914        __func__, element.c_str(), abilityState.c_str());
915
916    switch (targetState) {
917        case AbilityState::INACTIVE: {
918            if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
919                DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
920                    token, AppExecFwk::AbilityState::ABILITY_STATE_CREATE);
921            } else {
922                DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
923                    token, AppExecFwk::ExtensionState::EXTENSION_STATE_CREATE);
924                auto preloadTask = [owner = weak_from_this(), abilityRecord] {
925                    auto acm = owner.lock();
926                    if (acm == nullptr) {
927                        TAG_LOGE(AAFwkTag::ABILITYMGR, "null AbilityConnectManager");
928                        return;
929                    }
930                    acm->ProcessPreload(abilityRecord);
931                };
932                if (taskHandler_ != nullptr) {
933                    taskHandler_->SubmitTask(preloadTask);
934                }
935            }
936            return DispatchInactive(abilityRecord, state);
937        }
938        case AbilityState::FOREGROUND: {
939            abilityRecord->RemoveSignatureInfo();
940            return DispatchForeground(abilityRecord);
941        }
942        case AbilityState::BACKGROUND: {
943            return DispatchBackground(abilityRecord);
944        }
945        case AbilityState::INITIAL: {
946            if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
947                DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
948                    token, AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED);
949            } else {
950                DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
951                    token, AppExecFwk::ExtensionState::EXTENSION_STATE_TERMINATED);
952            }
953            return DispatchTerminate(abilityRecord);
954        }
955        default: {
956            TAG_LOGW(AAFwkTag::ABILITYMGR, "not support transiting state: %{public}d", state);
957            return ERR_INVALID_VALUE;
958        }
959    }
960}
961
962int AbilityConnectManager::AbilityWindowConfigTransactionDone(const sptr<IRemoteObject> &token,
963    const WindowConfig &windowConfig)
964{
965    std::lock_guard<ffrt::mutex> guard(serialMutex_);
966    auto abilityRecord = Token::GetAbilityRecordByToken(token);
967    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
968    abilityRecord->SaveAbilityWindowConfig(windowConfig);
969    return ERR_OK;
970}
971
972void AbilityConnectManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
973{
974    auto bundleMgrHelper = AbilityUtil::GetBundleManagerHelper();
975    CHECK_POINTER(record);
976    CHECK_POINTER(bundleMgrHelper);
977    auto abilityInfo = record->GetAbilityInfo();
978    Want want;
979    want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
980    auto uid = record->GetUid();
981    want.SetParam("uid", uid);
982    bundleMgrHelper->ProcessPreload(want);
983}
984
985int AbilityConnectManager::ScheduleConnectAbilityDoneLocked(
986    const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
987{
988    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
989    std::lock_guard guard(serialMutex_);
990    CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
991
992    auto abilityRecord = Token::GetAbilityRecordByToken(token);
993    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
994
995    std::string element = abilityRecord->GetURI();
996    TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called, Connect ability done, ability: %{public}s.",
997        __func__, element.c_str());
998
999    if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
1000        (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
1001        TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not inactive, state: %{public}d",
1002            abilityRecord->GetAbilityState());
1003        return INVALID_CONNECTION_STATE;
1004    }
1005    abilityRecord->RemoveConnectWant();
1006    abilityRecord->RemoveSignatureInfo();
1007
1008    if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
1009        DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
1010            token, AppExecFwk::AbilityState::ABILITY_STATE_CONNECTED);
1011    } else {
1012        DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
1013            token, AppExecFwk::ExtensionState::EXTENSION_STATE_CONNECTED);
1014    }
1015    EventInfo eventInfo = BuildEventInfo(abilityRecord);
1016    eventInfo.userId = userId_;
1017    eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1018    eventInfo.moduleName = abilityRecord->GetAbilityInfo().moduleName;
1019    eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
1020    EventReport::SendConnectServiceEvent(EventName::CONNECT_SERVICE, eventInfo);
1021
1022    abilityRecord->SetConnRemoteObject(remoteObject);
1023    // There may be multiple callers waiting for the connection result
1024    auto connectRecordList = abilityRecord->GetConnectRecordList();
1025    for (auto &connectRecord : connectRecordList) {
1026        connectRecord->ScheduleConnectAbilityDone();
1027        if (abilityRecord->GetAbilityInfo().type == AbilityType::EXTENSION &&
1028            abilityRecord->GetAbilityInfo().extensionAbilityType != AppExecFwk::ExtensionAbilityType::SERVICE) {
1029            PostExtensionDelayDisconnectTask(connectRecord);
1030        }
1031    }
1032    CompleteStartServiceReq(abilityRecord->GetURI());
1033    ResSchedUtil::GetInstance().ReportLoadingEventToRss(LoadingStage::CONNECT_END, abilityRecord->GetPid(),
1034        abilityRecord->GetUid());
1035    return ERR_OK;
1036}
1037
1038void AbilityConnectManager::ProcessEliminateAbilityRecord(std::shared_ptr<AbilityRecord> eliminateRecord)
1039{
1040    CHECK_POINTER(eliminateRecord);
1041    std::string eliminateKey = eliminateRecord->GetURI();
1042    if (FRS_BUNDLE_NAME == eliminateRecord->GetAbilityInfo().bundleName) {
1043        eliminateKey = eliminateKey +
1044            std::to_string(eliminateRecord->GetWant().GetIntParam(FRS_APP_INDEX, 0));
1045    }
1046    AddToServiceMap(eliminateKey, eliminateRecord);
1047    TerminateRecord(eliminateRecord);
1048}
1049
1050void AbilityConnectManager::TerminateOrCacheAbility(std::shared_ptr<AbilityRecord> abilityRecord)
1051{
1052    RemoveUIExtensionAbilityRecord(abilityRecord);
1053    if (abilityRecord->IsSceneBoard()) {
1054        return;
1055    }
1056    if (IsCacheExtensionAbilityType(abilityRecord)) {
1057        std::string serviceKey = abilityRecord->GetURI();
1058        auto abilityInfo = abilityRecord->GetAbilityInfo();
1059        TAG_LOGD(AAFwkTag::ABILITYMGR, "Cache the ability, service:%{public}s, extension type %{public}d",
1060            serviceKey.c_str(), abilityInfo.extensionAbilityType);
1061        if (FRS_BUNDLE_NAME == abilityInfo.bundleName) {
1062            AppExecFwk::ElementName elementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1063                abilityInfo.moduleName);
1064            serviceKey = elementName.GetURI() +
1065                std::to_string(abilityRecord->GetWant().GetIntParam(FRS_APP_INDEX, 0));
1066        }
1067        {
1068            std::lock_guard lock(serviceMapMutex_);
1069            serviceMap_.erase(serviceKey);
1070        }
1071        auto eliminateRecord = AbilityCacheManager::GetInstance().Put(abilityRecord);
1072        if (eliminateRecord != nullptr) {
1073            TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate the eliminated ability, service:%{public}s.",
1074                eliminateRecord->GetURI().c_str());
1075            ProcessEliminateAbilityRecord(eliminateRecord);
1076        }
1077        return;
1078    }
1079    TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate the ability, service:%{public}s, extension type %{public}d",
1080        abilityRecord->GetURI().c_str(), abilityRecord->GetAbilityInfo().extensionAbilityType);
1081    TerminateRecord(abilityRecord);
1082}
1083
1084int AbilityConnectManager::ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)
1085{
1086    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1087    std::lock_guard guard(serialMutex_);
1088    auto abilityRecord = GetExtensionByTokenFromServiceMap(token);
1089    CHECK_POINTER_AND_RETURN(abilityRecord, CONNECTION_NOT_EXIST);
1090
1091    auto connect = abilityRecord->GetDisconnectingRecord();
1092    CHECK_POINTER_AND_RETURN(connect, CONNECTION_NOT_EXIST);
1093
1094    if (!abilityRecord->IsAbilityState(AbilityState::ACTIVE)) {
1095        if (IsUIExtensionAbility(abilityRecord) && (abilityRecord->IsForeground() ||
1096            abilityRecord->IsAbilityState(AbilityState::BACKGROUND) ||
1097            abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING))) {
1098            // uiextension ability support connect and start, so the ability state maybe others
1099            TAG_LOGI(
1100                AAFwkTag::ABILITYMGR, "disconnect when ability state: %{public}d", abilityRecord->GetAbilityState());
1101        } else {
1102            TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not active, state: %{public}d",
1103                abilityRecord->GetAbilityState());
1104            return INVALID_CONNECTION_STATE;
1105        }
1106    }
1107
1108    if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
1109        DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
1110            token, AppExecFwk::AbilityState::ABILITY_STATE_DISCONNECTED);
1111    } else {
1112        DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
1113            token, AppExecFwk::ExtensionState::EXTENSION_STATE_DISCONNECTED);
1114    }
1115
1116    std::string element = abilityRecord->GetURI();
1117    TAG_LOGI(AAFwkTag::ABILITYMGR, "ScheduleDisconnectAbilityDoneLocked called, service:%{public}s.",
1118        element.c_str());
1119
1120    // complete disconnect and remove record from conn map
1121    connect->ScheduleDisconnectAbilityDone();
1122    abilityRecord->RemoveConnectRecordFromList(connect);
1123    if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
1124        if (IsUIExtensionAbility(abilityRecord) && CheckUIExtensionAbilitySessionExist(abilityRecord)) {
1125            TAG_LOGI(AAFwkTag::ABILITYMGR, "exist ui extension component, don't terminate when disconnect");
1126        } else if (abilityRecord->GetAbilityInfo().extensionAbilityType ==
1127            AppExecFwk::ExtensionAbilityType::UI_SERVICE) {
1128            TAG_LOGI(AAFwkTag::ABILITYMGR, "don't terminate uiservice");
1129        } else {
1130            TAG_LOGI(AAFwkTag::ABILITYMGR,
1131                "Service ability has no any connection, and not started, need terminate or cache.");
1132            TerminateOrCacheAbility(abilityRecord);
1133        }
1134    }
1135    RemoveConnectionRecordFromMap(connect);
1136
1137    return ERR_OK;
1138}
1139
1140int AbilityConnectManager::ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)
1141{
1142    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1143    std::lock_guard guard(serialMutex_);
1144    CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
1145    auto abilityRecord = Token::GetAbilityRecordByToken(token);
1146    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1147    std::string element = abilityRecord->GetURI();
1148    TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s called, Ability: %{public}s", __func__, element.c_str());
1149
1150    if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
1151        (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
1152        TAG_LOGE(AAFwkTag::ABILITYMGR, "ability not inactive, state: %{public}d",
1153            abilityRecord->GetAbilityState());
1154        return INVALID_CONNECTION_STATE;
1155    }
1156    EventInfo eventInfo = BuildEventInfo(abilityRecord);
1157    EventReport::SendStartServiceEvent(EventName::START_SERVICE, eventInfo);
1158    abilityRecord->RemoveSignatureInfo();
1159    // complete command and pop waiting start ability from queue.
1160    CompleteCommandAbility(abilityRecord);
1161
1162    return ERR_OK;
1163}
1164
1165int AbilityConnectManager::ScheduleCommandAbilityWindowDone(
1166    const sptr<IRemoteObject> &token,
1167    const sptr<SessionInfo> &sessionInfo,
1168    WindowCommand winCmd,
1169    AbilityCommand abilityCmd)
1170{
1171    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1172    std::lock_guard guard(serialMutex_);
1173    CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
1174    CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
1175    auto abilityRecord = Token::GetAbilityRecordByToken(token);
1176    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1177    std::string element = abilityRecord->GetURI();
1178    TAG_LOGI(AAFwkTag::ABILITYMGR,
1179        "ability:%{public}s, persistentId:%{private}d, winCmd:%{public}d, abilityCmd:%{public}d", element.c_str(),
1180        sessionInfo->persistentId, winCmd, abilityCmd);
1181
1182    // Only foreground mode need cancel, cause only foreground CommandAbilityWindow post timeout task.
1183    if (taskHandler_ && winCmd == WIN_CMD_FOREGROUND) {
1184        int recordId = abilityRecord->GetRecordId();
1185        std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
1186                               std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
1187        taskHandler_->CancelTask(taskName);
1188    }
1189
1190    if (winCmd == WIN_CMD_DESTROY) {
1191        HandleCommandDestroy(sessionInfo);
1192    }
1193
1194    abilityRecord->SetAbilityWindowState(sessionInfo, winCmd, true);
1195
1196    CompleteStartServiceReq(element);
1197    return ERR_OK;
1198}
1199
1200void AbilityConnectManager::HandleCommandDestroy(const sptr<SessionInfo> &sessionInfo)
1201{
1202    if (sessionInfo == nullptr) {
1203        TAG_LOGW(AAFwkTag::ABILITYMGR, "null sessionInfo");
1204        return;
1205    }
1206    if (sessionInfo->sessionToken) {
1207        RemoveUIExtWindowDeathRecipient(sessionInfo->sessionToken);
1208        size_t ret = 0;
1209        {
1210            std::lock_guard guard(uiExtensionMapMutex_);
1211            ret = uiExtensionMap_.erase(sessionInfo->sessionToken);
1212        }
1213        if (ret > 0) {
1214            return;
1215        }
1216
1217        std::lock_guard guard(windowExtensionMapMutex_);
1218        for (auto& item : windowExtensionMap_) {
1219            auto sessionInfoVal = item.second.second;
1220            if (sessionInfoVal && sessionInfoVal->callerToken == sessionInfo->sessionToken) {
1221                windowExtensionMap_.erase(item.first);
1222                break;
1223            }
1224        }
1225    }
1226}
1227
1228void AbilityConnectManager::CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)
1229{
1230    CHECK_POINTER(abilityRecord);
1231    if (taskHandler_) {
1232        int recordId = abilityRecord->GetRecordId();
1233        std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
1234                               std::to_string(abilityRecord->GetStartId());
1235        taskHandler_->CancelTask(taskName);
1236    }
1237
1238    abilityRecord->SetAbilityState(AbilityState::ACTIVE);
1239
1240    // manage queued request
1241    CompleteStartServiceReq(abilityRecord->GetURI());
1242    if (abilityRecord->NeedConnectAfterCommand()) {
1243        abilityRecord->UpdateConnectWant();
1244        ConnectAbility(abilityRecord);
1245    }
1246}
1247
1248void AbilityConnectManager::CompleteStartServiceReq(const std::string &serviceUri)
1249{
1250    std::shared_ptr<std::list<OHOS::AAFwk::AbilityRequest>> reqList;
1251    {
1252        std::lock_guard guard(startServiceReqListLock_);
1253        auto it = startServiceReqList_.find(serviceUri);
1254        if (it != startServiceReqList_.end()) {
1255            reqList = it->second;
1256            startServiceReqList_.erase(it);
1257            if (taskHandler_) {
1258                taskHandler_->CancelTask(std::string("start_service_timeout:") + serviceUri);
1259            }
1260        }
1261    }
1262
1263    if (reqList) {
1264        TAG_LOGI(AAFwkTag::ABILITYMGR, "target service activating: %{public}zu, uri: %{public}s", reqList->size(),
1265            serviceUri.c_str());
1266        for (const auto &req: *reqList) {
1267            StartAbilityLocked(req);
1268        }
1269    }
1270}
1271
1272std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementName(const std::string &element)
1273{
1274    std::lock_guard guard(serviceMapMutex_);
1275    auto mapIter = serviceMap_.find(element);
1276    if (mapIter != serviceMap_.end()) {
1277        return mapIter->second;
1278    }
1279    return nullptr;
1280}
1281
1282std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromServiceMap(
1283    const sptr<IRemoteObject> &token)
1284{
1285    auto IsMatch = [token](auto service) {
1286        if (!service.second) {
1287            return false;
1288        }
1289        sptr<IRemoteObject> srcToken = service.second->GetToken();
1290        return srcToken == token;
1291    };
1292    std::lock_guard lock(serviceMapMutex_);
1293    auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
1294    if (serviceRecord != serviceMap_.end()) {
1295        return serviceRecord->second;
1296    }
1297    return nullptr;
1298}
1299
1300std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromAbilityCache(
1301    const sptr<IRemoteObject> &token)
1302{
1303    return AbilityCacheManager::GetInstance().FindRecordByToken(token);
1304}
1305
1306std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByIdFromServiceMap(
1307    const int64_t &abilityRecordId)
1308{
1309    auto IsMatch = [abilityRecordId](auto &service) {
1310        if (!service.second) {
1311            return false;
1312        }
1313        return service.second->GetAbilityRecordId() == abilityRecordId;
1314    };
1315
1316    std::lock_guard lock(serviceMapMutex_);
1317    auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
1318    if (serviceRecord != serviceMap_.end()) {
1319        return serviceRecord->second;
1320    }
1321    return nullptr;
1322}
1323
1324std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByIdFromTerminatingMap(
1325    const int64_t &abilityRecordId)
1326{
1327    auto IsMatch = [abilityRecordId](auto &extensionRecord) {
1328        if (extensionRecord == nullptr) {
1329            return false;
1330        }
1331        return extensionRecord->GetAbilityRecordId() == abilityRecordId;
1332    };
1333
1334    std::lock_guard lock(serviceMapMutex_);
1335    auto extensionRecord = std::find_if(terminatingExtensionList_.begin(), terminatingExtensionList_.end(), IsMatch);
1336    if (extensionRecord != terminatingExtensionList_.end()) {
1337        return *extensionRecord;
1338    }
1339    return nullptr;
1340}
1341
1342std::shared_ptr<AbilityRecord> AbilityConnectManager::GetUIExtensionBySessionInfo(
1343    const sptr<SessionInfo> &sessionInfo)
1344{
1345    CHECK_POINTER_AND_RETURN(sessionInfo, nullptr);
1346    auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
1347    CHECK_POINTER_AND_RETURN(sessionToken, nullptr);
1348
1349    std::lock_guard guard(uiExtensionMapMutex_);
1350    auto it = uiExtensionMap_.find(sessionToken->AsObject());
1351    if (it != uiExtensionMap_.end()) {
1352        auto abilityRecord = it->second.first.lock();
1353        if (abilityRecord == nullptr) {
1354            TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord null");
1355            RemoveUIExtWindowDeathRecipient(sessionToken->AsObject());
1356            uiExtensionMap_.erase(it);
1357            return nullptr;
1358        }
1359        auto savedSessionInfo = it->second.second;
1360        if (!savedSessionInfo || savedSessionInfo->sessionToken != sessionInfo->sessionToken
1361            || savedSessionInfo->callerToken != sessionInfo->callerToken) {
1362            TAG_LOGW(AAFwkTag::ABILITYMGR, "inconsistent sessionInfo");
1363            return nullptr;
1364        }
1365        return abilityRecord;
1366    } else {
1367        TAG_LOGE(AAFwkTag::ABILITYMGR, "UIExtension not found");
1368    }
1369    return nullptr;
1370}
1371
1372std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromTerminatingMap(
1373    const sptr<IRemoteObject> &token)
1374{
1375    auto IsMatch = [token](auto& extensionRecord) {
1376        if (extensionRecord == nullptr) {
1377            return false;
1378        }
1379        auto terminatingToken = extensionRecord->GetToken();
1380        if (terminatingToken != nullptr) {
1381            return terminatingToken->AsObject() == token;
1382        }
1383        return false;
1384    };
1385
1386    std::lock_guard lock(serviceMapMutex_);
1387    auto terminatingExtensionRecord =
1388        std::find_if(terminatingExtensionList_.begin(), terminatingExtensionList_.end(), IsMatch);
1389    if (terminatingExtensionRecord != terminatingExtensionList_.end()) {
1390        return *terminatingExtensionRecord;
1391    }
1392    return nullptr;
1393}
1394
1395std::list<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRecordListByCallback(
1396    sptr<IAbilityConnection> callback)
1397{
1398    std::lock_guard guard(connectMapMutex_);
1399    std::list<std::shared_ptr<ConnectionRecord>> connectList;
1400    auto connectMapIter = connectMap_.find(callback->AsObject());
1401    if (connectMapIter != connectMap_.end()) {
1402        connectList = connectMapIter->second;
1403    }
1404    return connectList;
1405}
1406
1407void AbilityConnectManager::LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1408{
1409    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1410    CHECK_POINTER(abilityRecord);
1411    abilityRecord->SetStartTime();
1412
1413    if (!abilityRecord->CanRestartRootLauncher()) {
1414        TAG_LOGE(AAFwkTag::ABILITYMGR, "CanRestartRootLauncher fail");
1415        RemoveServiceAbility(abilityRecord);
1416        return;
1417    }
1418    if (!abilityRecord->IsDebugApp()) {
1419        TAG_LOGD(AAFwkTag::ABILITYMGR, "IsDebug is false, here is not debug app");
1420        PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
1421    }
1422    sptr<Token> token = abilityRecord->GetToken();
1423    sptr<Token> perToken = nullptr;
1424    if (abilityRecord->IsCreateByConnect()) {
1425        perToken = iface_cast<Token>(abilityRecord->GetConnectingRecord()->GetToken());
1426    } else {
1427        auto callerList = abilityRecord->GetCallerRecordList();
1428        if (!callerList.empty() && callerList.back()) {
1429            auto caller = callerList.back()->GetCaller();
1430            if (caller) {
1431                perToken = caller->GetToken();
1432            }
1433        }
1434    }
1435
1436    UpdateUIExtensionInfo(abilityRecord);
1437    DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
1438        token, perToken, abilityRecord->GetAbilityInfo(), abilityRecord->GetApplicationInfo(),
1439        abilityRecord->GetWant(), abilityRecord->GetRecordId(), abilityRecord->GetInstanceKey());
1440    abilityRecord->SetLoadState(AbilityLoadState::LOADING);
1441}
1442
1443void AbilityConnectManager::PostRestartResidentTask(const AbilityRequest &abilityRequest)
1444{
1445    TAG_LOGI(AAFwkTag::ABILITYMGR, "PostRestartResidentTask start");
1446    CHECK_POINTER(taskHandler_);
1447    std::string taskName = std::string("RestartResident_") + std::string(abilityRequest.abilityInfo.name);
1448    auto task = [abilityRequest, connectManager = shared_from_this()]() {
1449        CHECK_POINTER(connectManager);
1450        connectManager->HandleRestartResidentTask(abilityRequest);
1451    };
1452    int restartIntervalTime = 0;
1453    auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
1454    if (abilityMgr) {
1455        restartIntervalTime = AmsConfigurationParameter::GetInstance().GetRestartIntervalTime();
1456    }
1457    TAG_LOGD(AAFwkTag::ABILITYMGR, "PostRestartResidentTask, time:%{public}d", restartIntervalTime);
1458    taskHandler_->SubmitTask(task, taskName, restartIntervalTime);
1459    TAG_LOGI(AAFwkTag::ABILITYMGR, "PostRestartResidentTask end");
1460}
1461
1462void AbilityConnectManager::HandleRestartResidentTask(const AbilityRequest &abilityRequest)
1463{
1464    TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleRestartResidentTask start");
1465    std::lock_guard guard(serialMutex_);
1466    auto findRestartResidentTask = [abilityRequest](const AbilityRequest &requestInfo) {
1467        return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
1468            requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
1469            requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
1470    };
1471    auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(), findRestartResidentTask);
1472    if (findIter != restartResidentTaskList_.end()) {
1473        restartResidentTaskList_.erase(findIter);
1474    }
1475    StartAbilityLocked(abilityRequest);
1476}
1477
1478void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)
1479{
1480    CHECK_POINTER(abilityRecord);
1481    int connectRecordId = 0;
1482    if (messageId == AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1483        auto connectRecord = abilityRecord->GetConnectingRecord();
1484        CHECK_POINTER(connectRecord);
1485        connectRecordId = connectRecord->GetRecordId();
1486    }
1487    PostTimeOutTask(abilityRecord, connectRecordId, messageId);
1488}
1489
1490void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord,
1491    int connectRecordId, uint32_t messageId)
1492{
1493    CHECK_POINTER(abilityRecord);
1494    CHECK_POINTER(taskHandler_);
1495
1496    std::string taskName;
1497    int32_t delayTime = 0;
1498    if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
1499        if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1500            return abilityRecord->PostUIExtensionAbilityTimeoutTask(messageId);
1501        }
1502        // first load ability, There is at most one connect record.
1503        int recordId = abilityRecord->GetRecordId();
1504        taskName = std::string("LoadTimeout_") + std::to_string(recordId);
1505        delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE;
1506    } else if (messageId == AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1507        taskName = std::string("ConnectTimeout_") + std::to_string(connectRecordId);
1508        delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
1509        ResSchedUtil::GetInstance().ReportLoadingEventToRss(LoadingStage::CONNECT_BEGIN, abilityRecord->GetPid(),
1510            abilityRecord->GetUid(), delayTime);
1511    } else {
1512        TAG_LOGE(AAFwkTag::ABILITYMGR, "messageId error");
1513        return;
1514    }
1515
1516    // check libc.hook_mode
1517    const int bufferLen = 128;
1518    char paramOutBuf[bufferLen] = {0};
1519    const char *hook_mode = "startup:";
1520    int ret = GetParameter("libc.hook_mode", "", paramOutBuf, bufferLen - 1);
1521    if (ret > 0 && strncmp(paramOutBuf, hook_mode, strlen(hook_mode)) == 0) {
1522        TAG_LOGD(AAFwkTag::ABILITYMGR, "Hook_mode: no timeoutTask");
1523        return;
1524    }
1525
1526    auto timeoutTask = [abilityRecord, connectManager = shared_from_this(), messageId]() {
1527        if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
1528            connectManager->HandleStartTimeoutTask(abilityRecord);
1529        } else if (messageId == AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1530            connectManager->HandleConnectTimeoutTask(abilityRecord);
1531        }
1532    };
1533    taskHandler_->SubmitTask(timeoutTask, taskName, delayTime);
1534}
1535
1536void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1537{
1538    TAG_LOGW(AAFwkTag::ABILITYMGR, "load timeout");
1539    std::lock_guard guard(serialMutex_);
1540    CHECK_POINTER(abilityRecord);
1541    abilityRecord->SetLoadState(AbilityLoadState::FAILED);
1542    if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1543        TAG_LOGE(AAFwkTag::ABILITYMGR, "consume session timeout, Uri: %{public}s", abilityRecord->GetURI().c_str());
1544        if (uiExtensionAbilityRecordMgr_ != nullptr && IsCallerValid(abilityRecord)) {
1545            TAG_LOGW(AAFwkTag::ABILITYMGR, "start load timeout");
1546            uiExtensionAbilityRecordMgr_->LoadTimeout(abilityRecord->GetUIExtensionAbilityId());
1547        }
1548    }
1549    auto connectingList = abilityRecord->GetConnectingRecordList();
1550    for (auto &connectRecord : connectingList) {
1551        if (connectRecord == nullptr) {
1552            TAG_LOGW(AAFwkTag::ABILITYMGR, "connectRecord null");
1553            continue;
1554        }
1555        connectRecord->CompleteDisconnect(ERR_OK, false, true);
1556        abilityRecord->RemoveConnectRecordFromList(connectRecord);
1557        RemoveConnectionRecordFromMap(connectRecord);
1558    }
1559
1560    if (GetExtensionByTokenFromServiceMap(abilityRecord->GetToken()) == nullptr) {
1561        TAG_LOGE(AAFwkTag::ABILITYMGR, "timeout ability record not exist");
1562        return;
1563    }
1564    TAG_LOGW(AAFwkTag::ABILITYMGR, "AbilityUri:%{public}s,user:%{public}d", abilityRecord->GetURI().c_str(), userId_);
1565    MoveToTerminatingMap(abilityRecord);
1566    RemoveServiceAbility(abilityRecord);
1567    DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1568    if (abilityRecord->IsSceneBoard()) {
1569        if (DelayedSingleton<AbilityManagerService>::GetInstance()->GetUserId() == userId_) {
1570            RestartAbility(abilityRecord, userId_);
1571        }
1572        PrintTimeOutLog(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
1573        return;
1574    }
1575    if (IsAbilityNeedKeepAlive(abilityRecord)) {
1576        TAG_LOGW(AAFwkTag::ABILITYMGR, "load timeout");
1577        RestartAbility(abilityRecord, userId_);
1578    }
1579}
1580
1581void AbilityConnectManager::HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1582{
1583    CHECK_POINTER(abilityRecord);
1584    if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1585        TAG_LOGD(AAFwkTag::ABILITYMGR, "Handle root launcher command timeout.");
1586        // terminate the timeout root launcher.
1587        DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1588    }
1589    TAG_LOGD(AAFwkTag::ABILITYMGR, "HandleCommandTimeoutTask end");
1590}
1591
1592void AbilityConnectManager::HandleConnectTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)
1593{
1594    TAG_LOGW(AAFwkTag::ABILITYMGR, "connect timeout");
1595    CHECK_POINTER(abilityRecord);
1596    auto connectList = abilityRecord->GetConnectRecordList();
1597    std::lock_guard guard(serialMutex_);
1598    for (const auto &connectRecord : connectList) {
1599        RemoveExtensionDelayDisconnectTask(connectRecord);
1600        connectRecord->CancelConnectTimeoutTask();
1601        connectRecord->CompleteDisconnect(ERR_OK, false, true);
1602        abilityRecord->RemoveConnectRecordFromList(connectRecord);
1603        RemoveConnectionRecordFromMap(connectRecord);
1604    }
1605
1606    if (IsSpecialAbility(abilityRecord->GetAbilityInfo()) || abilityRecord->GetStartId() != 0) {
1607        TAG_LOGI(AAFwkTag::ABILITYMGR, "no need terminate");
1608        return;
1609    }
1610
1611    TerminateRecord(abilityRecord);
1612}
1613
1614void AbilityConnectManager::HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord,
1615    const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1616{
1617    TAG_LOGD(AAFwkTag::ABILITYMGR, "start");
1618    std::lock_guard guard(serialMutex_);
1619    CHECK_POINTER(abilityRecord);
1620    abilityRecord->SetAbilityWindowState(sessionInfo, winCmd, true);
1621    // manage queued request
1622    CompleteStartServiceReq(abilityRecord->GetURI());
1623    TAG_LOGD(AAFwkTag::ABILITYMGR, "end");
1624}
1625
1626void AbilityConnectManager::HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1627{
1628    TAG_LOGD(AAFwkTag::ABILITYMGR, "Complete stop ability timeout start.");
1629    std::lock_guard guard(serialMutex_);
1630    CHECK_POINTER(abilityRecord);
1631    if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1632        if (uiExtensionAbilityRecordMgr_ != nullptr && IsCallerValid(abilityRecord)) {
1633            TAG_LOGW(AAFwkTag::ABILITYMGR, "start terminate timeout");
1634            uiExtensionAbilityRecordMgr_->TerminateTimeout(abilityRecord->GetUIExtensionAbilityId());
1635        }
1636        PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1637    }
1638    TerminateDone(abilityRecord);
1639}
1640
1641void AbilityConnectManager::HandleTerminateDisconnectTask(const ConnectListType& connectlist)
1642{
1643    TAG_LOGD(AAFwkTag::ABILITYMGR, "Disconnect ability when terminate.");
1644    for (auto& connectRecord : connectlist) {
1645        if (!connectRecord) {
1646            continue;
1647        }
1648        auto targetService = connectRecord->GetAbilityRecord();
1649        if (targetService) {
1650            TAG_LOGW(AAFwkTag::ABILITYMGR, "record complete disconnect. recordId:%{public}d",
1651                connectRecord->GetRecordId());
1652            connectRecord->CompleteDisconnect(ERR_OK, false, true);
1653            targetService->RemoveConnectRecordFromList(connectRecord);
1654            RemoveConnectionRecordFromMap(connectRecord);
1655        };
1656    }
1657}
1658
1659int AbilityConnectManager::DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
1660{
1661    TAG_LOGD(AAFwkTag::ABILITYMGR, "DispatchInactive call");
1662    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1663    CHECK_POINTER_AND_RETURN(eventHandler_, ERR_INVALID_VALUE);
1664    if (!abilityRecord->IsAbilityState(AbilityState::INACTIVATING)) {
1665        TAG_LOGE(AAFwkTag::ABILITYMGR,
1666            "error. expect %{public}d, actual %{public}d callback %{public}d",
1667            AbilityState::INACTIVATING, abilityRecord->GetAbilityState(), state);
1668        return ERR_INVALID_VALUE;
1669    }
1670    eventHandler_->RemoveEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1671
1672    // complete inactive
1673    abilityRecord->SetAbilityState(AbilityState::INACTIVE);
1674    if (abilityRecord->IsCreateByConnect()) {
1675        ConnectAbility(abilityRecord);
1676    } else if (abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
1677        TAG_LOGD(AAFwkTag::ABILITYMGR, "IS_PRELOAD_UIEXTENSION_ABILITY");
1678        auto ret = uiExtensionAbilityRecordMgr_->AddPreloadUIExtensionRecord(abilityRecord);
1679        if (ret != ERR_OK) {
1680            TAG_LOGE(AAFwkTag::ABILITYMGR, "AddPreloadUIExtensionRecord error");
1681            return ret;
1682        }
1683        return ERR_OK;
1684    } else {
1685        CommandAbility(abilityRecord);
1686        if (abilityRecord->GetConnectRecordList().size() > 0) {
1687            // It means someone called connectAbility when service was loading
1688            abilityRecord->UpdateConnectWant();
1689            ConnectAbility(abilityRecord);
1690        }
1691    }
1692
1693    return ERR_OK;
1694}
1695
1696int AbilityConnectManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1697{
1698    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1699    CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1700    // remove foreground timeout task.
1701    abilityRecord->RemoveForegroundTimeoutTask();
1702    auto self(shared_from_this());
1703    auto task = [self, abilityRecord]() { self->CompleteForeground(abilityRecord); };
1704    taskHandler_->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
1705
1706    return ERR_OK;
1707}
1708
1709int AbilityConnectManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1710{
1711    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1712    CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1713    // remove background timeout task.
1714    taskHandler_->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1715
1716    auto self(shared_from_this());
1717    auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1718    taskHandler_->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
1719
1720    return ERR_OK;
1721}
1722
1723int AbilityConnectManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1724{
1725    CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1726    // remove terminate timeout task
1727    if (taskHandler_ != nullptr) {
1728        taskHandler_->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1729    }
1730    // complete terminate
1731    TerminateDone(abilityRecord);
1732    return ERR_OK;
1733}
1734
1735void AbilityConnectManager::ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1736{
1737    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1738    CHECK_POINTER(abilityRecord);
1739    AppExecFwk::ExtensionAbilityType extType = abilityRecord->GetAbilityInfo().extensionAbilityType;
1740    if (extType == AppExecFwk::ExtensionAbilityType::UI_SERVICE) {
1741        ResumeConnectAbility(abilityRecord);
1742    } else {
1743        PostTimeOutTask(abilityRecord, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1744        abilityRecord->ConnectAbility();
1745    }
1746}
1747
1748void AbilityConnectManager::ConnectUIServiceExtAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1749    int connectRecordId, const Want &want)
1750{
1751    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1752    CHECK_POINTER(abilityRecord);
1753    PostTimeOutTask(abilityRecord, connectRecordId, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1754    abilityRecord->ConnectAbilityWithWant(want);
1755}
1756
1757void AbilityConnectManager::ResumeConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1758{
1759    TAG_LOGI(AAFwkTag::ABILITYMGR, "ResumeConnectAbility");
1760    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1761    CHECK_POINTER(abilityRecord);
1762    std::list<std::shared_ptr<ConnectionRecord>> connectingList = abilityRecord->GetConnectingRecordList();
1763    for (auto &connectRecord : connectingList) {
1764        if (connectRecord == nullptr) {
1765            TAG_LOGW(AAFwkTag::ABILITYMGR, "connectRecord null");
1766            continue;
1767        }
1768        int connectRecordId = connectRecord->GetRecordId();
1769        PostTimeOutTask(abilityRecord, connectRecordId, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1770        abilityRecord->ConnectAbilityWithWant(connectRecord->GetConnectWant());
1771    }
1772}
1773
1774void AbilityConnectManager::CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1775{
1776    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1777    CHECK_POINTER(abilityRecord);
1778    if (taskHandler_ != nullptr) {
1779        // first connect ability, There is at most one connect record.
1780        int recordId = abilityRecord->GetRecordId();
1781        abilityRecord->AddStartId();
1782        std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
1783                               std::to_string(abilityRecord->GetStartId());
1784        auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
1785            TAG_LOGE(AAFwkTag::ABILITYMGR, "command ability timeout. %{public}s",
1786                abilityRecord->GetAbilityInfo().name.c_str());
1787            connectManager->HandleCommandTimeoutTask(abilityRecord);
1788        };
1789        int commandTimeout =
1790            AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_TIMEOUT_MULTIPLE;
1791        taskHandler_->SubmitTask(timeoutTask, taskName, commandTimeout);
1792        // scheduling command ability
1793        abilityRecord->CommandAbility();
1794    }
1795}
1796
1797void AbilityConnectManager::CommandAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord,
1798    const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1799{
1800    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1801    CHECK_POINTER(abilityRecord);
1802    CHECK_POINTER(sessionInfo);
1803    TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s, persistentId: %{private}d, wincmd: %{public}d",
1804        abilityRecord->GetURI().c_str(), sessionInfo->persistentId, winCmd);
1805    abilityRecord->SetAbilityWindowState(sessionInfo, winCmd, false);
1806    if (taskHandler_ != nullptr) {
1807        int recordId = abilityRecord->GetRecordId();
1808        std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
1809            std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
1810        auto timeoutTask = [abilityRecord, sessionInfo, winCmd, connectManager = shared_from_this()]() {
1811            TAG_LOGE(AAFwkTag::ABILITYMGR, "command window timeout. %{public}s",
1812                abilityRecord->GetAbilityInfo().name.c_str());
1813            connectManager->HandleCommandWindowTimeoutTask(abilityRecord, sessionInfo, winCmd);
1814        };
1815        int commandWindowTimeout =
1816            AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_WINDOW_TIMEOUT_MULTIPLE;
1817        taskHandler_->SubmitTask(timeoutTask, taskName, commandWindowTimeout);
1818        // scheduling command ability
1819        abilityRecord->CommandAbilityWindow(sessionInfo, winCmd);
1820    }
1821}
1822
1823void AbilityConnectManager::BackgroundAbilityWindowLocked(const std::shared_ptr<AbilityRecord> &abilityRecord,
1824    const sptr<SessionInfo> &sessionInfo)
1825{
1826    std::lock_guard guard(serialMutex_);
1827    DoBackgroundAbilityWindow(abilityRecord, sessionInfo);
1828}
1829
1830void AbilityConnectManager::DoBackgroundAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord,
1831    const sptr<SessionInfo> &sessionInfo)
1832{
1833    CHECK_POINTER(abilityRecord);
1834    CHECK_POINTER(sessionInfo);
1835    auto abilitystateStr = abilityRecord->ConvertAbilityState(abilityRecord->GetAbilityState());
1836    TAG_LOGI(AAFwkTag::ABILITYMGR,
1837        "ability:%{public}s, persistentId:%{public}d, abilityState:%{public}s",
1838        abilityRecord->GetURI().c_str(), sessionInfo->persistentId, abilitystateStr.c_str());
1839    if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
1840        MoveToBackground(abilityRecord);
1841    } else if (abilityRecord->IsAbilityState(AbilityState::INITIAL) ||
1842        abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
1843        TAG_LOGI(AAFwkTag::ABILITYMGR, "exist initial or foregrounding task");
1844        abilityRecord->DoBackgroundAbilityWindowDelayed(true);
1845    } else if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
1846        TAG_LOGW(AAFwkTag::ABILITYMGR, "invalid ability state");
1847    }
1848}
1849
1850void AbilityConnectManager::TerminateAbilityWindowLocked(const std::shared_ptr<AbilityRecord> &abilityRecord,
1851    const sptr<SessionInfo> &sessionInfo)
1852{
1853    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1854    CHECK_POINTER(abilityRecord);
1855    CHECK_POINTER(sessionInfo);
1856    auto abilitystateStr = abilityRecord->ConvertAbilityState(abilityRecord->GetAbilityState());
1857    TAG_LOGI(AAFwkTag::ABILITYMGR,
1858        "ability:%{public}s, persistentId:%{public}d, abilityState:%{public}s",
1859        abilityRecord->GetURI().c_str(), sessionInfo->persistentId, abilitystateStr.c_str());
1860    EventInfo eventInfo;
1861    eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
1862    eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
1863    EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
1864    std::lock_guard guard(serialMutex_);
1865    eventInfo.errCode = TerminateAbilityInner(abilityRecord->GetToken());
1866    if (eventInfo.errCode != ERR_OK) {
1867        EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1868    }
1869}
1870
1871void AbilityConnectManager::TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)
1872{
1873    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1874    CHECK_POINTER(abilityRecord);
1875    if (!abilityRecord->IsAbilityState(AbilityState::TERMINATING)) {
1876        std::string expect = AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING);
1877        std::string actual = AbilityRecord::ConvertAbilityState(abilityRecord->GetAbilityState());
1878        TAG_LOGE(AAFwkTag::ABILITYMGR,
1879            "error. expect %{public}s, actual %{public}s", expect.c_str(), actual.c_str());
1880        return;
1881    }
1882    IN_PROCESS_CALL_WITHOUT_RET(abilityRecord->RevokeUriPermission());
1883    abilityRecord->RemoveAbilityDeathRecipient();
1884    if (abilityRecord->IsSceneBoard()) {
1885        TAG_LOGI(AAFwkTag::ABILITYMGR, "scb exit, kill processes");
1886        KillProcessesByUserId();
1887    }
1888    DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(abilityRecord->GetToken(), false);
1889    if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1890        RemoveUIExtensionAbilityRecord(abilityRecord);
1891    }
1892    RemoveServiceAbility(abilityRecord);
1893}
1894
1895bool AbilityConnectManager::IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord,
1896    const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
1897{
1898    auto isMatch = [abilityRecord](auto connectRecord) -> bool {
1899        if (abilityRecord == nullptr || connectRecord == nullptr) {
1900            return false;
1901        }
1902        if (abilityRecord != connectRecord->GetAbilityRecord()) {
1903            return false;
1904        }
1905        return true;
1906    };
1907    return std::any_of(connectRecordList.begin(), connectRecordList.end(), isMatch);
1908}
1909
1910void AbilityConnectManager::RemoveConnectionRecordFromMap(std::shared_ptr<ConnectionRecord> connection)
1911{
1912    std::lock_guard lock(connectMapMutex_);
1913    for (auto &connectCallback : connectMap_) {
1914        auto &connectList = connectCallback.second;
1915        auto connectRecord = std::find(connectList.begin(), connectList.end(), connection);
1916        if (connectRecord != connectList.end()) {
1917            TAG_LOGD(AAFwkTag::ABILITYMGR, "connrecord(%{public}d)", (*connectRecord)->GetRecordId());
1918            connectList.remove(connection);
1919            if (connectList.empty()) {
1920                RemoveConnectDeathRecipient(connectCallback.first);
1921                connectMap_.erase(connectCallback.first);
1922            }
1923            return;
1924        }
1925    }
1926}
1927
1928void AbilityConnectManager::RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1929{
1930    CHECK_POINTER(abilityRecord);
1931    TAG_LOGD(AAFwkTag::ABILITYMGR, "Remove service(%{public}s) from terminating map.", abilityRecord->GetURI().c_str());
1932    std::lock_guard lock(serviceMapMutex_);
1933    terminatingExtensionList_.remove(abilityRecord);
1934}
1935
1936void AbilityConnectManager::AddConnectDeathRecipient(sptr<IRemoteObject> connectObject)
1937{
1938    CHECK_POINTER(connectObject);
1939    {
1940        std::lock_guard guard(recipientMapMutex_);
1941        auto it = recipientMap_.find(connectObject);
1942        if (it != recipientMap_.end()) {
1943            TAG_LOGE(AAFwkTag::ABILITYMGR, "recipient added before");
1944            return;
1945        }
1946    }
1947
1948    std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1949    sptr<IRemoteObject::DeathRecipient> deathRecipient =
1950        new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1951            auto abilityConnectManager = thisWeakPtr.lock();
1952            if (abilityConnectManager) {
1953                abilityConnectManager->OnCallBackDied(remote);
1954            }
1955        });
1956    if (!connectObject->AddDeathRecipient(deathRecipient)) {
1957        TAG_LOGE(AAFwkTag::ABILITYMGR, "AddDeathRecipient fail");
1958        return;
1959    }
1960    std::lock_guard guard(recipientMapMutex_);
1961    recipientMap_.emplace(connectObject, deathRecipient);
1962}
1963
1964void AbilityConnectManager::RemoveConnectDeathRecipient(sptr<IRemoteObject> connectObject)
1965{
1966    CHECK_POINTER(connectObject);
1967    sptr<IRemoteObject::DeathRecipient> deathRecipient;
1968    {
1969        std::lock_guard guard(recipientMapMutex_);
1970        auto it = recipientMap_.find(connectObject);
1971        if (it == recipientMap_.end()) {
1972            return;
1973        }
1974        deathRecipient = it->second;
1975        recipientMap_.erase(it);
1976    }
1977
1978    connectObject->RemoveDeathRecipient(deathRecipient);
1979}
1980
1981void AbilityConnectManager::OnCallBackDied(const wptr<IRemoteObject> &remote)
1982{
1983    auto object = remote.promote();
1984    CHECK_POINTER(object);
1985    if (taskHandler_) {
1986        auto task = [object, connectManager = shared_from_this()]() { connectManager->HandleCallBackDiedTask(object); };
1987        taskHandler_->SubmitTask(task, TASK_ON_CALLBACK_DIED);
1988    }
1989}
1990
1991void AbilityConnectManager::HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)
1992{
1993    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
1994    CHECK_POINTER(connect);
1995    {
1996        std::lock_guard guard(windowExtensionMapMutex_);
1997        auto item = windowExtensionMap_.find(connect);
1998        if (item != windowExtensionMap_.end()) {
1999            windowExtensionMap_.erase(item);
2000        }
2001    }
2002
2003    {
2004        std::lock_guard guard(connectMapMutex_);
2005        auto it = connectMap_.find(connect);
2006        if (it != connectMap_.end()) {
2007            ConnectListType connectRecordList = it->second;
2008            for (auto &connRecord : connectRecordList) {
2009                connRecord->ClearConnCallBack();
2010            }
2011        } else {
2012            TAG_LOGI(AAFwkTag::ABILITYMGR, "not find");
2013            return;
2014        }
2015    }
2016
2017    sptr<IAbilityConnection> object = iface_cast<IAbilityConnection>(connect);
2018    std::lock_guard guard(serialMutex_);
2019    DisconnectAbilityLocked(object, true);
2020}
2021
2022int32_t AbilityConnectManager::GetActiveUIExtensionList(
2023    const int32_t pid, std::vector<std::string> &extensionList)
2024{
2025    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
2026    return uiExtensionAbilityRecordMgr_->GetActiveUIExtensionList(pid, extensionList);
2027}
2028
2029int32_t AbilityConnectManager::GetActiveUIExtensionList(
2030    const std::string &bundleName, std::vector<std::string> &extensionList)
2031{
2032    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
2033    return uiExtensionAbilityRecordMgr_->GetActiveUIExtensionList(bundleName, extensionList);
2034}
2035
2036void AbilityConnectManager::OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2037{
2038    CHECK_POINTER(abilityRecord);
2039    TAG_LOGI(AAFwkTag::ABILITYMGR, "on ability died: %{public}s", abilityRecord->GetURI().c_str());
2040    if (abilityRecord->GetAbilityInfo().type != AbilityType::SERVICE &&
2041        abilityRecord->GetAbilityInfo().type != AbilityType::EXTENSION) {
2042        TAG_LOGW(AAFwkTag::ABILITYMGR, "type not service");
2043        return;
2044    }
2045    if (eventHandler_ && abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
2046        abilityRecord->RemoveLoadTimeoutTask();
2047    }
2048    if (eventHandler_ && abilityRecord->GetAbilityState() == AbilityState::FOREGROUNDING) {
2049        abilityRecord->RemoveForegroundTimeoutTask();
2050    }
2051    if (taskHandler_ && abilityRecord->GetAbilityState() == AbilityState::BACKGROUNDING) {
2052        taskHandler_->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
2053    }
2054    if (taskHandler_ && abilityRecord->GetAbilityState() == AbilityState::TERMINATING) {
2055        taskHandler_->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
2056    }
2057    if (taskHandler_) {
2058        auto task = [abilityRecord, connectManager = shared_from_this(), currentUserId]() {
2059            connectManager->HandleAbilityDiedTask(abilityRecord, currentUserId);
2060        };
2061        taskHandler_->SubmitTask(task, TASK_ON_ABILITY_DIED);
2062    }
2063}
2064
2065void AbilityConnectManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf)
2066{
2067    auto abilityRecord = GetExtensionByIdFromServiceMap(abilityRecordId);
2068    if (abilityRecord == nullptr) {
2069        TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
2070        return;
2071    }
2072    PrintTimeOutLog(abilityRecord, msgId, isHalf);
2073    if (isHalf) {
2074        return;
2075    }
2076    switch (msgId) {
2077        case AbilityManagerService::LOAD_TIMEOUT_MSG:
2078            HandleStartTimeoutTask(abilityRecord);
2079            break;
2080        case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
2081            HandleInactiveTimeout(abilityRecord);
2082            break;
2083        case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
2084            HandleForegroundTimeoutTask(abilityRecord);
2085            break;
2086        default:
2087            break;
2088    }
2089}
2090
2091void AbilityConnectManager::HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)
2092{
2093    TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleInactiveTimeout start");
2094    CHECK_POINTER(ability);
2095    if (ability->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
2096        TAG_LOGD(AAFwkTag::ABILITYMGR, "Handle root launcher inactive timeout.");
2097        // terminate the timeout root launcher.
2098        DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
2099    }
2100    if (ability->GetAbilityInfo().name == AbilityConfig::CALLUI_ABILITY_NAME && ability->GetStartId() == 0) {
2101        HandleConnectTimeoutTask(ability);
2102        EventInfo eventInfo;
2103        eventInfo.userId = userId_;
2104        eventInfo.bundleName = ability->GetAbilityInfo().bundleName;
2105        eventInfo.moduleName = ability->GetAbilityInfo().moduleName;
2106        eventInfo.abilityName = ability->GetAbilityInfo().name;
2107        eventInfo.abilityName = ability->GetAbilityInfo().name;
2108        eventInfo.errCode = CONNECTION_TIMEOUT;
2109        EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2110    }
2111
2112    TAG_LOGI(AAFwkTag::ABILITYMGR, "HandleInactiveTimeout end");
2113}
2114
2115bool AbilityConnectManager::IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)
2116{
2117    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2118    CHECK_POINTER_AND_RETURN(abilityRecord, false);
2119    const auto &abilityInfo = abilityRecord->GetAbilityInfo();
2120    if (IsSpecialAbility(abilityInfo)) {
2121        return true;
2122    }
2123
2124    return abilityRecord->IsKeepAliveBundle();
2125}
2126
2127void AbilityConnectManager::ClearPreloadUIExtensionRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
2128{
2129    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2130    CHECK_POINTER(abilityRecord);
2131    auto extensionRecordId = abilityRecord->GetUIExtensionAbilityId();
2132    std::string hostBundleName;
2133    auto ret = uiExtensionAbilityRecordMgr_->GetHostBundleNameForExtensionId(extensionRecordId, hostBundleName);
2134    if (ret != ERR_OK) {
2135        TAG_LOGE(AAFwkTag::ABILITYMGR, "GetHostBundleNameForExtensionId fail");
2136        return;
2137    }
2138    auto extensionRecordMapKey = std::make_tuple(abilityRecord->GetWant().GetElement().GetAbilityName(),
2139        abilityRecord->GetWant().GetElement().GetBundleName(),
2140        abilityRecord->GetWant().GetElement().GetModuleName(), hostBundleName);
2141    uiExtensionAbilityRecordMgr_->RemovePreloadUIExtensionRecordById(extensionRecordMapKey, extensionRecordId);
2142}
2143
2144void AbilityConnectManager::KeepAbilityAlive(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2145{
2146    CHECK_POINTER(abilityRecord);
2147    auto abilityInfo = abilityRecord->GetAbilityInfo();
2148    TAG_LOGI(AAFwkTag::ABILITYMGR, "restart ability, bundleName: %{public}s, abilityName: %{public}s",
2149        abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
2150    auto token = abilityRecord->GetToken();
2151    if ((IsLauncher(abilityRecord) || abilityRecord->IsSceneBoard()) && token != nullptr) {
2152        IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->ClearProcessByToken(
2153            token->AsObject()));
2154        if (abilityRecord->IsSceneBoard() && currentUserId != userId_) {
2155            TAG_LOGI(AAFwkTag::ABILITYMGR, "not current user's SCB, clear user and not restart");
2156            KillProcessesByUserId();
2157            return;
2158        }
2159    }
2160
2161    if (userId_ != USER_ID_NO_HEAD && userId_ != currentUserId) {
2162        TAG_LOGI(AAFwkTag::ABILITYMGR, "Not current user's ability");
2163        return;
2164    }
2165
2166    if (abilityRecord->IsSceneBoard() && AmsConfigurationParameter::GetInstance().IsSupportSCBCrashReboot()) {
2167        static int sceneBoardCrashCount = 0;
2168        static int64_t tickCount = GetTickCount();
2169        int64_t tickNow = GetTickCount();
2170        const int64_t maxTime = 240000; // 240000 4min
2171        const int maxCount = 4; // 4: crash happened 4 times during 4 mins
2172        if (tickNow - tickCount > maxTime) {
2173            sceneBoardCrashCount = 0;
2174            tickCount = tickNow;
2175        }
2176        ++sceneBoardCrashCount;
2177        if (sceneBoardCrashCount >= maxCount) {
2178            std::string reason = "SceneBoard exits " + std::to_string(sceneBoardCrashCount) +
2179                "times in " + std::to_string(maxTime) + "ms";
2180            DoRebootExt("panic", reason.c_str());
2181        }
2182    }
2183
2184    if (DelayedSingleton<AppScheduler>::GetInstance()->IsKilledForUpgradeWeb(abilityInfo.bundleName)) {
2185        TAG_LOGI(AAFwkTag::ABILITYMGR, "bundle killed");
2186        return;
2187    }
2188    if (DelayedSingleton<AppScheduler>::GetInstance()->IsMemorySizeSufficent() ||
2189        IsLauncher(abilityRecord) || abilityRecord->IsSceneBoard() ||
2190        AppUtils::GetInstance().IsAllowResidentInExtremeMemory(abilityInfo.bundleName, abilityInfo.name)) {
2191        RestartAbility(abilityRecord, currentUserId);
2192    }
2193}
2194
2195void AbilityConnectManager::HandleAbilityDiedTask(
2196    const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2197{
2198    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2199    std::lock_guard guard(serialMutex_);
2200    CHECK_POINTER(abilityRecord);
2201    TAG_LOGI(AAFwkTag::ABILITYMGR, "ability died: %{public}s", abilityRecord->GetURI().c_str());
2202    abilityRecord->SetConnRemoteObject(nullptr);
2203    ConnectListType connlist = abilityRecord->GetConnectRecordList();
2204    for (auto &connectRecord : connlist) {
2205        TAG_LOGW(AAFwkTag::ABILITYMGR, "record complete disconnect. recordId:%{public}d",
2206            connectRecord->GetRecordId());
2207        RemoveExtensionDelayDisconnectTask(connectRecord);
2208        connectRecord->CompleteDisconnect(ERR_OK, false, true);
2209        abilityRecord->RemoveConnectRecordFromList(connectRecord);
2210        RemoveConnectionRecordFromMap(connectRecord);
2211    }
2212
2213    if (IsUIExtensionAbility(abilityRecord)) {
2214        HandleUIExtensionDied(abilityRecord);
2215    }
2216
2217    std::string serviceKey = GetServiceKey(abilityRecord);
2218    if (GetServiceRecordByElementName(serviceKey) == nullptr) {
2219        TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s ability record is not exist in service map.", serviceKey.c_str());
2220        return;
2221    }
2222
2223    bool isRemove = false;
2224    if (IsCacheExtensionAbilityType(abilityRecord) &&
2225        AbilityCacheManager::GetInstance().FindRecordByToken(abilityRecord->GetToken()) != nullptr) {
2226        AbilityCacheManager::GetInstance().Remove(abilityRecord);
2227        MoveToTerminatingMap(abilityRecord);
2228        RemoveServiceAbility(abilityRecord);
2229        isRemove = true;
2230    } else if (GetExtensionByIdFromServiceMap(abilityRecord->GetAbilityRecordId()) != nullptr) {
2231        MoveToTerminatingMap(abilityRecord);
2232        RemoveServiceAbility(abilityRecord);
2233        if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
2234            RemoveUIExtensionAbilityRecord(abilityRecord);
2235        }
2236        isRemove = true;
2237    }
2238
2239    if (IsAbilityNeedKeepAlive(abilityRecord)) {
2240        KeepAbilityAlive(abilityRecord, currentUserId);
2241    } else {
2242        if (isRemove) {
2243            HandleNotifyAssertFaultDialogDied(abilityRecord);
2244        }
2245    }
2246}
2247
2248static bool CheckIsNumString(const std::string &numStr)
2249{
2250    const std::regex regexJsperf(R"(^\d*)");
2251    std::match_results<std::string::const_iterator> matchResults;
2252    if (numStr.empty() || !std::regex_match(numStr, matchResults, regexJsperf)) {
2253        TAG_LOGE(AAFwkTag::ABILITYMGR, "error, %{public}s", numStr.c_str());
2254        return false;
2255    }
2256    if (MAX_UINT64_VALUE.length() < numStr.length() ||
2257        (MAX_UINT64_VALUE.length() == numStr.length() && MAX_UINT64_VALUE.compare(numStr) < 0)) {
2258        TAG_LOGE(AAFwkTag::ABILITYMGR, "error, %{public}s", numStr.c_str());
2259        return false;
2260    }
2261
2262    return true;
2263}
2264
2265void AbilityConnectManager::HandleNotifyAssertFaultDialogDied(const std::shared_ptr<AbilityRecord> &abilityRecord)
2266{
2267    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2268    CHECK_POINTER(abilityRecord);
2269    if (abilityRecord->GetAbilityInfo().name != ABILITY_NAME_ASSERT_FAULT_DIALOG ||
2270        abilityRecord->GetAbilityInfo().bundleName != BUNDLE_NAME_DIALOG) {
2271        TAG_LOGE(AAFwkTag::ABILITYMGR, "not assert fault dialog");
2272        return;
2273    }
2274
2275    auto want = abilityRecord->GetWant();
2276    auto assertSessionStr = want.GetStringParam(Want::PARAM_ASSERT_FAULT_SESSION_ID);
2277    if (!CheckIsNumString(assertSessionStr)) {
2278        TAG_LOGE(AAFwkTag::ABILITYMGR, "assertSessionStr not number");
2279        return;
2280    }
2281
2282    auto callbackDeathMgr = DelayedSingleton<AbilityRuntime::AssertFaultCallbackDeathMgr>::GetInstance();
2283    if (callbackDeathMgr == nullptr) {
2284        TAG_LOGE(AAFwkTag::ABILITYMGR, "null callbackDeathMgr");
2285        return;
2286    }
2287    callbackDeathMgr->CallAssertFaultCallback(std::stoull(assertSessionStr));
2288}
2289
2290void AbilityConnectManager::CloseAssertDialog(const std::string &assertSessionId)
2291{
2292    TAG_LOGD(AAFwkTag::ABILITYMGR, "Called");
2293    std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2294    {
2295        std::lock_guard lock(serviceMapMutex_);
2296        for (const auto &item : serviceMap_) {
2297            if (item.second == nullptr) {
2298                continue;
2299            }
2300
2301            auto assertSessionStr = item.second->GetWant().GetStringParam(Want::PARAM_ASSERT_FAULT_SESSION_ID);
2302            if (assertSessionStr == assertSessionId) {
2303                abilityRecord = item.second;
2304                serviceMap_.erase(item.first);
2305                break;
2306            }
2307        }
2308    }
2309    if (abilityRecord == nullptr) {
2310        abilityRecord = AbilityCacheManager::GetInstance().FindRecordBySessionId(assertSessionId);
2311        AbilityCacheManager::GetInstance().Remove(abilityRecord);
2312    }
2313    if (abilityRecord == nullptr) {
2314        return;
2315    }
2316    TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate assert fault dialog");
2317    terminatingExtensionList_.push_back(abilityRecord);
2318    sptr<IRemoteObject> token = abilityRecord->GetToken();
2319    if (token != nullptr) {
2320        std::lock_guard lock(serialMutex_);
2321        TerminateAbilityLocked(token);
2322    }
2323}
2324
2325void AbilityConnectManager::HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> &abilityRecord)
2326{
2327    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2328    CHECK_POINTER(abilityRecord);
2329    std::lock_guard guard(uiExtensionMapMutex_);
2330    for (auto it = uiExtensionMap_.begin(); it != uiExtensionMap_.end();) {
2331        std::shared_ptr<AbilityRecord> uiExtAbility = it->second.first.lock();
2332        if (uiExtAbility == nullptr) {
2333            TAG_LOGW(AAFwkTag::ABILITYMGR, "uiExtAbility null");
2334            RemoveUIExtWindowDeathRecipient(it->first);
2335            it = uiExtensionMap_.erase(it);
2336            continue;
2337        }
2338
2339        if (abilityRecord == uiExtAbility) {
2340            sptr<Rosen::ISession> sessionProxy = iface_cast<Rosen::ISession>(it->first);
2341            if (sessionProxy) {
2342                TAG_LOGD(AAFwkTag::ABILITYMGR, "start NotifyExtensionDied");
2343                sessionProxy->NotifyExtensionDied();
2344            }
2345            TAG_LOGW(AAFwkTag::UI_EXT, "uiExtAbility died");
2346            RemoveUIExtWindowDeathRecipient(it->first);
2347            it = uiExtensionMap_.erase(it);
2348            continue;
2349        }
2350        ++it;
2351    }
2352}
2353
2354void AbilityConnectManager::RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
2355{
2356    TAG_LOGI(AAFwkTag::ABILITYMGR, "restart ability: %{public}s", abilityRecord->GetURI().c_str());
2357    AbilityRequest requestInfo;
2358    requestInfo.want = abilityRecord->GetWant();
2359    requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
2360    requestInfo.appInfo = abilityRecord->GetApplicationInfo();
2361    requestInfo.restartTime = abilityRecord->GetRestartTime();
2362    requestInfo.restart = true;
2363    requestInfo.uid = abilityRecord->GetUid();
2364    abilityRecord->SetRestarting(true);
2365    ResidentAbilityInfoGuard residentAbilityInfoGuard;
2366    if (abilityRecord->IsKeepAliveBundle()) {
2367        residentAbilityInfoGuard.SetResidentAbilityInfo(requestInfo.abilityInfo.bundleName,
2368            requestInfo.abilityInfo.name, userId_);
2369    }
2370
2371    if (AppUtils::GetInstance().IsLauncherAbility(abilityRecord->GetAbilityInfo().name)) {
2372        if (currentUserId != userId_) {
2373            TAG_LOGW(AAFwkTag::ABILITYMGR, "delay restart root launcher until switch user");
2374            return;
2375        }
2376        if (abilityRecord->IsSceneBoard()) {
2377            requestInfo.want.SetParam("ohos.app.recovery", true);
2378            DelayedSingleton<AbilityManagerService>::GetInstance()->EnableListForSCBRecovery(userId_);
2379        }
2380        requestInfo.restartCount = abilityRecord->GetRestartCount();
2381        TAG_LOGD(AAFwkTag::ABILITYMGR, "restart root launcher, number:%{public}d", requestInfo.restartCount);
2382        StartAbilityLocked(requestInfo);
2383        return;
2384    }
2385
2386    requestInfo.want.SetParam(WANT_PARAMS_APP_RESTART_FLAG, true);
2387
2388    // restart other resident ability
2389    if (abilityRecord->CanRestartResident()) {
2390        requestInfo.restartCount = abilityRecord->GetRestartCount();
2391        requestInfo.restartTime = AbilityUtil::SystemTimeMillis();
2392        StartAbilityLocked(requestInfo);
2393    } else {
2394        auto findRestartResidentTask = [requestInfo](const AbilityRequest &abilityRequest) {
2395            return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
2396                requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
2397                requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
2398        };
2399        auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(),
2400            findRestartResidentTask);
2401        if (findIter != restartResidentTaskList_.end()) {
2402            TAG_LOGW(AAFwkTag::ABILITYMGR, "restart task registered");
2403            return;
2404        }
2405        restartResidentTaskList_.emplace_back(requestInfo);
2406        PostRestartResidentTask(requestInfo);
2407    }
2408}
2409
2410std::string AbilityConnectManager::GetServiceKey(const std::shared_ptr<AbilityRecord> &service)
2411{
2412    std::string serviceKey = service->GetURI();
2413    if (FRS_BUNDLE_NAME == service->GetAbilityInfo().bundleName) {
2414        serviceKey = serviceKey + std::to_string(service->GetWant().GetIntParam(FRS_APP_INDEX, 0));
2415    }
2416    return serviceKey;
2417}
2418
2419void AbilityConnectManager::DumpState(std::vector<std::string> &info, bool isClient, const std::string &args)
2420{
2421    TAG_LOGI(AAFwkTag::ABILITYMGR, "args:%{public}s", args.c_str());
2422    auto serviceMapBack = GetServiceMap();
2423    auto cacheList = AbilityCacheManager::GetInstance().GetAbilityList();
2424    if (!args.empty()) {
2425        auto it = std::find_if(serviceMapBack.begin(), serviceMapBack.end(), [&args](const auto &service) {
2426            return service.first.compare(args) == 0;
2427        });
2428        if (it != serviceMapBack.end()) {
2429            info.emplace_back("uri [ " + it->first + " ]");
2430            if (it->second != nullptr) {
2431                it->second->DumpService(info, isClient);
2432            }
2433        } else {
2434            info.emplace_back(args + ": Nothing to dump from serviceMap.");
2435        }
2436
2437        std::string serviceKey;
2438        auto iter = std::find_if(cacheList.begin(), cacheList.end(), [&args, &serviceKey, this](const auto &service) {
2439            serviceKey = GetServiceKey(service);
2440            return serviceKey.compare(args) == 0;
2441        });
2442        if (iter != cacheList.end()) {
2443            info.emplace_back("uri [ " + serviceKey + " ]");
2444            if (*iter != nullptr) {
2445                (*iter)->DumpService(info, isClient);
2446            }
2447        } else {
2448            info.emplace_back(args + ": Nothing to dump from lru cache.");
2449        }
2450    } else {
2451        info.emplace_back("  ExtensionRecords:");
2452        for (auto &&service : serviceMapBack) {
2453            info.emplace_back("    uri [" + service.first + "]");
2454            if (service.second != nullptr) {
2455                service.second->DumpService(info, isClient);
2456            }
2457        }
2458        for (auto &&service : cacheList) {
2459            std::string serviceKey = GetServiceKey(service);
2460            info.emplace_back("    uri [" + serviceKey + "]");
2461            if (service != nullptr) {
2462                service->DumpService(info, isClient);
2463            }
2464        }
2465    }
2466}
2467
2468void AbilityConnectManager::DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args,
2469    std::vector<std::string> &params)
2470{
2471    TAG_LOGI(AAFwkTag::ABILITYMGR, "args:%{public}s, params size: %{public}zu", args.c_str(), params.size());
2472    std::shared_ptr<AbilityRecord> extensionAbilityRecord = nullptr;
2473    {
2474        std::lock_guard lock(serviceMapMutex_);
2475        auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
2476            return service.first.compare(args) == 0;
2477        });
2478        if (it != serviceMap_.end()) {
2479            info.emplace_back("uri [ " + it->first + " ]");
2480            extensionAbilityRecord = it->second;
2481        } else {
2482            info.emplace_back(args + ": Nothing to dump from serviceMap.");
2483        }
2484    }
2485    if (extensionAbilityRecord != nullptr) {
2486        extensionAbilityRecord->DumpService(info, params, isClient);
2487        return;
2488    }
2489    extensionAbilityRecord = AbilityCacheManager::GetInstance().FindRecordByServiceKey(args);
2490    if (extensionAbilityRecord != nullptr) {
2491        info.emplace_back("uri [ " + args + " ]");
2492        extensionAbilityRecord->DumpService(info, params, isClient);
2493    } else {
2494        info.emplace_back(args + ": Nothing to dump from lru cache.");
2495    }
2496}
2497
2498void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info,
2499    const int32_t userId, bool isPerm)
2500{
2501    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2502    auto serviceMapBack = GetServiceMap();
2503    auto queryInfo = [&](ServiceMapType::reference service) {
2504        if (static_cast<int>(info.size()) >= upperLimit) {
2505            return;
2506        }
2507        auto abilityRecord = service.second;
2508        CHECK_POINTER(abilityRecord);
2509
2510        if (isPerm) {
2511            GetExtensionRunningInfo(abilityRecord, userId, info);
2512        } else {
2513            auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2514            auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2515            if (callingTokenId == tokenID) {
2516                GetExtensionRunningInfo(abilityRecord, userId, info);
2517            }
2518        }
2519    };
2520    std::for_each(serviceMapBack.begin(), serviceMapBack.end(), queryInfo);
2521
2522    auto cacheAbilityList = AbilityCacheManager::GetInstance().GetAbilityList();
2523    auto queryInfoForCache = [&](std::shared_ptr<AbilityRecord> &service) {
2524        if (static_cast<int>(info.size()) >= upperLimit) {
2525            return;
2526        }
2527        CHECK_POINTER(service);
2528
2529        if (isPerm) {
2530            GetExtensionRunningInfo(service, userId, info);
2531        } else {
2532            auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2533            auto tokenID = service->GetApplicationInfo().accessTokenId;
2534            if (callingTokenId == tokenID) {
2535                GetExtensionRunningInfo(service, userId, info);
2536            }
2537        }
2538    };
2539    std::for_each(cacheAbilityList.begin(), cacheAbilityList.end(), queryInfoForCache);
2540}
2541
2542void AbilityConnectManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
2543{
2544    auto serviceMapBack = GetServiceMap();
2545    auto queryInfo = [&info, isPerm](ServiceMapType::reference service) {
2546        auto abilityRecord = service.second;
2547        CHECK_POINTER(abilityRecord);
2548
2549        if (isPerm) {
2550            DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2551        } else {
2552            auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2553            auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
2554            if (callingTokenId == tokenID) {
2555                DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
2556            }
2557        }
2558    };
2559
2560    std::for_each(serviceMapBack.begin(), serviceMapBack.end(), queryInfo);
2561}
2562
2563void AbilityConnectManager::GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord,
2564    const int32_t userId, std::vector<ExtensionRunningInfo> &info)
2565{
2566    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2567    ExtensionRunningInfo extensionInfo;
2568    AppExecFwk::RunningProcessInfo processInfo;
2569    extensionInfo.extension = abilityRecord->GetElementName();
2570    extensionInfo.type = abilityRecord->GetAbilityInfo().extensionAbilityType;
2571    DelayedSingleton<AppScheduler>::GetInstance()->
2572        GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
2573    extensionInfo.pid = processInfo.pid_;
2574    extensionInfo.uid = processInfo.uid_;
2575    extensionInfo.processName = processInfo.processName_;
2576    extensionInfo.startTime = abilityRecord->GetStartTime();
2577    ConnectListType connectRecordList = abilityRecord->GetConnectRecordList();
2578    for (auto &connectRecord : connectRecordList) {
2579        if (connectRecord == nullptr) {
2580            TAG_LOGD(AAFwkTag::ABILITYMGR, "connectRecord is nullptr.");
2581            continue;
2582        }
2583        auto callerAbilityRecord = Token::GetAbilityRecordByToken(connectRecord->GetToken());
2584        if (callerAbilityRecord == nullptr) {
2585            TAG_LOGD(AAFwkTag::ABILITYMGR, "callerAbilityRecord is nullptr.");
2586            continue;
2587        }
2588        std::string package = callerAbilityRecord->GetAbilityInfo().bundleName;
2589        extensionInfo.clientPackage.emplace_back(package);
2590    }
2591    info.emplace_back(extensionInfo);
2592}
2593
2594void AbilityConnectManager::PauseExtensions()
2595{
2596    TAG_LOGD(AAFwkTag::ABILITYMGR, "begin.");
2597    std::vector<sptr<IRemoteObject>> needTerminatedTokens;
2598    {
2599        std::lock_guard lock(serviceMapMutex_);
2600        for (auto it = serviceMap_.begin(); it != serviceMap_.end();) {
2601            auto targetExtension = it->second;
2602            if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION &&
2603                (IsLauncher(targetExtension) || targetExtension->IsSceneBoard() ||
2604                (targetExtension->GetKeepAlive() && userId_ != USER_ID_NO_HEAD))) {
2605                terminatingExtensionList_.push_back(it->second);
2606                it = serviceMap_.erase(it);
2607                TAG_LOGI(AAFwkTag::ABILITYMGR, "terminate ability:%{public}s",
2608                    targetExtension->GetAbilityInfo().name.c_str());
2609                needTerminatedTokens.push_back(targetExtension->GetToken());
2610            } else {
2611                ++it;
2612            }
2613        }
2614    }
2615
2616    for (const auto &token : needTerminatedTokens) {
2617        std::lock_guard lock(serialMutex_);
2618        TerminateAbilityLocked(token);
2619    }
2620}
2621
2622void AbilityConnectManager::RemoveLauncherDeathRecipient()
2623{
2624    TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
2625    {
2626        std::lock_guard lock(serviceMapMutex_);
2627        for (auto it = serviceMap_.begin(); it != serviceMap_.end(); ++it) {
2628            auto targetExtension = it->second;
2629            if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION &&
2630                (IsLauncher(targetExtension) || targetExtension->IsSceneBoard())) {
2631                targetExtension->RemoveAbilityDeathRecipient();
2632                return;
2633            }
2634        }
2635    }
2636    AbilityCacheManager::GetInstance().RemoveLauncherDeathRecipient();
2637}
2638
2639bool AbilityConnectManager::IsLauncher(std::shared_ptr<AbilityRecord> serviceExtension) const
2640{
2641    if (serviceExtension == nullptr) {
2642        TAG_LOGE(AAFwkTag::ABILITYMGR, "param null");
2643        return false;
2644    }
2645    return serviceExtension->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME &&
2646        serviceExtension->GetAbilityInfo().bundleName == AbilityConfig::LAUNCHER_BUNDLE_NAME;
2647}
2648
2649void AbilityConnectManager::KillProcessesByUserId() const
2650{
2651    auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
2652    if (appScheduler == nullptr) {
2653        TAG_LOGE(AAFwkTag::ABILITYMGR, "appScheduler null");
2654        return;
2655    }
2656    IN_PROCESS_CALL_WITHOUT_RET(appScheduler->KillProcessesByUserId(userId_));
2657}
2658
2659void AbilityConnectManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
2660{
2661    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2662    if (abilityRecord == nullptr) {
2663        TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityRecord");
2664        return;
2665    }
2666    TAG_LOGD(AAFwkTag::ABILITYMGR, "Move the ui extension ability to background, ability:%{public}s.",
2667        abilityRecord->GetAbilityInfo().name.c_str());
2668    abilityRecord->SetIsNewWant(false);
2669
2670    auto self(weak_from_this());
2671    auto task = [abilityRecord, self]() {
2672        auto selfObj = self.lock();
2673        if (selfObj == nullptr) {
2674            TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr invalid");
2675            return;
2676        }
2677        CHECK_POINTER(abilityRecord);
2678        if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType) &&
2679            selfObj->uiExtensionAbilityRecordMgr_ != nullptr && selfObj->IsCallerValid(abilityRecord)) {
2680            TAG_LOGD(AAFwkTag::ABILITYMGR, "Start background timeout.");
2681            selfObj->uiExtensionAbilityRecordMgr_->BackgroundTimeout(abilityRecord->GetUIExtensionAbilityId());
2682        }
2683        TAG_LOGE(AAFwkTag::ABILITYMGR, "move timeout");
2684        selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
2685        selfObj->CompleteBackground(abilityRecord);
2686    };
2687    abilityRecord->BackgroundAbility(task);
2688}
2689
2690void AbilityConnectManager::CompleteForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
2691{
2692    std::lock_guard guard(serialMutex_);
2693    if (abilityRecord == nullptr) {
2694        TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
2695        return;
2696    }
2697    if (abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
2698        TAG_LOGE(AAFwkTag::ABILITYMGR, "ability state: %{public}d, not complete foreground",
2699            abilityRecord->GetAbilityState());
2700        return;
2701    }
2702
2703    abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
2704    if (abilityRecord->BackgroundAbilityWindowDelayed()) {
2705        TAG_LOGI(AAFwkTag::ABILITYMGR, "response background request");
2706        abilityRecord->DoBackgroundAbilityWindowDelayed(false);
2707        DoBackgroundAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo());
2708    }
2709    CompleteStartServiceReq(abilityRecord->GetURI());
2710}
2711
2712void AbilityConnectManager::HandleForegroundTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
2713{
2714    std::lock_guard guard(serialMutex_);
2715    if (abilityRecord == nullptr) {
2716        TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
2717        return;
2718    }
2719    if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType) &&
2720        uiExtensionAbilityRecordMgr_ != nullptr && IsCallerValid(abilityRecord)) {
2721        TAG_LOGW(AAFwkTag::ABILITYMGR, "start foreground timeout");
2722        uiExtensionAbilityRecordMgr_->ForegroundTimeout(abilityRecord->GetUIExtensionAbilityId());
2723    }
2724    abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
2725    abilityRecord->DoBackgroundAbilityWindowDelayed(false);
2726    CompleteStartServiceReq(abilityRecord->GetURI());
2727}
2728
2729void AbilityConnectManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
2730{
2731    std::lock_guard lock(serialMutex_);
2732    if (abilityRecord == nullptr) {
2733        TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
2734        return;
2735    }
2736    if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
2737        TAG_LOGE(AAFwkTag::ABILITYMGR, "ability state: %{public}d, not complete background.",
2738            abilityRecord->GetAbilityState());
2739        return;
2740    }
2741    abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
2742    // send application state to AppMS.
2743    // notify AppMS to update application state.
2744    DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
2745    CompleteStartServiceReq(abilityRecord->GetURI());
2746    // Abilities ahead of the one started were put in terminate list, we need to terminate them.
2747    TerminateAbilityLocked(abilityRecord->GetToken());
2748}
2749
2750void AbilityConnectManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId, bool isHalf)
2751{
2752    CHECK_POINTER(ability);
2753    AppExecFwk::RunningProcessInfo processInfo = {};
2754    DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
2755    if (processInfo.pid_ == 0) {
2756        TAG_LOGE(AAFwkTag::ABILITYMGR, "ability %{public}s pid invalid", ability->GetURI().c_str());
2757        return;
2758    }
2759    int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
2760    std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
2761    switch (msgId) {
2762        case AbilityManagerService::LOAD_TIMEOUT_MSG:
2763            msgContent += "load timeout";
2764            typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
2765            break;
2766        case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
2767            msgContent += "active timeout";
2768            break;
2769        case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
2770            msgContent += "inactive timeout";
2771            break;
2772        case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
2773            msgContent += "foreground timeout";
2774            typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
2775            break;
2776        case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
2777            msgContent += "background timeout";
2778            break;
2779        case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
2780            msgContent += "terminate timeout";
2781            break;
2782        default:
2783            return;
2784    }
2785
2786    TAG_LOGW(AAFwkTag::ABILITYMGR,
2787        "LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
2788        "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
2789        ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
2790    std::string eventName = isHalf ?
2791        AppExecFwk::AppFreezeType::LIFECYCLE_HALF_TIMEOUT : AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
2792    AppExecFwk::AppfreezeManager::ParamInfo info = {
2793        .typeId = typeId,
2794        .pid = processInfo.pid_,
2795        .eventName = eventName,
2796        .bundleName = ability->GetAbilityInfo().bundleName,
2797        .msg = msgContent
2798    };
2799    AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info);
2800}
2801
2802void AbilityConnectManager::MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)
2803{
2804    CHECK_POINTER(abilityRecord);
2805    auto& abilityInfo = abilityRecord->GetAbilityInfo();
2806    std::lock_guard lock(serviceMapMutex_);
2807    terminatingExtensionList_.push_back(abilityRecord);
2808    std::string serviceKey = abilityRecord->GetURI();
2809    if (FRS_BUNDLE_NAME == abilityInfo.bundleName) {
2810        AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
2811            abilityInfo.moduleName);
2812        serviceKey = element.GetURI() + std::to_string(abilityRecord->GetWant().GetIntParam(FRS_APP_INDEX, 0));
2813    }
2814    if (serviceMap_.erase(serviceKey) == 0) {
2815        TAG_LOGW(AAFwkTag::ABILITYMGR, "Unknown: %{public}s", serviceKey.c_str());
2816    }
2817    AbilityCacheManager::GetInstance().Remove(abilityRecord);
2818    if (IsSpecialAbility(abilityRecord->GetAbilityInfo())) {
2819        TAG_LOGI(AAFwkTag::ABILITYMGR, "moving ability: %{public}s", abilityRecord->GetURI().c_str());
2820    }
2821}
2822
2823void AbilityConnectManager::AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
2824{
2825    CHECK_POINTER(session);
2826    std::lock_guard lock(uiExtRecipientMapMutex_);
2827    auto it = uiExtRecipientMap_.find(session);
2828    if (it != uiExtRecipientMap_.end()) {
2829        TAG_LOGE(AAFwkTag::ABILITYMGR, "recipient added before");
2830        return;
2831    } else {
2832        std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
2833        sptr<IRemoteObject::DeathRecipient> deathRecipient =
2834            new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
2835                auto abilityConnectManager = thisWeakPtr.lock();
2836                if (abilityConnectManager) {
2837                    abilityConnectManager->OnUIExtWindowDied(remote);
2838                }
2839            });
2840        if (!session->AddDeathRecipient(deathRecipient)) {
2841            TAG_LOGE(AAFwkTag::ABILITYMGR, "AddDeathRecipient fail");
2842        }
2843        uiExtRecipientMap_.emplace(session, deathRecipient);
2844    }
2845}
2846
2847void AbilityConnectManager::RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
2848{
2849    CHECK_POINTER(session);
2850    std::lock_guard lock(uiExtRecipientMapMutex_);
2851    auto it = uiExtRecipientMap_.find(session);
2852    if (it != uiExtRecipientMap_.end() && it->first != nullptr) {
2853        it->first->RemoveDeathRecipient(it->second);
2854        uiExtRecipientMap_.erase(it);
2855        return;
2856    }
2857}
2858
2859void AbilityConnectManager::OnUIExtWindowDied(const wptr<IRemoteObject> &remote)
2860{
2861    auto object = remote.promote();
2862    CHECK_POINTER(object);
2863    if (taskHandler_) {
2864        auto task = [object, connectManager = shared_from_this()]() {
2865            connectManager->HandleUIExtWindowDiedTask(object);
2866        };
2867        taskHandler_->SubmitTask(task);
2868    }
2869}
2870
2871void AbilityConnectManager::HandleUIExtWindowDiedTask(const sptr<IRemoteObject> &remote)
2872{
2873    TAG_LOGD(AAFwkTag::ABILITYMGR, "call.");
2874    CHECK_POINTER(remote);
2875    std::shared_ptr<AbilityRecord> abilityRecord;
2876    sptr<SessionInfo> sessionInfo;
2877    {
2878        std::lock_guard guard(uiExtensionMapMutex_);
2879        auto it = uiExtensionMap_.find(remote);
2880        if (it != uiExtensionMap_.end()) {
2881            abilityRecord = it->second.first.lock();
2882            sessionInfo = it->second.second;
2883            TAG_LOGW(AAFwkTag::UI_EXT, "uiExtAbility caller died");
2884            uiExtensionMap_.erase(it);
2885        } else {
2886            TAG_LOGI(AAFwkTag::ABILITYMGR, "not find");
2887            return;
2888        }
2889    }
2890
2891    if (abilityRecord) {
2892        TerminateAbilityWindowLocked(abilityRecord, sessionInfo);
2893    } else {
2894        TAG_LOGI(AAFwkTag::ABILITYMGR, "abilityRecord null");
2895    }
2896    RemoveUIExtWindowDeathRecipient(remote);
2897}
2898
2899bool AbilityConnectManager::IsUIExtensionFocused(uint32_t uiExtensionTokenId, const sptr<IRemoteObject>& focusToken)
2900{
2901    TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2902    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, false);
2903    std::lock_guard guard(uiExtensionMapMutex_);
2904    for (auto& item: uiExtensionMap_) {
2905        auto uiExtension = item.second.first.lock();
2906        auto sessionInfo = item.second.second;
2907        if (uiExtension && uiExtension->GetApplicationInfo().accessTokenId == uiExtensionTokenId) {
2908            if (sessionInfo && uiExtensionAbilityRecordMgr_->IsFocused(
2909                uiExtension->GetUIExtensionAbilityId(), sessionInfo->callerToken, focusToken)) {
2910                TAG_LOGD(AAFwkTag::ABILITYMGR, "Focused");
2911                return true;
2912            }
2913            if (sessionInfo && sessionInfo->callerToken == focusToken) {
2914                return true;
2915            }
2916        }
2917    }
2918    return false;
2919}
2920
2921sptr<IRemoteObject> AbilityConnectManager::GetUIExtensionSourceToken(const sptr<IRemoteObject> &token)
2922{
2923    TAG_LOGD(AAFwkTag::ABILITYMGR, "Called");
2924    std::lock_guard guard(uiExtensionMapMutex_);
2925    for (auto &item : uiExtensionMap_) {
2926        auto sessionInfo = item.second.second;
2927        auto uiExtension = item.second.first.lock();
2928        if (sessionInfo != nullptr && uiExtension != nullptr && uiExtension->GetToken() != nullptr &&
2929            uiExtension->GetToken()->AsObject() == token) {
2930            TAG_LOGD(AAFwkTag::ABILITYMGR, "The source token found.");
2931            return sessionInfo->callerToken;
2932        }
2933    }
2934    return nullptr;
2935}
2936
2937void AbilityConnectManager::GetUIExtensionCallerTokenList(const std::shared_ptr<AbilityRecord> &abilityRecord,
2938    std::list<sptr<IRemoteObject>> &callerList)
2939{
2940    CHECK_POINTER(uiExtensionAbilityRecordMgr_);
2941    uiExtensionAbilityRecordMgr_->GetCallerTokenList(abilityRecord, callerList);
2942}
2943
2944bool AbilityConnectManager::IsWindowExtensionFocused(uint32_t extensionTokenId, const sptr<IRemoteObject>& focusToken)
2945{
2946    std::lock_guard guard(windowExtensionMapMutex_);
2947    for (auto& item: windowExtensionMap_) {
2948        uint32_t windowExtTokenId = item.second.first;
2949        auto sessionInfo = item.second.second;
2950        if (windowExtTokenId == extensionTokenId && sessionInfo && sessionInfo->callerToken == focusToken) {
2951            return true;
2952        }
2953    }
2954    return false;
2955}
2956
2957void AbilityConnectManager::HandleProcessFrozen(const std::vector<int32_t> &pidList, int32_t uid)
2958{
2959    auto taskHandler = taskHandler_;
2960    if (!taskHandler) {
2961        TAG_LOGE(AAFwkTag::ABILITYMGR, "taskHandler null");
2962        return;
2963    }
2964    TAG_LOGI(AAFwkTag::ABILITYMGR, "uid:%{public}d", uid);
2965    std::unordered_set<int32_t> pidSet(pidList.begin(), pidList.end());
2966    std::lock_guard lock(serviceMapMutex_);
2967    auto weakThis = weak_from_this();
2968    for (auto [key, abilityRecord] : serviceMap_) {
2969        if (abilityRecord && abilityRecord->GetUid() == uid &&
2970            abilityRecord->GetAbilityInfo().extensionAbilityType == AppExecFwk::ExtensionAbilityType::SERVICE &&
2971            pidSet.count(abilityRecord->GetPid()) > 0 &&
2972            abilityRecord->GetAbilityInfo().bundleName != FROZEN_WHITE_DIALOG &&
2973            abilityRecord->IsConnectListEmpty() &&
2974            !abilityRecord->GetKeepAlive()) {
2975            taskHandler->SubmitTask([weakThis, record = abilityRecord]() {
2976                    auto connectManager = weakThis.lock();
2977                    if (record && connectManager) {
2978                        TAG_LOGI(AAFwkTag::ABILITYMGR, "terminateRecord:%{public}s",
2979                            record->GetAbilityInfo().bundleName.c_str());
2980                        connectManager->TerminateRecord(record);
2981                    } else {
2982                        TAG_LOGE(AAFwkTag::ABILITYMGR, "connectManager null");
2983                    }
2984                });
2985        }
2986    }
2987}
2988
2989void AbilityConnectManager::PostExtensionDelayDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)
2990{
2991    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
2992    CHECK_POINTER(taskHandler_);
2993    CHECK_POINTER(connectRecord);
2994    int32_t recordId = connectRecord->GetRecordId();
2995    std::string taskName = std::string("DelayDisconnectTask_") + std::to_string(recordId);
2996
2997    auto abilityRecord = connectRecord->GetAbilityRecord();
2998    CHECK_POINTER(abilityRecord);
2999    auto typeName = abilityRecord->GetAbilityInfo().extensionTypeName;
3000    int32_t delayTime = DelayedSingleton<ExtensionConfig>::GetInstance()->GetExtensionAutoDisconnectTime(typeName);
3001    if (delayTime == AUTO_DISCONNECT_INFINITY) {
3002        TAG_LOGD(AAFwkTag::ABILITYMGR, "This extension needn't auto disconnect.");
3003        return;
3004    }
3005
3006    auto task = [connectRecord, self = weak_from_this()]() {
3007        auto selfObj = self.lock();
3008        if (selfObj == nullptr) {
3009            TAG_LOGW(AAFwkTag::ABILITYMGR, "mgr invalid");
3010            return;
3011        }
3012        TAG_LOGW(AAFwkTag::ABILITYMGR, "auto disconnect the Extension's connection");
3013        selfObj->HandleExtensionDisconnectTask(connectRecord);
3014    };
3015    taskHandler_->SubmitTask(task, taskName, delayTime);
3016}
3017
3018void AbilityConnectManager::RemoveExtensionDelayDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)
3019{
3020    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
3021    CHECK_POINTER(taskHandler_);
3022    CHECK_POINTER(connectRecord);
3023    int32_t recordId = connectRecord->GetRecordId();
3024    std::string taskName = std::string("DelayDisconnectTask_") + std::to_string(recordId);
3025    taskHandler_->CancelTask(taskName);
3026}
3027
3028void AbilityConnectManager::HandleExtensionDisconnectTask(const std::shared_ptr<ConnectionRecord> &connectRecord)
3029{
3030    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
3031    std::lock_guard guard(serialMutex_);
3032    CHECK_POINTER(connectRecord);
3033    int result = connectRecord->DisconnectAbility();
3034    if (result != ERR_OK) {
3035        TAG_LOGW(AAFwkTag::ABILITYMGR, "error, ret: %{public}d", result);
3036    }
3037    if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
3038        connectRecord->CompleteDisconnect(ERR_OK, false);
3039        RemoveConnectionRecordFromMap(connectRecord);
3040    }
3041}
3042
3043bool AbilityConnectManager::IsUIExtensionAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
3044{
3045    CHECK_POINTER_AND_RETURN(abilityRecord, false);
3046    return UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType);
3047}
3048
3049bool AbilityConnectManager::IsCacheExtensionAbilityType(const std::shared_ptr<AbilityRecord> &abilityRecord)
3050{
3051    CHECK_POINTER_AND_RETURN(abilityRecord, false);
3052    return CacheExtensionUtils::IsCacheExtensionType(abilityRecord->GetAbilityInfo().extensionAbilityType);
3053}
3054
3055bool AbilityConnectManager::CheckUIExtensionAbilitySessionExist(
3056    const std::shared_ptr<AbilityRecord> &abilityRecord)
3057{
3058    CHECK_POINTER_AND_RETURN(abilityRecord, false);
3059    std::lock_guard guard(uiExtensionMapMutex_);
3060    for (auto it = uiExtensionMap_.begin(); it != uiExtensionMap_.end(); ++it) {
3061        std::shared_ptr<AbilityRecord> uiExtAbility = it->second.first.lock();
3062        if (abilityRecord == uiExtAbility) {
3063            return true;
3064        }
3065    }
3066
3067    return false;
3068}
3069
3070void AbilityConnectManager::RemoveUIExtensionAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
3071{
3072    CHECK_POINTER(abilityRecord);
3073    CHECK_POINTER(uiExtensionAbilityRecordMgr_);
3074    if (abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
3075        ClearPreloadUIExtensionRecord(abilityRecord);
3076    }
3077    uiExtensionAbilityRecordMgr_->RemoveExtensionRecord(abilityRecord->GetUIExtensionAbilityId());
3078}
3079
3080void AbilityConnectManager::AddUIExtensionAbilityRecordToTerminatedList(
3081    const std::shared_ptr<AbilityRecord> &abilityRecord)
3082{
3083    CHECK_POINTER(abilityRecord);
3084    CHECK_POINTER(uiExtensionAbilityRecordMgr_);
3085    uiExtensionAbilityRecordMgr_->AddExtensionRecordToTerminatedList(abilityRecord->GetUIExtensionAbilityId());
3086}
3087
3088bool AbilityConnectManager::IsCallerValid(const std::shared_ptr<AbilityRecord> &abilityRecord)
3089{
3090    CHECK_POINTER_AND_RETURN_LOG(abilityRecord, false, "Invalid caller for UIExtension");
3091    auto sessionInfo = abilityRecord->GetSessionInfo();
3092    CHECK_POINTER_AND_RETURN_LOG(sessionInfo, false, "Invalid caller for UIExtension");
3093    CHECK_POINTER_AND_RETURN_LOG(sessionInfo->sessionToken, false, "Invalid caller for UIExtension");
3094    std::lock_guard lock(uiExtRecipientMapMutex_);
3095    if (uiExtRecipientMap_.find(sessionInfo->sessionToken) == uiExtRecipientMap_.end()) {
3096        TAG_LOGW(AAFwkTag::ABILITYMGR, "invalid caller for UIExtension");
3097        return false;
3098    }
3099
3100    TAG_LOGD(AAFwkTag::ABILITYMGR, "The caller survival.");
3101    return true;
3102}
3103
3104std::shared_ptr<AAFwk::AbilityRecord> AbilityConnectManager::GetUIExtensionRootHostInfo(const sptr<IRemoteObject> token)
3105{
3106    CHECK_POINTER_AND_RETURN(token, nullptr);
3107    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, nullptr);
3108    return uiExtensionAbilityRecordMgr_->GetUIExtensionRootHostInfo(token);
3109}
3110
3111int32_t AbilityConnectManager::GetUIExtensionSessionInfo(const sptr<IRemoteObject> token,
3112    UIExtensionSessionInfo &uiExtensionSessionInfo)
3113{
3114    CHECK_POINTER_AND_RETURN(token, ERR_NULL_OBJECT);
3115    CHECK_POINTER_AND_RETURN(uiExtensionAbilityRecordMgr_, ERR_NULL_OBJECT);
3116    return uiExtensionAbilityRecordMgr_->GetUIExtensionSessionInfo(token, uiExtensionSessionInfo);
3117}
3118
3119void AbilityConnectManager::SignRestartAppFlag(int32_t uid)
3120{
3121    {
3122        std::lock_guard lock(serviceMapMutex_);
3123        for (auto &[key, abilityRecord] : serviceMap_) {
3124            if (abilityRecord == nullptr || abilityRecord->GetUid() != uid) {
3125                continue;
3126            }
3127            abilityRecord->SetRestartAppFlag(true);
3128        }
3129    }
3130    AbilityCacheManager::GetInstance().SignRestartAppFlag(uid);
3131}
3132
3133bool AbilityConnectManager::AddToServiceMap(const std::string &key, std::shared_ptr<AbilityRecord> abilityRecord)
3134{
3135    std::lock_guard lock(serviceMapMutex_);
3136    if (abilityRecord == nullptr) {
3137        return false;
3138    }
3139    auto insert = serviceMap_.emplace(key, abilityRecord);
3140    if (!insert.second) {
3141        TAG_LOGW(AAFwkTag::ABILITYMGR, "record exist: %{public}s", key.c_str());
3142    }
3143    return insert.second;
3144}
3145
3146AbilityConnectManager::ServiceMapType AbilityConnectManager::GetServiceMap()
3147{
3148    std::lock_guard lock(serviceMapMutex_);
3149    return serviceMap_;
3150}
3151
3152void AbilityConnectManager::AddConnectObjectToMap(sptr<IRemoteObject> connectObject,
3153    const ConnectListType &connectRecordList, bool updateOnly)
3154{
3155    if (!updateOnly) {
3156        AddConnectDeathRecipient(connectObject);
3157    }
3158    std::lock_guard guard(connectMapMutex_);
3159    connectMap_[connectObject] = connectRecordList;
3160}
3161
3162EventInfo AbilityConnectManager::BuildEventInfo(const std::shared_ptr<AbilityRecord> &abilityRecord)
3163{
3164    EventInfo eventInfo;
3165    if (abilityRecord == nullptr) {
3166        TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord null");
3167        return eventInfo;
3168    }
3169    AppExecFwk::RunningProcessInfo processInfo;
3170    DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
3171    eventInfo.pid = processInfo.pid_;
3172    eventInfo.processName = processInfo.processName_;
3173    eventInfo.time = std::chrono::duration_cast<std::chrono::milliseconds>(
3174        std::chrono::system_clock::now().time_since_epoch()).count();
3175    auto callerPid = abilityRecord->GetWant().GetIntParam(Want::PARAM_RESV_CALLER_PID, -1);
3176    eventInfo.callerPid = callerPid == -1 ? IPCSkeleton::GetCallingPid() : callerPid;
3177    DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByPid(eventInfo.callerPid, processInfo);
3178    eventInfo.callerPid = processInfo.pid_;
3179    eventInfo.callerProcessName = processInfo.processName_;
3180    if (!abilityRecord->IsCreateByConnect()) {
3181        auto abilityInfo = abilityRecord->GetAbilityInfo();
3182        eventInfo.extensionType = static_cast<int32_t>(abilityInfo.extensionAbilityType);
3183        eventInfo.userId = userId_;
3184        eventInfo.bundleName = abilityInfo.bundleName;
3185        eventInfo.moduleName = abilityInfo.moduleName;
3186        eventInfo.abilityName = abilityInfo.name;
3187    }
3188    return eventInfo;
3189}
3190
3191void AbilityConnectManager::UpdateUIExtensionInfo(const std::shared_ptr<AbilityRecord> &abilityRecord)
3192{
3193    if (abilityRecord == nullptr ||
3194        !UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
3195        return;
3196    }
3197
3198    WantParams wantParams;
3199    auto uiExtensionAbilityId = abilityRecord->GetUIExtensionAbilityId();
3200    wantParams.SetParam(UIEXTENSION_ABILITY_ID, AAFwk::Integer::Box(uiExtensionAbilityId));
3201    auto rootHostRecord = GetUIExtensionRootHostInfo(abilityRecord->GetToken());
3202    if (rootHostRecord != nullptr) {
3203        auto rootHostPid = rootHostRecord->GetPid();
3204        wantParams.SetParam(UIEXTENSION_ROOT_HOST_PID, AAFwk::Integer::Box(rootHostPid));
3205    }
3206    if (abilityRecord->GetWant().GetBoolParam(IS_PRELOAD_UIEXTENSION_ABILITY, false)) {
3207        // Applicable only to preloadUIExtension scenarios
3208        auto rootHostPid = IPCSkeleton::GetCallingPid();
3209        wantParams.SetParam(UIEXTENSION_ROOT_HOST_PID, AAFwk::Integer::Box(rootHostPid));
3210    }
3211    abilityRecord->UpdateUIExtensionInfo(wantParams);
3212}
3213
3214std::string AbilityConnectManager::GenerateBundleName(const AbilityRequest &abilityRequest) const
3215{
3216    auto bundleName = abilityRequest.abilityInfo.bundleName;
3217    if (MultiInstanceUtils::IsMultiInstanceApp(abilityRequest.appInfo)) {
3218        bundleName = bundleName + '-' + MultiInstanceUtils::GetValidExtensionInstanceKey(abilityRequest);
3219        return bundleName;
3220    }
3221    if (AbilityRuntime::StartupUtil::IsSupportAppClone(abilityRequest.abilityInfo.extensionAbilityType)) {
3222        auto appCloneIndex = abilityRequest.want.GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, 0);
3223        if (appCloneIndex > 0) {
3224            bundleName = std::to_string(appCloneIndex) + bundleName;
3225        }
3226    }
3227    return bundleName;
3228}
3229
3230int32_t AbilityConnectManager::ReportXiaoYiToRSSIfNeeded(const AppExecFwk::AbilityInfo &abilityInfo)
3231{
3232    if (abilityInfo.type != AppExecFwk::AbilityType::EXTENSION ||
3233        abilityInfo.bundleName != XIAOYI_BUNDLE_NAME) {
3234        return ERR_OK;
3235    }
3236    TAG_LOGI(AAFwkTag::ABILITYMGR,
3237        "bundleName is extension, abilityName:%{public}s",
3238        abilityInfo.name.c_str());
3239    auto ret = ReportAbilityStartInfoToRSS(abilityInfo);
3240    if (ret != ERR_OK) {
3241        TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, ret:%{public}d", ret);
3242        return ret;
3243    }
3244    return ERR_OK;
3245}
3246
3247int32_t AbilityConnectManager::ReportAbilityStartInfoToRSS(const AppExecFwk::AbilityInfo &abilityInfo)
3248{
3249    HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3250    std::vector<AppExecFwk::RunningProcessInfo> runningProcessInfos;
3251    auto ret = IN_PROCESS_CALL(DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfos(
3252        runningProcessInfos));
3253    if (ret != ERR_OK) {
3254        return ret;
3255    }
3256    bool isColdStart = true;
3257    int32_t pid = 0;
3258    for (auto const &info : runningProcessInfos) {
3259        if (info.uid_ == abilityInfo.applicationInfo.uid) {
3260            isColdStart = false;
3261            pid = info.pid_;
3262            break;
3263        }
3264    }
3265    TAG_LOGI(AAFwkTag::ABILITYMGR, "ReportAbilityStartInfoToRSS, abilityName:%{public}s", abilityInfo.name.c_str());
3266    ResSchedUtil::GetInstance().ReportAbilityStartInfoToRSS(abilityInfo, pid, isColdStart);
3267    return ERR_OK;
3268}
3269
3270void AbilityConnectManager::UninstallApp(const std::string &bundleName)
3271{
3272    std::lock_guard lock(serviceMapMutex_);
3273    for (const auto &[key, abilityRecord]: serviceMap_) {
3274        if (abilityRecord && abilityRecord->GetAbilityInfo().bundleName == bundleName) {
3275            abilityRecord->SetKeepAliveBundle(false);
3276        }
3277    }
3278}
3279
3280int32_t AbilityConnectManager::UpdateKeepAliveEnableState(const std::string &bundleName,
3281    const std::string &moduleName, const std::string &mainElement, bool updateEnable)
3282{
3283    std::lock_guard lock(serviceMapMutex_);
3284    for (const auto &[key, abilityRecord]: serviceMap_) {
3285        CHECK_POINTER_AND_RETURN(abilityRecord, ERR_NULL_OBJECT);
3286        if (abilityRecord->GetAbilityInfo().bundleName == bundleName &&
3287            abilityRecord->GetAbilityInfo().name == mainElement &&
3288            abilityRecord->GetAbilityInfo().moduleName == moduleName) {
3289            TAG_LOGI(AAFwkTag::ABILITYMGR,
3290                "update keepAlive,bundle:%{public}s,module:%{public}s,ability:%{public}s,enable:%{public}d",
3291                bundleName.c_str(), moduleName.c_str(), mainElement.c_str(), updateEnable);
3292            abilityRecord->SetKeepAliveBundle(updateEnable);
3293            return ERR_OK;
3294        }
3295    }
3296    return ERR_OK;
3297}
3298}  // namespace AAFwk
3299}  // namespace OHOS
3300