OpenHarmony 应用签名配置实战指南
为何必须进行应用签名?
在 OpenHarmony 系统中,所有应用在安装前都必须完成数字签名。签名不仅是发布流程的必要环节,更承担着多重安全职责:- 身份验证:确认应用开发者身份,防止冒名发布
- 数据完整性保护:确保应用从打包到安装过程中未被篡改
- 设备兼容性要求:真实物理设备仅允许安装已签名的应用包
- 上架前提条件:向应用市场提交应用时,签名是强制性要求
Termony 项目中的签名配置方式
目前 Termony 支持两种签名模式,开发者可根据实际需求选择:- 自动签名(推荐方案):通过 DevEco Studio 自动生成密钥与相关配置文件
- 手动签名:自行准备签名材料并编辑配置文件
build-profile.json5
推荐方式:使用 DevEco Studio 实现自动签名
该方法操作简便,适合初次使用者,由开发工具自动完成密钥生成和配置注入。第一步:打开目标项目
启动 DevEco Studio 后执行以下操作:- 选择项目打开入口
- 定位至 Termony 项目的根目录并选中
- 点击确认按钮完成加载
File → Open
OK
第二步:进入签名设置界面
可通过以下任一方式进入配置页面:- 菜单导航:依次点击对应选项
- 快捷键操作:
File → Project Structure...
快捷键说明:
- Mac 用户使用:? + ;
- Windows/Linux 用户使用:Ctrl + Alt + Shift + S
进入后,在左侧栏选择 Signing Configs,然后点击 + 按钮新增签名配置。
选择签名类型
根据使用场景选择合适的签名类别:- Debug 签名:适用于开发调试阶段(首次建议选用)
- Release 签名:用于正式版本发布
启用自动签名功能
选择Automatically generate signing 选项(即“自动生成签名”),系统将自动完成以下动作:
- 创建密钥库文件(存储于指定路径)
.p12 - 生成证书文件
.cer - 生成完整的签名配置文件
.p7b - 自动填充
相关字段build-profile.json5
保存签名设置
完成配置后,请执行:- 点击
应用更改Apply - 随后点击
保存并关闭窗口OK
第三步:验证签名配置是否生效
配置完成后,需检查build-profile.json5 文件内容以确认签名信息已正确写入。
可执行如下命令查看关键部分:
# 查看签名配置
cat build-profile.json5 | grep -A 10 "signingConfigs"
预期输出示例:
# "signingConfigs": [
# {
# "name": "default",
# "type": "HarmonyOS",
# "material": {
# "certpath": "/Users/.../.cer",
# "keyAlias": "debugKey",
# ...
# }
# }
# ]
验证要点包括:
数组不应为空signingConfigs
对象应包含所有必需项:material
:证书文件的具体路径certpath
:密钥库存储路径storeFile
:签名配置文件路径profile
:密钥别名标识keyAlias
:密钥密码(需加密存储)keyPassword
:密钥库密码(加密形式)storePassword
:所使用的签名算法类型signAlg
备选方案:手动配置签名信息
若已有现成的签名密钥材料,可采用手动方式直接修改配置文件。第一步:准备必要的签名文件
请确保以下三个文件已准备就绪:- 密钥库文件(
):包含私钥及证书链.p12 - 证书文件(
):用于身份认证的应用证书.cer - 签名配置文件(
):符合 OpenHarmony 格式的配置定义.p7b
第二步:编辑 build-profile.json5 文件
打开项目中的build-profile.json5 文件,并添加相应的签名配置段落。
示例结构如下:
{
"app": {
"signingConfigs": [
{
"name": "default",
"type": "HarmonyOS",
"material": {
"certpath": "/path/to/your/certificate.cer",
"keyAlias": "yourKeyAlias",
"keyPassword": "encrypted_password_hex",
"profile": "/path/to/your/profile.p7b",
"signAlg": "SHA256withECDSA",
"storeFile": "/path/to/your/keystore.p12",
"storePassword": "encrypted_password_hex"
}
}
],
"products": [
{
"name": "default",
"signingConfig": "default", // 关联签名配置
...
}
],
...
}
}
注意事项:
和keyPassword
字段必须填入经过storePassword
工具加密后的十六进制字符串sign.js- 加密方法参考:
node sign.js <密钥目录> <原始密码>
第三步:校验配置正确性
运行以下命令检查配置完整性和文件可达性: 验证 JSON 格式合法性:python3 -m json.tool build-profile.json5 > /dev/null && echo "配置格式正确" || echo "配置格式错误"
检查各签名文件是否存在且可读:
python3 -c "import json; c=json.load(open('build-profile.json5')); m=c['app']['signingConfigs'][0]['material']; import os; print('证书文件:', os.path.exists(m['certpath'])); print('密钥库文件:', os.path.exists(m['storeFile'])); print('配置文件:', os.path.exists(m['profile']))"
常见签名问题及解决方案
问题一:签名配置为空
错误提示:IndexError: list index out of range
原因分析:
build-profile.json5 文件中 signingConfigs 字段为空数组,未定义任何签名条目。
解决办法:
- 推荐使用 DevEco Studio 的自动签名功能进行配置
- 或手动编辑
文件,添加完整的签名配置信息build-profile.json5
问题二:签名文件路径无效
错误提示:FileNotFoundError: [Errno 2] No such file or directory: '/path/to/cert.cer'
解决方案:
- 仔细核对配置中的文件路径是否准确无误
- 确认目标文件确实存在且具备读取权限
- 建议使用绝对路径而非相对路径,避免路径解析失败
问题三:密码解密失败
错误提示:Error: Failed to decrypt password
应对措施:
- 确保
解密脚本环境正常可用sign.js - 检查加密过程是否正确执行,输出为合法十六进制串
- 确认密码字段已按规范加密并填入配置
HAP 包构建前的签名配置检查
在开始构建 HAP 包之前,必须完成应用签名的配置。若未正确设置签名信息,构建过程将报错并中断。以下是关键检查项和常见问题的解决方案。
签名配置验证清单
- 确保 DevEco Studio 已成功安装,并已打开对应项目
- 确认签名配置已添加且内容非空(此处为图片18)
- 验证签名文件路径正确无误,且文件实际存在
- 此处为图片48 中的 此处为图片49 需指向正确的签名配置名称
- 检查配置文件格式是否符合 JSON 标准,建议使用在线工具进行语法验证
常见问题及处理方法
问题 1:密码加密格式错误
请确认输入的密钥库密码与别名密码均采用正确的加密方式,避免因格式不匹配导致解析失败。
问题 2:签名算法不兼容
错误信息:
此处为图片44
解决方案:
确保使用的算法为:
此处为图片45
支持的算法类型应为:
此处为图片46
同时检查所用密钥库是否支持该签名算法。
问题 3:未配置 ArkUI-X 路径
在构建 HAP 包前,务必通过 DevEco Studio 打开项目并配置 ArkUI-X 相关路径。否则可能出现如下错误:
Installing dependencies... ?ERR_PNPM_FETCH_404? GET https://repo.huaweicloud.com/repository/npm/@ohos%2Fhvigor-ohos-arkui-x-plugin: Not Found - 404 This error happened while installing a direct dependency of /Users/baixm/.hvigor/project_caches/ff796b85a5dcea0ae785783bb7e61d4b/workspace @ohos/hvigor-ohos-arkui-x-plugin is not in the npm registry, or you have no permission to fetch it. No authorization header was set for the request. > hvigor ERROR: 00308002 Operation Error Error Message: /Users/baixm/.hvigor/wrapper/tools/node_modules/.bin/pnpm install execute failed. * Try the following: > See above for details.
此问题通常由缺失 ArkUI-X 插件依赖引起,正确配置路径后可解决。
问题 4:缺少签名配置导致构建失败
若未设置签名信息,系统将提示以下错误:
> hvigor ERROR: Failed :entry:default@SignHap... > hvigor ERROR: 00303107 Configuration Error Error Message: Invalid storeFile value. Make sure it is not null or empty. The file must be included in '/Users/tetcl/.ohos/config/default_Termony_moe-OdT8YFdEgcGrfK_31DBCd0zmKNQIKzz8AgaZFvE=.p12'. At file: /Users/baixm/HarmonyOSPC/szkygc/Termony/build-profile.json5 * Try the following: > Please check signingConfigs in root project file * Try: > Run with --stacktrace option to get the stack trace. > Run with --debug option to get more log output. > hvigor ERROR: BUILD FAILED in 3 s 884 ms
这表明 storeFile 值无效或为空,请检查配置文件中的路径是否存在或拼写是否有误。
推荐操作流程
- 在 DevEco Studio 中完成签名配置(参考前述章节)
- 验证签名配置的完整性与准确性
- 执行构建命令:
此处为图片52
HAP 包构建实战指南
什么是 HAP?
HAP(OpenHarmony Application Package)是 OpenHarmony 平台上的应用程序安装包格式,功能上类似于 Android 的 APK。一个完整的 HAP 包包含应用的所有代码、资源文件、配置信息以及原生库等必要组件。
前置条件
在启动 HAP 构建流程前,请确认满足以下条件:
- 开发环境已配置完毕(包括 Homebrew 及相关工具链)
- DevEco Studio 已安装,用于提供 OpenHarmony SDK 和构建支持
- 应用签名配置已完成(至关重要! 必须提前在 DevEco Studio 中完成)
- HNP 包已成功构建并输出(此处为图片51 已执行)
- 所有必要的环境变量均已正确设置
构建步骤
步骤 1:检查 HNP 包状态
确认 HNP 包已经生成并复制到目标应用目录中:
# 检查 HNP 包是否存在
# 步骤 1:检查 HNP 文件是否存在 执行以下命令查看 arm64-v8a 架构下的 HNP 文件: ls -lh entry/hnp/arm64-v8a/*.hnp # 预期输出应包含: # -rw-r--r-- ... entry/hnp/arm64-v8a/base.hnp # -rw-r--r-- ... entry/hnp/arm64-v8a/base-public.hnp![]()
# 步骤 2:验证签名配置是否正确
在开始构建前,需确认 build-profile.json5 中已配置签名信息:
python3 -c "import json; c=json.load(open('build-profile.json5')); print('签名配置数量:', len(c['app']['signingConfigs'])); print('签名配置名称:', c['app']['signingConfigs'][0]['name'] if c['app']['signingConfigs'] else '无')"
# 正常情况下会显示:
# 签名配置数量: 1
# 签名配置名称: default
若输出“无”或数量为0,则表示未设置签名,请参考相关章节完成签名配置。
# 步骤 3:运行构建脚本 首先切换至项目主目录并执行构建命令: cd /path/to/Termony ./build-macos.sh./build-macos.sh
构建流程详细说明
当执行构建脚本后,系统将按以下顺序处理:
1. 环境变量初始化
为确保工具链可用,脚本会预先设置必要的路径:
export TOOL_HOME=/Applications/DevEco-Studio.app/Contents export DEVECO_SDK_HOME=$TOOL_HOME/sdk export OHOS_SDK_HOME=$TOOL_HOME/sdk/default/openharmony # 将关键工具加入环境变量 PATH export PATH=$TOOL_HOME/tools/ohpm/bin:$PATH # OpenHarmony 包管理器 export PATH=$TOOL_HOME/tools/hvigor/bin:$PATH # Hvigor 构建引擎 export PATH=$TOOL_HOME/tools/node/bin:$PATH # Node.js 运行时
2. 使用 Hvigor 执行 HAP 构建
Hvigor 是 OpenHarmony 的核心构建工具,功能类似于 Gradle。其主要执行任务包括:
- PreBuild:执行构建前的准备工作
- CreateModuleInfo:生成模块描述信息
- GenerateMetadata:创建应用所需的元数据文件
- ConfigureCmake:配置 CMake 以支持原生代码编译
- ProcessProfile:解析并处理 profile 配置文件
- CompileResource:编译资源如布局、字符串等
- BuildJS:转换 JavaScript 或 ArkTS 源码
- BuildNativeWithNinja:调用 Ninja 编译 C/C++ 代码
- CompileArkTS:对 ArkTS 文件进行类型检查与编译
- PackageHap:将所有组件打包成未签名的 HAP 文件
- SignHap:如有配置,自动对 HAP 进行数字签名
hvigorw assembleHap
3. 将 HNP 文件嵌入 HAP 包
构建过程中会将 hnp 目录内容添加到最终的 HAP 包中:
pushd entry zip -1 -r ../entry/build/default/outputs/default/entry-default-unsigned.hap hnp popd
其中参数说明:
-1:使用最低压缩等级(仅存储,不压缩)-r:递归打包整个目录结构
4. 对 HAP 包进行签名
若手动控制签名过程,可运行如下命令:
python3 sign.py \ ./entry/build/default/outputs/default/entry-default-unsigned.hap \ ./entry/build/default/outputs/default/entry-default-signed.hap
注意事项:
- 如果已在配置文件中定义了签名信息,构建脚本将自动完成签名步骤。
- 若未配置签名,构建过程会提示警告,但仍可生成未签名包,适用于模拟器测试。
- 建议提前配置签名,以便能在真实设备上安装和调试应用。
build-profile.json5
构建结果输出
构建成功后的典型输出如下:
未签名 HAP 文件位置及大小
ls -lh entry/build/default/outputs/default/entry-default-unsigned.hap # 示例输出: # -rw-r--r-- 1 user staff 4.6M Nov 15 12:33 entry-default-unsigned.hap
查看 HAP 内部结构
可通过 unzip 命令列出包内内容:
unzip -l entry/build/default/outputs/default/entry-default-unsigned.hap # 输出示例:
HAP 包的结构如下所示:
entry-default-unsigned.hap
├── module.json # 模块配置文件
├── resources.index # 资源索引文件
├── libs/ # 原生库文件
│ └── arm64-v8a/
│ ├── libentry.so # 终端引擎库
│ └── libc++_shared.so # C++ 标准库
├── resources/ # 资源文件
│ ├── rawfile/ # 原始资源文件
│ │ ├── Inconsolata-Bold.ttf
│ │ └── Inconsolata-Regular.ttf
│ ├── base/ # 基础资源
│ │ ├── media/ # 媒体资源
│ │ └── profile/ # 配置文件
├── ets/ # ArkTS 编译产物
│ ├── modules.abc # 字节码文件
│ └── sourceMaps.map # 源码映射
├── hnp/ # HNP 包目录
│ └── arm64-v8a/
│ ├── base.hnp # HNP 包
│ └── base-public.hnp # 公开 HNP 包
└── pack.info # 打包信息
构建时间说明:
- 首次构建:耗时约 10 到 30 秒,具体取决于设备硬件性能。
- 增量构建:仅需几秒钟,系统只会重新编译被修改过的文件。
- 原生代码构建:使用 Ninja 构建系统,通常在 1 至 2 秒内完成。
- ArkTS 编译:平均耗时约为 2 到 3 秒。
常见问题及解决方案
问题一:hvigorw 命令无法找到
错误提示:
command not found: hvigorw
解决方法:
- 确认已正确安装 DevEco Studio。
- 检查
是否已被添加至系统 PATH 环境变量中。$TOOL_HOME/tools/hvigor/bin - 若未配置,可手动添加路径:
export PATH=/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin:$PATH
问题二:签名配置缺失导致构建失败
错误信息:
IndexError: list index out of range
原因分析:
在
build-profile.json5
文件中,
signingConfigs
字段为空数组,表示尚未配置任何签名信息。
解决方案:
重要提示:必须在执行构建前完成签名配置!
推荐方式 — 使用 DevEco Studio 自动配置:
- 启动 DevEco Studio。
- 打开对应的 Termony 项目。
- 选择
选项。File → Project Structure → Signing Configs - 点击
添加新的签名配置。+ - 选择
(系统将自动生成测试签名)。Automatically generate signing - 依次点击
和Apply
完成保存操作。OK - 验证
中是否已成功写入签名配置。build-profile.json5
高级用户 — 手动编辑配置文件:
- 参考“应用签名配置实战”相关章节进行设置。
- 确保所有签名文件的路径准确无误。
- 密码字段需通过
进行加密处理。sign.js
验证签名配置是否生效:
# 检查签名配置
python3 -c "import json; c=json.load(open('build-profile.json5')); print('签名配置数量:', len(c['app']['signingConfigs']))"
注意事项:
- 未签名的 HAP 包可用于模拟器测试,但无法安装到真实设备上。
- 一旦配置了签名信息,构建脚本会自动对生成的 HAP 包进行签名处理。
- 签名后的 HAP 包支持在真实设备上安装运行。
问题三:HNP 包缺失
错误提示:
zip: hnp: No such file or directory
解决办法:
- 确认已经执行了
命令以生成 HNP 包。./create-hnp.sh - 检查
目录是否存在且包含预期输出文件。entry/hnp/arm64-v8a/ - 确保 HNP 包已正确复制到目标应用目录中。
问题四:构建过程中出现警告信息
警告内容:
WARN: Function may throw exceptions. Special handling is required.
WARN: 'showToast' has been deprecated.
说明:此类提示属于代码层面的警告,不会中断构建流程,但仍建议修复以提升代码质量。
建议改进措施:
- 增加必要的异常处理逻辑。
- 替换已弃用的旧版 API,采用官方推荐的新接口。
问题五:原生代码构建失败
应对策略:
# 清理已有构建产物
cd entry
rm -rf build
# 返回根目录并重新构建
cd ..
./build-macos.sh
构建过程优化建议
- 启用增量构建机制:
Hvigor 工具会自动识别变更的文件,仅对改动部分进行重新编译,显著提升效率。 - 利用并行构建能力:
Hvigor 默认启用多线程构建模式,可通过
调整并发线程数以匹配机器性能。hvigor.properties - 保留构建缓存:
持续保留
目录中的缓存数据,避免频繁清理造成重复编译开销。entry/build
构建结果验证方式
方法一:通过命令行检查输出文件
# 查看 HAP 包是否存在
ls -lh entry/build/default/outputs/default/entry-default-unsigned.hap
# 查看包体大小(正常应在 4-5MB 左右)
du -h entry/build/default/outputs/default/entry-default-unsigned.hap
# 查看包内具体内容
# 验证关键文件内容 # 确认原生库是否包含在包中 unzip -l entry/build/default/outputs/default/entry-default-unsigned.hap | grep libentry.so # 检查 HNP 包文件是否存在 unzip -l entry/build/default/outputs/default/entry-default-unsigned.hap | grep base.hnp # 查看字体文件 Inconsolata 是否被打包 unzip -l entry/build/default/outputs/default/entry-default-unsigned.hap | grep Inconsolata# 方法 2:分析 HAP 包的内部结构 # 进入临时目录并解压 HAP 文件 cd /tmp unzip -q /path/to/Termony/entry/build/default/outputs/default/entry-default-unsigned.hap tree -L 3 # 方法 1:列出未签名 HAP 包中的所有文件 unzip -l entry/build/default/outputs/default/entry-default-unsigned.hap ???? 对 HAP 包进行签名(可选步骤) 若需将应用安装至真实设备,必须对 HAP 包进行签名处理: **步骤 1:设置签名配置** 可在 DevEco Studio 中完成签名信息的配置,或通过手动方式修改相关配置文件。 **步骤 2:运行签名脚本** 使用以下命令执行签名操作: python3 sign.py \ ./entry/build/default/outputs/default/entry-default-unsigned.hap \ ./entry/build/default/outputs/default/entry-default-signed.hap **步骤 3:验证签名结果** 签名完成后,检查已生成的签名包是否存在且大小正常: ls -lh entry/build/default/outputs/default/entry-default-signed.hapbuild-profile.json5


雷达卡


京公网安备 11010802022788号







