OpenHarmony—Hap包签名工具

概述

为了保证OpenHarmony应用的完整性和来源可靠,在应用构建时需要对应用进行签名。经过签名的应用才能在真机设备上安装、运行、和调试。developtools_hapsigner仓 提供了签名工具的源码,包含密钥对生成、CSR文件生成、证书生成、Profile文件签名、Hap包签名等功能。

说明:
针对无需通过ACL跨级别申请权限的应用,DevEco Studio为开发者提供了自动化签名方案,可以一键完成应用/服务签名。具体可参考 自动化签名方案

基本概念

Hap包签名工具支持本地签名需求的开发,为OpenHarmony应用提供完整性保护和来源管控机制,该签名工具基于PKI公钥证书的机制实现,在进行开发前,开发者应了解以下基本概念:

  • 非对称密钥对:

非对称密钥算法是数据签名/验签的基础,应用签名工具实现了标准的非对称密钥对生成功能(支持的密钥对类型包括ECC P384/256、RSA2048/3072/4096)

  • CSR:

CSR(Certificate Signing Request)证书签发请求是生成证书的前提,他包括证书的公钥、证书主题和私钥签名,在申请证书之前,需要先基于密钥对生成CSR,然后提交给CA签发证书。

  • 证书:

OpenHarmony采用RFC5280标准构建X509证书信任体系。用于应用签名的OpenHarmony证书共有三级,分为:根CA证书、中间CA证书、最终实体证书,其中最终实体证书分为应用签名证书和profile签名证书。应用签名证书表示应用开发者的身份,可保证系统上安装的应用来源可追溯,profile签名证书实现对profile文件的签名进行验签,保证profile文件的完整性。

  • HAP:

HAP(OpenHarmony Ability Package)是Ability的部署包,OpenHarmony应用代码围绕Ability组件展开,它是由一个或者多个Ability组成。

  • Profile文件:

HarmonyAppProvision配置文件,hap包中的描述文件,该描述文件描述了已授权的证书权限和设备ID信息等信息。

约束与限制

  • Hap包签名工具基于Java语言开发,需要Java8以上Java环境运行。
  • 一键签名等脚本文件基于Python语言开发,使用需配置环境python3.5及以上。

编译构建

  1. 该工具基于Gradle 7.1编译构建,请确认环境已安装配置Gradle环境,并且版本高于或等于7.1。
gradle -v
  1. 下载代码,命令行打开文件目录至developtools_hapsigner/hapsigntool,执行命令进行编译打包。
    gradle build 

    gradle jar
  1. 编译后得到二进制文件,目录为: ./hap_sign_tool/build/libs/hap-sign-tool.jar。

开发指导

场景介绍

OpenHarmony系统内置密钥库文件,文件名称为OpenHarmony.p12,内含根CA证书、中间CA证书、最终实体证书等信息,工具基于该密钥库文件对OpenHarmony应用进行签名。

按照有无应用签名证书可分为以下两种场景:

  1. 无应用签名证书场景: 开发者使用该工具对Hap包签名时,需按照签名步骤从第一步生成应用签名证书密钥对依次完成应用签名证书生成、profile文件签名、应用签名流程。
  2. 有应用签名证书场景: 开发者可直接从签名步骤第三步对profile文件进行签名开始开发,使用应用签名证书和包含对应密钥的本地密钥库文件对应用进行签名。

