前置知识: HarmonyOS

应用签名与发布

6 minIntermediate2026/6/14

应用签名打包与上架

概述

应用签名与发布是将你的应用交付给用户的最后一步。HarmonyOS 要求所有应用必须经过数字签名才能安装和运行,这保证了应用的来源可信和内容完整。发布流程包括生成签名证书、配置签名信息、构建发布包和提交应用市场。

为什么需要签名?没有签名的应用无法在真机上安装运行。签名是应用的身份证明,确保应用在分发过程中未被篡改。不同的签名代表不同的开发者,同一应用的不同签名版本不能互相覆盖安装。

基础概念

签名证书:包含公钥和私钥的数字证书,用于对应用进行签名。私钥用于签名,公钥用于验证。HarmonyOS 使用 .p12 或 .jks 格式的证书文件。

签名Profile:HarmonyOS 的签名配置文件(.p7b 格式),包含应用的包名、开发者信息和权限声明。由华为开发者平台签发。

调试签名:开发阶段使用的签名,只能在特定设备上运行。通过 DevEco Studio 自动生成。

发布签名:发布到应用市场时使用的签名,需要在华为开发者平台申请。使用发布签名的应用可以在任何设备上运行。

HAP/APP 包:HAP(HarmonyOS Ability Package)是单个模块的安装包,APP(Application Package)是包含所有 HAP 的完整发布包。

快速上手

调试签名(自动配置)

在 DevEco Studio 中,调试签名可以自动完成:

  1. 打开 DevEco Studio
  2. 选择 File -> Project Structure -> Project -> Signing Configs
  3. 勾选 “Automatically generate signature”
  4. 登录华为开发者账号
  5. DevEco Studio 会自动生成调试证书和签名 Profile

手动配置签名

如果需要手动配置签名信息:

  1. 在华为开发者平台(developer.huawei.com)注册开发者账号
  2. 创建应用,获取包名
  3. 生成或上传签名证书
  4. 下载签名 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 中构建发布包:

  1. 选择 Build -> Build Hap(s)/APP(s) -> Build APP(s)
  2. 构建完成后,发布包位于 entry/build/default/outputs/default/ 目录
  3. 发布包文件名为 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”。

常见场景

完整的发布流程

  1. 准备阶段:在华为开发者平台创建应用,获取包名和签名 Profile
  2. 开发阶段:使用调试签名在真机上测试
  3. 测试阶段:完成功能测试和兼容性测试
  4. 构建阶段:切换到发布签名,构建 APP 包
  5. 提交阶段:在华为开发者平台提交应用包和截
  6. 审核阶段:等待华为审核(通常 1-3 个工作日)
  7. 发布阶段:审核通过后,应用上架到应用市场

环境区分

// 在 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"

应用加固

华为提供了应用加固服务,可以防止应用被反编译和篡改:

  1. 在华为开发者平台开启应用加固
  2. 上传 APP 包后,平台会自动进行加固处理
  3. 加固后的应用具有更强的安全防护能力