文章目录
Android Proguard
为了尽可能减小应用的大小,应该启用缩减功能来移除不使用的代码和资源。启用缩减功能后,您还会受益于两项功能,一项是混淆处理功能,该功能会缩短应用的类和成员的名称;另一项是优化功能,该功能会采用更积极的策略来进一步减小应用的大小。
代码压缩(code shrinking)
R8工具的代码压缩功能在配置minifyEnabled值为true后就默认打开了。
代码压缩(code shrinking)是R8工具移除在运行时不需要使用的代码过程。这个过程中R8移除不需要的类,变量,方法等。
原理
R8先根据配置的proguard文件(默认,或自定义),分析确定代码的切入点。Android会依据这些切入点打开Activity或者Service。从每个入口点开始,R8会分析并构建包含类,变量,方法和其他在运行时可能访问到的类的图。而未分析到的类会被认定是不可达的,在后续打包过程中将被移除。

在上图中显示了App运行时以来的库,R8在分析后将MyActivity.class作为入口,确定方法foo(),faz(),以及AwesomeApi.class的方法bar()是可达的。而OkayApi.class类是不可达的,因此在打包压缩过程中会被移除。
R8依据proguard文件内的-keep规则确认切入点。-keep规则指定的class文件是R8在压缩代码时不能移除的,并且将保留作为App的切入点。
测试
在module目录下的build.gradle文件内配置minifyEnabled值为true后,程序代码压缩功能就默认打开了,在打包release版本过程中,Android打包工具会源码进行压缩,移除其中不使用的类,变量,方法等,从而达到缩小最终APK体积的目的。
配置minifyEnabled值后体积大小对比如下图——第一张图minifyEnabled=true,第二张图minifyEnabled=false:

自定义保留类
默认的ProGuard规则(proguard-android-optimize.txt)对R8在压缩代码过程中移除不需要的代码已经足够。
但也有R8会错误移除的个别情况:
- 调用JNI(Java Native Interface)接口;
- 调用反射接口;
测试过程中可以揭露由于错误移除导致的错误,但是也可以通过配置产生一个report文件查看移除与保留的类。
怎么解决错误移除问题呢? 使用-keep规则,例如
-keep public class MyClass
也可以使用@Keep标注解决上述问题。@Keep标注在类声明上面,该类会保持原有类名及内部结构,不会被压缩处理。
注意:使用@Keep,前提是使用AndroidX Annotation Library标注库。
资源压缩(Resource Shrinking)
资源压缩(Resource Shrinking)与代码压缩(Code Shrinking)一同进行。在代码压缩执行完成,移除无用代码后,资源压缩就也可以确定哪些资源是不再被使用的(反之,明确哪些资源是继续被使用的)。
通过在module目录下的build.gradle文件中设置shrinkResources为true,打开该功能,配置代码如下:
android {
...
buildTypes {
release {
Android资源与代码压缩技巧

本文介绍Android开发中如何利用R8工具进行代码压缩和资源压缩,包括自定义保留类和资源的方法,以及如何在不同模式下进行严格引用检查。
最低0.47元/天 解锁文章
167

被折叠的 条评论
为什么被折叠?