命令说明

  1. 输出命令帮助信息。
    -help     # 输出命令帮助信息(不输入参数默认输出命令帮助信息)
  1. 输出版本信息。
    -version  # 输出版本信息
  1. 生成密钥对。
    generate-keypair : 生成密钥对
        ├── -keyAlias          # 密钥别名,必填项
        ├── -keyPwd            # 密钥口令,可选项
        ├── -keyAlg            # 密钥算法,必填项,包括RSA/ECC
        ├── -keySize           # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384
        ├── -keystoreFile      # 密钥库文件,必填项,JKS或P12格式
        ├── -keystorePwd       # 密钥库口令,可选项
  1. 生成证书签名请求。
    generate-csr : 生成证书签名请求
        ├── -keyAlias          # 密钥别名,必填项
        ├── -keyPwd            # 密钥口令,可选项
        ├── -subject           # 证书主题,必填项
        ├── -signAlg           # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA
        ├── -keystoreFile      # 密钥库文件,必填项,JKS或P12格式
        ├── -keystorePwd       # 密钥库口令,可选项
        ├── -outFile           # 输出文件,可选项,如果不填,则直接输出到控制台
  1. 生成根CA/中间CA证书。
    generate-ca : 生成根CA/中间CA证书,如果密钥不存在,一起生成密钥
        ├── -keyAlias                        # 密钥别名,必填项
        ├── -keyPwd                          # 密钥口令,可选项
        ├── -keyAlg                          # 密钥算法,必填项,包括RSA/ECC
        ├── -keySize                         # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384
        ├── -issuer                          # 颁发者的主题,可选项,如果不填,表示根CA
        ├── -issuerKeyAlias                  # 颁发者的密钥别名,可选项,如果不填,表示根CA
        ├── -issuerKeyPwd                    # 颁发者的密钥口令,可选项
        ├── -subject                         # 证书主题,必填项
        ├── -validity                        # 证书有效期,可选项,默认为3650天
        ├── -signAlg                         # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA
        ├── -basicConstraintsPathLen         # 路径长度,可选项,默认为0
        ├── -keystoreFile                    # 密钥库文件,必填项,JKS或P12格式
        ├── -keystorePwd                     # 密钥库口令,可选项
        ├── -issuerKeystoreFile              # 签发者密钥库文件,可选项,JKS或P12格式
        ├── -issuerKeystorePwd               # 签发者密钥库口令,可选项
        ├── -outFile                         # 输出文件,可选项,如果不填,则直接输出到控制台
  1. 生成应用调试/发布证书。
    generate-app-cert : 生成应用调试/发布证书
        ├── -keyAlias                        # 密钥别名,必填项
        ├── -keyPwd                          # 密钥口令,可选项
        ├── -issuer                          # 颁发者的主题,必填项
        ├── -issuerKeyAlias                  # 颁发者的密钥别名,必填项
        ├── -issuerKeyPwd                    # 颁发者的密钥口令,可选项
        ├── -subject                         # 证书主题,必填项
        ├── -validity                        # 证书有效期,可选项,默认为3650天
        ├── -signAlg                         # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA;
        ├── -issuerKeystoreFile              # 签发者密钥库文件,可选项,JKS或P12格式
        ├── -issuerKeystorePwd               # 签发者密钥库口令,可选项
        ├── -keystoreFile                    # 密钥库文件,必填项,JKS或P12格式
        ├── -keystorePwd                     # 密钥库口令,可选项
        ├── -outForm                         # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain
        ├── -rootCaCertFile                  #  outForm为certChain时必填,根CA证书文件
        ├── -subCaCertFile                   #  outForm为certChain时必填,中间CA证书文件
        ├── -outFile                         #  输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台
  1. 生成profile调试/发布证书。
    generate-profile-cert : 生成profile调试/发布证书
        ├── -keyAlias                        # 密钥别名,必填项
        ├── -keyPwd                          # 密钥口令,可选项
        ├── -issuer                          # 颁发者的主题,必填项
        ├── -issuerKeyAlias                  # 颁发者的密钥别名,必填项
        ├── -issuerKeyPwd                    # 颁发者的密钥口令,可选项
        ├── -subject                         # 证书主题,必填项
        ├── -validity                        # 证书有效期,可选项,默认为3650天
        ├── -signAlg                         # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA;
        ├── -issuerKeystoreFile              # 签发者密钥库文件,可选项,JKS或P12格式
        ├── -issuerKeystorePwd               # 签发者密钥库口令,可选项
        ├── -keystoreFile                    # 密钥库文件,必填项,JKS或P12格式
        ├── -keystorePwd                     # 密钥库口令,可选项
        ├── -outForm                         # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain
        ├── -rootCaCertFile                  #  outForm为certChain时必填,根CA证书文件
        ├── -subCaCertFile                   #  outForm为certChain时必填,中间CA证书文件
        ├── -outFile                         #  输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台
  1. 通用证书生成,可以生成自定义证书。
    generate-cert : 通用证书生成,可以生成自定义证书
        ├── -keyAlias                          # 密钥别名,必填项
        ├── -keyPwd                            # 密钥口令,可选项
        ├── -issuer                            # 颁发者的主题,必填项
        ├── -issuerKeyAlias                    # 颁发者的密钥别名,必填项
        ├── -issuerKeyPwd                      # 颁发者的密钥口令,可选项
        ├── -subject                           # 证书主题,必填项
        ├── -validity                          # 证书有效期,可选项,默认为1095天
        ├── -keyUsage                          # 密钥用法,必选项,包括digitalSignature, nonRepudiation, keyEncipherment,
        ├                                        dataEncipherment, keyAgreement, certificateSignature, crlSignature,
        ├                                        encipherOnly和decipherOnly,如果证书包括多个密钥用法,用逗号分隔
        ├── -keyUsageCritical                  # keyUsage是否为关键项,可选项,默认为是
        ├── -extKeyUsage                       # 扩展密钥用法,可选项,包括clientAuthentication,serverAuthentication,
        ├                                        codeSignature,emailProtection,smartCardLogin,timestamp,ocspSignature
        ├── -extKeyUsageCritical               # extKeyUsage是否为关键项,可选项,默认为否
        ├── -signAlg                           # 签名算法,必填项,包括SHA256withRSA/SHA384withRSA/SHA256withECDSA/SHA384withECDSA 
        ├── -basicConstraints                  # 是否包含basicConstraints,可选项,默认为否
        ├── -basicConstraintsCritical          # basicConstraints是否包含为关键项,可选项,默认为否
        ├── -basicConstraintsCa                # 是否为CA,可选项,默认为否
        ├── -basicConstraintsPathLen           # 路径长度,可选项,默认为0
        ├── -issuerKeystoreFile                # 签发者密钥库文件,可选项,JKS或P12格式
        ├── -issuerKeystorePwd                 # 签发者密钥库口令,可选项
        ├── -keystoreFile                      # 密钥库文件,必填项,JKS或P12格式
        ├── -keystorePwd                       # 密钥库口令,可选项
        ├── -outFile                           # 输出证书文件,可选项,如果不填,则直接输出到控制台
  1. profile文件签名。
    sign-profile : profile文件签名
        ├── -mode            # 签名模式,必填项,包括localSign,remoteSign
        ├── -keyAlias        # 密钥别名,必填项
        ├── -keyPwd          # 密钥口令,可选项
        ├── -profileCertFile # Profile签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项
        ├── -inFile          # 输入原始的模板Profile文件,文件为json格式,所在目录为developtools_hapsigner/autosign/UnsgnedReleasedProfileTemplate.json,必填项
        ├── -signAlg         # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA
        ├── -keystoreFile    # 密钥库文件,localSign模式时为必填项,JKS或P12格式
        ├── -keystorePwd     # 密钥库口令,可选项
        ├── -outFile         # 输出签名后的profile文件,p7b格式,必填项
  1. profile文件验签。
    verify-profile : profile文件验签
        ├── -inFile       # 已签名的profile文件,p7b格式,必填项
        ├── -outFil       # 验证结果文件(包含验证结果和profile内容),json格式,可选项;如果不填,则直接输出到控制台
  1. hap应用包签名。
    sign-app : hap应用包签名 
        ├── -mode          # 签名模式,必填项,包括localSign,remoteSign,remoteResign
        ├── -keyAlias      # 密钥别名,必填项
        ├──-keyPwd         # 密钥口令,可选项
        ├── -appCertFile   # 应用签名证书文件(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项
        ├── -profileFile   # 签名后的profile文件名,p7b格式,必填项
        ├── -profileSigned # 指示profile文件是否带有签名,1表示有签名,0表示没有签名,默认为1。可选项
        ├── -inForm        # 输入的原始文件的格式,zip格式或bin格式,默认zip格式,可选项
        ├── -inFile        # 输入的原始APP包文件,hap格式或bin格式,必填项
        ├── -signAlg       # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA
        ├── -keystoreFile  # 密钥库文件,localSign模式时为必填项,JKS或P12格式
        ├── -keystorePwd   # 密钥库口令,可选项
        ├── -outFile       # 输出签名后的包文件,必填项
  1. hap应用包文件验签。
    verify-app : hap应用包文件验签
        ├── -inFile          # 已签名的应用包文件,hap格式或bin格式,必填项
        ├── -outCertchain    # 签名的证书链文件,必填项
        ├── -outProfile      # 应用包中的profile文件,必填项  

