> 技术文档 > 鸿蒙app打包流程解析

鸿蒙app打包流程解析


本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、打包全流程分解

1. 初始化阶段
  • 环境检查
    • 验证 Node.jsOpenJDKDevEco Studio插件 版本是否符合要求。
    • 检查 config.json 中的 bundleNameversionCode 等配置合法性。
2. 资源处理(关键阶段)
  • 资源收集与索引
    • 扫描 resources 目录下的图片、布局、字符串等文件,生成二进制资源索引文件 resources.index(路径:build/resources/rawfile/resources.index)。
    • 资源压缩:图片转为 .webp 格式,非图片文件使用 LZ4 压缩。
  • 多设备适配
    • 根据 resources/[device-type](如 mobiletablet)目录结构,按目标设备类型过滤资源。
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)
  • 若工程包含多个模块(如 entryfeature),将所有 HAP 和共享库(HSP)合并为 .app 文件,用于应用市场上架。

二、关键内部命令与工具

阶段 底层工具/命令 输出路径示例 资源处理 hvigor resGen build/resources/rawfile/ ArkTS 编译 arktsc (ArkTS Compiler) build/intermediates/ark/ Native 编译 CMake build/intermediates/libs/arm64/ HAP 打包 zip + 鸿蒙签名工具 build/outputs/release/entry-release.hap 签名 hapsigner build/outputs/signed/

三、资源打包的详细过程

资源处理是打包的核心环节,具体流程如下:

  1. 资源扫描
    • 遍历 resources/base/ 和 resources/[device-type]/ 目录,收集所有文件。
  2. 资源编译
    • 将 xml 布局文件转换为二进制格式,字符串(string.json)生成索引表。
  3. 资源优化
    • 图片自动转为 .webp,非必要资源(如未引用的图片)被过滤。
  4. 生成 resources.res
    • 合并所有优化后的资源为单个二进制文件,结构如下:
resources.res├── index # 资源索引表├── picture # 压缩后的图片└── layout # 二进制布局文件

 四、问题排查

1. 常见问题解决
问题 原因 解决方案 资源文件未打包 路径错误或未引用 检查 resources/ 目录结构 HAP 签名失败 证书过期或密码错误 重新生成签名文件 Native 库缺失 CMake 配置错误 验证 CMakeLists.txt 中的 target_link_libraries

五、高级配置

1. 自定义资源过滤

build-profile.json5 中指定保留的资源类型:

{ \"arkOptions\": { \"resConfigs\": [\"en\", \"zh\", \"xxhdpi\"] }}

2. 手动执行分阶段打包

# 仅编译资源./hvigorw resGen# 仅编译ArkTS代码./hvigorw compileArk# 生成最终HAP./hvigorw assembleRelease