这部分内容,自己其实看过很多遍,但是无一例外的是:在若干天后,自己在用到这一方面的内容时,竟然忘了,我怀疑自己有个假脑袋,所以还是记录一下,毕竟再看时会产生相应的联想,有助于理解和记忆。
1.目的
尽可能的减少 APK 的大小,所以应该在应用中启用 压缩
来移除在版本构建中未使用的代码和资源。
1.代码压缩
代码压缩通过ProGuard
提供,ProGuard 会检测和移除封装应用中未使用的类
、字段
、方法
和属性
,包括自带代码库中的未使用项(这使其成为以变通方式解决64k 引用限制
)。ProGuard 还可优化字节码,移除未使用的代码指令
,以及用短名称混淆其余的类
、字段
和方法
。混淆过的代码可令您的 APK 难以被逆向工程,这在应用使用许可验证等安全敏感性功能时特别有用。2.资源压缩
资源压缩通过 Gradle 的 Android 插件实现,该插件会移除封装应用中未使用的资源,包括代码库中未使用的资源。它可与代码压缩发挥协同效应,使得在移除未使用的代码后,任何不再被引用的资源也能安全地移除。
2 . 代码压缩
要通过 ProGuard 启用代码压缩,请在 build.gradle
文件内相应的构建类型中添加 minifyEnabled true
。
注意: 代码压缩会拖慢构建速度,因此您应该尽可能避免在调试构建中使用
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
...
}
proguard-android.txt
文件位置:Android SDK 文件目录 tools/proguard/
proguard-rules.pro
文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)
每次构建时 ProGuard 都会输出下列文件:
dump.txt
说明 APK 中所有类文件的内部结构。
mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换。
seeds.txt
列出未进行混淆的类和成员。
usage.txt
列出从 APK 移除的代码。
这些文件保存在 <module-name>/build/outputs/mapping/release/ 中
- ** 自定义保留的代码**
要修正错误并强制 ProGuard 保留特定代码,请在 ProGuard 配置文件中添加一行 -keep代码。例如:
-keep public class MyClass
2 . 资源压缩
资源压缩只与代码压缩协同工作。代码压缩器移除所有未使用的代码后,资源压缩器便可确定应用仍然使用的资源。这在您添加包含资源的代码库时体现得尤为明显 - 您必须移除未使用的库代码,使库资源变为未引用资源,才能通过资源压缩器将它们移除。
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
如果您尚未使用代码压缩用途的 minifyEnabled 构建应用,请先尝试使用它,然后再启用 shrinkResources,因为您可能需要编辑 proguard-rules.pro 文件以保留动态创建或调用的类或方法,然后再开始移除资源。
2 . 移除未使用的备用资源
Gradle 资源压缩器只会移除未被您的应用代码引用的资源,这意味着它不会移除用于不同设备配置的备用资源。必要时,您可以使用 Android Gradle 插件的 resConfigs
属性来移除您的应用不需要的备用资源文件。
栗子:
如果您使用的库包含语言资源(例如使用的是 AppCompat 或 Google Play 服务),则 APK 将包括这些库中消息的所有已翻译语言字符串,无论应用的其余部分是否翻译为同一语言。如果您想只保留应用正式支持的语言,则可以利用 resConfig 属性指定这些语言。系统会移除未指定语言的所有资源。
下面这段代码展示了如何将语言资源限定为仅支持英语和法语:
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}