跳到主要内容

APK 体积优化

场景

APK 体积从 30MB 膨胀到 80MB,影响下载转化率,需要瘦身到 50MB 以下。

排查与方案

1. 分析体积组成

APK Analyzer(Android Studio → Build → Analyze APK)查看各部分占比:

组成部分常见占比优化方向
lib/ (so 文件)30-50%ABI 过滤、动态下载
res/ (资源)20-30%图片压缩、无用资源删除
classes.dex15-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% 下载体积。


面试答题要点

  1. 先用 APK Analyzer 定量分析,找到"大头"
  2. 针对 so / 资源 / 代码分别给方案
  3. 提到 AAB + R8 是基本操作
  4. 给出优化前后具体数字

相关链接