421
社区成员




ExtensionAbility;应用;权限;
环境:3.2.6.5及以后版本系统
问题现象:包含ExtensionAbility
的应用无法安装到设备上。
安装应用返回成功信息:
install bundle successfully.
安装应用返回错误信息:
install parse profile prop check error.
由于ExtensionAbility能力普通开发者无法使用,应用需要赋予高权限,才可使用PrivilegeExtension。所以需要通过修改默认的配置文件生成带有高权限的P7b证书,生成P7b所使用的SDK版本需要3.2.6.5及以后版本。
对生成P7b证书的配置Profile.json文件进行修改,在文件中加入新配置项app-privilege-capabilities。并添加AllowAppUsePrivilegeExtension参数允许应用使用PrivilegeExtension。
"app-privilege-capabilities": [
"AllowAppUsePrivilegeExtension"
]
通过以上修改生成的P7b证书文件签名的应用,即被赋予应用使用PrivilegeExtension权限。
foundation/bundlemanager/bundle_framework/services/bundlemgr/src/module_profile.cpp
的1641行通过源码得知,ServiceExtensionAbility
和DataShareExtension
的应用需要appPrivilegeCapability.allowUsePrivilegeExtension
权限为 true,才会继续执行安装。
根据逻辑向上寻找在foundation/bundlemanager/bundle_framework/services/bundlemgr/src/bundle_install_checker.cpp
的ParseHapFiles
中设置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);
...
}
ParseAppPrivilegeCapability
方法,发现allowUsePrivilegeExtension
参数是通过解析provisionInfo
对象设置。如果provisionInfo.appPrivilegeCapabilities
数组中包含AllowAppUsePrivilegeExtension
字符串则appPrivilegeCapability.allowUsePrivilegeExtension
为true
,默认值为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);
}
}
...
}
provisionInfo
对象是在foundation/bundlemanager/bundle_framework/services/bundlemgr/src/bundle_install_checker.cpp
的CheckMultipleHapsSignInfo
方法中被解析赋值。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);
}
}
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;
}
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);
}
应用在签名时获取的高级能力包括:AllowAppDataNotCleared
、AllowAppMultiProcess
、AllowAppDesktopIconHide
、AllowAbilityPriorityQueried
、AllowAbilityExcludeFromMissions
、AllowAppUsePrivilegeExtension
和AllowFormVisibleNotify
。