From 86cbe048e8550d59bb3f8de63c37f719a7fc993b Mon Sep 17 00:00:00 2001 From: "DESKTOP-UGVMD4B\\DawnComing" Date: Fri, 10 Jul 2026 19:13:30 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E6=8B=89=E8=B5=B7cli=E5=88=86=E8=BA=AB?= =?UTF-8?q?=E6=97=B6=E5=BC=B9=E5=88=86=E8=BA=AB=E9=80=89=E6=8B=A9=E6=A1=86?= =?UTF-8?q?=20=E5=92=8C=E5=90=AF=E5=8A=A8specified=20ability=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=88=B0SCB=E6=97=B6=E6=9C=AA=E6=9B=B4=E6=96=B0Sandbo?= =?UTF-8?q?xCloneParams=E9=97=AE=E9=A2=98=20Signed-off-by:=20lidongrui=20=20Co-Authored-By:=20Agent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 AI[0%] 🔧 Human Fixed[0%] 🧑 Human[100%] 👌 AI Adopted[0%] --- .../ui_ability_lifecycle_manager.h | 8 ++ .../dialog_session/dialog_session_manager.cpp | 2 +- .../ui_ability_lifecycle_manager.cpp | 38 ++++++---- services/appmgr/src/app_mgr_service_inner.cpp | 4 +- ..._ability_lifecycle_manager_second_test.cpp | 75 ++++++++++++++++++- tools/ohos-aa/include/ohos_aa_command.h | 2 +- tools/ohos-aa/src/ohos_aa_command.cpp | 4 +- 7 files changed, 112 insertions(+), 21 deletions(-) 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 7384d4810d..4ee213bc7b 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -864,6 +864,14 @@ private: */ int NotifySCBPendingActivation(sptr &sessionInfo, const AbilityRequest &abilityRequest, std::string &errMsg); + + /** + * @brief Store sandbox clone params (isWebSandBoxClone, sandboxCloneIndex, caller info) into + * sessionInfo->want for the SCB callback. + * @param sessionInfo The session info to be updated + * @param abilityRequest The ability request carrying the sandbox clone flag and caller info + */ + void SetSandboxCloneParamsForSession(sptr &sessionInfo, const AbilityRequest &abilityRequest); void CreateSessionConfigurations(std::vector> &sessionInfoList, int primaryWindowId, std::vector &configList, sptr sessionInfo); diff --git a/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp b/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp index 5e0ce19cb9..6ad6674424 100644 --- a/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp +++ b/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp @@ -578,7 +578,7 @@ bool DialogSessionManager::IsCreateCloneSelectorDialog(const std::string &bundle StartAbilityUtils::isWantWithAppCloneIndex = false; return false; #else - if (StartAbilityUtils::isWantWithAppCloneIndex) { + if (StartAbilityUtils::isWantWithAppCloneIndex || StartAbilityUtils::isSandBoxClone) { TAG_LOGI(AAFwkTag::ABILITYMGR, "no clone index"); StartAbilityUtils::isWantWithAppCloneIndex = false; return false; 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 959c32d747..b585ca38ab 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -721,6 +721,27 @@ bool UIAbilityLifecycleManager::AddStartCallerTimestamp(int32_t callerUid) return true; } +void UIAbilityLifecycleManager::SetSandboxCloneParamsForSession(sptr &sessionInfo, + const AbilityRequest &abilityRequest) +{ + if (sessionInfo == nullptr || !abilityRequest.isWebSandBoxClone) { + return; + } + // Store isWebSandBoxClone and appIndex in want for SCB callback. + sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::IS_WEB_SANDBOX_CLONE, + abilityRequest.isWebSandBoxClone); + sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::SANDBOX_CLONE_INDEX, + abilityRequest.abilityInfo.applicationInfo.appIndex); + std::string callerBundleName = abilityRequest.want.GetStringParam( + AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME); + std::string callerTokenId = abilityRequest.want.GetStringParam( + AbilityRuntime::GlobalConstant::CLI_CALLER_TOKEN_ID); + sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME, callerBundleName); + sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::CLI_CALLER_TOKEN_ID, callerTokenId); + TAG_LOGD(AAFwkTag::ABILITYMGR, "WebSandBoxClone params: bundle = %{public}s, tokenId = %{public}s", + callerBundleName.c_str(), callerTokenId.c_str()); +} + int UIAbilityLifecycleManager::NotifySCBToStartUIAbility(AbilityRequest &abilityRequest) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); @@ -796,20 +817,7 @@ int UIAbilityLifecycleManager::NotifySCBToStartUIAbility(AbilityRequest &ability sessionInfo->reuse = reuse; } // Store isWebSandBoxClone and appIndex in want for SCB callback. - if (abilityRequest.isWebSandBoxClone) { - sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::IS_WEB_SANDBOX_CLONE, - abilityRequest.isWebSandBoxClone); - sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::SANDBOX_CLONE_INDEX, - abilityRequest.abilityInfo.applicationInfo.appIndex); - std::string callerBundleName = abilityRequest.want.GetStringParam( - AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME); - std::string callerTokenId = abilityRequest.want.GetStringParam( - AbilityRuntime::GlobalConstant::CLI_CALLER_TOKEN_ID); - sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME, callerBundleName); - sessionInfo->want.SetParam(AbilityRuntime::GlobalConstant::CLI_CALLER_TOKEN_ID, callerTokenId); - TAG_LOGD(AAFwkTag::ABILITYMGR, "WebSandBoxClone params: bundle = %{public}s, tokenId = %{public}s", - callerBundleName.c_str(), callerTokenId.c_str()); - } + SetSandboxCloneParamsForSession(sessionInfo, abilityRequest); sessionInfo->userId = userId_; sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); TAG_LOGI(AAFwkTag::ABILITYMGR, @@ -4558,6 +4566,8 @@ void UIAbilityLifecycleManager::StartSpecifiedRequest(SpecifiedRequest &specifie } sessionInfo->requestCode = request.requestCode; sessionInfo->userId = userId_; + // Store isWebSandBoxClone and appIndex in want for SCB callback. + SetSandboxCloneParamsForSession(sessionInfo, request); TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedRequest cold"); std::string errMsg; auto result = NotifySCBPendingActivation(sessionInfo, request, errMsg); diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index cc7b26f93b..78e9aef64a 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -9665,7 +9665,7 @@ int32_t AppMgrServiceInner::IsAppRunning(const std::string &bundleName, int32_t TAG_LOGE(AAFwkTag::APPMGR, "permission verification fail"); return ERR_PERMISSION_DENIED; } - if (appCloneIndex < 0 || AbilityRuntime::GlobalConstant::IsDlpIndex(appCloneIndex)) { + if (appCloneIndex < 0 || appCloneIndex > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) { TAG_LOGE(AAFwkTag::APPMGR, "appCloneIndex invalid"); return AAFwk::ERR_APP_CLONE_INDEX_INVALID; } @@ -9712,7 +9712,7 @@ int32_t AppMgrServiceInner::IsAppRunning(const std::string &bundleName, int32_t TAG_LOGE(AAFwkTag::APPMGR, "permission verification fail"); return ERR_PERMISSION_DENIED; } - if (appCloneIndex < 0 || AbilityRuntime::GlobalConstant::IsDlpIndex(appCloneIndex)) { + if (appCloneIndex < 0 || appCloneIndex > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) { TAG_LOGI(AAFwkTag::APPMGR, "appCloneIndex invalid"); appCloneIndex = -1; } diff --git a/test/unittest/ui_ability_lifecycle_manager_second_test/ui_ability_lifecycle_manager_second_test.cpp b/test/unittest/ui_ability_lifecycle_manager_second_test/ui_ability_lifecycle_manager_second_test.cpp index 042f5112a3..59814dddb4 100644 --- a/test/unittest/ui_ability_lifecycle_manager_second_test/ui_ability_lifecycle_manager_second_test.cpp +++ b/test/unittest/ui_ability_lifecycle_manager_second_test/ui_ability_lifecycle_manager_second_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Huawei Device Co., Ltd. + * Copyright (c) 2025-2026 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -32,6 +32,7 @@ #include "process_options.h" #include "session/host/include/session.h" #include "session_info.h" +#include "global_constant.h" #include "startup_util.h" #define private public #define protected public @@ -1221,6 +1222,78 @@ HWTEST_F(UIAbilityLifecycleManagerSecondTest, BackToCallerAbilityWithResultLocke EXPECT_EQ(ret, ERR_INVALID_VALUE); } +/** + * @tc.name: UIAbilityLifecycleManager_SetSandboxCloneParamsForSession_0100 + * @tc.desc: SetSandboxCloneParamsForSession with null sessionInfo returns early without crash. + * @tc.type: FUNC + */ +HWTEST_F(UIAbilityLifecycleManagerSecondTest, SetSandboxCloneParamsForSession_001, TestSize.Level1) +{ + auto mgr = std::make_shared(); + sptr sessionInfo = nullptr; + AbilityRequest abilityRequest; + abilityRequest.isWebSandBoxClone = true; + + mgr->SetSandboxCloneParamsForSession(sessionInfo, abilityRequest); + + EXPECT_EQ(sessionInfo, nullptr); +} + +/** + * @tc.name: UIAbilityLifecycleManager_SetSandboxCloneParamsForSession_0200 + * @tc.desc: SetSandboxCloneParamsForSession with isWebSandBoxClone false sets no params. + * @tc.type: FUNC + */ +HWTEST_F(UIAbilityLifecycleManagerSecondTest, SetSandboxCloneParamsForSession_002, TestSize.Level1) +{ + auto mgr = std::make_shared(); + sptr sessionInfo(new SessionInfo()); + ASSERT_NE(sessionInfo, nullptr); + AbilityRequest abilityRequest; + abilityRequest.isWebSandBoxClone = false; + abilityRequest.abilityInfo.applicationInfo.appIndex = 2000; + + mgr->SetSandboxCloneParamsForSession(sessionInfo, abilityRequest); + + EXPECT_FALSE(sessionInfo->want.GetBoolParam( + AbilityRuntime::GlobalConstant::IS_WEB_SANDBOX_CLONE, false)); + EXPECT_EQ(sessionInfo->want.GetIntParam( + AbilityRuntime::GlobalConstant::SANDBOX_CLONE_INDEX, -1), -1); + EXPECT_TRUE(sessionInfo->want.GetStringParam( + AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME).empty()); +} + +/** + * @tc.name: UIAbilityLifecycleManager_SetSandboxCloneParamsForSession_0300 + * @tc.desc: SetSandboxCloneParamsForSession with isWebSandBoxClone true stores all params into sessionInfo->want. + * @tc.type: FUNC + */ +HWTEST_F(UIAbilityLifecycleManagerSecondTest, SetSandboxCloneParamsForSession_003, TestSize.Level1) +{ + auto mgr = std::make_shared(); + sptr sessionInfo(new SessionInfo()); + ASSERT_NE(sessionInfo, nullptr); + AbilityRequest abilityRequest; + abilityRequest.isWebSandBoxClone = true; + abilityRequest.abilityInfo.applicationInfo.appIndex = 2000; + const std::string callerBundleName = "com.test.cli.caller"; + const std::string callerTokenId = "537919265"; + abilityRequest.want.SetParam(AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME, callerBundleName); + abilityRequest.want.SetParam(AbilityRuntime::GlobalConstant::CLI_CALLER_TOKEN_ID, callerTokenId); + + mgr->SetSandboxCloneParamsForSession(sessionInfo, abilityRequest); + + EXPECT_TRUE(sessionInfo->want.GetBoolParam( + AbilityRuntime::GlobalConstant::IS_WEB_SANDBOX_CLONE, false)); + EXPECT_EQ(sessionInfo->want.GetIntParam( + AbilityRuntime::GlobalConstant::SANDBOX_CLONE_INDEX, -1), + abilityRequest.abilityInfo.applicationInfo.appIndex); + EXPECT_EQ(sessionInfo->want.GetStringParam( + AbilityRuntime::GlobalConstant::CLI_CALLER_BUNDLE_NAME), callerBundleName); + EXPECT_EQ(sessionInfo->want.GetStringParam( + AbilityRuntime::GlobalConstant::CLI_CALLER_TOKEN_ID), callerTokenId); +} + /** * @tc.name: QueryCallerTokenIdForAnco_001 * @tc.desc: Test QueryCallerTokenIdForAnco with empty callerInfoMap_ diff --git a/tools/ohos-aa/include/ohos_aa_command.h b/tools/ohos-aa/include/ohos_aa_command.h index 779e4eb998..1ce53e1466 100644 --- a/tools/ohos-aa/include/ohos_aa_command.h +++ b/tools/ohos-aa/include/ohos_aa_command.h @@ -184,7 +184,7 @@ private: void FormatOutputForWithWait(const Want &want, const AbilityStartWithWaitObserverData& data); bool startAbilityWithWaitFlag_ = false; - bool StartSandboxCloneAbilityFlag_ = false; + bool startSandboxCloneAbilityFlag_ = false; std::map errorInfoMap_; }; } // namespace AAFwk diff --git a/tools/ohos-aa/src/ohos_aa_command.cpp b/tools/ohos-aa/src/ohos_aa_command.cpp index 171369575b..56ff5a6916 100644 --- a/tools/ohos-aa/src/ohos_aa_command.cpp +++ b/tools/ohos-aa/src/ohos_aa_command.cpp @@ -315,7 +315,7 @@ ErrCode ClawAaShellCommand::RunAsStartAbility() if (result == OHOS::ERR_OK) { if (startAbilityWithWaitFlag_) { result = StartAbilityWithWait(want); - } else if (StartSandboxCloneAbilityFlag_) { + } else if (startSandboxCloneAbilityFlag_) { SandboxCloneParams params; // Get caller info from environment variables (set by SA-CLI via config["env"]) if (const char* envCallerUid = std::getenv("ohos_cli_callerUid")) { @@ -953,7 +953,7 @@ ErrCode ClawAaShellCommand::MakeWantFromCmd(Want& want, int32_t& userId) } sandBoxCloneIndex = std::stoi(sandBoxCloneIndexStr); hasSandBoxCloneIndex = true; - StartSandboxCloneAbilityFlag_ = true; + startSandboxCloneAbilityFlag_ = true; TAG_LOGI(AAFwkTag::AA_TOOL, "sandBoxCloneIndex = %{public}d, Flag_ set to true", sandBoxCloneIndex); } break;