Android优化——proguard之缩减体积

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

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文件中设置shrinkResourcestrue,打开该功能,配置代码如下:

android {
   
   
    ...
    buildTypes {
   
   
        release {
   
   
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zen_Ni

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值