我是兰瓶Coding,一枚刚踏入鸿蒙领域的转型小白,原是移动开发中级,如下是我学习笔记《零基础学鸿蒙》,若对你所有帮助,还请不吝啬的给个大大的赞~

前言

目标:在不牺牲核心体验的前提下,将 安装包(APP)与模块包(HAP) 的体积、下载时长与首次启动成本降到可控范围;形成可度量、可回归、可审计的体积治理体系。覆盖:资源去重/按需打包、本地化拆分、代码分拆(HSP/HAR/Feature HAP)、符号与 SourceMap 管理、以及流水线门禁与回滚策略。

1 度量与目标

1.1 指标口径

  • APP 体积:打包产物(.app)总体;
  • HAP 体积entry.hap + feature.hap[*]
  • 安装后占用:解压/编译后的磁盘占用(含缓存);
  • 首启下载量:动态资源/语言包/模型的首次拉取量;
  • 冷启动时长:与体积相关的 I/O 与类加载开销。

1.2 目标基线(建议,按品类可调)

  • 主入口 entry.hap ≤ 25–40MB;常驻型应用趋向下限;
  • 单个 feature.hap ≤ 10–20MB
  • APP 总体 ≤ 80–120MB(含必要离线包);
  • 首启在线拉取 ≤ 10MB;弱网模式可延后下载。

2 模块化与代码分拆

2.1 模块类型与职责

  • entry(HAP):仅保留首屏/登录/基础路由通用能力
  • feature(HAP):按业务域拆分(如导航/停车/报表),按需安装/更新
  • HAR(静态库):UI 组件库、工具库;
  • HSP(共享包):跨 HAP 共享代码与资源,避免重复打包;
  • Native/ArkTS 混编:Native 仅承载性能关键路径,避免体积膨胀。

2.2 分拆策略

  • 按功能域:面向“菜单/Tab/路由”切片;
  • 按冷/热路径:冷路径下沉到 feature.hap,需要时安装;
  • 按平台能力:地图/媒体/ML 模块抽成独立 feature,可在低配机不安装;
  • 路由级懒加载:首屏只包含骨架与路由占位,按需动态加载视图与资源。

2.3 依赖治理

  • 去重与合并:多 HAP 共享依赖上移到 HSP
  • 三方库裁剪:仅引入使用到的子模块;
  • 版本对齐:统一三方依赖版本,避免同库多版本并存;
  • 反射/动态加载:为混淆保留规则,防止运行时失败。

3 资源瘦身(去重/按需/格式)

3.1 去重

  • 图片/ICON:单源管理(图床或 LFS),构建时去重 Hash;
  • 字体:按字形子集(subset),拉丁/中日韩分包;
  • 音视频:公共素材上移 HSP;多码率合并至 ABR 模式在线拉取。

3.2 按需打包

  • 屏幕密度:仅打入目标主流密度(如 mdpi/hdpi/xhdpi),其余在线按需;
  • ABI:裁剪无用 lib/abi(如仅 arm64-v8a);
  • 语言:默认仅内置 zh/zh-Hant/en,其余语言在首次进入设置页时下载;
  • 特性资源:功能首用再拉取(预留弱网兜底方案)。

3.3 格式与压缩

  • 图片:WebP/AVIF 优先;矢量优先(SVG/Shape),避免超大位图;
  • 音频:AAC/OPUS(语音)替代 PCM/WAV;
  • 视频:短片内置 H.264,长片或多清晰度在线;
  • 压缩:构建时 zipalign、资源极小化(移除元数据/EXIF),文本 gzip/br

4 本地化拆分(语言/区域/法规)

4.1 语言包策略

  • 核心语言内置:zh / zh-Hant / en;
  • 可选语言在线安装:以语言包 HAP 或资源包形式分发;
  • 回滚机制:下载失败 → 回退至基础语言;
  • UI 与文案分离:使用资源键引用,避免硬编码。

4.2 区域资源

  • 法规/地图/车机协议等区域特有资料单独成包;
  • 首次定位确认区域后再下载对应资源;
  • 变更区域触发差异化同步。

