HarmonyOS APP实战-基于Image Kit的图像处理APP - 第13篇:打包发布与项目总结

📅 2026/7/15 2:16:05 👁️ 阅读次数 📝 编程学习
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第13篇:打包发布与项目总结

HarmonyOS APP实战-基于Image Kit的图像处理APP - 第13篇:打包发布与总结

1. 开篇

在上一篇(第12篇)中,我们重点解决了性能优化与资源释放问题:通过ImageSource的采样参数setDesiredRegionsetDesiredSize实现大图降采样,降低内存占用;在处理链路的每个环节(旋转、裁剪、滤镜等)完成后主动调用PixelMap.release()释放中间对象;同时使用弱引用和try/finally确保异常安全。经过优化,应用在编辑大尺寸图片时不再出现显式OOM,操作流畅度提升明显。

现在工程已经具备了完整且稳定的图像处理能力,是时候将其打包成可发布的HAP包,上架到AppGallery。本篇将完成应用签名的配置、自动化打包脚本的编写,并汇总最终的ReleaseNotes。最后,对整个13篇系列进行技术总结,回顾从零构建一个HarmonyOS图像处理APP的全过程,并给出后续可拓展的方向。

2. 核心实现

2.1 App签名配置

HarmonyOS应用在安装前必须经过数字签名,签名文件可以通过DevEco Studio的Build → Generate Key and CSR生成,也可以使用已有的.p12证书。签名配置存储在build-profile.json5中。

代码块1:签名配置文件build-profile.json5(位于AppScope根目录)