签名步骤

对hap包签名的完整步骤为:

  • 生成应用签名证书密钥对
  • 生成应用签名证书
  • 对profile文件进行签名
  • 对Hap包进行签名

注意事项:

  1. 步骤一中的密钥对算法推荐使用ECC,出于安全性考虑,应用签名暂不使用RSA算法。
  2. 建议将待签名hap包、profile文件、密钥库文件OpenHarmony.p12、根CA证书、中间CA证书、签名工具放在同一个目录下,方便操作。在developtools_hapsigner/autosign/result路径下,有如下文件:
    - OpenHarmony密钥库文件OpenHarmony.p12
    - 根CA证书rootCA.cer
    - 中间CA证书subCA.cer
    - profile签名证书OpenHarmonyProfileRelease.pem
  1. 生成应用签名证书密钥对

    调用密钥对生成接口,生成签名密钥并保存到密钥库。

    命令实例:

    java -jar hap-sign-tool.jar generate-keypair -keyAlias "oh-app1-key-v1" -keyAlg "ECC"  -keySize "NIST-P-256" -keystoreFile "OpenHarmony.p12" -keyPwd "123456" -keystorePwd "123456"
    shell

说明:
请记录下keyAlias、keyStorePwdkeyPwd的值,在后续生成应用 签名证书和对Hap包进行签名操作会使用到。

