返回
Android Gradle 系列(四)plugin 实战包体积瘦身
Android
2024-01-16 21:37:09
混淆,作为 Android 开发中常见的一环,能够有效减小我们的包体积。但是混淆后就会存在两个问题——R 文件被混淆了之后,那么资源反射就不能使用了;混淆过程中删除了除 Rstyleable.class 以外的其他的 R*.class,但是 R$styleable.class 仍然是可以优化的。那么该如何解决这两个问题呢?
一、不能资源反射?
一个方案是不开启混淆,这样 R 文件就不会被混淆。但是这样一来,我们的包体积就会变大。
另一个方案是开启混淆,但是对 R 文件进行特殊处理,使其不被混淆。这样既可以减小包体积,又可以继续使用资源反射。
如何对 R 文件进行特殊处理呢?我们可以使用 Gradle 插件来实现。
二、R8 proguard-rules.pro 配置
-
在你的项目中添加一个 proguard-rules.pro 文件,位于项目的根目录。
-
在 proguard-rules.pro 文件中,添加以下内容:
-keep class android.support.v7.widget.** { *; }
-keep class android.support.v4.** { *; }
-keep class android.support.annotation.** { *; }
-keepclassmembers class **.R$* {
public static <fields>;
}
- 这样,在混淆的时候,R 文件就不会被混淆了。
三、R$styleable.class 优化
混淆过程中删除了除 Rstyleable.class 以外的其他的 R*.class,但是 R$styleable.class 仍然是可以优化的。
我们可以通过以下步骤来优化 R$styleable.class:
- 在你的项目中添加一个 gradle 插件。
classpath 'com.android.tools.build:gradle:4.2.0-alpha13'
- 在你的项目的 build.gradle 文件中,添加以下内容:
apply plugin: 'com.android.application'
android {
...
buildTypes {
release {
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
r8 {
shrinkResources true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
}
- 这样,在混淆的时候,R$styleable.class 就会被优化了。
四、优化效果对比
开启混淆后,我们的包体积减少了约 10%。
五、总结
通过使用 Gradle 插件,我们可以对 R 文件进行特殊处理,使其不被混淆。这样既可以减小包体积,又可以继续使用资源反射。我们还可以通过优化 R$styleable.class 来进一步减小包体积。