5 符号与 SourceMap 管理

5.1 生成与产出

  • ArkTS/JS:构建开启 SourceMap 产出(仅供服务端留存),对外包删除 map;
  • Native:使用 strip 移除符号,生成 .sym/.dSYM(或等价)离线保存;
  • 混淆映射:ArkTS/JS 混淆映射表(mapping)与 Native 符号分环境管理(dev/stage/prod)。

5.2 归档与访问控制

  • 上传到私有制品库/符号服务器(按版本+GIT SHA 索引);
  • 最小权限:仅崩溃分析/安全小组可访问;
  • 保留周期:≥ 18 个月或两轮大版本;
  • 合规:符号文件不得外泄到客户端;对第三方崩溃平台使用代理去标识上传

5.3 反混淆/还原流程

  • 崩溃上报包含:appVersion、hapVersion、buildId、abi、stack
  • 后端根据 buildId 拉取对应符号与 mapping,生成可读堆栈
  • 支持离线还原(命令行工具)与在线查询(CI 工具)。

6 构建流水线与门禁

6.1 构建阶段

  • 静态分析:发现未使用资源/重复依赖/过大文件;
  • 拆包检查:HSP/HAR/Feature 引用关系图与循环依赖检测;
  • 资源清单:输出 Top-N 大文件列表与责任模块。

6.2 体积预算与门禁

  • entry.hap / feature.hap / app 设置预算(budget),超过即失败;
  • 设置 变化阈值:相对主分支 +5% 警告,+10% 拒绝;
  • 记录历史趋势,周报体积曲线(含平均/分位)。

6.3 灰度与回滚

  • 新增/移除资源按灰度策略发布;
  • 发现异常膨胀可一键回滚至上一稳定构建;
  • 版本与资源包具备可追溯性(buildId → 制品 → 提交)。

7 典型组合方案(示例)

7.1 通用应用(地图/出行类)

  • entry.hap:登录/首屏/地图基础、通用 UI;
  • feature.hap.nav:导航(首次使用下载);
  • feature.hap.parking:停车;
  • hsp.shared:网络、日志、UI 组件、图标、字体子集;
  • 语言:内置 zh/en,其他按需;
  • 图片:图标/插图 WebP,地图覆盖物矢量化;
  • 模型:语音/路线 ETA 模型按需下载(分版本)。

7.2 重媒体应用

  • entry.hap 仅播放器壳与基础清晰度;
  • 高码率/编解码器通过在线模块拉取;
  • CDNs 分区与按带宽自适应

8 工程技巧与注意事项

  • 避免把大文件放进 HAR:HAR 会被多个 HAP 重复打包;大资源放 HSP 或在线;
  • 资源命名规范:路径 + 语义 + 指纹(name.hash.ext)利于去重与缓存;
  • 避免多份相同字体:统一在 HSP 中子集化产出;
  • 反射/动态加载:为混淆配置 keep 规则,确保运行时可见;
  • Lazy Init:启动阶段不要加载大字库/大图/模型;按需惰性初始化;
  • ABI/密度自动裁剪:在 CI 根据目标市场覆盖率生成不同渠道包。

9 验证与回归

  • 端到端:安装/首次启动/功能首用下载链路时长;
  • 离线/弱网:包内可用的最小闭环(可浏览/登录/离线地图片段);
  • 回归脚本:Top 场景路径监控体积与时长;
  • A/B:资源本地内置 vs 在线拉取的功耗/时延/留存对比。

10 快速检查清单(Cheat Sheet)

  • entry.hap 仅保留首屏/登录/基础能力;
  • feature.hap 按业务域拆分,首用才下载;
  • 公共代码/资源统一上移 HSP;
  • 图片 WebP/AVIF + 字体子集;移除无用密度与 ABI;
  • 语言包拆分,非核心语言在线安装;
  • 生成并归档 SourceMap / Native 符号与混淆 mapping;
  • CI 体积预算门禁 + Top-N 大文件报表;
  • 启动阶段禁止加载大资源,按路由懒加载。

(未完待续)

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