该命令的参数说明:

    generate-keypair : 生成应用签名证书密钥对
        ├── -keyAlias         #用于生成应用签名证书的密钥别名,存于OpenHarmony.p12密钥库文件中,该参数必填
        ├── -keyAlg           #密钥算法,推荐使用ECC,该参数必填
        ├── -keySize          #密钥长度,ECC算法的长度NIST-P-256/NIST-P-384,该参数必填
        ├── -keyStoreFile     #密钥库文件,推荐使用提供的OpenHarmony.p12密钥库文件,该参数必填
        ├── -keyStorePwd      #密钥库口令,OpenHarmony.p12口令默认为“123456”,必填项
        ├── -keyPwd           #密钥口令,可选项,该参数不填默认生成的密钥对无口令
  1. 生成应用签名证书

调用应用签名证书生成接口,使用本地中间CA证书签发应用签名证书。

命令实例:

    java -jar hap-sign-tool.jar generate-app-cert -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA"  -issuer "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN= OpenHarmony Application CA" -issuerKeyAlias "openharmony application ca" -subject "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN=OpenHarmony Application Release" -keystoreFile "OpenHarmony.p12" -subCaCertFile "subCA.cer" -rootCaCertFile "rootCA.cer" -outForm "certChain" -outFile "app1.pem" -keyPwd "123456" -keystorePwd "123456" -issuerKeyPwd "123456" -validity "365"

该命令的参数说明:

    generate-app-cert:生成应用签名证书
        ├── -keyAlias         # 用于生成应用签名证书的密钥别名,请与第一步生成密钥对的密钥别名-keyAlias保持一致
        ├── -signAlg          # 签名算法,必填项,包括 SHA256withECDSA / SHA384withECDSA
        ├── -issuer           # 颁发者主题,填写已提供的中间CA证书主题,该参数必填且不能修改
        ├── -issuerKeyAlias   # 颁发者密钥别名,填写中间CA证书密钥别名,该参数必填且不能修改
        ├── -subject          # 证书主题,请参照命令实例中内容保证顺序不变,该参数必填
        ├── -issuerKeyPwd     # 颁发者密钥口令,填写中间CA证书密钥口令,该参数必填,指定“123456”,不可修改
        ├── -keystoreFile     # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改
        ├── -rootCaCertFile   # 根CA证书文件,指定为已提供的根CA证书,该参数必填且不可修改
        ├── -subCaCertFile    # 中间CA证书文件,指定为已提供的中间CA证书,该参数必填且不可修改
        ├── -outForm          # 输出证书文件格式,推荐使用certChain
        ├── -outFile          # 可选项,建议填写,不填则默认输出到控制台
        ├── -keyPwd           # 密钥口令,可选项,为第一步生成的密钥对口令
        ├── -keystorePwd      # 密钥库口令,默认为“123456”
        ├── -validity         # 证书有效期,可选项,默认为3650天
  1. 对profile文件进行签名

调用profile文件签名接口,使用Profile签名密钥对profile文件进行签名。

