鸿蒙app打包流程解析
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、打包全流程分解
1. 初始化阶段
- 环境检查
- 验证
Node.js
、OpenJDK
、DevEco Studio插件
版本是否符合要求。 - 检查
config.json
中的bundleName
、versionCode
等配置合法性。
- 验证
2. 资源处理(关键阶段)
- 资源收集与索引
- 多设备适配
- 根据
resources/[device-type]
(如mobile
、tablet
)目录结构,按目标设备类型过滤资源。
- 根据
3. 代码编译与转换
- ArkTS/JS 编译
- 通过
ArkCompiler
将 ArkTS 代码转换为方舟字节码(.abc
文件),存放于build/default/intermediates/ark
。 - 类型检查:静态分析
@State
、@Prop
等装饰器的正确性。
- 通过
- C/C++ 编译(如存在)
- 使用
CMake
或Ninja
编译动态库(.so
),输出到build/default/intermediates/libs
。
- 使用
4. HAP 文件组装
- 生成
resources.res
- 将压缩后的资源与
resources.index
合并为resources.res
文件。
- 将压缩后的资源与
- 生成
module.json
- 从
module.json5
提取配置,转换为二进制格式的module.json
。
- 从
- 打包 HAP
- 将以下内容打包为
.hap
文件(ZIP 格式):
- 将以下内容打包为
classes.abc # 方舟字节码libs/ # Native库resources.res # 资源文件module.json # 模块配置assets/ # 原始资源(如字体)
5. 签名与对齐
- 签名验证
- 使用
jarsigner
或鸿蒙专用工具对 HAP 进行签名(调试签名或发布签名)。
- 使用
- ZIP 对齐优化
- 执行
zipalign
优化 HAP 文件结构,提升加载速度。
- 执行
6. 多模块合并(如生成 APP)
- 若工程包含多个模块(如
entry
、feature
),将所有 HAP 和共享库(HSP)合并为.app
文件,用于应用市场上架。
二、关键内部命令与工具
hvigor resGen
build/resources/rawfile/
arktsc
(ArkTS Compiler)build/intermediates/ark/
CMake
build/intermediates/libs/arm64/
zip
+ 鸿蒙签名工具build/outputs/release/entry-release.hap
hapsigner
build/outputs/signed/
三、资源打包的详细过程
资源处理是打包的核心环节,具体流程如下:
- 资源扫描
- 遍历
resources/base/
和resources/[device-type]/
目录,收集所有文件。
- 遍历
- 资源编译
- 将
xml
布局文件转换为二进制格式,字符串(string.json
)生成索引表。
- 将
- 资源优化
- 图片自动转为
.webp
,非必要资源(如未引用的图片)被过滤。
- 图片自动转为
- 生成
resources.res
- 合并所有优化后的资源为单个二进制文件,结构如下:
resources.res├── index # 资源索引表├── picture # 压缩后的图片└── layout # 二进制布局文件
四、问题排查
1. 常见问题解决
resources/
目录结构CMakeLists.txt
中的 target_link_libraries
五、高级配置
1. 自定义资源过滤
在 build-profile.json5
中指定保留的资源类型:
{ \"arkOptions\": { \"resConfigs\": [\"en\", \"zh\", \"xxhdpi\"] }}
2. 手动执行分阶段打包
# 仅编译资源./hvigorw resGen# 仅编译ArkTS代码./hvigorw compileArk# 生成最终HAP./hvigorw assembleRelease