一、资源文件优化(通常收益最大)
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 分发 |
| 去除调试符号 | stripDebugDebugInfo 或 android: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/:原始资源(如配置文件、音视频)
优化优先级建议
- 立即见效:图片转 WebP(减少 20-30%)、资源清理、ABI 过滤
- 中期投入:启用 R8 + shrinkResources、resConfigs 精简、依赖优化
- 长期架构:模块化拆分、Dynamic Feature、App Bundle 适配