命令实例:

    java -jar hap-sign-tool.jar  sign-profile -keyAlias "openharmony application profile release" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "OpenHarmonyProfileRelease.pem" -inFile "UnsgnedReleasedProfileTemplate.json" -keystoreFile "OpenHarmony.p12" -outFile "app1-profile.p7b" -keyPwd "123456" -keystorePwd "123456"

该命令的参数说明:

    sign-profile:签名profile文件
        ├── -keyAlias         # 生成profile证书的密钥别名,该参数必填且不能修改
        ├── -signAlg          # 签名算法,包括 SHA256withECDSA / SHA384withECDSA,该参数必填
        ├── -mode             # 签名模式,目前仅支持localSign,该参数必填
        ├── -profileCertFile  # Profile签名证书,指定已提供的profile证书文件,该参数必填且不可修改
        ├── -inFile           # 输入原始的模板Profile文件,文件为json格式,所在目录为developtools_hapsigner/autosign/UnsgnedReleasedProfileTemplate.json,该参数必填
        ├── -keystoreFile     # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改
        ├── -outFile          # 输出签名后的profile文件,p7b格式,该参数必填
        ├── -keyPwd           # 密钥口令,OpenHarmony.p12中的口令默认“123456”
        ├── -keystorePwd      # 密钥库口令,OpenHarmony.p12口令默认为“123456”
  1. 对Hap包进行签名

调用Hap包签名接口,使用应用签名密钥为Hap包签名。

命令实例:

    java -jar hap-sign-tool.jar sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "app1.pem" -profileFile "app1-profile.p7b" -inFile "app1-unsigned.zip" -keystoreFile "OpenHarmony.p12" -outFile "app1-signed.hap" -keyPwd "123456" -keystorePwd "123456"

说明
以下参数说明默认为无应用签名证书场景,当开发场景为有应用签名证书场景时,下列参数需要修改: -keyAlias:密钥别名,填写已有应用签名证书对应的密钥别名,参数必填。 -appCertFile:应用签名证书,填写已有的应用签名证书,参数必填。 -keystoreFile:密钥库文件,填写已有应用签名证书对应的密钥库文件,参数必填。 -keyPwd:密钥口令,填写密钥库文件中对应密钥的口令。 -keystorePwd:密钥库口令,填写密钥库文件的密钥口令。

该命令的参数说明:

    sign-app:签名Hap包
        ├── -keyAlias          # 密钥别名,为第一步生成的密钥信息别名,该参数必填
        ├── -signAlg           # 签名算法,包括 SHA256withECDSA / SHA384withECDSA,该参数必填
        ├──  -mode             # 签名模式,目前仅支持localSign,该参数必填
        ├──  -appCertFile      # 应用签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),填写第二步生成的应用签名证书,该参数必填
        ├──  -profileFile      # 签名后的profile文件,p7b格式,填写第三步中生成的profile文件,必填项
        ├──  -inFile           # 输入原始APP包文件,该参数必填
        ├──  -keystoreFile     # 密钥库文件,请与步骤一中密钥库文件保持一致,该参数必填且不可修改
        ├──  -outFile          # 输出签名后的包文件,必填项
        ├──  -keyPwd           # 密钥口令,与第一步生成的密钥对口令保持一致
        ├──  -keystorePwd      # 密钥库口令,与第一步的密钥库口令保持一致

常见问题

  1. 执行第二步生成应用签名证书命令时,控制台打印结果,无文件输出。

    • 现象描述

      生成证书时,只在控制台打印证书内容,无对应文件输出。

    • 可能原因

      outFile参数中路径不正确 和 ‘-outFile’中的’-'非英文格式。

    • 解决办法

      检查并修正outFile参数为正确路径,‘-outFile’中的’-'为英文格式

  2. 执行第三步对profile文件进行签名时,提示签名失败。

    • 现象描述

      现象分为以下几种:

      (1)执行命令后提示 "SIGN_ERROR, code: 107. Details: Failed to verify signature: Wrong key usage"

      (2)执行命令后提示 "NOT_SUPPORT_ERROR, code: 105. Details: Profile cert 'result\profile1.pem' must a cert chain"

      (3)执行命令后提示 "VERIFY_ERROR, code: 108. Details: Failed to verify signature: unable to find valid certification path to requested target"

    • 可能原因

      (1)profile签名证书(最终实体证书)证书链顺序不正确。

      (2)profile签名证书(最终实体证书)不是证书链。

      (3)证书主题顺序不正确 或者 生成应用签名证书时“-issuerKeyAlias”参数填写错误。

    • 解决办法

      (1)检查并修正证书链顺序,只能正序或反序,不可乱序。

      (2)检查签名时的最终实体证书是否为证书链。

      (3)检查证书主题顺序是否正确,顺序须为C、O、OU、CN。

  3. 对Hap包进行签名时提示签名错误。

    • 现象描述

      执行命令后提示:NOT_SUPPORT_ERROR, code: 105. Details: SignAlg params is incorrect, signature algorithms include SHA256withECDSA,SHA384withECDSA

    • 可能原因

      签名算法不支持,signAlg参数填写错误。

    • 解决办法

      最终实体证书密钥对推荐使用ECC生成,hap签名算法修改为ECC对应的SHA256withECDSA,SHA384withECDSA。

