及时做APP开发实战(二十)-应用打包与发布本文将介绍HarmonyOS应用的打包发布流程包括签名配置、HAP打包、应用上架等。一、打包发布流程1.1 整体流程【图1打包发布流程图】┌─────────────────────────────────────┐ │ 打包发布流程 │ ├─────────────────────────────────────┤ │ │ │ 1. 签名配置 │ │ ↓ │ │ 2. 构建HAP包 │ │ ↓ │ │ 3. 测试验证 │ │ ↓ │ │ 4. 上架应用市场 │ │ ↓ │ │ 5. 版本更新 │ │ │ └─────────────────────────────────────┘1.2 关键步骤步骤说明工具签名配置配置应用签名证书DevEco Studio构建HAP编译生成安装包hvigor测试验证真机安装测试hdc上架发布提交应用市场AGC二、签名配置2.1 签名类型【图2签名配置界面】签名类型 ┌─────────────────────────────────────┐ │ Debug签名 │ │ - 用于开发测试 │ │ - 自动生成签名 │ │ - 无法上架应用市场 │ ├─────────────────────────────────────┤ │ Release签名 │ │ - 用于正式发布 │ │ - 需要申请证书 │ │ - 可以上架应用市场 │ └─────────────────────────────────────┘2.2 签名配置文件// build-profile.json5 { app: { signingConfigs: [ { name: default, type: HarmonyOS, material: { certpath: certs/release.cer, storePassword: password, keyAlias: jishizuo, keyPassword: password, profile: certs/release.p7b, signAlg: SHA256withECDSA, storeFile: certs/release.p12 } } ], products: [ { name: default, signingConfig: default, compatibleSdkVersion: 9.0.0, runtimeSdkVersion: 9.0.0, buildOption: { strictMode: { caseSensitiveCheck: true, useNormalizedOhmUrl: true } } } ] } }2.3 申请签名证书// 步骤说明1.登录AGCAppGallery Connect https://developer.huawei.com/consumer/cn/2.创建应用-选择项目-填写应用信息-获取应用ID3.生成签名证书-使用DevEco Studio生成.p12文件-或使用命令行生成4.申请发布证书-上传.csr文件-下载.cer证书-下载.p7b配置文件5.配置签名-将证书文件放入项目-修改build-profile.json5三、构建HAP包3.1 构建命令【图3构建输出结果】构建命令 ┌─────────────────────────────────────┐ │ # Debug构建 │ │ hvigorw clean │ │ hvigorw assembleHap --mode module │ │ │ │ # Release构建 │ │ hvigorw clean │ │ hvigorw assembleHap --mode module │ │ -p productdefault │ │ -p buildModerelease │ └─────────────────────────────────────┘ 输出目录 entry/build/default/outputs/default/ └── entry-default-signed.hap3.2 构建配置// hvigorfile.ts import { hapTasks } from ohos/hvigor-ohos-plugin; export default { system: hapTasks, plugins: [] }// oh-package.json5 { name: jishizuo, version: 1.0.0, description: 及时做 - 番茄钟待办管理应用, main: , author: , license: ISC, dependencies: {} }3.3 版本配置// app.json5 { app: { bundleName: com.example.jishizuo, vendor: { name: 开发者, id: developer }, versionCode: 1000000, versionName: 1.0.0, icon: $media:app_icon, label: $string:app_name } }四、测试验证4.1 真机安装# 查看连接设备hdc list targets# 安装HAP包hdcinstallentry-default-signed.hap# 启动应用hdc shell aa start-aEntryAbility-bcom.example.jishizuo# 查看日志hdc hilog-Tjishizuo# 卸载应用hdc uninstall com.example.jishizuo4.2 测试检查项测试检查清单 ┌─────────────────────────────────────┐ │ □ 应用启动正常 │ │ □ 界面显示正常 │ │ □ 功能运行正常 │ │ □ 数据存储正常 │ │ □ 权限申请正常 │ │ □ 无崩溃无报错 │ │ □ 性能表现良好 │ └─────────────────────────────────────┘五、应用上架5.1 上架准备// 上架所需材料1.应用信息-应用名称及时做-应用简介番茄钟待办管理应用-应用详情功能介绍、使用说明-应用分类效率办公2.应用图标-512x512PNG格式-无透明通道-无圆角处理3.应用截图-至少3张截图-分辨率1080x1920-展示核心功能4.隐私政策-隐私政策链接-数据收集说明-权限使用说明5.2 上架流程上架流程 ┌─────────────────────────────────────┐ │ 1. 登录AGC控制台 │ │ ↓ │ │ 2. 选择应用 │ │ ↓ │ │ 3. 填写应用信息 │ │ ↓ │ │ 4. 上传HAP包 │ │ ↓ │ │ 5. 提交审核 │ │ ↓ │ │ 6. 等待审核结果 │ │ ↓ │ │ 7. 审核通过后上架 │ └─────────────────────────────────────┘5.3 审核注意事项审核常见问题 ┌─────────────────────────────────────┐ │ 1. 应用崩溃 │ │ - 确保稳定性 │ │ - 充分测试 │ │ │ │ 2. 功能不符合描述 │ │ - 描述准确 │ │ - 功能完整 │ │ │ │ 3. 权限使用不合理 │ │ - 说明权限用途 │ │ - 避免过度权限 │ │ │ │ 4. 界面显示异常 │ │ - 适配不同机型 │ │ - 测试各种分辨率 │ └─────────────────────────────────────┘六、版本更新6.1 版本号规则版本号规则major.minor.patch major主版本号 - 重大功能更新 - 架构调整 - 不兼容更新 minor次版本号 - 新增功能 - 功能优化 - 兼容更新 patch修订号 - Bug修复 - 小幅优化 - 安全更新 示例 1.0.0 → 1.0.1 (Bug修复) 1.0.1 → 1.1.0 (新增功能) 1.1.0 → 2.0.0 (重大更新)6.2 更新配置// app.json5 版本更新 { app: { bundleName: com.example.jishizuo, versionCode: 1000001, // 递增 versionName: 1.0.1 // 更新 } }七、应用加固与安全7.1 代码混淆配置// build-profile.json5 { app: { products: [ { name: default, signingConfig: default, compileSdkVersion: 9, compatibleSdkVersion: 9, runtimeOS: HarmonyOS, buildOption: { arkOptions: { obfuscation: { enable: true, options: { enableNameObfuscation: true, enablePropertyObfuscation: true, enableExportObfuscation: true, reservedNames: [^MainAbility$, ^Entry$, ^Component$], reservedProperties: [^id$, ^key$, ^name$] } } } } } ] } }7.2 敏感信息保护// src/main/ets/config/SecureConfig.etsexportclassSecureConfig{privatestaticsecureStore:secureStore|nullnull;staticasyncinit(context:Context){this.secureStoreawaitsecureStore.create(context,secure_config);}staticasyncsaveSecret(key:string,value:string):Promisevoid{if(!this.secureStore)thrownewError(SecureStore not initialized);awaitthis.secureStore.set(key,value);}staticasyncgetSecret(key:string):Promisestring|null{if(!this.secureStore)thrownewError(SecureStore not initialized);returnawaitthis.secureStore.get(key);}}八、性能优化与包体积优化8.1 包体积分析HAP包结构分析 ┌─────────────────────────────────────┐ │ 及时做.hap (5.2MB) │ ├─────────────────────────────────────┤ │ ├── resources/ (2.1MB) │ │ │ ├── base/media/ (1.5MB) │ │ │ └── rawfile/ (500KB) │ │ ├── ets/ (1.8MB) │ │ │ ├── source/ (1.2MB) │ │ │ └── libs/ (600KB) │ │ └── libs/ (800KB) │ └─────────────────────────────────────┘8.2 资源优化策略// build-profile.json5 资源压缩配置 { app: { products: [{ buildOption: { resourceOptions: { compressOptions: { enable: true, quality: 80, formats: [png, jpg, webp] } } } }] } }九、多渠道打包9.1 渠道配置// build-profile.json5 多渠道配置 { app: { products: [ { name: huawei, signingConfig: release, output: { channel: huawei, apkName: jishizuo-huawei-${versionName}.hap } }, { name: thirdparty, signingConfig: release, output: { channel: thirdparty, apkName: jishizuo-thirdparty-${versionName}.hap } } ] } }9.2 渠道信息注入// src/main/ets/config/ChannelConfig.etsexportclassChannelConfig{privatestaticreadonlyCHANNEL__CHANNEL__;staticgetChannel():string{returnthis.CHANNEL||default;}staticisHuaweiChannel():boolean{returnthis.getChannel()huawei;}}十、灰度发布与AB测试10.1 灰度发布配置// src/main/ets/config/GrayReleaseConfig.etsexportclassGrayReleaseConfig{privatestaticreadonlyGRAY_RATIO10;// 10%用户staticisGrayUser(userId:string):boolean{consthashthis.hashCode(userId);returnMath.abs(hash%100)this.GRAY_RATIO;}privatestatichashCode(str:string):number{lethash0;for(leti0;istr.length;i){hash(hash*31str.charCodeAt(i))|0;}returnhash;}}10.2 AB测试实现// src/main/ets/experiment/ABTestManager.etsexportclassABTestManager{privatestaticinstance:ABTestManager;privateexperiments:Mapstring,ABExperimentnewMap();staticgetInstance():ABTestManager{if(!ABTestManager.instance){ABTestManager.instancenewABTestManager();}returnABTestManager.instance;}getVariant(experimentId:string):string{constexperimentthis.experiments.get(experimentId);returnexperiment?.variant||control;}}十一、常见问题与解决方案11.1 打包问题常见打包问题 ┌─────────────────────────────────────┐ │ 1. 签名失败 │ │ 原因签名配置错误 │ │ 解决检查签名文件路径和密码 │ │ │ │ 2. 资源找不到 │ │ 原因资源路径错误 │ │ 解决检查$r()路径是否正确 │ │ │ │ 3. 包体积过大 │ │ 原因资源未压缩 │ │ 解决启用资源压缩配置 │ └─────────────────────────────────────┘11.2 上架问题constreviewIssues[{issue:应用图标不符合规范,solution:确保图标为512x512像素},{issue:隐私政策未提供,solution:在应用内提供隐私政策链接},{issue:权限申请未说明,solution:在申请权限前向用户说明用途},{issue:应用崩溃,solution:确保应用在真机上稳定运行}];十二、总结本文介绍了HarmonyOS应用打包发布流程核心要点签名配置Debug和Release签名构建HAP使用hvigor构建测试验证真机安装测试应用上架AGC提交审核版本更新版本号管理应用加固代码混淆与安全性能优化包体积优化多渠道打包渠道配置与注入灰度发布AB测试实现