Android 中APK 体积优化的几种方法
在 Android 开发中,APK 体积优化是一个重要的环节,尤其是在用户下载和安装体验方面。以下是一些常用的方法来压缩 APK 体积:
1. 启用代码和资源压缩
Android 提供了 ProGuard 和 R8 工具来压缩和优化代码和资源。
1.1 启用代码压缩(ProGuard/R8)
在 build.gradle 文件中启用代码压缩:
android {
buildTypes {
release {
minifyEnabled true // 启用代码压缩
shrinkResources true // 启用资源压缩
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
-
minifyEnabled true:启用代码压缩和混淆。
-
shrinkResources true:移除未使用的资源文件。
-
proguardFiles:指定 ProGuard 规则文件。
1.2 自定义 ProGuard 规则
在 proguard-rules.pro 中添加自定义规则,确保必要的类和方法不被移除或混淆。
2. 移除未使用的资源
2.1 使用 shrinkResources
在 build.gradle 中启用 shrinkResources,自动移除未使用的资源:
android {
buildTypes {
release {
shrinkResources true // 启用资源压缩
}
}
}
2.2 使用 lint 工具
运行 lint 检查未使用的资源:
./gradlew lint
在 lint 报告中查找未使用的资源并手动删除。
2.3 使用 resConfigs 限制资源语言
如果应用只支持特定语言,可以通过 resConfigs 移除其他语言的资源:
android {
defaultConfig {
resConfigs "en", "zh" // 只保留英文和中文资源
}
}
3. 优化资源文件
3.1 压缩图片资源
使用工具(如 TinyPNG 或 ImageOptim)压缩图片。
使用 WebP 格式替代 PNG 或 JPEG,WebP 通常具有更小的体积:
右键点击图片 -> Convert to WebP
3.2 移除未使用的资源
-
删除未使用的图片、布局、字符串等资源。
-
使用 lint 工具检查未使用的资源。
3.3 使用矢量图(Vector Drawable)
矢量图可以替代多分辨率的位图,减少资源文件数量:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF0000"
android:pathData="M12,2L2,22h20L12,2z"/>
</vector>
4. 优化代码
4.1 移除未使用的依赖库
检查 build.gradle 文件,移除未使用的依赖库:
dependencies {
implementation 'com.example:library:1.0.0' // 确保只保留必要的库
}
4.2 使用代码拆分
- ABI 拆分:为不同的 CPU 架构生成单独的 APK:
android {
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk false
}
}
}
- 按屏幕密度拆分:为不同的屏幕密度生成单独的 APK:
android {
splits {
density {
enable true
reset()
include 'mdpi', 'hdpi', 'xhdpi', 'xxhdpi', 'xxxhdpi'
}
}
}
4.3 使用动态功能模块
将部分功能拆分为动态功能模块(Dynamic Feature Module),用户可以在需要时下载:
android {
dynamicFeatures = [':feature_module']
}
5. 使用 Android App Bundle (AAB)
Google Play 推荐使用 AAB 格式上传应用,Google Play 会根据用户设备生成优化的 APK:
- 在 build.gradle 中启用 AAB:
android {
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
- 使用 Android Studio 生成 AAB 文件:
点击 Build -> Build Bundle(s) / APK(s) -> Build Bundle(s)。
6. 移除调试信息
在发布版本中移除调试信息,减少 APK 体积:
android {
buildTypes {
release {
debuggable false
jniDebuggable false
renderscriptDebuggable false
}
}
}
7. 使用第三方工具
7.1 AndResGuard
AndResGuard 是一个资源混淆工具,可以进一步压缩资源文件:
- 在 build.gradle 中添加插件:
plugins {
id 'com.tencent.andresguard'
}
- 配置 AndResGuard:
andResGuard {
mappingFile = null
use7zip = true
useSign = true
keepRoot = false
whiteList = [
// 保留白名单资源
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
]
}
7.2 Zipalign
- 使用 zipalign 工具优化 APK 文件:
zipalign -v 4 input.apk output.apk
8. 检查 APK 内容
使用 Android Studio 的 APK 分析工具检查 APK 内容,找出体积较大的文件:
- 打开 APK 分析工具:
点击 Build -> Analyze APK。
- 查看 APK 中占用空间较大的文件,并针对性优化。