配置文件的内部结构

HarmonyAppProvision文件包含version-code对象、version-name对象、uuid对象、type对象、issuer对象、validity对象、bundle-info对象、acls对象、permissions对象、debug-info对象、app-privilege-capabilities对象等部分组成。

属性名称含义数据类型是否必选是否可缺省
version-code表示HarmonyAppProvision文件格式的版本号,取值范围为二进制32位以内的正整数。数值必选不可缺省
version-name表示版本号的文字描述,推荐使用三段数字版本号,如A.B.C。字符串必选不可缺省
uuid表示文件的唯一ID号,用于OEM厂商标识HarmonyAppProvision文件,开源社区版本该属性不做强制要求。字符串必选不可缺省
type表示HarmonyAppProvision文件的类型, 系统预定义的文件类型包括:debug(用于应用调试场景)和release(用于应用发布场景) ,开源社区版本该属性值建议为debug。字符串必选不可缺省
issuer表示HarmonyAppProvision签发者。字符串必选不可缺省
validity表示HarmonyAppProvision文件有效期的信息。参考validity对象内部结构。对象必选不可缺省
bundle-info表示应用包以及开发者的信息。参考bundle-info对象内部结构。对象必选不可缺省
acls表示授权的acl权限信息。参考acls对象内部结构。对象可选可缺省
permissions表示允许使用的受限敏感权限信息。参考permissions对象内部结构。对象可选可缺省
debug-info表示应用调试场景下的额外信息。参考debug-info对象内部结构。对象可选可缺省
app-privilege-capabilities表示应用包所需要的特权信息。可以参考应用特权配置指南。字符串数组可选可缺省

HarmonyAppProvision文件示例:

{
    "version-code": 1,
    "version-name": "1.0.0",
	"uuid": "string",
	"type": "debug",
	"validity": {
		"not-before": 1586422743,
		"not-after": 1617958743
	},
	"bundle-info" : {
		"developer-id": "OpenHarmony",
		"development-certificate": "Base64 string",
		"distribution-certificate": "Base64 string",
		"bundle-name": "com.OpenHarmony.app.test",
		"apl": "normal",
        "app-feature": "hos_normal_app"
	},
	"acls": {
		"allowed-acls": ["string"]
    },
	"permissions": {
		"restricted-permissions": ["string"]
    },
    "debug-info" : {
	    "device-id-type": "udid",
	    "device-ids": ["string"]
    },
    "app-privilege-capabilities":["AllowAppUsePrivilegeExtension"],
    "issuer": "OpenHarmony"
}

validity对象内部结构

属性名称含义数据类型是否必选是否可缺省
not-before表示文件有效期的开始时间,时间表示方式为unix时间戳,非负整数。数值必选不可缺省
not-after表示文件有效期的结束时间,时间表示方式为unix时间戳,非负整数。数值必选不可缺省

bundle-info对象内部结构

说明: HarmonyAppProvision文件中的bundle-info对象中bundle-name需要和所签名应用的包名bundleName(config.json/module.json5)保持一致。为了防止同一个HarmonyAppProvision配置文件任意用于不同应用的签名,在应用安装过程中,系统会校验HAP签名信息的bundleName与HAP的配置文件中的bundleName是否一致,如果不一致,HAP无法安装。

