HarmonyOS7 签名、打包、上架总出错?AppGallery Connect 发布流程跑通
文章目录前言签名证书生成与管理使用 DevEco Studio 自动签名推荐新手手动签名适合需要精细控制的场景自动签名 vs 手动签名配置签名信息HAP/HAR/HSP 包的构建与验证构建 HAP验证包签名构建 App 包多 HAP 组合AppGallery Connect 上架流程第一步创建应用第二步完善应用信息第三步上传应用包第四步提交审核审核常见驳回原因灰度发布与 A/B 测试灰度发布A/B 测试完整的 CI/CD 发布流水线一些经验前言第一次上架华为应用市场的时候我在签名和发布流程上卡了整整两天。证书、Profile、签名配置、AppGallery Connect 后台……一堆概念绕来绕去文档又分散在不同页面踩了不少坑。后来我把整个流程从头到尾跑通了几遍整理了一套清晰的步骤。今天把这套经验分享出来帮你一次性搞定签名打包和上架。签名证书生成与管理鸿蒙应用签名用的是非对称密钥对你需要生成两类证书调试证书debug用于开发调试设备数量有限制发布证书release用于上架应用市场使用 DevEco Studio 自动签名推荐新手DevEco Studio 提供了自动签名功能配置起来最简单打开File → Project Structure → Signing Configs勾选Automatically generate signature登录华为账号选择证书类型debug 或 release点 OKIDE 自动帮你生成证书和 Profile自动签名帮你搞定了所有事情包括证书生成、Profile 下载和签名配置。对于个人开发者和小团队来说完全够用。手动签名适合需要精细控制的场景有些场景必须手动签名——比如企业级应用需要用自己的证书管理系统或者 CI/CD 流水线里需要用固定的证书。用keytool生成密钥库# HarmonyOS7 签名、打包、上架总出错AppGallery Connect 发布流程跑通keytool-genkeypair\-aliasmy_release_key\-keyalgEC\-keysize256\-sigalgSHA256withECDSA\-dnameCNMyApp,OUDev,OMyCompany,LBeijing,STBeijing,CCN\-validity9125\-keystorerelease.keystore\-storetypePKCS12\-storepassMyStorePass123# 查看密钥库信息keytool-list-v-keystorerelease.keystore-storepassMyStorePass123然后在 AppGallery Connect 后台申请发布证书登录 AppGallery Connect进入用户与访问 → 证书管理点击新建证书上传 CSR 文件下载.cer证书文件接着申请 Profile 文件进入HarmonyOS 应用 → 你的项目 → HarmonyOS 应用 → Profile 管理新建 Profile选择发布类型绑定设备调试需要和应用下载.p7bProfile 文件自动签名 vs 手动签名对比项自动签名手动签名配置复杂度低IDE 自动处理高需要手动管理证书CI/CD 兼容性差依赖 IDE 登录态好证书文件可版本管理安全性中证书在本地生成高可配合企业 KMS适用场景个人开发、小团队企业级应用、自动化流水线我的建议是开发阶段用自动签名CI/CD 和正式发布用手动签名。两套签名配置并存互不影响。配置签名信息在build-profile.json5中配置签名{ app: { signingConfigs: [ { name: debug_auto, type: HarmonyOS, material: { // 自动签名的字段留空IDE 自动填充 certpath: , storeFile: , storePassword: , keyAlias: , keyPassword: , profile: , signAlg: SHA256withECDSA } }, { name: release_manual, type: HarmonyOS, material: { certpath: ./signature/release.cer, storeFile: ./signature/release.keystore, storePassword: MyStorePass123, keyAlias: my_release_key, keyPassword: MyKeyPass123, profile: ./signature/release.p7b, signAlg: SHA256withECDSA } } ], products: [ { name: default, signingConfig: release_manual, compatibleSdkVersion: 5.0.0(12), runtimeOS: HarmonyOS } ] } }安全提醒别把密码明文写在build-profile.json5里提交到 Git。用环境变量注入{ name: release_manual, type: HarmonyOS, material: { certpath: ./signature/release.cer, storeFile: ./signature/release.keystore, storePassword: $env:STORE_PASSWORD, keyAlias: my_release_key, keyPassword: $env:KEY_PASSWORD, profile: ./signature/release.p7b, signAlg: SHA256withECDSA } }CI 脚本里这样设置exportSTORE_PASSWORDMyStorePass123exportKEY_PASSWORDMyKeyPass123hvigorw assembleHap--modereleaseHAP/HAR/HSP 包的构建与验证鸿蒙有三种包类型包类型全称用途HAPHarmonyOS Ability Package可安装的应用包HARHarmonyOS Archive静态共享库HSPHarmonyOS Shared Package动态共享库构建 HAP# 构建 debug 包hvigorw assembleHap--modedebug# 构建 release 包hvigorw assembleHap--moderelease# 输出路径# entry/build/default/outputs/default/entry-default-unsigned.hap# entry/build/release/outputs/default/entry-release-signed.hap验证包签名# 使用 hdc 安装到设备验证hdcinstallentry-release-signed.hap# 查看包信息hdc shell bm dump-ncom.example.myapp构建 App 包多 HAP 组合如果你的应用有多个模块比如 entry feature需要打 App 包# 构建 App 包包含所有 HAPhvigorw assembleApp--moderelease# 输出路径# build/outputs/default/app-release-signed.appAppGallery Connect 上架流程第一步创建应用登录 AppGallery Connect进入HarmonyOS 应用 → 应用列表 → 新建应用填写应用名称、包名跟module.json5里的bundleName一致选择应用分类第二步完善应用信息这一步最耗时需要准备这些素材应用图标512x512 PNG应用截图至少 3 张支持手机、平板等不同设备应用描述一句话简介 详细描述隐私政策链接必须有而且要能正常访问应用分类和标签第三步上传应用包进入应用详情页 →版本信息 → 新建版本上传签名后的.app或.hap文件系统会自动解析包信息检查签名和兼容性第四步提交审核检查以下清单签名证书类型为发布compatibleSdkVersion设置正确隐私政策链接可访问应用截图清晰完整应用描述没有违禁内容权限申请合理别申请一堆用不到的权限点提交后一般 1-3 个工作日出审核结果。审核常见驳回原因我踩过的几个坑提前帮你避开隐私政策不完整要写清楚收集哪些数据、用于什么目的、怎么存储权限未说明用途每个权限都要在申请理由里写清楚为什么需要截图与实际不符别用设计稿截图用真实设备截图应用功能不完整审核人员会实际体验你的 App别上传半成品灰度发布与 A/B 测试灰度发布审核通过后不要直接全量发布。用灰度发布先让一小部分用户试用在版本信息页面选择分阶段发布设置灰度比例建议 5% → 20% → 50% → 100%每个阶段观察 1-2 天看崩溃率和用户反馈没问题就逐步扩大比例灰度期间如果发现问题可以随时暂停发布或者回滚到上一版本这个功能关键时刻能救命。A/B 测试AppGallery Connect 提供了远程配置能力可以做 A/B 测试import{agconnect}fromkit.AGConnectKitComponentstruct HomePage{StateshowNewUI:booleanfalseaboutToAppear(){// 获取远程配置constremoteConfigagconnect.remoteConfig()remoteConfig.fetch(0)// 0 表示最小间隔秒生产环境设大一点remoteConfig.activate().then((){// 获取 A/B 测试的配置值this.showNewUIremoteConfig.getValue(show_new_ui)asboolean})}build(){Column(){if(this.showNewUI){this.NewVersionUI()}else{this.OldVersionUI()}}}BuilderNewVersionUI(){// 新版 UIColumn(){Text(新版首页).fontSize(24)// ...}}BuilderOldVersionUI(){// 旧版 UIColumn(){Text(首页).fontSize(24)// ...}}}在 AGC 后台配置实验进入增长 → A/B 测试新建实验设置实验参数如show_new_ui设置对照组和实验组的值配置流量比例如各 50%发布实验等待数据收集完整的 CI/CD 发布流水线把上面的流程串起来一个完整的自动化发布流程长这样#!/bin/bash# publish.sh - 自动构建签名发布脚本set-eecho 1. 环境准备 exportSTORE_PASSWORD$KEYSTORE_STORE_PASSexportKEY_PASSWORD$KEYSTORE_KEY_PASSecho 2. 版本号更新 # 从 CI 系统获取版本号VERSION_NAME1.2.${CI_BUILD_NUMBER}echo构建版本:$VERSION_NAMEecho 3. 清理旧产物 hvigorw cleanecho 4. 构建 Release 包 hvigorw assembleApp--moderelease --no-daemonecho 5. 验证签名 APP_FILE$(findbuild/outputs-name*.app|head-1)if[-z$APP_FILE];thenecho构建失败未找到 .app 文件exit1fiecho构建成功:$APP_FILEecho 6. 上传到 AGC # 使用 AGC CLI 上传需要提前配置好 API Keyagc publish--file$APP_FILE\--app-id$AGC_APP_ID\--api-key$AGC_API_KEY\--update-type1# 1新版本, 2更新包echo 发布流程完成 一些经验证书一定要备份。发布证书丢了就意味着你得换个包名重新上架之前的用户全没了。我见过不少团队因为这个原因被迫重新开一个 App。调试证书别用在生产环境。虽然技术上能装上去但调试证书签名的包有设备数量限制而且随时可能被吊销。先灰度再全量这是铁律。我亲眼见过一个 Bug 在灰度 5% 的时候就被发现了如果直接全量推送那天的客服电话怕是要被打爆。审核被驳回别慌。仔细看驳回理由大部分问题都很容易修复。我一般会把常见的驳回原因做成 checklist每次提交前过一遍。签名打包和上架这套流程第一次跑确实觉得繁琐但跑通之后就是肌肉记忆了。建议你在项目初期就把 CI/CD 流水线搭好别每次发版都手动操作——手动操作次数越多出错的概率越大。把重复的事情交给脚本你只需要关心代码质量和用户体验就够了。