OpenHarmony 5.1 HAP 安装权限与签名 Profile 配置教程

适用场景:DevEco Studio 构建 OpenHarmony 应用时,安装 HAP 报 95682899568344install parse profile prop check errorgrant request permissions failed 等错误。
示例工程:com.openharmony.jymqtt
示例 SDK:C:\Users\Lenovo\AppData\Local\OpenHarmony\Sdk\18


1. 问题现象

DevEco Studio Run 应用时,常见报错如下:

Install Failed: error: failed to install bundle.
code:9568289
error: install failed due to grant request permissions failed.
PermissionName: ohos.permission.INSTALL_BUNDLE

或者:

Install Failed: error: failed to install bundle.
code:9568289
error: install failed due to grant request permissions failed.
PermissionName: ohos.permission.START_INVISIBLE_ABILITY

或者:

Install Failed: error: failed to install bundle.
code:9568344
error: install parse profile prop check error.

2. 错误原因总结

2.1 9568289

这个错误表示:

应用申请了高权限,但是当前签名 Profile 没有授权这些权限。

典型权限包括:

ohos.permission.INSTALL_BUNDLE
ohos.permission.START_ABILITIES_FROM_BACKGROUND
ohos.permission.START_INVISIBLE_ABILITY

这些权限不是普通 normal APL 应用默认能申请的,需要在 HarmonyAppProvision / Profile 中配置:

"apl": "system_core"

以及:

"acls": {
  "allowed-acls": [
    "ohos.permission.INSTALL_BUNDLE",
    "ohos.permission.START_ABILITIES_FROM_BACKGROUND",
    "ohos.permission.START_INVISIBLE_ABILITY"
  ]
}

2.2 9568344

这个错误常见于应用使用了 ServiceExtensionAbility 或其他特权 Extension,但是设备侧没有配置白名单。

如果 module.json5 中有:

"extensionAbilities": [
  {
    "name": "ServiceExtAbility",
    "type": "service"
  }
]

则设备侧需要配置:

install_list_capability.json

并开启:

"allowAppUsePrivilegeExtension": true

3. 三个权限分别是什么

3.1 ohos.permission.INSTALL_BUNDLE

作用:允许应用安装其他 HAP / Bundle。

适用场景:

应用商店
系统升级工具
自动安装器
设备管理类系统应用

普通 MQTT 客户端一般不需要这个权限。


3.2 ohos.permission.START_ABILITIES_FROM_BACKGROUND

作用:允许应用在后台启动 Ability。

适用场景:

后台 ServiceExtension 主动拉起页面
后台服务启动其他 Ability
后台业务需要唤起组件

3.3 ohos.permission.START_INVISIBLE_ABILITY

作用:允许应用启动不可见 Ability。

这个权限级别较高,通常属于系统级或特权应用使用。


4. module.json5 中声明权限

文件位置通常是:

entry/src/main/module.json5

如果确实需要这三个权限,可以配置:

"requestPermissions": [
  {
    "name": "ohos.permission.INSTALL_BUNDLE",
    "usedScene": {
      "abilities": [
        "ServiceExtAbility"
      ],
      "when": "always"
    }
  },
  {
    "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND",
    "usedScene": {
      "abilities": [
        "ServiceExtAbility"
      ],
      "when": "always"
    }
  },
  {
    "name": "ohos.permission.START_INVISIBLE_ABILITY",
    "usedScene": {
      "abilities": [
        "ServiceExtAbility"
      ],
      "when": "always"
    }
  },
  {
    "name": "ohos.permission.INTERNET"
  }
]

注意:ServiceExtAbility 必须和 extensionAbilities 中的 Ability 名称一致。

例如如果实际是:

"name": "IpcServiceExtAbility"

usedScene.abilities 也要写:

"abilities": [
  "IpcServiceExtAbility"
]

5. 获取当前 HAP 证书指纹

5.1 从 distribution-certificate 提取证书

证书通常在 HarmonyAppProvision 文件的字段中:

"distribution-certificate": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n"

复制内容,新建:

