APK 体积优化
场景
APK 体积从 30MB 膨胀到 80MB,影响下载转化率,需要瘦身到 50MB 以下。
排查与方案
1. 分析体积组成
用 APK Analyzer(Android Studio → Build → Analyze APK)查看各部分占比:
| 组成部分 | 常见占比 | 优化方向 |
|---|---|---|
lib/ (so 文件) | 30-50% | ABI 过滤、动态下载 |
res/ (资源) | 20-30% | 图片压缩、无用资源删除 |
classes.dex | 15-25% | R8 混淆、移除无用代码 |
assets/ | 变化大 | 按需下载、压缩 |
2. 优化方案
so 文件瘦身
// build.gradle.kts — 只保留主流 ABI
android {
defaultConfig {
ndk {
abiFilters += listOf("arm64-v8a", "armeabi-v7a")
// 去除 x86、x86_64(模拟器用,正式包不需要)
}
}
}
对于大体积 so(如 FFmpeg),考虑动态下载:首次使用时从 CDN 下载,不打包进 APK。
资源优化
android {
buildTypes {
release {
// 开启资源压缩(配合 R8 混淆)
isShrinkResources = true
isMinifyEnabled = true
}
}
}
| 手段 | 说明 |
|---|---|
| WebP 替换 PNG | 同画质体积减少 25-35% |
| 矢量图 VectorDrawable | 替换小图标,不受分辨率影响 |
resConfigs "zh", "en" | 只保留需要的语言资源 |
Lint UnusedResources | 删除未引用的资源 |
| 资源混淆 | AndResGuard 缩短资源路径名 |
代码优化
android {
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
- R8 Tree Shaking 移除未使用的类和方法
- 检查是否引入了体积大但只用了一小部分的库(如 Guava → 换 Kotlin stdlib)
App Bundle
# 使用 AAB 格式发布,Google Play 自动按设备裁剪
./gradlew bundleRelease
AAB 让 Google Play 按设备的 ABI、屏幕密度、语言生成只含必要资源的 APK,可减少 15-30% 下载体积。
面试答题要点
- 先用 APK Analyzer 定量分析,找到"大头"
- 针对 so / 资源 / 代码分别给方案
- 提到 AAB + R8 是基本操作
- 给出优化前后具体数字