属性名称含义数据类型是否必选是否可缺省
developer-id表示开发者的唯一ID号,用于OEM厂商标识开发者,开源社区版本该属性不做强制要求。字符串必选不可缺省
development-certificate表示调试证书的信息。数值当type属性为debug时,该属性必选;否则,该属性可选。不可缺省
distribution-certificate表示发布证书的信息。数值当type属性为release时,该标签必选;否则,该标签可选。不可缺省
bundle-name表示应用程序的Bundle名称。字符串必选不可缺省
apl表示应用程序的APL级别,系统预定义的apl包括:normal、system_basic和system_core。字符串必选不可缺省
app-feature表示应用程序的类型,系统预定义的app-feature包括hos_system_app (系统应用)和hos_normal_app(普通应用)。只有系统应用才允许调用系统API,普通应用调用系统API可能会调用失败或运行异常。字符串必选不可缺省

acls对象内部结构

acls对象包含已授权的ACL权限。需要指出的是,开发者仍然需要在应用包配置文件将acls权限信息填写到requestPermissions属性中。

属性名称含义数据类型是否必选是否可缺省
allowed-acls表示已授权的acl权限列表。字符串数组可选不可缺省

permissions对象内部结构

permissions对象包含允许使用的受限敏感权限。不同于acls对象,permissions对象中的权限仅代表应用允许使用该敏感权限,权限最终由用户运行时授权。需要指出的是,开发者仍然需要在应用包配置文件将permissions权限信息填写到requestPermissions属性中。

属性名称含义数据类型是否必选是否可缺省
restricted-permissions表示允许使用的受限敏感权限。字符串数组可选不可缺省

debug-info对象内部结构

debug-info对象包含应用调试场景下的信息,主要是设备管控的信息。

属性名称含义数据类型是否必选是否可缺省
device-id-type表示设备ID的类型,当前系统仅提供udid的设备ID类型。字符串可选不可缺省
device-ids表示应用调试场景下允许调试的设备ID列表。字符串数组可选不可缺省

修改HarmonyAppProvision配置文件

当开发者新建一个工程时,应用的类型默认为hos_normal_app(普通应用),APL级别默认为normal。

当需要使用系统API时,开发者需要手动修改app-feature字段为hos_system_app(系统应用);当需要申请高级别权限时,开发者可能需要修改apl、acl等字段,请根据实际需要,参考访问控制开发概述进行修改。

开发者可以参考以下步骤,修改HarmonyAppProvision配置文件。

  1. 打开OpenHarmony SDK所在目录(可通过DevEco Studio菜单栏中单击File > Settings > OpenHarmony SDK界面查看)。
  2. 在SDK目录下,进入Toolchains > {Version} > lib文件夹,打开“UnsgnedReleasedProfileTemplate.json”文件。
  3. 根据实际需求,修改对应的字段。

完成配置文件修改后,开发者可以参考Hap包签名工具使用指导进行应用签名。

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:401-420)

第401题 R1的配置如图所示,此时在R1查看FIB表时,关于目的网段192.168.1.0/24的下跳是以下哪一项? A、10.0.23.3 B、10.0.12.2 C、10.0.23.2 D、10.0.12.1 【答案】A 【答案解析】 该题目考查的是路由的递归查询和 RIB 以及 FIB 的关系。在 RIB 中,静态路由写的是什么,下…

Node.js之内存限制理解_对处理前端打包内存溢出有所帮助

Node.js内存限制理解_对处理前端打包内存溢出有所帮助 文章目录 Node.js内存限制理解_对处理前端打包内存溢出有所帮助Node.js内存限制1. 查看Node.js默认内存限制1. Ndos.js_V20.10.02. Node.js_V18.16.0 2. V8引擎垃圾回收相关Heap organization堆组织 Node.js内存限制 默认情…

(十二)springboot实战——SSE服务推送事件案例实现

前言 SSE(Server-Sent Events,服务器推送事件)是一种基于HTTP协议的服务器推送技术。它允许服务器向客户端发送异步的、无限长的数据流,而无需客户端不断地轮询或发起请求。这种技术可以用来实现实时通信、在线聊天、即时更新等功…

Entity实体设计

Entity实体设计 💡用来和数据库中的表对应,解决的是数据格式在Java和数据库间的转换。 (一)设计思想 数据库Java表类行对象字段(列)属性 (二)实体Entity编程 编码规范 &#x1f4a…

文本检测学习笔记_CTPN

论文地址:https://arxiv.org/pdf/1609.03605.pdf 开源代码:https://github.com/lvliguoren/pytorch_ctpn?tabreadme-ov-file 本文主要的的内容 提出了一种将文本视为由密集排列的具有固定宽度的文本候选区域组成的序列的方法。这些文本候选区域可以通…

