当前位置: 首页 > news >正文

HarmonyOS掌上记账APP开发实践第74篇:包体积优化 — HAR 模块的按需加载与代码缩减

包体积优化 — HAR 模块的按需加载与代码缩减

文章简介

随着应用功能的增加,包体积(APK/HAP 大小)会逐渐膨胀,影响用户下载转化率和安装成功率。HarmonyOS 应用通过 HAR(Harmony Archive)模块化架构天然支持按需加载,配合代码混淆、资源压缩等策略,可以有效控制包体积。本文介绍 MoneyTrack 项目中采用的包体积优化措施,包括 HAR 模块划分、obfuscation-rules.txt 混淆配置、consumer-rules.txt 规则等。

核心知识点

1. HAR 模块按需加载

合理的模块划分是包体积优化的基础。HAR 支持按需加载,只有被主模块依赖的 HAR 才会被打包到最终 HAP 中:

未引用模块

按需选择

主模块 HAP

可选按需添加

entry

commonlib HAR

home HAR

assets HAR

statistics HAR

基础工具函数 + Logger

首页账单展示

资产管理页面

统计图表页面

membership HAR

MoneyTrack 的模块划分策略:将通用能力(网络请求、日志、工具函数)放入commonlib,每个业务功能独立为 HAR(homeassetsstatisticsmembership),构建时只打包被引用的模块。

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. 最佳实践

  1. 模块化设计:功能按 HAR 拆分,避免"万能模块",未被引用的模块不会打包
  2. 混淆全量开启:所有 HAR 模块均启用混淆,谨慎使用 -keep 规则
  3. 资源按需加载:图片使用 WebP 格式,大资源分包加载
  4. ABI 按需过滤:只保留目标设备的架构,减少 so 文件体积
  5. 定期包体积检查:在 CI 中集成包体积监控,设置阈值告警(如 HAP 包超过 30MB 触发告警)
  6. 使用 AppAnalyzer 分析:每次发布前运行打包分析,定位体积异常点

项目代码案例

各模块的 obfuscation-rules.txt 配置

文件路径示例:

  • commons/commonlib/obfuscation-rules.txt
  • features/home/obfuscation-rules.txt
  • features/assets/obfuscation-rules.txt

每个 HAR 模块均包含独立的obfuscation-rules.txt,定义了模块级别的混淆保留规则。

consumer-rules.txt

文件路径示例:

  • commons/commonlib/consumer-rules.txt
  • components/membership/consumer-rules.txt

consumer-rules.txt定义了模块作为依赖被其他模块引用时的混淆规则,确保公开 API 不被混淆破坏。

推荐参考文档

  • HarmonyOS HAR 模块开发指南
  • obfuscation-rules.txt 混淆配置文件语法
  • HarmonyOS 应用包体积优化最佳实践
  • DevEco Studio AppAnalyzer 工具使用指南
http://www.jsqmd.com/news/1244780/

相关文章:

  • GEO数据监测工具哪家性价比更高?四款主流产品横向测评
  • X99鸡血工具V4版:释放E5处理器性能潜力的终极指南
  • Python微信聊天记录分析与NLP实战指南
  • 2026小红书视频下载方法怎么操作?这几种亲测可用 - 免费软件工具方法教程
  • SFML音频开发实战:5分钟搞定C++游戏音效播放
  • 2026年7月最新西安周至县亨得利名表服务中心电话公示 - 亨得利官方博客
  • 阿里秒悟 Meoo 零代码开发全流程实测:自然语言生成应用并部署云上
  • TM4C129 GPIO寄存器深度解析:从位寻址到中断与复用实战
  • 天津靠谱的无铁芯直线电机/有铁芯直线电机制造商选型指南 - 品牌优推
  • 5分钟掌握ZIP伪加密破解:从文件格式原理到WinHex实战
  • VC++环境下高性能矩阵运算库实现:从内存管理到LU分解求逆
  • 通信工程没有项目经验,怎么写简历?2026届求职这样包装,别再空着“项目栏”了
  • 千问最新福利券来啦!新用户输入:千问新人福利yPBm3m 就可以直接领取8元通用立减券,这是真的。快来领取吧
  • 2026年7月亲身探访盐城亨得利名表服务中心|全新电话和维修地址 - 亨得利官方博客
  • Redis沙盒逃逸(CVE-2022-0543)
  • C++ STL 完整入门笔记[3]:vector底层剖析 附杨辉三角实战
  • 天津靠谱的无铁芯直线电机有铁芯直线电机订购厂家选购指南 - 品牌优推
  • L3级自动驾驶为何不可跳过:技术、法规与用户信任的平衡
  • 雅典中国售后服务中心|全新维修地址和电话权威信息公告(2026年7月最新) - 亨得利官方服务中心
  • LVSum基准实践指南:多模态大模型长视频时间感知摘要评估
  • 2026抖音去水印保存教程,个人收藏学习这样保存 - 免费软件工具方法教程
  • Excel字符编码转换:CHAR与CODE函数实战指南
  • Go语言实现XOR加密:10分钟掌握流密码核心原理与工程实践
  • 2026最新5款Cursor平替之选深度实测
  • Cortex-M4F内存映射、位带操作与中断机制深度解析
  • GLM与Kimi编程工具对比:代码生成、调试与部署实战指南
  • Python调用AI大模型API实现高效求职文档生成
  • 亲身到店体验福州亨得利名表服务中心|服务热线及全部维修地址(2026年7月更新) - 亨得利官方
  • Unity导出透明背景PNG全攻略:解决背景不透明与尺寸偏差
  • 权威发布:宇舶金华2026年7月最新地址与热线,售后客户服务信息 - 亨得利钟表维修中心