From fc72088d2c6fe8b37eca1081de8f6add14a21e5c Mon Sep 17 00:00:00 2001 From: yangzk Date: Mon, 17 Jan 2022 12:01:55 +0800 Subject: [PATCH] add GetExtensionAbilityInfo Signed-off-by: yangzk Change-Id: Ie1d68c9abf864edfee0c2c9c04b5f507a9b4134b --- .../native/src/js_service_extension.cpp | 18 ++--- .../include/ability_manager_service.h | 4 + .../src/ability_manager_service.cpp | 76 ++++++++++++++++++- 3 files changed, 87 insertions(+), 11 deletions(-) diff --git a/frameworks/kits/ability/native/src/js_service_extension.cpp b/frameworks/kits/ability/native/src/js_service_extension.cpp index f5aefbaf5b8..1abe9ce14fa 100755 --- a/frameworks/kits/ability/native/src/js_service_extension.cpp +++ b/frameworks/kits/ability/native/src/js_service_extension.cpp @@ -42,22 +42,22 @@ JsServiceExtension::JsServiceExtension(JsRuntime& jsRuntime) : jsRuntime_(jsRunt JsServiceExtension::~JsServiceExtension() = default; void JsServiceExtension::Init(const std::shared_ptr &record, - const std::shared_ptr &application, - std::shared_ptr &handler, + const std::shared_ptr &application, std::shared_ptr &handler, const sptr &token) { ServiceExtension::Init(record, application, handler, token); - std::string srcPath(Extension::abilityInfo_->package); - srcPath.append("/assets/js/"); - if (!Extension::abilityInfo_->srcPath.empty()) { - srcPath.append(Extension::abilityInfo_->srcPath); + if (Extension::abilityInfo_->srcEntrance.empty()) { + HILOG_ERROR("abilityInfo srcEntrance is empty"); + return; } - srcPath.append("/").append(Extension::abilityInfo_->name).append(".abc"); + std::string srcPath(Extension::abilityInfo_->moduleName + "/"); + srcPath.append(Extension::abilityInfo_->srcPath); + srcPath.erase(srcPath.rfind('.')); + srcPath.append(".abc"); std::string moduleName(Extension::abilityInfo_->moduleName); moduleName.append("::").append(abilityInfo_->name); - HILOG_INFO("JsServiceExtension::Init moduleName:%{public}s,srcPath:%{public}s.", - moduleName.c_str(), srcPath.c_str()); + HILOG_INFO("JsServiceExtension::Init module:%{public}s,srcPath:%{public}s.", moduleName.c_str(), srcPath.c_str()); HandleScope handleScope(jsRuntime_); auto& engine = jsRuntime_.GetNativeEngine(); diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index f6c2176e820..bc7dde09312 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -897,6 +897,10 @@ private: void InitDataAbilityManager(int32_t userId, bool switchUser); void InitPendWantManager(int32_t userId, bool switchUser); + int32_t GetAbilityInfoFromExtension(const Want &want, AppExecFwk::AbilityInfo& abilityInfo); + int32_t InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo, + AppExecFwk::AbilityInfo &abilityInfo); + // multi user void StartFreezingScreen(); void StopFreezingScreen(); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 9325436dcc9..08399f6a49c 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -28,6 +28,7 @@ #include "ability_manager_errors.h" #include "ability_util.h" #include "bytrace.h" +#include "bundle_mgr_client.h" #include "configuration_distributor.h" #include "hilog_wrapper.h" #include "if_system_ability_manager.h" @@ -2006,8 +2007,12 @@ int AbilityManagerService::GenerateAbilityRequest( bms->QueryAbilityInfo(want, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, request.abilityInfo); if (request.abilityInfo.name.empty() || request.abilityInfo.bundleName.empty()) { - HILOG_ERROR("Get ability info failed."); - return RESOLVE_ABILITY_ERR; + // try to find extension + int ret = GetAbilityInfoFromExtension(want, request.abilityInfo); + if (!ret) { + HILOG_ERROR("Get ability info failed."); + return RESOLVE_ABILITY_ERR; + } } HILOG_DEBUG("Query ability name: %{public}s,", request.abilityInfo.name.c_str()); if (request.abilityInfo.type == AppExecFwk::AbilityType::SERVICE) { @@ -2982,5 +2987,72 @@ bool AbilityManagerService::IsAbilityControllerResuming(const std::string &bundl } return true; } + +int32_t AbilityManagerService::InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo, + AppExecFwk::AbilityInfo &abilityInfo) +{ + abilityInfo.bundleName = extensionInfo.bundleName; + abilityInfo.package = extensionInfo.moduleName; + abilityInfo.moduleName = extensionInfo.moduleName; + abilityInfo.name = extensionInfo.name; + abilityInfo.srcEntrance = extensionInfo.srcEntrance; + abilityInfo.srcPath = extensionInfo.srcEntrance; + abilityInfo.iconPath = extensionInfo.icon; + abilityInfo.iconId = extensionInfo.iconId; + abilityInfo.label = extensionInfo.label; + abilityInfo.labelId = extensionInfo.labelId; + abilityInfo.description = extensionInfo.description; + abilityInfo.descriptionId = extensionInfo.descriptionId; + abilityInfo.permissions = extensionInfo.permissions; + abilityInfo.readPermission = extensionInfo.readPermission; + abilityInfo.writePermission = extensionInfo.writePermission; + abilityInfo.extensionAbilityType = extensionInfo.type; + abilityInfo.visible = extensionInfo.visible; + abilityInfo.applicationInfo = extensionInfo.applicationInfo; + abilityInfo.resourcePath = extensionInfo.resourcePath; + abilityInfo.enabled = extensionInfo.enabled; + switch (extensionInfo.type) { + case AppExecFwk::ExtensionAbilityType::FORM: + abilityInfo.type = AppExecFwk::AbilityType::FORM; + break; + case AppExecFwk::ExtensionAbilityType::SERVICE: + abilityInfo.type = AppExecFwk::AbilityType::SERVICE; + break; + case AppExecFwk::ExtensionAbilityType::DATASHARE: + abilityInfo.type = AppExecFwk::AbilityType::DATA; + break; + default: + abilityInfo.type = AppExecFwk::AbilityType::EXTENSION; + break; + } + return 0; +} + +int32_t AbilityManagerService::GetAbilityInfoFromExtension(const Want &want, AppExecFwk::AbilityInfo &abilityInfo) +{ + ElementName elementName = want.GetElement(); + std::string bundleName = elementName.GetBundleName(); + std::string abilityName = elementName.GetAbilityName(); + AppExecFwk::BundleMgrClient bundleClient; + AppExecFwk::BundleInfo bundleInfo; + if (!bundleClient.GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO, bundleInfo)) { + HILOG_ERROR("Failed to get bundle info when generate ability request."); + return RESOLVE_APP_ERR; + } + bool found = false; + + for (auto &extensionInfo: bundleInfo.extensionInfos) { + if (extensionInfo.name != abilityName) { + continue; + } + found = true; + HILOG_DEBUG("GetExtensionAbilityInfo, extension ability info found, name=%{public}s", abilityName.c_str()); + abilityInfo.applicationName = bundleInfo.applicationInfo.name; + InitAbilityInfoFromExtension(extensionInfo, abilityInfo); + break; + } + + return found; +} } // namespace AAFwk } // namespace OHOS -- Gitee