Skip to content

包体积优化

鸿蒙应用包体积优化: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 Tool

4. 资源优化

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 图片、资源分包、动态加载、移除无用资源"