Appearance
包体积优化
鸿蒙应用包体积优化:HSP/HAR、资源压缩、图片优化、动态加载。
1. 包体积构成
应用包 (.app) 组成:
├─ 代码资源 (HAP)
│ ├─ entry HAP (主模块)
│ └─ feature HAP (特性模块,按需加载)
├─ 共享包 (HSP)
│ └─ 公共模块,多模块共享
├─ HAR 包 (静态共享)
│ └─ 编译时依赖
├─ 资源文件
│ ├─ 图片/视频
│ ├─ 字体
│ └─ 音频
└─ 原生库 (SO)
└─ C++ 编译产物2. 模块拆分
2.1 HSP vs HAR
| 特性 | HSP (Harmony Shared Package) | HAR (Harmony Archive) |
|---|---|---|
| 加载方式 | 运行时共享 | 编译时链接 |
| 代码复用 | 多模块共享一份代码 | 每个模块独立一份 |
| 包体积 | 更小 | 较大 |
| 适用场景 | 运行时共享库 | 静态依赖库 |
2.2 模块拆分策略
typescript
// entry module.json5 - 主模块
{
"module": {
"name": "entry",
"type": "entry",
"js": [
{
"pages": ["pages/Index", "pages/Detail"] // 只包含页面路由
}
],
"jsLibs": [ // 依赖的 HAR/HSP 库
{
"src": "../commonLib",
"bundleName": "com.example.commonlib"
}
]
}
}3. 图片优化
3.1 图片格式优化
图片格式对比:
├─ PNG: 无损,体积大
├─ JPEG: 有损,适合照片
├─ WebP: 有损,体积小 25-34% ⭐ 推荐
├─ AVIF: 有损,更小,兼容差
└─ SVG: 矢量,适合图标3.2 图片压缩
typescript
// ❌ 错误:使用原始图片
Image($r('app.media.photo_4k')) // 原图 4MB
// ✅ 正确:使用压缩后图片
Image($r('app.media.photo_compressed_webp')) // WebP 200KB
// DevEco Studio 自带图片压缩工具:
// Tools -> Image Compression Tool4. 资源优化
4.1 资源压缩
资源优化策略:
├─ 移除未使用资源
├─ 图片格式转换 (PNG → WebP)
├─ 资源分包(大资源延迟加载)
└─ 动态加载资源(按需下载)4.2 动态资源加载
typescript
// 延迟加载大资源
@Entry
@Component
struct LazyResource {
@State show: boolean = false
aboutToAppear() {
// 首屏不加载大资源
setTimeout(() => {
this.show = true
}, 500)
}
build() {
Column() {
if (this.show) {
Image($r('app.media.background'))
} else {
Image($r('app.media.placeholder'))
}
}
}
}5. 分包与按需加载
5.1 分包配置
json5
// build-profile.json5
{
"app": {
"products": [
{
"name": "default",
"signingConfig": "debug",
"compileSdkVersion": 12,
"compatibleSdkVersion": 12,
"runtimeOS": "HarmonyOS",
// 动态特性模块
"bundleType": "app",
"runtimeFeatureFlags": ["dynamicFeature"]
}
]
}
}5.2 动态加载
typescript
// 动态加载特性模块
async function loadFeature(featureName: string): Promise<void> {
// 从应用市场下载特性包
let bundleManager = bundleManager.getBundleManager()
let featureModule = await bundleManager.getFeatureBundleInfo(featureName)
if (featureModule) {
// 加载特性模块
await bundleManager.loadFeatureBundle(featureName)
}
}6. 面试高频考点
Q1: 包体积优化策略?
回答:HSP/HAR 模块拆分、图片转 WebP、资源压缩分包、动态加载、移除未使用资源。
Q2: HSP vs HAR 区别?
回答:HSP 运行时共享(多模块共用一份代码,包体积小);HAR 编译时链接(每个模块独立一份代码,包体积大)。
🐱 小猫提示:包体积记住 "HSP 共享、WebP 图片、资源分包、动态加载、移除无用资源"。