APK 包体积优化的系统方法

3 阅读3分钟

一、资源文件优化(通常收益最大)

1. 图片资源优化

方案具体做法效果
WebP 格式将 PNG/JPG 转换为 WebP(Android 4.0+ 支持)体积减少 25-35%,质量无损
矢量图简单图标使用 SVG(Vector Drawable)无限缩放,体积极小
.9 图精简检查冗余的 9-patch 图片避免重复资源
动态下发大图/皮肤包使用网络下载减少 base APK 体积

实践建议:使用 cwebp 工具批量转换:

cwebp -q 75 input.png -o output.webp

2. 资源文件清理

  • Lint 检查:使用 Analyze > Run Inspection by Name > Unused resources 删除无用资源
  • 资源混淆:启用 shrinkResources true(需配合 ProGuard/R8)
  • 统一资源库:建立公共资源模块,避免各模块重复引入相同图片

二、代码层面优化

1. ProGuard / R8 代码压缩

android {
    buildTypes {
        release {
            minifyEnabled true      // 开启代码混淆
            shrinkResources true    // 移除无用资源(需配合 minifyEnabled)
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

关键配置

  • -keep 规则要精确,避免过度保留
  • 使用 proguard-android-optimize.txt 而非基础版本,包含更多优化规则

2. 原生库(.so 文件)优化

策略说明
ABI 过滤只保留必要架构:arm64-v8a(主流)+ armeabi-v7a(兼容)
动态交付使用 App Bundle 按设备 ABI 分发
去除调试符号stripDebugDebugInfoandroid:extractNativeLibs="true"
android {
    defaultConfig {
        ndk {
            abiFilters 'arm64-v8a', 'armeabi-v7a'
        }
    }
    packagingOptions {
        // 打包时剔除调试符号
        doNotStrip '*/arm64-v8a/*.so'  // 按需保留
    }
}

三、构建配置优化

1. 启用资源缩减(Android Gradle Plugin 特性)

android {
    buildTypes {
        release {
            // 移除未使用的备用资源(如只保留中文)
            resConfigs "zh", "xhdpi"
        }
    }
}

2. APK 压缩选项

android {
    packagingOptions {
        // 不压缩特定类型(影响运行时性能 vs 包体积权衡)
        // 默认 .so 文件已压缩,如需运行时直接 mmap 可排除
    }
}

四、架构与工程优化

1. 模块化 + 动态功能模块(Dynamic Feature)

  • 将非核心功能(如直播、地图、AR)拆分为 Dynamic Delivery
  • 用户按需下载,base APK 仅保留核心功能

2. 依赖库瘦身

检查项操作
重复依赖./gradlew app:dependencies 分析依赖树,排除重复
功能拆分如只需 Gson 的解析功能,避免引入完整库
替代方案用更轻量的库替换重型库(如 Fresco → Coil)

示例:排除传递依赖

implementation('com.example:heavy-lib:1.0') {
    exclude group: 'com.android.support'
    exclude module: 'unused-module'
}

五、进阶工具与方案

1. App Bundle(AAB)分发

  • Google Play 强制要求,国内商店逐步支持
  • 按设备配置分发:只下发对应 ABI 的 .so、对应 DPI 的资源、对应语言的字符串
  • 平均减少 20% 下载体积

2. 资源混淆(AndResGuard / AabResGuard)

  • res/drawable/icon.png 缩短为 r/a/b.png
  • 减少资源路径和文件名长度,通常减少 1-3MB

3. Dex 优化

  • Dex 分包优化:控制单个 dex 方法数,避免冗余
  • Kotlin 标准库精简:使用 R8 的 -keep 规则优化 Kotlin 反射等开销

六、分析诊断工具

工具用途
APK Analyzer(Android Studio 内置)可视化查看 APK 各模块体积占比
ClassyShark分析 dex 文件,查看方法数和类结构
Matrix-ApkChecker(腾讯)自动化检查 APK 冗余资源、重复文件等
Bugly 的 APK 分析在线分析包体积构成

APK Analyzer 关键指标

  • lib/:原生库占比(通常最大)
  • res/:资源文件
  • classes.dex:Java/Kotlin 代码
  • assets/:原始资源(如配置文件、音视频)

优化优先级建议

  1. 立即见效:图片转 WebP(减少 20-30%)、资源清理、ABI 过滤
  2. 中期投入:启用 R8 + shrinkResources、resConfigs 精简、依赖优化
  3. 长期架构:模块化拆分、Dynamic Feature、App Bundle 适配