使用 proguard 缩减代码和资源

要使你的 APK 文件尽可能小,你应该启用收缩以删除发布版本中未使用的代码和资源。此页面介绍了如何执行此操作以及如何指定在构建期间要保留或丢弃的代码和资源。

ProGuard 提供代码缩减功能,可以从打包的应用程序中检测并删除未使用的类,字段,方法和属性,包括来自所包含代码库的那些(使其成为处理 64k 参考限制的有用工具)。ProGuard 还优化字节码,删除未使用的代码指令,并使用短名称对剩余的类,字段和方法进行模糊处理。混淆的代码使你的 APK 难以进行逆向工程,这在你的应用使用安全敏感功能(例如许可验证)时尤为重要。

Gradle 的 Android 插件提供了资源缩减功能,可以从打包的应用程序中删除未使用的资源,包括代码库中未使用的资源。它与代码收缩一起工作,这样一旦删除了未使用的代码,也可以安全地删除不再引用的任何资源。

收缩你的代码

要使用 ProGuard 启用代码收缩,请将 minifyEnabled true 添加到 build.gradle 文件中的相应构建类型。

请注意,代码缩小会减慢构建时间,因此如果可能,应避免在调试版本中使用它。但是,重要的是你要在用于测试的最终 APK 上启用代码缩减,因为如果你没有充分定制要保留的代码,它可能会引入错误。

例如,build.gradle 文件中的以下代码段可以为发布版本启用代码收缩:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

minifyEnabled 属性外,proguardFiles 属性定义了 ProGuard rules

getDefaultProguardFile(‘proguard-android.txt’)方法从 Android SDK tools/proguard/ folder 获取默认的 ProGuard 设置。提示:要获得更多代码缩减,请尝试位于同一位置的 proguard-android-optimize.txt 文件。它包含相同的 ProGuard 规则,但其他优化功能可在字节码级别(内部和跨方法)执行分析,从而进一步降低 APK 大小并帮助其更快地运行。你可以在 proguard-rules.pro 文件中添加自定义 ProGuard 规则。默认情况下,此文件位于模块的根目录(build.gradle 文件旁边)。要添加特定于每个构建变体的更多 ProGuard 规则,请在相应的 productFlavor 块中添加另一个 proguardFiles 属性。例如,以下 Gradle 文件将 flavor2-rules.pro 添加到 flavor2 产品风格中。

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                   'proguard-rules.pro'
        }
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'flavor2-rules.pro'
        }
    }
}