HarmonyOS掌上记账APP开发实践第74篇:包体积优化 — HAR 模块的按需加载与代码缩减
包体积优化 — HAR 模块的按需加载与代码缩减
文章简介
随着应用功能的增加,包体积(APK/HAP 大小)会逐渐膨胀,影响用户下载转化率和安装成功率。HarmonyOS 应用通过 HAR(Harmony Archive)模块化架构天然支持按需加载,配合代码混淆、资源压缩等策略,可以有效控制包体积。本文介绍 MoneyTrack 项目中采用的包体积优化措施,包括 HAR 模块划分、obfuscation-rules.txt 混淆配置、consumer-rules.txt 规则等。
核心知识点
1. HAR 模块按需加载
合理的模块划分是包体积优化的基础。HAR 支持按需加载,只有被主模块依赖的 HAR 才会被打包到最终 HAP 中:
MoneyTrack 的模块划分策略:将通用能力(网络请求、日志、工具函数)放入commonlib,每个业务功能独立为 HAR(home、assets、statistics、membership),构建时只打包被引用的模块。
2. obfuscation-rules.txt 混淆配置
混淆通过缩短标识符名称并移除死代码来缩小包体积。以下是完整的混淆规则配置示例:
# ============ 基础混淆配置 ============ # 启用代码压缩(移除未使用的类和方法) -enable-obfuscation -enable-compression # ============ 保留公共 API ============ # 保留 HAP 入口类 -keep class com.moneytrack.EntryAbility { *; } # 保留 ViewModel 层(被 UI 动态引用) -keep class com.moneytrack.viewmodel.** { *; } # 保留所有 Model 数据类(JSON 序列化需要) -keep class com.moneytrack.model.** { *; } # 保留 HAR 模块对外暴露的接口 -keep interface com.moneytrack.commonlib.api.** { *; } # ============ 按需禁用混淆 ============ # 禁用 HAR 模块的内部混淆(使用 consumer-rules.txt 控制) # -disable-obfuscation # 注意:禁用混淆会增加包体积,仅在调试时使用 # 保留枚举类 -keep class **.BalanceChangeType { *; } -keep class **.AccountType { *; }每个 HAR 模块的obfuscation-rules.txt应仅包含该模块的保留规则,避免过度保留导致混淆效果下降。
3. 消费者规则 consumer-rules.txt
当模块作为依赖被其他模块引用时,consumer-rules.txt确保对外 API 不被混淆破坏:
# commons/commonlib/consumer-rules.txt # 保留对外暴露的日志接口 -keep class com.moneytrack.commonlib.logger.** { *; } # 保留基础工具类 -keep class com.moneytrack.commonlib.utils.** { *; }4. 资源瘦身
图片资源往往是包体积的大头,以下策略可以有效压缩资源占用:
# build-profile.json5 中启用资源压缩 { "apiType": "stageMode", "buildOption": { "arkOptions": { "compress": { "enable": true, "compressLevel": "high" } } } }资源瘦身具体措施:
- 图片压缩:使用 WebP 格式替代 PNG/JPEG,同等质量下体积减少 30%-50%
- 移除未使用资源:定期使用 DevEco Studio 的"未使用资源检查"功能扫描删除
- 矢量图标替代位图:使用 Symbol 或 SVG 图标替代多倍率 PNG 图标
- 按需加载资源:将大资源放入单独的 HAR,仅在使用到的页面才加载
5. ABI 分片
HarmonyOS 支持多种设备架构,构建时只打包目标设备的 so 文件可以显著减小包体积:
// build-profile.json5 - ABI 过滤配置 { "buildOption": { "abiFilter": [ "arm64-v8a" ] } }配置建议:
- 线上正式包:仅保留
arm64-v8a(覆盖 95% 以上的设备) - 调试包:可以保留
arm64-v8a+x86_64(方便模拟器调试) - 避免同时打
armeabi-v7a+arm64-v8a,除非需要兼容老旧设备
6. 打包分析(查看 HAP 包内容)
分析 HAP 包的内容是定位体积问题的关键步骤:
# 解压 HAP 包查看内部文件分布hdcfilerecv /data/app/el1/bundle/public/<bundleName>/<entry>.hap ./output/# 或者使用 DevEco Studio 的 AppAnalyzer# 路径:Build > Analyze App > 选择 HAP 文件分析时重点关注:
lib/目录下的 so 文件大小(通常是最大的一部分)resources/目录的图片资源- 未混淆的代码段(可能遗漏了混淆配置)
module.json中是否有未使用的依赖模块
7. 最佳实践
- 模块化设计:功能按 HAR 拆分,避免"万能模块",未被引用的模块不会打包
- 混淆全量开启:所有 HAR 模块均启用混淆,谨慎使用 -keep 规则
- 资源按需加载:图片使用 WebP 格式,大资源分包加载
- ABI 按需过滤:只保留目标设备的架构,减少 so 文件体积
- 定期包体积检查:在 CI 中集成包体积监控,设置阈值告警(如 HAP 包超过 30MB 触发告警)
- 使用 AppAnalyzer 分析:每次发布前运行打包分析,定位体积异常点
项目代码案例
各模块的 obfuscation-rules.txt 配置
文件路径示例:
commons/commonlib/obfuscation-rules.txtfeatures/home/obfuscation-rules.txtfeatures/assets/obfuscation-rules.txt
每个 HAR 模块均包含独立的obfuscation-rules.txt,定义了模块级别的混淆保留规则。
consumer-rules.txt
文件路径示例:
commons/commonlib/consumer-rules.txtcomponents/membership/consumer-rules.txt
consumer-rules.txt定义了模块作为依赖被其他模块引用时的混淆规则,确保公开 API 不被混淆破坏。
推荐参考文档
- HarmonyOS HAR 模块开发指南
- obfuscation-rules.txt 混淆配置文件语法
- HarmonyOS 应用包体积优化最佳实践
- DevEco Studio AppAnalyzer 工具使用指南