profile.cer

保存时必须把 \n 改成真实换行。

正确格式示例:

-----BEGIN CERTIFICATE-----
MIIC...
...
-----END CERTIFICATE-----

不要保留这些字符:

\n
"
,

5.2 用 keytool 计算指纹

keytool -printcert -file profile.cer

输出类似:

SHA256: 2F:2E:84:F9:21:85:23:AD:F2:4D:91:CE:86:87:39:D4:2F:68:1B:0E:59:B8:65:EE:46:E0:9E:13:6A:5F:C0:5A

去掉冒号后:

2F2E84F9218523ADF24D91CE868739D42F681B0E59B865EE46E09E136A5FC05A

这个值后面要填到 install_list_capability.jsonapp_signature 中。


6. 修改 SDK Profile 模板

本次工程实际使用的 SDK 路径是:

C:\Users\Lenovo\AppData\Local\OpenHarmony\Sdk\18\toolchains\lib

进入目录:

cd /d "C:\Users\Lenovo\AppData\Local\OpenHarmony\Sdk\18\toolchains\lib"

先检查模板:

findstr /n /i "bundle-name apl allowed-acls INSTALL_BUNDLE START_INVISIBLE_ABILITY START_ABILITIES_FROM_BACKGROUND" UnsgnedReleasedProfileTemplate.json

Release 包实际使用的是:

UnsgnedReleasedProfileTemplate.json

需要确认它包含:

"bundle-name": "com.openharmony.jymqtt",
"apl": "system_core",

以及:

"acls": {
  "allowed-acls": [
    "ohos.permission.INSTALL_BUNDLE",
    "ohos.permission.START_ABILITIES_FROM_BACKGROUND",
    "ohos.permission.START_INVISIBLE_ABILITY"
  ]
}

完整结构示例:

{
  "version-name": "1.0.0",
  "version-code": 1,
  "uuid": "xxx",
  "type": "release",
  "bundle-info": {
    "developer-id": "OpenHarmony",
    "distribution-certificate": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n",
    "bundle-name": "com.openharmony.jymqtt",
    "apl": "system_core",
    "app-feature": "hos_normal_app"
  },
  "acls": {
    "allowed-acls": [
      "ohos.permission.INSTALL_BUNDLE",
      "ohos.permission.START_ABILITIES_FROM_BACKGROUND",
      "ohos.permission.START_INVISIBLE_ABILITY"
    ]
  },
  "permissions": {
    "restricted-permissions": [
      ""
    ]
  }
}

检查 JSON 是否正确:

powershell -NoProfile -Command "Get-Content '.\UnsgnedReleasedProfileTemplate.json' -Raw | ConvertFrom-Json | Out-Null; echo OK"

输出:

OK

说明 JSON 格式没有问题。


7. 关键坑:工程里可能固定使用旧 .p7b

本次真正的问题在这里。

工程 build-profile.json5 中有:

"signingConfigs": [
  {
    "name": "default",
    "material": {
      "certpath": "C:/Users/Lenovo/.ohos/config/openharmony/default_JYMQTT_xxx.cer",
      "keyAlias": "debugKey",
      "profile": "C:/Users/Lenovo/.ohos/config/openharmony/default_JYMQTT_xxx.p7b",
      "storeFile": "C:/Users/Lenovo/.ohos/config/openharmony/default_JYMQTT_xxx.p12"
    }
  }
]

这里的重点是:

"profile": "C:/Users/Lenovo/.ohos/config/openharmony/default_JYMQTT_xxx.p7b"

只要工程固定指定了这个 .p7b,DevEco 打包时就会使用旧的 .p7b,不会自动使用你刚刚修改过的 SDK 模板。

所以会出现:

SDK 模板已经是 system_core
但是最终 HAP 反查还是 apl normal

8. 反查最终 HAP 中的 Profile

进入 SDK 工具目录:

cd /d "C:\Users\Lenovo\AppData\Local\OpenHarmony\Sdk\18\toolchains\lib"

创建输出目录:

