问题及分析
近期在项目打包时遇到一个奇怪的问题:同一个业务组件在一个老项目中集成没问题,在新创建的项目中打release包就有问题,post请求(retrofit 2.7.1 )的body一直为null,debug包没问题。很明显这是个混淆造成的问题,但为什么同样的组件、同样的proguard-rules.pro打出来的包却一个没问题,一个有问题呢?查询相关资料后,发现是代码压缩器不同的缘故。
新项目的gradle插件版本:
classpath 'com.android.tools.build:gradle:4.0.2'
老项目的gradle插件版本:
classpath 'com.android.tools.build:gradle:3.3.2'
在官方文档中明确说明了gradle 插件3.4.0之后不再使用Proguard进行混淆,而是使用R8编译器,当然R8完全兼容原proguard-rules.pro中指定的规则使得插件可以平滑升级。
从资料中可以了解R8相比Proguard会“压缩得更狠”。在业务组件代码中我是通过@SerializedName注解而非@Keep注解处理bean类字段,由于Gson使用反射创建bean对象并对对象的字段进行填充,这在R8优化过程中是不可见的,相应的字段直接被抹掉。所以在不修改业务组件代码的前提下,只要能keep住@SerializedName注解的字段即可。

本文主要讨论了在Android项目中,新旧版本Gradle插件导致的混淆问题,特别是R8编译器与Proguard的区别。当使用R8时,由于其更严格的优化,导致Gson的序列化注解被删除,从而引发POST请求Body为null的错误。解决方案是调整Gson的混淆规则,保持`@SerializedName`注解及其相关类。同时,介绍了如何通过`consumerProguardFiles`在组件中包含混淆规则,降低沟通成本。
最低0.47元/天 解锁文章
538

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