{ "apiType": "stageMode", "buildOption": { "artifactType": "hap" }, "signingConfigs": [ { "name": "release", // 签名配置名称,用于后续引用 "type": "HarmonyOS", // 签名类型,固定为HarmonyOS "material": { "keyStoreFile": "C:/cert/imageapp_release.p12", // p12证书文件路径 "certPath": "C:/cert/imageapp_release.cer", // 证书文件路径(.cer) "keyPwd": "YourKeyPassword", // 证书私钥密码 "keystorePwd": "YourKeystorePassword", // 证书库密码 "materialName": "imageapp", // 证书中的KeyAlias "signAlg": "SHA256withECDSA" // 签名算法,推荐使用SHA256withECDSA }, "provisioningProfile": "C:/cert/imageapp_release.p7b" // 描述文件(.p7b) } ] }

关键点说明:

  • 证书和描述文件需在AppGallery Connect中申请。开发调试时可使用“自动签名”模式(DevEco Studio自动生成),上架时必须使用正式签名。
  • signAlg建议使用SHA256withECDSA,兼容性更好。
  • materialName对应生成证书时输入的Key Alias。
  • 不要将包含密码的配置文件提交到版本控制,建议通过环境变量注入。

2.2 打包脚本

使用DevEco Studio内置的hvigorw命令行工具,可以一键构建HAP包。编写一个Shell脚本,方便CI/CD集成。

代码块2:打包脚本build_hap.sh

#!/bin/bash# 图像处理APP打包脚本# 使用方式: ./build_hap.sh [release|debug]set-ePROJECT_DIR="$(cd "$(dirname"$0")"&&pwd)" BUILD_MODE="${1:-release}" OUTPUT_DIR="${PROJECT_DIR}/build/output/${BUILD_MODE}" echo "====================开始构建图像处理APP====================" echo "构建模式:${BUILD_MODE}" echo "项目路径:${PROJECT_DIR}" # 1. 进入项目根目录 cd "${PROJECT_DIR}" # 2. 清理上次构建产物 echo ">>>清理上次构建..." ./hvigorw clean --mode="${BUILD_MODE}" -p product=default --no-daemon # 3. 运行单元测试(如有) # echo ">>>运行测试..." # ./hvigorw test --mode="${BUILD_MODE}" --no-daemon # 4. 构建HAP包 echo ">>>开始打包..." ./hvigorw assembleHap --mode="${BUILD_MODE}" -p product=default --no-daemon # 5. 检查输出 if [ -d "${OUTPUT_DIR}" ]; then echo ">>>构建完成,产物目录:${OUTPUT_DIR}" ls -lh "${OUTPUT_DIR}"/*.hap 2>/dev/null || echo "未找到HAP文件" else echo ">>>错误:输出目录不存在,构建可能失败" exit 1 fi echo "====================构建结束===================="

关键点说明:

  • hvigorw位于项目根目录,由DevEco Studio创建项目时自动生成。
  • assembleHap是构建HAP包的任务。
  • --mode=release会使用build-profile.json5中名为release的签名配置;--mode=debug使用调试证书。
  • 可在CI流水线中调用此脚本,实现自动化打包。
  • 若需要生成App Pack(.app文件用于上架),可执行assembleApp任务。

2.3 AppGallery服务检查模块(可选功能)

在应用首屏或“关于”页面中,可以检查当前设备是否支持AppGallery,用于后续版本更新提示。这里使用@ohos.app.appGallery模块。

代码块3:AppGallery可用性检查器AppGalleryChecker.ets

// AppGalleryChecker.ets// 检查当前设备是否安装了AppGallery客户端,用于后续引导用户更新或评分import{appGallery}from'@ohos.app.appGallery';// 导入AppGallery模块/** * 检查AppGallery可用性 * @returns true表示AppGallery可用,false不可用 */exportfunctionisAppGalleryAvailable():boolean{try{// appGallery.isAppGalleryAvailable() 同步返回布尔值constavailable:boolean=appGallery.isAppGalleryAvailable();console.info(`[AppGalleryChecker] AppGallery可用状态:${available}`);returnavailable;}catch(error){console.error(`[AppGalleryChecker] 检查AppGallery失败:${JSON.stringify(error)}`);returnfalse;}}/** * 监听应用安装/卸载事件(可选) * @param callback 事件回调,参数为事件类型字符串 */exportfunctionwatchAppGalleryEvent(callback:(event:string)=>void):void{try{appGallery.on('appInstall',(data)=>{console.info(`[AppGalleryChecker] 安装事件:${JSON.stringify(data)}`);callback('install');});appGallery.on('appUninstall',(data)=>{console.info(`[AppGalleryChecker] 卸载事件:${JSON.stringify(data)}`);callback('uninstall');});console.info('[AppGalleryChecker] AppGallery事件监听已注册');}catch(error){console.error(`[AppGalleryChecker] 注册监听失败:${JSON.stringify(error)}`);}}

关键点说明:

  • @ohos.app.appGallery模块提供了isAppGalleryAvailable()on(event, callback)等API。
  • 该模块仅在真机(搭载AppGallery的设备)上有效,模拟器中可能返回false
  • 注册事件监听后,需要在页面销毁时调用appGallery.off(event)取消监听,防止内存泄漏。
  • 此功能可用于“检查更新”按钮:若AppGallery可用,则跳转到AppGallery详情页;否则提示手动下载。

2.4 ReleaseNotes 示例

在发布前编写ReleaseNotes.md,记录版本号和变更内容。

# 图像处理APP v1.0.0 Release Notes ## 功能特性 - 图片选择:支持从相册或文件管理器选择图片 - 基础编辑:缩放、裁剪、旋转、翻转 - 滤镜效果:灰度、怀旧、冷色、暖色等预设滤镜 - 色彩调节:亮度、对比度、饱和度独立滑块调整 - 水印叠加:支持文字和图标水印,可拖动位置 - 批量处理:多图编辑,统一应用裁切/滤镜 - 历史记录:支持撤销/重做,最多50步 - 性能优化:大图降采样、及时释放资源,内存占用降低60% ## 兼容性 - HarmonyOS API 11 及以上 - 支持手机、平板 ## 已知问题 - 滤镜色彩矩阵在部分低端设备上渲染稍慢(已调优) - 水印字体仅在系统支持的中文字体范围内有效 ## 安装方式 - 通过AppGallery搜索“图像处理”下载安装 - 或使用本HAP包通过DevEco Studio安装到设备

3. 运行验证

  1. 签名配置验证:在DevEco Studio中打开build-profile.json5,确认签名物料路径正确。然后点击Build → Build Hap(s),选择release模式,观察控制台输出。若成功,会在build/output/release目录生成entry-default-release.hap

  2. 打包脚本验证:打开终端,进入项目根目录,执行./build_hap.sh release。等待脚本完成,查看输出目录下的HAP包大小(通常2~5MB)。

  3. AppGallery检查功能:将HAP包安装到真机(需支持AppGallery),打开应用的“关于”页面,点击“检查更新”按钮,观察日志输出AppGallery可用状态: true。若在模拟器中运行,显示false

4. 小结与系列总结

本篇完成了图像处理APP的最后一步:配置了正式签名(build-profile.json5),编写了自动化打包Shell脚本(build_hap.sh),并添加了AppGallery可用性检查模块(AppGalleryChecker.ets)。至此,一个功能完整、性能优化的图像处理APP具备了上架条件。结合ReleaseNotes,我们清楚掌握了版本发布的标准流程。

系列总结:从零到一的HarmonyOS图像处理APP

经过13篇的实战,我们完成了一个完整的HarmonyOS原生图像处理应用。以下是核心收获与回顾:

阶段核心模块使用的Image Kit API
环境搭建项目创建、权限配置
图片选择PhotoViewPicker@ohos.multimedia.photoAccessHelper
解码与元信息ImageSource解码createImageSourcegetImageInfo
缩放裁剪PixelMap变形scalecrop
旋转翻转几何变换rotateflip
滤镜色彩矩阵setColorMatrix
亮度对比度饱和度像素级调整setColorMatrix配自定义矩阵
编码导出ImagePackercreateImagePackerpacking
批量处理与历史堆栈数据结构
水印Canvas合成Canvas.drawImage
本地存储Preferences@ohos.data.preferences
性能优化采样、释放setDesiredSizerelease
打包发布签名、脚本、AppGallery@ohos.app.appGallery

Image Kit核心经验

  • 所有图片处理操作均基于PixelMap,它是内存中的位图表示。
  • createImageSource负责解码,createImagePacker负责编码,二者成对使用。
  • setColorMatrix是强大的色彩调节工具,通过4×5矩阵可实现滤镜和亮度/对比度/饱和度。
  • 大图处理必须使用setDesiredSize降采样,否则极易内存溢出。
  • 每个PixelMap对象在使用后必须release(),建议搭配try/finallyDisposable模式。

可拓展方向

  1. 扩展滤镜库:集成更多色彩矩阵,甚至通过C++原生实现GPU加速。
  2. 人脸识别:接入Camera KitML Kit实现人脸美颜。
  3. 动效集成:为滤镜切换添加过渡动画(使用animateTo)。
  4. 云存储:将编辑后的图片同步到华为云盘。

至此,本系列全部结束。希望你能跟随每一步代码,亲手构建出属于自己的图像处理APP。如果在实战中遇到问题,欢迎在评论区交流。感谢阅读!