rmdir /s /q D:\hapcheck
mkdir D:\hapcheck

导出 HAP 里的证书链和 profile:

java -jar hap-sign-tool.jar verify-app -inFile "E:\baidu\arkTS_code\XJTtoMe\JYMQTT\entry\build\default\outputs\default\entry-default-signed.hap" -outCertChain "D:\hapcheck\out.cer" -outProfile "D:\hapcheck\out.p7b"

注意参数大小写:

-outCertChain

不要写成:

-outCertchain

解析 profile:

java -jar hap-sign-tool.jar verify-profile -inFile "D:\hapcheck\out.p7b" -outFile "D:\hapcheck\profile_check.json"

查看关键字段:

findstr /n /i "bundle-name apl allowed-acls INSTALL_BUNDLE START_INVISIBLE_ABILITY START_ABILITIES_FROM_BACKGROUND" D:\hapcheck\profile_check.json

正确结果应该类似:

"bundle-name": "com.openharmony.jymqtt"
"apl": "system_core"
"allowed-acls": [
"ohos.permission.INSTALL_BUNDLE"
"ohos.permission.START_ABILITIES_FROM_BACKGROUND"
"ohos.permission.START_INVISIBLE_ABILITY"

如果还是:

"apl": "normal"

说明最终 HAP 仍然使用旧 profile。


9. 处理固定旧 .p7b 的方法

方案 A:重新生成 .p7b

用修改后的 UnsgnedReleasedProfileTemplate.json 重新 sign-profile,生成新的 .p7b,覆盖 build-profile.json5 中指定的旧 .p7b

大致流程是:

UnsgnedReleasedProfileTemplate.json
        ↓ sign-profile
新的 default_JYMQTT_xxx.p7b
        ↓ DevEco 重新签名 HAP
entry-default-signed.hap

生成后先验证新 .p7b

java -jar hap-sign-tool.jar verify-profile -inFile "C:\Users\Lenovo\.ohos\config\openharmony\default_JYMQTT_xxx.p7b" -outFile "D:\hapcheck\new_profile_check.json"

检查:

findstr /n /i "bundle-name apl allowed-acls INSTALL_BUNDLE START_INVISIBLE_ABILITY START_ABILITIES_FROM_BACKGROUND" D:\hapcheck\new_profile_check.json

必须看到:

"apl": "system_core"

方案 B:重新生成 DevEco 签名材料

在 DevEco Studio 中:

File > Project Structure > Signing Configs

删除旧 signing config,重新创建签名配置。
然后确认生成的新 .p7baplsystem_core


10. 配置板端 install_list_capability.json

如果应用用了 ServiceExtensionAbility,还需要修改设备侧白名单。

查找文件:

hdc shell "find / -name install_list_capability.json 2>/dev/null"

常见路径:

/system/etc/app/install_list_capability.json

拉到电脑:

hdc file recv /system/etc/app/install_list_capability.json D:\install_list_capability.json

备份:

copy D:\install_list_capability.json D:\install_list_capability.json.bak

添加应用项:

{
  "bundleName": "com.openharmony.jymqtt",
  "app_signature": [
    "2F2E84F9218523ADF24D91CE868739D42F681B0E59B865EE46E09E136A5FC05A"
  ],
  "allowAppUsePrivilegeExtension": true
}

如果原文件结构是:

{
  "install_list": []
}

可以改成:

{
  "install_list": [
    {
      "bundleName": "com.openharmony.jymqtt",
      "app_signature": [
        "2F2E84F9218523ADF24D91CE868739D42F681B0E59B865EE46E09E136A5FC05A"
      ],
      "allowAppUsePrivilegeExtension": true
    }
  ]
}

推回设备:

hdc target mount
hdc file send D:\install_list_capability.json /system/etc/app/install_list_capability.json
hdc shell "chmod 644 /system/etc/app/install_list_capability.json"
hdc shell "sync"
hdc shell reboot

重启后确认:

hdc shell "cat /system/etc/app/install_list_capability.json | grep -A 8 -B 2 com.openharmony.jymqtt"

11. 清理构建缓存并重新安装

修改签名 Profile 后,建议强制清理构建产物。

关闭 DevEco Studio,然后执行:

cd /d E:\baidu\arkTS_code\XJTtoMe\JYMQTT

rmdir /s /q entry\build
rmdir /s /q build
rmdir /s /q .hvigor

重新打开 DevEco Studio:

Build > Clean Project
Build > Rebuild Project
Run

或者手动安装:

hdc install "E:\baidu\arkTS_code\XJTtoMe\JYMQTT\entry\build\default\outputs\default\entry-default-signed.hap"

12. 最终验证

安装成功后,板端查询包名:

hdc shell "bm dump -a | grep -i mqtt"

查询指纹:

hdc shell "bm dump -n com.openharmony.jymqtt | grep -i fingerprint"

如果输出类似:

"fingerprint": "2F2E84F9218523ADF24D91CE868739D42F681B0E59B865EE46E09E136A5FC05A"

说明签名证书、白名单和安装结果一致。


13. 本次排查的核心结论

本次真正踩坑点是:

SDK 模板已经改成 system_core,但是工程 build-profile.json5 指定了固定旧 p7b。

所以最终 HAP 仍然是:

"apl": "normal"

安装时继续报:

9568289
grant request permissions failed
PermissionName: ohos.permission.INSTALL_BUNDLE

最终解决思路:

1. module.json5 声明需要的权限
2. HarmonyAppProvision/Profile 设置 apl=system_core
3. allowed-acls 加入高权限
4. 重新生成工程实际使用的 .p7b
5. 反查最终 HAP,确认 apl=system_core
6. ServiceExtension 场景配置 install_list_capability.json
7. 重新构建安装

14. 常用排查命令汇总

查 SDK 模板

cd /d "C:\Users\Lenovo\AppData\Local\OpenHarmony\Sdk\18\toolchains\lib"

findstr /n /i "bundle-name apl allowed-acls INSTALL_BUNDLE START_INVISIBLE_ABILITY START_ABILITIES_FROM_BACKGROUND" UnsgnedReleasedProfileTemplate.json

查工程固定签名配置

cd /d E:\baidu\arkTS_code\XJTtoMe\JYMQTT

findstr /s /n /i "signingConfigs profile p7b certpath storeFile keyAlias" *.json5 *.json *.properties

反查最终 HAP

cd /d "C:\Users\Lenovo\AppData\Local\OpenHarmony\Sdk\18\toolchains\lib"

rmdir /s /q D:\hapcheck
mkdir D:\hapcheck

java -jar hap-sign-tool.jar verify-app -inFile "E:\baidu\arkTS_code\XJTtoMe\JYMQTT\entry\build\default\outputs\default\entry-default-signed.hap" -outCertChain "D:\hapcheck\out.cer" -outProfile "D:\hapcheck\out.p7b"

java -jar hap-sign-tool.jar verify-profile -inFile "D:\hapcheck\out.p7b" -outFile "D:\hapcheck\profile_check.json"

findstr /n /i "bundle-name apl allowed-acls INSTALL_BUNDLE START_INVISIBLE_ABILITY START_ABILITIES_FROM_BACKGROUND" D:\hapcheck\profile_check.json

查证书指纹

keytool -printcert -file D:\hapcheck\out.cer

查板端应用

hdc shell "bm dump -a | grep -i mqtt"
hdc shell "bm dump -n com.openharmony.jymqtt | grep -i fingerprint"

15. 注意事项

  1. 不要把 keyPasswordstorePassword.p12 私钥文件发给别人。
  2. install_list_capability.json 里的 app_signature 必须和最终 HAP 的证书 SHA256 一致。
  3. bm dump 获取指纹的前提是应用已经安装成功。
  4. 没安装成功时,要从证书或 HAP 中离线获取指纹。
  5. hap-sign-tool.jar verify-app 的参数是 -outCertChain,大小写不能错。
  6. 最终判断以 profile_check.json 为准,不以 SDK 模板为准。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