HarmonyOS APP实战-画图APP - 第17篇:打包发布与项目总结
HarmonyOS APP实战-画图APP - 第17篇生成HAP包与上架准备1. 开篇第16篇完成了整个画图APP的功能联调与Bug修复。我们在真机与模拟器上全面测试了绘制、效果处理、保存、撤销/重做、数据库管理、可变帧率等核心功能的完整流程修复了包括触摸事件冲突、图像效果crash、数据库并发写入、画布缩略图黑屏等7个关键Bug。经过系统联调应用已达到可稳定运行状态。本篇将把经过完整测试的工程打包为Release版本的HAP包为上架华为应用市场做准备。我们会配置应用签名证书、设置版本号与权限声明、生成HAP包并验证其可安装性最后总结整个系列17篇文章从零到一的开发历程与关键技术点。2. 核心实现2.1 配置签名证书在HAP包生成前需要创建开发者签名证书。HarmonyOS应用使用公私钥对进行签名确保包来源可信并与应用包名绑定。// 此文件为build-profile.json5位于AppScope目录// 用于配置应用签名信息{apiType:stageMode,buildOption:{arkOptions:{// 配置混淆规则Release版本需要开启混淆以缩减包体积obfuscation:{ruleOptions:{enable:true,files:[./obfuscation-rules.txt]}}}},buildOptionSet:[{name:release,buildOption:{arkOptions:{obfuscation:{ruleOptions:{files:[./obfuscation-rules.txt]}}}}}],signingConfigs:[{name:release,material:{// 证书文件路径需替换为开发者自己生成的证书storeFile:/path/to/drawing-app-release.p12,// 证书密码需替换storePassword:123456,keyAlias:drawing_app_key,keyPassword:123456,// 证书profile文件路径profileFile:/path/to/drawing-app-release.p7b,// 证书材料类型certpath:/path/to/drawing-app-release.cer}}]}关键点说明signingConfigs中的release配置用于生成Release版HAP包其证书与Debug不同需通过华为开发者联盟申请分发证书发布证书证书文件.p12、.cer、.p7b需从华为开发者网站生成用keytool -genkey生成密钥对后上传至AppGallery Connect获取obfuscation开启可根据混淆规则文件压缩代码与资源减少包体积storePassword与keyPassword在生产环境中应使用密钥管理服务存储不写入代码仓库替换路径时必须使用绝对路径或相对于项目根目录的相对路径否则打包会失败2.2 配置AppScope与模块构建在AppScope中设置应用级别参数包括版本号、应用图标、权限声明等。// app.json5 - 位于AppScope/entry/src/main/resources/base/profile/{app:{bundleName:com.example.drawingapp,vendor:example,version:{// 版本号前三位为语义化版本最后一位为内部构建号code:1000017,name:1.0.17},icon:$media:app_icon,label:$string:app_name,minAPIVersion:11,targetAPIVersion:12,car:{minAPIVersion:11},tablet:{minAPIVersion:11}},module:{name:entry,type:entry,description:$string:entry_desc,mainElement:MainAbility,deviceTypes:[phone,tablet,2in1],deliveryWithInstall:true,installationFree:false,pages:$profile:main_pages,// 声明应用需要的权限requestPermissions:[{name:ohos.permission.INTERNET,reason:$string:permission_internet,usedScene:{abilities:[MainAbility],when:always}},{name:ohos.permission.READ_MEDIA,reason:$string:permission_read_media,usedScene:{abilities:[MainAbility],when:inuse}},{name:ohos.permission.WRITE_MEDIA,reason:$string:permission_write_media,usedScene:{abilities:[MainAbility],when:inuse}}]}}关键点说明version中的code为整型数字从1开始递增每次上架新版本必须增加否则会被拒绝minAPIVersion设为11对应API 11确保兼容低版本设备targetAPIVersion设为12可使用最新API特性deviceTypes声明了支持手机、平板和2in1设备画图APP在这些设备上均有良好体验requestPermissions声明访问网络用于可能的上传功能、读取/写入媒体文件权限方便用户打开已有图片deliveryWithInstall为true表示应用随安装包分发installationFree为false表示不支持免安装运行因为画图APP需要持久存储2.3 生成Release HAP包完成证书配置与权限声明后通过DevEco Studio的构建工具生成HAP包。以下为构建脚本的核心逻辑及生成的包验证代码。// 构建脚本 build-hap.sh位于项目根目录// 用于在命令行生成Release HAP包#!/bin/bash # 设置环境变量exportDEVECO_HOME/Applications/DevEco-Studio.app/ContentsexportPATH$DEVECO_HOME/tools/ohpm/bin:$PATH# 进入项目目录 cd/path/to/drawing-app # 清理之前的构建产物 echo清理旧构建...rm-rf./entry/build/outputs/hap rm-rf./entry/build/outputs/app # 编译TypeScript代码 echo编译TS代码...npx tsc--project tsconfig.json # 使用hvigor构建ReleaseHAP包 echo开始构建Release HAP...hvigorw assembleHap--mode module-p productdefault-p buildModerelease # 检查构建结果if[-f./entry/build/outputs/hap/release/entry-default-release.hap];then echo构建成功HAP包路径./entry/build/outputs/hap/release/ls-lh./entry/build/outputs/hap/release/*.hap else echo 构建失败请检查日志 exit 1 fi # 验证HAP包签名 echo 验证HAP包签名... hdc shell hilog | grep -v I /dev/null 21 java -jar $DEVECO_HOME/tools/app_sign_tool.jar -verify \ -inFile ./entry/build/outputs/hap/release/entry-default-release.hap if [ $? -eq 0 ]; then echo 签名验证通过 else echo 签名验证失败请检查证书配置 exit 1 fi// 模拟器/真机安装验证脚本 install-hap.sh// 将构建的HAP包安装到设备进行最终验证#!/bin/bash # 定义HAP包路径HAP_PATH./entry/build/outputs/hap/release/entry-default-release.hapBUNDLE_NAMEcom.example.drawingappecho检查设备连接...hdc list-devices # 卸载之前安装的版本如果存在 echo卸载旧版本应用...hdc shell app uninstall $BUNDLE_NAME# 安装新HAP包 echo安装新的HAP包...hdc install $HAP_PATH# 检查安装结果if[$?-eq0];then echo安装成功启动应用...hdc shell aa start-a MainAbility-b $BUNDLE_NAMEecho应用已启动请检查画图功能是否正常。elseecho安装失败请检查日志exit1fi关键点说明assembleHap --mode module -p productdefault -p buildModerelease指定构建Release模式的HAP包Debug模式不能上架hvigorw是OpenHarmony的构建工具链替代了之前的gradle用法类似app_sign_tool.jar验证签名确保包未被篡改是上架前的必要步骤hdc install命令安装HAP包到设备测试包是否能在真实环境安装运行验证签名通过后应向设备安装测试一次确保第三方设备也能正常安装没有依赖特殊的调试签名构建成功后在entry/build/outputs/hap/release/目录下生成entry-default-release.hap文件约2-8MB2.4 生成HAP包与上架检查清单构建完成后使用华为AppGallery Connect创建应用并上传HAP包。下面的清单代码可以在构建时自动生成检查项报告。// release-check.ginna - 构建后自动执行的上架检查工具import{inspect}fromnode:inspector;import{existsSync,statSync,readFileSync}fromfs;importpathfrompath;// 检查项列表constcheckItems[{name:HAP包是否存在,check:()existsSync(hapPath)},{name:HAP包大小是否合理,check:(){conststatsstatSync(hapPath);returnstats.size50*1024*1024;// 不超过50MB}},{name:版本号是否递增,check:(){constappConfigJSON.parse(readFileSync(./AppScope/app.json5,utf-8));returnappConfig.app.version.code1000000;// 至少大于1.0.0}},{name:权限声明是否合理,check:(){constmoduleConfigJSON.parse(readFileSync(./entry/src/main/resources/base/profile/app.json5,utf-8));constpermsmoduleConfig.module.requestPermissions.map(pp.name);constrequired[ohos.permission.INTERNET,ohos.permission.READ_MEDIA,ohos.permission.WRITE_MEDIA];returnrequired.every(rperms.includes(r));}},{name:签名证书是否已配置,check:(){constbuildConfigJSON.parse(readFileSync(./build-profile.json5,utf-8));consthasSignbuildConfig.signingConfigs.some(ss.material.storeFiles.material.storePassword);returnhasSign;}},{name:应用图标是否合规,check:(){consticonPath./entry/src/main/resources/base/media/app_icon.png;returnexistsSync(iconPath);}},{name:隐私协议是否已配置,check:(){constprivacyPath./entry/src/main/resources/base/profile/privacy_policy.html;returnexistsSync(privacyPath);}}];// 执行检查并输出报告consthapPath./entry/build/outputs/hap/release/entry-default-release.hap;letallPassedtrue;console.log( 上架前自查清单 );checkItems.forEach(item{constresultitem.check();constsymbolresult?[✓]:[✗];console.log(${symbol}${item.name});if(!result)allPassedfalse;});console.log(allPassed?\n✅ 所有检查通过可以上架:\n❌ 存在未通过的检查项请修复后重试。);关键点说明该检查清单覆盖了上架前的关键合规点HAP包大小、版本号递增、权限最小化、签名配置、图标合规、隐私协议配置app.json5中的隐私协议文件路径需存在否则华为审核会上传拒绝版本号code必须严格递增且name不能包含字母如1.0.17是合规格式应用图标需为1024x1024的纯色背景Png名称为app_icon.png位于base/media目录requestPermissions中的每个权限必须提供reason字段说明使用原因否则审核时退回3. 运行验证在DevEco Studio中选择Build→Build Hap(s)→Release等待构建完成构建成功后在项目entry/build/outputs/hap/release/目录下找到entry-default-release.hap文件大小约400kb使用hdc install手动安装到真机验证画图APP的所有功能正常。最后访问华为AppGallery Connect创建应用上传HAP包并填写隐私协议、应用截图、描述信息提交审核4. 小结与系列总结本篇完成了画图APP的签名证书配置、Release HAP包生成与上架检查生成了可直接安装的分发包。至此整个画图APP从零开发到上架准备的全流程结束。回顾17篇文章的完整历程我们从搭建开发环境开始逐步实现了基础能力Canvas 2D绘制、触摸交互、形状/画笔/文字绘制第1-7篇图像处理effectKit亮度/模糊/灰度调节、智能取色与色板生成、色彩空间转换与HDR支持第8-10篇高级功能撤销/重做历史管理、图片导出与加载、本地数据库存储第11-13篇性能优化displaySync可变帧率、overdraw过度绘制调试、联调测试与Bug修复第14-16篇工程化HAP打包与上架准备第17篇关键技术点总结Canvas 2D绘制需注意像素密度适配、effectKit的ImageEffect需传入PixelMap且需注意调用顺序、colorSpaceManager的ColorSpaceManager.create方法需等待UI线程、displaySync的requestFrameCallback需正确处理帧率切换、Permission请求需在Ability生命周期内完成。踩坑经验绘制时未考虑像素密度会导致模糊Image.save()要求传入目标格式参数数据库写入需在异步线程进行overdraw调试建议在模拟器上开启签名证书生成需注意密钥别名与密码匹配。