返回

Android Gradle 系列(四)plugin 实战包体积瘦身

Android

混淆,作为 Android 开发中常见的一环,能够有效减小我们的包体积。但是混淆后就会存在两个问题——R 文件被混淆了之后,那么资源反射就不能使用了;混淆过程中删除了除 Rstyleable.class 以外的其他的 R*.class,但是 R$styleable.class 仍然是可以优化的。那么该如何解决这两个问题呢?

一、不能资源反射?

一个方案是不开启混淆,这样 R 文件就不会被混淆。但是这样一来,我们的包体积就会变大。

另一个方案是开启混淆,但是对 R 文件进行特殊处理,使其不被混淆。这样既可以减小包体积,又可以继续使用资源反射。

如何对 R 文件进行特殊处理呢?我们可以使用 Gradle 插件来实现。

二、R8 proguard-rules.pro 配置

  1. 在你的项目中添加一个 proguard-rules.pro 文件,位于项目的根目录。

  2. 在 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>;
}
  1. 这样,在混淆的时候,R 文件就不会被混淆了。

三、R$styleable.class 优化

混淆过程中删除了除 Rstyleable.class 以外的其他的 R*.class,但是 R$styleable.class 仍然是可以优化的。

我们可以通过以下步骤来优化 R$styleable.class:

  1. 在你的项目中添加一个 gradle 插件。
classpath 'com.android.tools.build:gradle:4.2.0-alpha13'
  1. 在你的项目的 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'
            }
        }
    }
}
  1. 这样,在混淆的时候,R$styleable.class 就会被优化了。

四、优化效果对比

开启混淆后,我们的包体积减少了约 10%。

五、总结

通过使用 Gradle 插件,我们可以对 R 文件进行特殊处理,使其不被混淆。这样既可以减小包体积,又可以继续使用资源反射。我们还可以通过优化 R$styleable.class 来进一步减小包体积。