应用签名与发布
应用签名打包与上架
概述
应用签名与发布是将你的应用交付给用户的最后一步。HarmonyOS 要求所有应用必须经过数字签名才能安装和运行,这保证了应用的来源可信和内容完整。发布流程包括生成签名证书、配置签名信息、构建发布包和提交应用市场。
为什么需要签名?没有签名的应用无法在真机上安装运行。签名是应用的身份证明,确保应用在分发过程中未被篡改。不同的签名代表不同的开发者,同一应用的不同签名版本不能互相覆盖安装。
基础概念
签名证书:包含公钥和私钥的数字证书,用于对应用进行签名。私钥用于签名,公钥用于验证。HarmonyOS 使用 .p12 或 .jks 格式的证书文件。
签名Profile:HarmonyOS 的签名配置文件(.p7b 格式),包含应用的包名、开发者信息和权限声明。由华为开发者平台签发。
调试签名:开发阶段使用的签名,只能在特定设备上运行。通过 DevEco Studio 自动生成。
发布签名:发布到应用市场时使用的签名,需要在华为开发者平台申请。使用发布签名的应用可以在任何设备上运行。
HAP/APP 包:HAP(HarmonyOS Ability Package)是单个模块的安装包,APP(Application Package)是包含所有 HAP 的完整发布包。
快速上手
调试签名(自动配置)
在 DevEco Studio 中,调试签名可以自动完成:
- 打开 DevEco Studio
- 选择 File -> Project Structure -> Project -> Signing Configs
- 勾选 “Automatically generate signature”
- 登录华为开发者账号
- DevEco Studio 会自动生成调试证书和签名 Profile
手动配置签名
如果需要手动配置签名信息:
- 在华为开发者平台(developer.huawei.com)注册开发者账号
- 创建应用,获取包名
- 生成或上传签名证书
- 下载签名 Profile 文件
在项目的 build-profile.json5 中配置签名:
{
app: {
signingConfigs: [
{
name: 'default',
type: 'HarmonyOS',
material: {
certpath: 'certs/certificate.cer', // 证书文件路径
storePassword: 'password', // 密钥库密码
keyAlias: 'mykey', // 密钥别名
keyPassword: 'password', // 密钥密码
profile: 'certs/profile.p7b', // 签名 Profile 路径
signAlg: 'SHA256withECDSA', // 签名算法
storeFile: 'certs/keystore.p12', // 密钥库文件路径
},
},
],
},
}
详细用法
生成签名证书
使用 OpenSSL 生成签名证书:
# 生成私钥
openssl genrsa -out private.pem 2048
# 生成证书签名请求(CSR)
openssl req -new -key private.pem -out certificate.csr \
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=MyCompany/CN=MyApp"
# 生成自签名证书(开发用)
openssl x509 -req -days 3650 -in certificate.csr \
-signkey private.pem -out certificate.cer
# 将私钥和证书打包为 P12 格式
openssl pkcs12 -export -out keystore.p12 \
-inkey private.pem -in certificate.cer \
-name mykey
构建发布包
在 DevEco Studio 中构建发布包:
- 选择 Build -> Build Hap(s)/APP(s) -> Build APP(s)
- 构建完成后,发布包位于
entry/build/default/outputs/default/目录 - 发布包文件名为
entry-default-signed.app
也可以使用命令行构建:
# 构建 HAP 包
hvigorw assembleHap --mode release -p product=default
# 构建 APP 包
hvigorw assembleApp --mode release -p product=default
配置应用信息
在 AppScope/app.json5 中配置应用基本信息:
{
app: {
bundleName: 'com.example.myapp', // 应用包名,全局唯一
vendor: 'MyCompany', // 开发者名称
versionCode: 1000000, // 版本号,整数,递增
versionName: '1.0.0', // 版本名称,展示给用户
icon: '$media:app_icon', // 应用图标
label: '$string:app_name', // 应用名称
},
}
在 entry/src/main/module.json5 中配置模块信息:
{
module: {
name: 'entry',
type: 'entry', // 模块类型:entry(主模块)
deviceTypes: [
// 支持的设备类型
'phone',
'tablet',
],
deliveryWithInstall: true, // 是否随安装包一起安装
installationFree: false, // 是否支持免安装
pages: '$profile:main_pages', // 页面路由配置
abilities: [
// Ability 配置
{
name: 'EntryAbility',
srcEntry: './ets/entryability/EntryAbility.ts',
description: '$string:entry_desc',
icon: '$media:icon',
label: '$string:entry_label',
startWindowIcon: '$media:icon',
startWindowBackground: '$color:start_bg',
exported: true,
skills: [
{
entities: ['entity.system.home'],
actions: ['action.system.home'],
},
],
},
],
},
}
版本管理
// 第一次发布
{
"versionCode": 1000000,
"versionName": "1.0.0"
}
// 小版本更新(修复 Bug)
{
"versionCode": 1000001, // versionCode 必须递增
"versionName": "1.0.1"
}
// 功能更新
{
"versionCode": 1000100,
"versionName": "1.1.0"
}
// 大版本更新
{
"versionCode": 2000000,
"versionName": "2.0.0"
}
多模块打包
大型应用可以拆分为多个模块:
MyApp/
├── entry/ # 主模块(必须)
├── feature1/ # 功能模块1
├── feature2/ # 功能模块2
└── shared/ # 共享库模块
每个模块都有自己的 module.json5 配置。主模块的 type 为 “entry”,功能模块的 type 为 “feature”,共享库的 type 为 “shared”。
常见场景
完整的发布流程
- 准备阶段:在华为开发者平台创建应用,获取包名和签名 Profile
- 开发阶段:使用调试签名在真机上测试
- 测试阶段:完成功能测试和兼容性测试
- 构建阶段:切换到发布签名,构建 APP 包
- 提交阶段:在华为开发者平台提交应用包和截图
- 审核阶段:等待华为审核(通常 1-3 个工作日)
- 发布阶段:审核通过后,应用上架到应用市场
环境区分
// 在 build-profile.json5 中配置不同环境的签名
{
app: {
signingConfigs: [
{
name: 'debug',
type: 'HarmonyOS',
material: {
storeFile: 'certs/debug.p12',
profile: 'certs/debug-profile.p7b',
// ... 其他配置
},
},
{
name: 'release',
type: 'HarmonyOS',
material: {
storeFile: 'certs/release.p12',
profile: 'certs/release-profile.p7b',
// ... 其他配置
},
},
],
},
}
注意事项
保管好签名证书:丢失发布签名证书将无法更新已发布的应用。务必将证书文件和密码安全备份。
包名不可更改:应用一旦发布,包名(bundleName)不能更改。更改包名等同于一个全新的应用。
versionCode 必须递增:每次更新发布时,versionCode 必须大于上一次发布的值,否则应用市场会拒绝。
签名一致性:同一应用的更新必须使用相同的签名证书。更换签名证书会导致用户无法覆盖安装。
证书有效期:签名证书有有效期,过期后需要重新申请。建议申请较长期限的证书(如 10 年)。
不要将证书提交到代码仓库:签名证书和密码属于敏感信息,不应提交到 Git。将证书文件添加到 .gitignore。
进阶用法
自动化构建
使用 CI/CD 工具自动化构建和签名流程:
# 在 CI 环境中构建发布包
# 1. 安装依赖
npm install
# 2. 使用环境变量中的签名信息构建
hvigorw assembleApp --mode release \
-p product=default \
-p signingConfig=release
# 3. 获取构建产物
APP_PATH=$(find entry/build -name "*.app" | head -1)
echo "发布包路径: $APP_PATH"
应用加固
华为提供了应用加固服务,可以防止应用被反编译和篡改:
- 在华为开发者平台开启应用加固
- 上传 APP 包后,平台会自动进行加固处理
- 加固后的应用具有更强的安全防护能力