
包体积优化 — HAR 模块的按需加载与代码缩减文章简介随着应用功能的增加包体积APK/HAP 大小会逐渐膨胀影响用户下载转化率和安装成功率。HarmonyOS 应用通过 HARHarmony Archive模块化架构天然支持按需加载配合代码混淆、资源压缩等策略可以有效控制包体积。本文介绍 MoneyTrack 项目中采用的包体积优化措施包括 HAR 模块划分、obfuscation-rules.txt 混淆配置、consumer-rules.txt 规则等。核心知识点1. HAR 模块按需加载合理的模块划分是包体积优化的基础。HAR 支持按需加载只有被主模块依赖的 HAR 才会被打包到最终 HAP 中未引用模块按需选择主模块 HAP可选按需添加entrycommonlib HARhome HARassets HARstatistics HAR基础工具函数 Logger首页账单展示资产管理页面统计图表页面membership HARMoneyTrack 的模块划分策略将通用能力网络请求、日志、工具函数放入commonlib每个业务功能独立为 HARhome、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-v8ax86_64方便模拟器调试避免同时打armeabi-v7aarm64-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.txtconsumer-rules.txt定义了模块作为依赖被其他模块引用时的混淆规则确保公开 API 不被混淆破坏。推荐参考文档HarmonyOS HAR 模块开发指南obfuscation-rules.txt 混淆配置文件语法HarmonyOS 应用包体积优化最佳实践DevEco Studio AppAnalyzer 工具使用指南