ProGuard 是一个压缩、优化、混淆代码的工具。尽管有很多其他工具供开发者们使用,但是 ProGuard 作为 Android Gradle 构建过程的一部分,已经打包在 SDK 中。
当我们构建应用时,使用 ProGuard 有很多好处。有的开发者更关心混淆这块功能,对我而言最大的用处是打包时移除 dex 中的无用代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PSbPYKs-1630583794712)(https://user-gold-cdn.xitu.io/2018/1/15/160f7822ce7376b5?imageView2/0/w/1280/h/960/ignore-error/1)]
一个 Android 示例应用的空间分布图,源码地址 Topeka sample app。
减少包体积的好处有很多,比如增加用户黏性和满意度,提升下载速度,减少安装时间,以便在终端设备上连接用户,尤其是在新兴市场。当然,有时候您不得不限制您的应用的大小,比如 Instant App 限制大小 4 MB,此时 ProGuard 显得必不可少了。
如果以上还不足以说服您使用 ProGuard,其实移除无用代码和混淆所有名称还有其他更多的优化效果:
- 在一些版本的 Android 设备上,DEX 代码会在安装或者运行时被编译成机器码。原始的 DEX 和优化后的机器码都会保留在设备中,所以算一下就知道:代码越少,意味着编译时间越短,存储占用越少。
- ProGuard 除了可以大幅减少代码的空间之外,还可以让所有的标识符(包、类和成员)都使用更短的名字,如
a.A
和a.a.B
。这个过程就是混淆。混淆通过两种方式来减少代码:让表示名称的字符串更短;在这些方法或者属性有相同的签名情况,下这些字符串更容易被复用,最终减少了字符串池的数目。 - 使用 ProGuard 是开启资源压缩的前提条件. 资源压缩功能会移除您项目中代码没有引用到的资源文件(如图片资源,这一般是 APK 中占比最大的部分了).
- 通过仅将您代码中实际使用的方法打包到 APK 中,移除代码会帮您避免 64K dex 方法引用问题。尤其是您引用了很多第三方库的时候,这样可以大大降低在您应用中使用 Multidex 的需求。
每个 Android 应用都应该使用代码压缩吗?我认为是的!
但是在您激动的跳起来之前,请先继续阅读下去。当您开启 ProGuard 时,在某些非常微妙的情况下会让您的应用崩溃。虽然有些错误会在构建应用时发生,您能及时发现,但是也有些错误您只能在运行时发现,所以请确保您的应用经过彻底的测试。
如何使用 ProGuard?
在您的项目中开启 ProGuard 只需简单到添加如下几行代码在您的主应用模块的 build.gradle
文件中:
buildTypes {
/* you will normally want to enable ProGuard only for your release
builds, as it’s an additional step that makes the build slower and can make debugging more difficult */
release