3.2系统无法安装包含ExtensionAbility应用问题分析报告

鸿蒙使小强 2023-03-13 17:37:44

1 关键字

ExtensionAbility;应用;权限;

2 问题描述

环境:3.2.6.5及以后版本系统

问题现象:包含ExtensionAbility的应用无法安装到设备上。

3 问题原因

3.1 正常机制

安装应用返回成功信息:

install bundle successfully.

3.2 异常机制

安装应用返回错误信息:

install parse profile prop check error.

4 解决方案

由于ExtensionAbility能力普通开发者无法使用,应用需要赋予高权限,才可使用PrivilegeExtension。所以需要通过修改默认的配置文件生成带有高权限的P7b证书,生成P7b所使用的SDK版本需要3.2.6.5及以后版本。

对生成P7b证书的配置Profile.json文件进行修改,在文件中加入新配置项app-privilege-capabilities。并添加AllowAppUsePrivilegeExtension参数允许应用使用PrivilegeExtension。

"app-privilege-capabilities": [
  "AllowAppUsePrivilegeExtension"
]

通过以上修改生成的P7b证书文件签名的应用,即被赋予应用使用PrivilegeExtension权限。

5 定位过程

  1. 安装应用时,捕获错误日志信息

img

  1. 通过报错信息定位源码位置位于foundation/bundlemanager/bundle_framework/services/bundlemgr/src/module_profile.cpp的1641行

img

  1. 通过源码得知,ServiceExtensionAbilityDataShareExtension的应用需要appPrivilegeCapability.allowUsePrivilegeExtension权限为 true,才会继续执行安装。

  2. 根据逻辑向上寻找在foundation/bundlemanager/bundle_framework/services/bundlemgr/src/bundle_install_checker.cppParseHapFiles中设置appPrivilegeCapability参数值。

ErrCode BundleInstallChecker::ParseHapFiles(
    const std::vector<std::string> &bundlePaths,
    const InstallCheckParam &checkParam,
    std::vector<Security::Verify::HapVerifyResult> &hapVerifyRes,
    std::unordered_map<std::string, InnerBundleInfo> &infos)
{
    ...
    ParseAppPrivilegeCapability(provisionInfo, appPrivilegeCapability);
    ...
}
  1. 查看ParseAppPrivilegeCapability方法,发现allowUsePrivilegeExtension参数是通过解析provisionInfo对象设置。如果provisionInfo.appPrivilegeCapabilities数组中包含AllowAppUsePrivilegeExtension字符串则appPrivilegeCapability.allowUsePrivilegeExtensiontrue,默认值为false
const std::string PRIVILEGE_ALLOW_APP_USE_PRIVILEGE_EXTENSION = "AllowAppUsePrivilegeExtension";

PRIVILEGE_MAP = {
    ...
    { PRIVILEGE_ALLOW_APP_USE_PRIVILEGE_EXTENSION,
        [] (AppPrivilegeCapability &appPrivilegeCapability) {
            appPrivilegeCapability.allowUsePrivilegeExtension = true;
        } },
    ...
};

void BundleInstallChecker::ParseAppPrivilegeCapability(
    const Security::Verify::ProvisionInfo &provisionInfo,
    AppPrivilegeCapability &appPrivilegeCapability)
{
    for (const auto &appPrivilege : provisionInfo.appPrivilegeCapabilities) {
        auto iter = PRIVILEGE_MAP.find(appPrivilege);
        if (iter != PRIVILEGE_MAP.end()) {
            iter->second(appPrivilegeCapability);
        }
    }
    ...
}
  1. 继续追踪源码发现,provisionInfo对象是在foundation/bundlemanager/bundle_framework/services/bundlemgr/src/bundle_install_checker.cppCheckMultipleHapsSignInfo方法中被解析赋值。
ErrCode BundleInstallChecker::CheckMultipleHapsSignInfo(
    const std::vector<std::string> &bundlePaths,
    std::vector<Security::Verify::HapVerifyResult>& hapVerifyRes)
{
    for (const std::string &bundlePath : bundlePaths) {
        Security::Verify::HapVerifyResult hapVerifyResult;
        auto verifyRes = BundleVerifyMgr::HapVerify(bundlePath, hapVerifyResult);
        if (verifyRes != ERR_OK) {
            APP_LOGE("hap file verify failed");
            return verifyRes;
        }
        hapVerifyRes.emplace_back(hapVerifyResult);
    }
}
  1. 向下查看逻辑,在base/security/appverify/interfaces/innerkits/appverify/src/provision/provision_verify.cpp中进行签名文件的解析,把签名信息赋值给provisionInfo对象。
AppProvisionVerifyResult ParseProvision(const string& appProvision, ProvisionInfo& info)
{
    json obj = json::parse(appProvision, nullptr, false);
    ...
    obj.get_to(info);
    ...
    return PROVISION_OK;
}
  1. 在解析时,把签名配置文件中的app-privilege-capabilities参数项,赋值给appPrivilegeCapabilities
const string KEY_APP_PRIVILEGE_CAPABILITIES = "app-privilege-capabilities";

void from_json(const json& obj, ProvisionInfo& out)
{
    if (!obj.is_object()) {
        return;
    }
    ...
    GetStringArrayIfExist(obj, KEY_APP_PRIVILEGE_CAPABILITIES, out.appPrivilegeCapabilities);
}

6 知识分享

应用在签名时获取的高级能力包括:AllowAppDataNotClearedAllowAppMultiProcessAllowAppDesktopIconHideAllowAbilityPriorityQueriedAllowAbilityExcludeFromMissionsAllowAppUsePrivilegeExtensionAllowFormVisibleNotify

...全文
138 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

515

社区成员

发帖
与我相关
我的任务
社区描述
OpenHarmony开发者社区
其他 企业社区
社区管理员
  • csdnsqst0025
  • shewaliujingli
  • BaoWei
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