From d3d2b469c8aec0a938ffc99f8423f021eac0559e Mon Sep 17 00:00:00 2001 From: zhengzhuolan Date: Wed, 10 Dec 2025 16:19:57 +0800 Subject: [PATCH] fix StartSelfUIAbilityInCurrentProcess Signed-off-by: zhengzhuolan --- .../ability_manager/include/process_options.h | 1 + .../ability_manager/include/start_options.h | 2 +- .../include/ability_manager_service.h | 2 +- services/abilitymgr/include/ability_record.h | 2 +- .../ability_record/ability_record_utils.h | 1 + .../ui_ability_lifecycle_manager.h | 2 +- .../src/ability_manager_service.cpp | 12 ++- services/abilitymgr/src/ability_record.cpp | 6 +- services/abilitymgr/src/process_options.cpp | 5 + .../ui_ability_lifecycle_manager.cpp | 17 ++-- .../appmgr/include/app_mgr_service_inner.h | 5 + services/appmgr/src/app_mgr_service_inner.cpp | 99 +++++++++++-------- .../mock_ui_ability_lifecycle_manager.h | 2 +- .../mock/src/mock_ability_record.cpp | 3 +- .../src/mock_ui_ability_lifecycle_manager.cpp | 2 +- .../ability_manager_service_sixth_test.cpp | 4 +- .../mock_ui_ability_lifecycle_manager.h | 2 +- .../mock/src/mock_ability_record.cpp | 3 +- .../src/mock_ui_ability_lifecycle_manager.cpp | 2 +- .../app_mgr_service_inner_test.cpp | 89 +++++++++++++++++ .../ui_ability_lifecycle_manager_test.cpp | 14 ++- utils/server/startup/include/param.h | 1 + 22 files changed, 207 insertions(+), 69 deletions(-) diff --git a/interfaces/inner_api/ability_manager/include/process_options.h b/interfaces/inner_api/ability_manager/include/process_options.h index 5e5e7c13b5..ff1ec3d2a8 100644 --- a/interfaces/inner_api/ability_manager/include/process_options.h +++ b/interfaces/inner_api/ability_manager/include/process_options.h @@ -63,6 +63,7 @@ public: std::string processName; uint64_t loadAbilityCallbackId = 0; pid_t callingPid = -1; + pid_t selfPid = -1; }; } // namespace AAFwk } // namespace OHOS diff --git a/interfaces/inner_api/ability_manager/include/start_options.h b/interfaces/inner_api/ability_manager/include/start_options.h index 3b091af315..8adeb86694 100644 --- a/interfaces/inner_api/ability_manager/include/start_options.h +++ b/interfaces/inner_api/ability_manager/include/start_options.h @@ -147,7 +147,7 @@ private: int32_t minWindowHeight_ = 0; int32_t maxWindowWidth_ = 0; int32_t maxWindowHeight_ = 0; - std::string currentProcessName_; + std::string currentProcessName_ = ""; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 87f8492f4d..ed1da3dda7 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -2747,7 +2747,7 @@ private: AAFwk::EventInfo BuildEventInfo(const Want &want, int32_t userId); AAFwk::EventInfo BuildEventInfoByAbilityRecord(const std::shared_ptr &abilityRecord); - ErrCode IsUIAbilityAlreadyExist(const std::string &abilityName, const std::string &specifiedFlag, + ErrCode IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode); bool IsAppCloneOrMultiInstance(const Want &want, const std::shared_ptr callerRecord, diff --git a/services/abilitymgr/include/ability_record.h b/services/abilitymgr/include/ability_record.h index 443487adfe..cfac26f7c5 100644 --- a/services/abilitymgr/include/ability_record.h +++ b/services/abilitymgr/include/ability_record.h @@ -99,7 +99,7 @@ public: * @return Returns ERR_OK on success, others on failure. */ int LoadAbility(bool isShellCall = false, bool isStartupHide = false, pid_t callingPid = -1, - uint64_t loadAbilityCallbackId = 0); + uint64_t loadAbilityCallbackId = 0, pid_t selfPid = -1); /** * foreground the ability. diff --git a/services/abilitymgr/include/ability_record/ability_record_utils.h b/services/abilitymgr/include/ability_record/ability_record_utils.h index 2b49244af8..58cc1abb1c 100644 --- a/services/abilitymgr/include/ability_record/ability_record_utils.h +++ b/services/abilitymgr/include/ability_record/ability_record_utils.h @@ -108,6 +108,7 @@ struct ForegroundOptions { std::string targetGrantBundleName; pid_t callingPid = -1; uint64_t loadAbilityCallbackId = 0; + pid_t selfPid = -1; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h index 00ec28f38b..1c7af39d39 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -537,7 +537,7 @@ public: */ int32_t NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason); - ErrCode IsUIAbilityAlreadyExist(const std::string &abilityName, const std::string &specifiedFlag, + ErrCode IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode); private: diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 2558b68b2c..e2394cf629 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -2233,7 +2233,6 @@ int AbilityManagerService::StartAbilityForOptionInner(const Want &want, const St abilityRequest.specifiedFlag = want.GetStringParam(KEY_SPECIFIED_FLAG); abilityRequest.want.RemoveParam(KEY_SPECIFIED_FLAG); abilityRequest.abilityInfo.isolationProcess = false; - abilityRequest.abilityInfo.process = currentProcessName; } abilityRequest.userId = validUserId; @@ -15966,12 +15965,12 @@ int32_t AbilityManagerService::ProcessUdmfKey( return ERR_OK; } -ErrCode AbilityManagerService::IsUIAbilityAlreadyExist(const std::string &abilityName,const std::string &specifiedFlag, +ErrCode AbilityManagerService::IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode) { auto uiAbilityManager = GetUIAbilityManagerByUid(IPCSkeleton::GetCallingUid()); CHECK_POINTER_AND_RETURN(uiAbilityManager, ERR_INVALID_VALUE); - return uiAbilityManager->IsUIAbilityAlreadyExist(abilityName, specifiedFlag, appIndex, instanceKey, launchMode); + return uiAbilityManager->IsUIAbilityAlreadyExist(want, specifiedFlag, appIndex, instanceKey, launchMode); } bool AbilityManagerService::IsAppCloneOrMultiInstance(const Want &want, const std::shared_ptr callerRecord, @@ -16038,8 +16037,7 @@ ErrCode AbilityManagerService::StartSelfUIAbilityInCurrentProcess(const Want &wa CHECK_TRUE_RETURN_RET(abilityInfo.type != AppExecFwk::AbilityType::PAGE, TARGET_BUNDLE_NOT_EXIST, "not UIAbility"); - auto ret = IsUIAbilityAlreadyExist(targetAbilityName, - specifiedFlag, appIndex, processInfo.instanceKey, abilityInfo.launchMode); + auto ret = IsUIAbilityAlreadyExist(want, specifiedFlag, appIndex, processInfo.instanceKey, abilityInfo.launchMode); if (ret != ERR_OK) { TAG_LOGE(AAFwkTag::ABILITYMGR, "UIAbility already exist"); return ret; @@ -16050,6 +16048,10 @@ ErrCode AbilityManagerService::StartSelfUIAbilityInCurrentProcess(const Want &wa auto useStartOptions = startOptions; useStartOptions.SetCurrentProcessName(processInfo.processName_); + if (useStartOptions.processOptions == nullptr) { + useStartOptions.processOptions = std::make_shared(); + } + useStartOptions.processOptions->selfPid = callingPid; auto useWant = want; if (abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) { useWant.SetParam(KEY_SPECIFIED_FLAG, specifiedFlag); diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index 04a5af61d8..3fc56ec7ea 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -274,7 +274,7 @@ void AbilityRecord::LoadUIAbility() } int AbilityRecord::LoadAbility(bool isShellCall, bool isStartupHide, pid_t callingPid, - uint64_t loadAbilityCallbackId) + uint64_t loadAbilityCallbackId, pid_t selfPid) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGI(AAFwkTag::ABILITYMGR, "LoadLifecycle: abilityName:%{public}s", abilityInfo_.name.c_str()); @@ -315,6 +315,7 @@ int AbilityRecord::LoadAbility(bool isShellCall, bool isStartupHide, pid_t calli loadParam.loadAbilityCallbackId = loadAbilityCallbackId; loadParam.isPrelaunch = isPrelaunch_; loadParam.isPreloadStart = isPreloadStart_; + loadParam.selfPid = selfPid; auto userId = abilityInfo_.uid / BASE_USER_RANGE; bool isMainUIAbility = MainElementUtils::IsMainUIAbility(abilityInfo_.bundleName, abilityInfo_.name, userId); @@ -449,7 +450,8 @@ void AbilityRecord::ProcessForegroundAbility(uint32_t tokenId, const ForegroundO if (!isReady_) { TAG_LOGD(AAFwkTag::ABILITYMGR, "To load ability."); lifeCycleStateInfo_.sceneFlagBak = options.sceneFlag; - LoadAbility(options.isShellCall, options.isStartupHide, options.callingPid, options.loadAbilityCallbackId); + LoadAbility(options.isShellCall, options.isStartupHide, options.callingPid, + options.loadAbilityCallbackId, options.selfPid); return; } diff --git a/services/abilitymgr/src/process_options.cpp b/services/abilitymgr/src/process_options.cpp index 853cef2466..509b0fd525 100644 --- a/services/abilitymgr/src/process_options.cpp +++ b/services/abilitymgr/src/process_options.cpp @@ -29,6 +29,7 @@ bool ProcessOptions::ReadFromParcel(Parcel &parcel) isPreloadStart = parcel.ReadBool(); loadAbilityCallbackId = parcel.ReadUint64(); callingPid = parcel.ReadInt32(); + selfPid = parcel.ReadInt32(); return true; } @@ -81,6 +82,10 @@ bool ProcessOptions::Marshalling(Parcel &parcel) const TAG_LOGE(AAFwkTag::ABILITYMGR, "callingPid write failed"); return false; } + if (!parcel.WriteInt32(selfPid)) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "selfPid write failed"); + return false; + } return true; } diff --git a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp index b6d48b49c3..08c6f3fc4e 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -271,6 +271,9 @@ int UIAbilityLifecycleManager::StartUIAbility(AbilityRequest &abilityRequest, sp options.callingPid = abilityRequest.processOptions->callingPid; options.loadAbilityCallbackId = abilityRequest.processOptions->loadAbilityCallbackId; } + if (sessionInfo->processOptions != nullptr) { + options.selfPid = sessionInfo->processOptions->selfPid; + } uiAbilityRecord->ProcessForegroundAbility(callerTokenId, options); if (uiAbilityRecord->GetSpecifiedFlag().empty() && !sessionInfo->specifiedFlag.empty()) { TAG_LOGI(AAFwkTag::ABILITYMGR, "update specified: %{public}d--%{public}s", sessionInfo->requestId, @@ -382,10 +385,6 @@ UIAbilityRecordPtr UIAbilityLifecycleManager::GenerateAbilityRecord(AbilityReque } MoreAbilityNumbersSendEventInfo( abilityRequest.userId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName); - if (!abilityRequest.startOptions.GetCurrentProcessName().empty()) { - uiAbilityRecord->SetProcessName(abilityRequest.abilityInfo.process); - uiAbilityRecord->SetCallerSetProcess(true); - } if (isLowMemKill) { TAG_LOGI(AAFwkTag::ABILITYMGR, "killed by low-mem, created a new record, " "replacing old record id=%{public}d, new record id=%{public}d", @@ -4314,7 +4313,7 @@ int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId return ERR_OK; } -ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const std::string &abilityName, +ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode) { @@ -4323,18 +4322,22 @@ ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const std::string &ab std::lock_guard guard(sessionLock_); tempSessionAbilityMap = sessionAbilityMap_; } + std::string moduleName = want.GetElement().GetModuleName(); + std::string abilityName = want.GetElement().GetAbilityName(); for (auto it = tempSessionAbilityMap.begin(); it != tempSessionAbilityMap.end(); it++) { if (it->second == nullptr) { continue; } if (launchMode == AppExecFwk::LaunchMode::SPECIFIED && it->second->GetSpecifiedFlag() == specifiedFlag && - it->second->GetAbilityInfo().name == abilityName && it->second->GetAppIndex() == appIndex && - it->second->GetInstanceKey() == instanceKey) { + it->second->GetAbilityInfo().name == abilityName && + (moduleName.empty() || it->second->GetAbilityInfo().moduleName == moduleName) && + it->second->GetAppIndex() == appIndex && it->second->GetInstanceKey() == instanceKey) { TAG_LOGE(AAFwkTag::ABILITYMGR, "specifiedFlag is already exist"); return ERROR_UIABILITY_IS_ALREADY_EXIST; } if (launchMode != AppExecFwk::LaunchMode::SPECIFIED && it->second->GetAbilityInfo().name == abilityName && + (moduleName.empty() || it->second->GetAbilityInfo().moduleName == moduleName) && it->second->GetInstanceKey() == instanceKey && it->second->GetAppIndex() == appIndex) { TAG_LOGE(AAFwkTag::ABILITYMGR, "UIAbility is already exist"); return ERROR_UIABILITY_IS_ALREADY_EXIST; diff --git a/services/appmgr/include/app_mgr_service_inner.h b/services/appmgr/include/app_mgr_service_inner.h index 476969b8e4..abac4d6c6a 100644 --- a/services/appmgr/include/app_mgr_service_inner.h +++ b/services/appmgr/include/app_mgr_service_inner.h @@ -1901,6 +1901,11 @@ private: void ReportUIExtensionProcColdStartToRss(const std::shared_ptr& abilityInfo, const std::shared_ptr& want); + void HandleExistingAppRecordAfterFound(std::shared_ptr appRecord, + std::shared_ptr abilityInfo, const HapModuleInfo &hapModuleInfo, + std::shared_ptr want, bool isProcCache, + const std::shared_ptr &loadParam); + private: /** * ClearUpApplicationData, clear the application data. diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index 84db0f6af2..519fd9d26a 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -934,6 +934,24 @@ void AppMgrServiceInner::LoadAbility(std::shared_ptr abilityInfo, s TAG_LOGE(AAFwkTag::APPMGR, "null loadParam"); return; } + BundleInfo bundleInfo; + bool isProcCache = false; + HapModuleInfo hapModuleInfo; + int32_t appIndex = 0; + if (loadParam->selfPid > 0) { + if (!GetBundleAndHapInfo(*abilityInfo, appInfo, bundleInfo, hapModuleInfo, appIndex)) { + TAG_LOGE(AAFwkTag::APPMGR, "getBundleAndHapInfo fail"); + return; + } + std::shared_ptr appRecord = GetAppRunningRecordByPid(loadParam->selfPid); + if (appRecord == nullptr) { + TAG_LOGW(AAFwkTag::APPMGR, "appRecord not found by pid %{public}d", loadParam->selfPid); + return; + } + isProcCache = DelayedSingleton::GetInstance()->ReuseCachedProcess(appRecord); + HandleExistingAppRecordAfterFound(appRecord, abilityInfo, hapModuleInfo, want, isProcCache, loadParam); + return; + } LoadAbilityCallbackGuard guard(loadParam->loadAbilityCallbackId, loadParam->callingPid, weak_from_this()); if (!CheckLoadAbilityConditions(loadParam->token, abilityInfo, appInfo)) { TAG_LOGE(AAFwkTag::APPMGR, "checkLoadAbilityConditions fail"); @@ -954,9 +972,6 @@ void AppMgrServiceInner::LoadAbility(std::shared_ptr abilityInfo, s return; } - BundleInfo bundleInfo; - HapModuleInfo hapModuleInfo; - int32_t appIndex = 0; std::string callerKey; std::string processName; std::string specifiedProcessFlag = GetSpecifiedProcessFlag(abilityInfo, want); // for isolation process @@ -965,7 +980,6 @@ void AppMgrServiceInner::LoadAbility(std::shared_ptr abilityInfo, s bool isWatermarkEnabled = false; bool isFileUri = false; std::string customProcessFlag = loadParam->customProcessFlag; - bool isProcCache = false; bool isExtensionSandBox = false; if (want != nullptr) { if (want->HasParameter(DLP_INDEX)) { @@ -1073,41 +1087,7 @@ void AppMgrServiceInner::LoadAbility(std::shared_ptr abilityInfo, s return; } } else { - TAG_LOGI(AAFwkTag::APPMGR, "have apprecord"); - if (!appRecord->IsKeepAliveDkv()) { - TAG_LOGD(AAFwkTag::APPMGR, "appRecord setKeepAlive"); - appRecord->SetKeepAliveDkv(loadParam->isKeepAlive); - } - if (!appRecord->IsMainElementRunning()) { - TAG_LOGD(AAFwkTag::APPMGR, "appRecord SetMainElementRunning"); - appRecord->SetMainElementRunning(loadParam->isMainElementRunning); - } - if (appRecord->GetProcessType() == ProcessType::EXTENSION && - appRecord->GetExtensionType() != abilityInfo->extensionAbilityType) { - appRecord->SetProcessType(ProcessType::NORMAL); - DelayedSingleton::GetInstance()->OnProcessTypeChanged(appRecord); - } - ReportEventToRSS(*abilityInfo, appRecord); - appRunningManager_->UpdateConfigurationDelayed(appRecord); - if (!isProcCache) { - SendPreloadAppStartupTypeEvent(appRecord, abilityInfo); - } else { - SendAppStartupTypeEvent(appRecord, abilityInfo, AppStartType::WARM, AppStartReason::SUGGEST_CACHE); - } - if (appRecord->GetPreloadMode() == PreloadMode::PRE_LAUNCH) { - appRecord->SetPreloadMode(PreloadMode::PRELOAD_NONE); - } - if (appRecord->IsPreloaded()) { - appRecord->SetPreloadState(PreloadState::NONE); - appRecord->SetPreloadMode(PreloadMode::PRELOAD_NONE); - } - int32_t requestProcCode = (want == nullptr) ? 0 : want->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0); - if (requestProcCode != 0 && appRecord->GetRequestProcCode() == 0) { - appRecord->SetRequestProcCode(requestProcCode); - DelayedSingleton::GetInstance()->OnProcessReused(appRecord); - } - StartAbility(loadParam->token, loadParam->preToken, abilityInfo, appRecord, hapModuleInfo, want, - loadParam->abilityRecordId); + HandleExistingAppRecordAfterFound(appRecord, abilityInfo, hapModuleInfo, want, isProcCache, loadParam); if (AAFwk::UIExtensionUtils::IsUIExtension(abilityInfo->extensionAbilityType)) { AddUIExtensionBindItem(want, appRecord, loadParam->token); AddUIExtensionLauncherItem(want, appRecord, loadParam->token); @@ -1191,6 +1171,47 @@ void AppMgrServiceInner::AfterLoadAbility(std::shared_ptr appR appRecord->UpdateAbilityState(loadParam->token, AbilityState::ABILITY_STATE_CREATE); } +void AppMgrServiceInner::HandleExistingAppRecordAfterFound(std::shared_ptr appRecord, + std::shared_ptr abilityInfo, const HapModuleInfo &hapModuleInfo, + std::shared_ptr want, bool isProcCache, const std::shared_ptr &loadParam) +{ + TAG_LOGI(AAFwkTag::APPMGR, "have apprecord"); + if (!appRecord->IsKeepAliveDkv()) { + TAG_LOGD(AAFwkTag::APPMGR, "appRecord setKeepAlive"); + appRecord->SetKeepAliveDkv(loadParam->isKeepAlive); + } + if (!appRecord->IsMainElementRunning()) { + TAG_LOGD(AAFwkTag::APPMGR, "appRecord SetMainElementRunning"); + appRecord->SetMainElementRunning(loadParam->isMainElementRunning); + } + if (appRecord->GetProcessType() == ProcessType::EXTENSION && + appRecord->GetExtensionType() != abilityInfo->extensionAbilityType) { + appRecord->SetProcessType(ProcessType::NORMAL); + DelayedSingleton::GetInstance()->OnProcessTypeChanged(appRecord); + } + ReportEventToRSS(*abilityInfo, appRecord); + appRunningManager_->UpdateConfigurationDelayed(appRecord); + if (!isProcCache) { + SendPreloadAppStartupTypeEvent(appRecord, abilityInfo); + } else { + SendAppStartupTypeEvent(appRecord, abilityInfo, AppStartType::WARM, AppStartReason::SUGGEST_CACHE); + } + if (appRecord->GetPreloadMode() == PreloadMode::PRE_LAUNCH) { + appRecord->SetPreloadMode(PreloadMode::PRELOAD_NONE); + } + if (appRecord->IsPreloaded()) { + appRecord->SetPreloadState(PreloadState::NONE); + appRecord->SetPreloadMode(PreloadMode::PRELOAD_NONE); + } + int32_t requestProcCode = (want == nullptr) ? 0 : want->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0); + if (requestProcCode != 0 && appRecord->GetRequestProcCode() == 0) { + appRecord->SetRequestProcCode(requestProcCode); + DelayedSingleton::GetInstance()->OnProcessReused(appRecord); + } + StartAbility(loadParam->token, loadParam->preToken, abilityInfo, appRecord, hapModuleInfo, want, + loadParam->abilityRecordId); +} + void AppMgrServiceInner::AddUIExtensionLauncherItem(std::shared_ptr want, std::shared_ptr appRecord, sptr token) { diff --git a/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h b/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h index b43d324c80..630186c063 100644 --- a/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h +++ b/test/unittest/ability_manager_service_fourteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h @@ -394,7 +394,7 @@ public: int32_t NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason); - ErrCode IsUIAbilityAlreadyExist(const std::string &abilityName, const std::string &specifiedFlag, + ErrCode IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode); private: diff --git a/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ability_record.cpp b/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ability_record.cpp index b4db272f2c..fdb7d41e12 100644 --- a/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ability_record.cpp +++ b/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ability_record.cpp @@ -300,7 +300,8 @@ void AbilityRecord::LoadUIAbility() g_addLifecycleEventTask(token_, methodName); } -int AbilityRecord::LoadAbility(bool isShellCall, bool isStartupHide, pid_t callingPid, uint64_t callbackId) +int AbilityRecord::LoadAbility(bool isShellCall, bool isStartupHide, pid_t callingPid, + uint64_t callbackId, pid_t selfPid) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGI(AAFwkTag::ABILITYMGR, "LoadLifecycle: abilityName:%{public}s", abilityInfo_.name.c_str()); diff --git a/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp b/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp index 5a87764260..85e85c15b5 100644 --- a/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp +++ b/test/unittest/ability_manager_service_fourteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp @@ -754,7 +754,7 @@ int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId return ERR_OK; } -ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const std::string &abilityName, +ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode) { diff --git a/test/unittest/ability_manager_service_sixth_test/ability_manager_service_sixth_test.cpp b/test/unittest/ability_manager_service_sixth_test/ability_manager_service_sixth_test.cpp index b8add78811..236de17b27 100644 --- a/test/unittest/ability_manager_service_sixth_test/ability_manager_service_sixth_test.cpp +++ b/test/unittest/ability_manager_service_sixth_test/ability_manager_service_sixth_test.cpp @@ -2086,11 +2086,11 @@ HWTEST_F(AbilityManagerServiceSixthTest, IsUIAbilityAlreadyExist_001, TestSize.L TAG_LOGI(AAFwkTag::TEST, "AbilityManagerServiceSixthTest IsUIAbilityAlreadyExist_001 start"); auto abilityMs = std::make_shared(); ASSERT_NE(abilityMs, nullptr); - std::string abilityName; + Want want; std::string specifiedFlag; int32_t appIndex = 0; std::string instanceKey; - auto ret = abilityMs->IsUIAbilityAlreadyExist(abilityName, specifiedFlag, appIndex, + auto ret = abilityMs->IsUIAbilityAlreadyExist(want, specifiedFlag, appIndex, instanceKey, AppExecFwk::LaunchMode::SPECIFIED); EXPECT_EQ(ret, ERR_INVALID_VALUE); TAG_LOGI(AAFwkTag::TEST, "AbilityManagerServiceSixthTest IsUIAbilityAlreadyExist_001 end"); diff --git a/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h b/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h index 304aaff38a..bb4a040bd9 100644 --- a/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h +++ b/test/unittest/ability_manager_service_thirteenth_test/mock/include/mock_ui_ability_lifecycle_manager.h @@ -396,7 +396,7 @@ public: int32_t NotifyStartupExceptionBySCB(int32_t requestId, const std::string &reason); - ErrCode IsUIAbilityAlreadyExist(const std::string &abilityName, const std::string &specifiedFlag, + ErrCode IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode); private: diff --git a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_record.cpp b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_record.cpp index a61257cc14..3d5bd72fe9 100644 --- a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_record.cpp +++ b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_record.cpp @@ -304,7 +304,8 @@ void AbilityRecord::LoadUIAbility() g_addLifecycleEventTask(token_, methodName); } -int AbilityRecord::LoadAbility(bool isShellCall, bool isStartupHide, pid_t callingPid, uint64_t callbackId) +int AbilityRecord::LoadAbility(bool isShellCall, bool isStartupHide, pid_t callingPid, + uint64_t callbackId, pid_t selfPid) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGI(AAFwkTag::ABILITYMGR, "LoadLifecycle: abilityName:%{public}s", abilityInfo_.name.c_str()); diff --git a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp index f1ea3b7687..4c43f783a6 100644 --- a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp +++ b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ui_ability_lifecycle_manager.cpp @@ -763,7 +763,7 @@ int32_t UIAbilityLifecycleManager::NotifyStartupExceptionBySCB(int32_t requestId return ERR_OK; } -ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const std::string &abilityName, +ErrCode UIAbilityLifecycleManager::IsUIAbilityAlreadyExist(const Want &want, const std::string &specifiedFlag, int32_t appIndex, const std::string &instanceKey, AppExecFwk::LaunchMode launchMode) { diff --git a/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp b/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp index 7ee824b9f2..23656cb2ca 100644 --- a/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp +++ b/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp @@ -400,6 +400,95 @@ HWTEST_F(AppMgrServiceInnerTest, PreStartNWebSpawnProcess_001, TestSize.Level2) EXPECT_NE(ret, ERR_OK); } +/** + * @tc.name: HandleExistingAppRecordAfterFound_001 + * @tc.desc: verify keepAlive/mainElement flags and preload reset without process cache + * @tc.type: FUNC + */ +HWTEST_F(AppMgrServiceInnerTest, HandleExistingAppRecordAfterFound_001, TestSize.Level1) +{ + auto appMgrServiceInner = std::make_shared(); + ASSERT_NE(appMgrServiceInner, nullptr); + + HapModuleInfo hapModuleInfo; + auto want = std::make_shared(); + BundleInfo info; + std::string processName = "test_processName"; + std::shared_ptr appRecord = + appMgrServiceInner->appRunningManager_->CreateAppRunningRecord(applicationInfo_, processName, info, ""); + + appRecord->SetKeepAliveDkv(false); + appRecord->SetMainElementRunning(false); + appRecord->SetPreloadMode(PreloadMode::PRE_LAUNCH); + appRecord->SetPreloadState(PreloadState::PRELOADING); + + AbilityRuntime::LoadParam loadParam; + loadParam.isKeepAlive = true; + loadParam.isMainElementRunning = true; + + appMgrServiceInner->HandleExistingAppRecordAfterFound(appRecord, abilityInfo_, hapModuleInfo, want, false, + std::make_shared(loadParam)); + + EXPECT_TRUE(appRecord->IsKeepAliveDkv()); + EXPECT_TRUE(appRecord->IsMainElementRunning()); + EXPECT_EQ(appRecord->GetPreloadMode(), PreloadMode::PRELOAD_NONE); +} + +/** + * @tc.name: HandleExistingAppRecordAfterFound_002 + * @tc.desc: verify request proc code propagation from want to record + * @tc.type: FUNC + */ +HWTEST_F(AppMgrServiceInnerTest, HandleExistingAppRecordAfterFound_002, TestSize.Level1) +{ + auto appMgrServiceInner = std::make_shared(); + ASSERT_NE(appMgrServiceInner, nullptr); + + HapModuleInfo hapModuleInfo; + auto want = std::make_shared(); + want->SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 5); + BundleInfo info; + std::string processName = "test_processName"; + std::shared_ptr appRecord = + appMgrServiceInner->appRunningManager_->CreateAppRunningRecord(applicationInfo_, processName, info, ""); + + EXPECT_EQ(appRecord->GetRequestProcCode(), 0); + + AbilityRuntime::LoadParam loadParam; + appMgrServiceInner->HandleExistingAppRecordAfterFound(appRecord, abilityInfo_, hapModuleInfo, want, false, + std::make_shared(loadParam)); + + EXPECT_EQ(appRecord->GetRequestProcCode(), 5); +} + +/** + * @tc.name: HandleExistingAppRecordAfterFound_003 + * @tc.desc: when extension type mismatches in EXTENSION process, reset to NORMAL + * @tc.type: FUNC + */ +HWTEST_F(AppMgrServiceInnerTest, HandleExistingAppRecordAfterFound_003, TestSize.Level1) +{ + auto appMgrServiceInner = std::make_shared(); + ASSERT_NE(appMgrServiceInner, nullptr); + + HapModuleInfo hapModuleInfo; + auto want = std::make_shared(); + BundleInfo info; + std::string processName = "test_processName"; + std::shared_ptr appRecord = + appMgrServiceInner->appRunningManager_->CreateAppRunningRecord(applicationInfo_, processName, info, ""); + + appRecord->SetProcessType(ProcessType::EXTENSION); + appRecord->extensionType_ = ExtensionAbilityType::SERVICE; + abilityInfo_->extensionAbilityType = ExtensionAbilityType::UI_SERVICE; + + AbilityRuntime::LoadParam loadParam; + appMgrServiceInner->HandleExistingAppRecordAfterFound(appRecord, abilityInfo_, hapModuleInfo, want, false, + std::make_shared(loadParam)); + + EXPECT_EQ(appRecord->GetProcessType(), ProcessType::NORMAL); +} + /** * @tc.name: PreStartNWebSpawnProcess_002 * @tc.desc: prestart nwebspawn process. diff --git a/test/unittest/ui_ability_lifecycle_manager_test/ui_ability_lifecycle_manager_test.cpp b/test/unittest/ui_ability_lifecycle_manager_test/ui_ability_lifecycle_manager_test.cpp index b8de0f49d1..114a9f6260 100644 --- a/test/unittest/ui_ability_lifecycle_manager_test/ui_ability_lifecycle_manager_test.cpp +++ b/test/unittest/ui_ability_lifecycle_manager_test/ui_ability_lifecycle_manager_test.cpp @@ -7149,7 +7149,9 @@ HWTEST_F(UIAbilityLifecycleManagerTest, IsUIAbilityAlreadyExist_0001, TestSize.L record->SetInstanceKey(instanceKey); mgr->sessionAbilityMap_[1] = record; - auto ret = mgr->IsUIAbilityAlreadyExist(abilityName, "", appIndex, instanceKey, AppExecFwk::LaunchMode::STANDARD); + Want want; + want.SetElementName("device", bundleName, abilityName, moduleName); + auto ret = mgr->IsUIAbilityAlreadyExist(want, "", appIndex, instanceKey, AppExecFwk::LaunchMode::STANDARD); EXPECT_EQ(ret, ERROR_UIABILITY_IS_ALREADY_EXIST); } @@ -7182,7 +7184,9 @@ HWTEST_F(UIAbilityLifecycleManagerTest, IsUIAbilityAlreadyExist_0002, TestSize.L record->SetSpecifiedFlag(specifiedFlag); mgr->sessionAbilityMap_[10] = record; - auto ret = mgr->IsUIAbilityAlreadyExist(abilityName, specifiedFlag, appIndex, instanceKey, + Want want; + want.SetElementName("device", bundleName, abilityName, moduleName); + auto ret = mgr->IsUIAbilityAlreadyExist(want, specifiedFlag, appIndex, instanceKey, AppExecFwk::LaunchMode::SPECIFIED); EXPECT_EQ(ret, ERROR_UIABILITY_IS_ALREADY_EXIST); } @@ -7196,7 +7200,9 @@ HWTEST_F(UIAbilityLifecycleManagerTest, IsUIAbilityAlreadyExist_0003, TestSize.L { auto mgr = std::make_shared(); ASSERT_NE(mgr, nullptr); - auto ret = mgr->IsUIAbilityAlreadyExist("NoExistAbility", "flag", 0, "key", AppExecFwk::LaunchMode::STANDARD); + Want want; + want.SetElementName("device", "com.example.test", "NoExistAbility", "entry"); + auto ret = mgr->IsUIAbilityAlreadyExist(want, "flag", 0, "key", AppExecFwk::LaunchMode::STANDARD); EXPECT_EQ(ret, ERR_OK); AbilityRequest abilityRequest; @@ -7208,7 +7214,7 @@ HWTEST_F(UIAbilityLifecycleManagerTest, IsUIAbilityAlreadyExist_0003, TestSize.L record->SetAppIndex(0); record->SetInstanceKey("key"); mgr->sessionAbilityMap_[5] = record; - ret = mgr->IsUIAbilityAlreadyExist("NoExistAbility", "flag", 0, "key", AppExecFwk::LaunchMode::STANDARD); + ret = mgr->IsUIAbilityAlreadyExist(want, "flag", 0, "key", AppExecFwk::LaunchMode::STANDARD); EXPECT_EQ(ret, ERR_OK); } } // namespace AAFwk diff --git a/utils/server/startup/include/param.h b/utils/server/startup/include/param.h index e9cf9e9b5a..7752d40c25 100644 --- a/utils/server/startup/include/param.h +++ b/utils/server/startup/include/param.h @@ -58,6 +58,7 @@ struct LoadParam : public Parcelable { uint64_t loadAbilityCallbackId = 0; bool isPrelaunch = false; bool isPreloadStart = false; + pid_t selfPid = -1; }; } // namespace AbilityRuntime } // namespace OHOS