其中minifyEnabled和shrinkResources就是优化的开关,当这两个开关都打开时,APK编译的时候会进行如下优化流程:
下面重点介绍下上述各流程中所做的优化。
shrink code
- 功能
shrink code为删除没有用的类,方法,变量和属性的过程,该过程能很大程度缩减APK体积,如当使用一个aar中部分功能接口,没有使用的那部分将被删除,如下例所示:
其中library中的没有被调用的class文件将被删除。
shrink code过程需要知道入口点,换言之就是shrink code需要知道哪些类是入口类,然后按照这个入口类建立调用链确定哪些类,方法,属性和变量是没有被使用。
- 入口的确定
shrink code的入口是根据proguard文件中keep标签的 以及代码中@keep的注解确定的,Android中的四大组件是默认的入口,如下两种情况代码可能被误删除:
-
JNI中的native方法,没法找到调用链会被误删
-
反射调用类或者方法
其中第一种情况Android已经意识到,所以在默认的proguard文件中