三.Linux权限管控 1-5.Linux的root用户用户和用户组查看权限控制信息chmod命令chown命令

目录 三.Linux权限管控 1.Linux的root用户 root用户(超级管理员) su和exit命令 sudo命令 为普通用户配置sudo认证 三.Linux权限管控 2.用户和用户组 用户,用户组 用户组管理 用户管理 getent---查看系统中的用户 三.Linux权限管控…

[每周一更]-(第86期):NLP-实战操作-文本分类

NLP文本分类的应用场景 医疗领域 - 病历自动摘要: 应用: 利用NLP技术从医疗文档中自动生成病历摘要,以帮助医生更快速地了解患者的状况。 法律领域 - 法律文件分类: 应用: 使用文本分类技术自动分类法律文件&#xf…

【网络安全实验】snort实现高级IDS

注:本实验分别使用kali和CentOS6.8进行测试,可惜的是使用kali进行实验过程中遇到了困难,未能完成完整实验,而使用CentOS6.8成功完成了完整实验。 实验中用到的软件: https://download.csdn.net/download/weixin_5255…

Spring-集成Web

一、引子 前面我们在Spring集成Junit中为读者引出了Spring善于集成其它框架的优势,而Spring项目不可能仅限于小范围的某个方法的测试,终究会落脚于Web项目上。于是,我们就从这里正式进入Spring集成Web的话题。由于笔者会从原生的Java Web开发…

【Spark实践6】特征转换FeatureTransformers实践Scala版--补充算子

本节介绍了用于处理特征的算法,大致可以分为以下几组: 提取(Extraction):从“原始”数据中提取特征。转换(Transformation):缩放、转换或修改特征。选择(Selection&…

前端常见标签

<li> (List Item)&#xff1a;定义列表中的一个项目&#xff08;项&#xff09; <ul> (Unordered List)&#xff1a;定义无序列表 <ol> (Ordered List)&#xff1a;定义有序列表 <a> (Anchor Tag)&#xff1a;定义超链接 <ul><li>苹…

关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式

关于华为应用市场上架过程中出现的【您的应用在运行时&#xff0c;未同步告知权限申请的使用目的&#xff0c;向用户索取&#xff08;存储、拍照&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。】 使用方式&#xff1a; 1、引入 import permision from "/m…

paddle环境安装

一、paddle环境安装 如pytorch环境安装一样&#xff0c;首先在base环境下创建一个新的环境来安装paddlepaddle框架。首先创建一个新的环境名叫paddle。执行如下命令。 conda create -n paddle python3.8创建好了名叫paddle这个环境以后&#xff0c;进入到这个环境中&#xff…

【Java 数据结构】排序

排序算法 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序2.3.3 快速排序非递归 2.4 归并排…

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

rust gui开发框架选择

作为一个系统编程强大语言&#xff0c;怎么能少得了图形界面的开发 实际上写这篇前我也不知道&#xff0c;于是我问了ai大模型&#xff0c;文心3.5和chatgpt4.0 答案实际上不能满意&#xff0c;最后我做了下筛选 参考博文&#xff1a; rust开发环境配置&#xff1a;链接 一、…

如何选择最适合的服务器

许多朋友想做一些网站&#xff0c;应用&#xff0c;游戏&#xff0c;小程序等等&#xff0c;都需要接触一个基础&#xff0c;就是服务器。服务器相当于一台24小时不关机的联网电脑&#xff0c;浏览网页或者应用相当于用户在访问这台电脑里的文件。那么如何选择最适合自己的服务…

[C++]类和对象(中)

一:类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中并不是什么都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为…

Android Studio非UI线程修改控件——定时器软件

目录 一、UI界面设计 1、UI样式 2、XML代码 二、功能编写 1、定义 2、实现方法 3、功能实现 一、UI界面设计 1、UI样式 2、XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android…

Interpolator:在Android中方便使用一些常见的CubicBezier贝塞尔曲线动画效果

说明 方便在Android中使用Interpolator一些常见的CubicBezier贝塞尔曲线动画效果。 示意图如下 import android.view.animation.Interpolator import androidx.core.view.animation.PathInterpolatorCompat/*** 参考* android https://yisibl.github.io/cubic-bezier* 实现常…