HarmonyOS APP实战-基于Image Kit的图像处理APP - 第13篇:打包发布与项目总结
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第13篇:打包发布与总结
1. 开篇
在上一篇(第12篇)中,我们重点解决了性能优化与资源释放问题:通过ImageSource的采样参数setDesiredRegion和setDesiredSize实现大图降采样,降低内存占用;在处理链路的每个环节(旋转、裁剪、滤镜等)完成后主动调用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 -e
PROJECT_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不可用
*/
export function isAppGalleryAvailable(): boolean {
try {
// appGallery.isAppGalleryAvailable() 同步返回布尔值
const available: boolean = appGallery.isAppGalleryAvailable();
console.info(`[AppGalleryChecker] AppGallery可用状态: ${available}`);
return available;
} catch (error) {
console.error(`[AppGalleryChecker] 检查AppGallery失败: ${JSON.stringify(error)}`);
return false;
}
}
/**
* 监听应用安装/卸载事件(可选)
* @param callback 事件回调,参数为事件类型字符串
*/
export function watchAppGalleryEvent(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. 运行验证
-
签名配置验证:在DevEco Studio中打开
build-profile.json5,确认签名物料路径正确。然后点击 Build → Build Hap(s),选择release模式,观察控制台输出。若成功,会在build/output/release目录生成entry-default-release.hap。
-
打包脚本验证:打开终端,进入项目根目录,执行
./build_hap.sh release。等待脚本完成,查看输出目录下的HAP包大小(通常2~5MB)。
-
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解码 | createImageSource,getImageInfo |
| 缩放裁剪 | PixelMap变形 | scale,crop |
| 旋转翻转 | 几何变换 | rotate,flip |
| 滤镜 | 色彩矩阵 | setColorMatrix |
| 亮度对比度饱和度 | 像素级调整 | setColorMatrix配自定义矩阵 |
| 编码导出 | ImagePacker | createImagePacker,packing |
| 批量处理与历史 | 堆栈数据结构 | 无 |
| 水印 | Canvas合成 | Canvas.drawImage |
| 本地存储 | Preferences | @ohos.data.preferences |
| 性能优化 | 采样、释放 | setDesiredSize,release |
| 打包发布 | 签名、脚本、AppGallery | @ohos.app.appGallery |
Image Kit核心经验:
- 所有图片处理操作均基于
PixelMap,它是内存中的位图表示。 createImageSource负责解码,createImagePacker负责编码,二者成对使用。setColorMatrix是强大的色彩调节工具,通过4×5矩阵可实现滤镜和亮度/对比度/饱和度。- 大图处理必须使用
setDesiredSize降采样,否则极易内存溢出。 - 每个
PixelMap对象在使用后必须release(),建议搭配try/finally或Disposable模式。
可拓展方向:
- 扩展滤镜库:集成更多色彩矩阵,甚至通过C++原生实现GPU加速。
- 人脸识别:接入
Camera Kit或ML Kit实现人脸美颜。 - 动效集成:为滤镜切换添加过渡动画(使用
animateTo)。 - 云存储:将编辑后的图片同步到华为云盘。
至此,本系列全部结束。希望你能跟随每一步代码,亲手构建出属于自己的图像处理APP。如果在实战中遇到问题,欢迎在评论区交流。感谢阅读!
更多推荐




所有评论(0)