Gradle:启用R8混淆后post请求的body变为null的问题分析及解决办法

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

问题及分析

近期在项目打包时遇到一个奇怪的问题:同一个业务组件在一个老项目中集成没问题,在新创建的项目中打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注解的字段即可。

hook代码报错: Process crashed: Bad access due to invalid address *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'google/sdk_gphone64_x86_64/emu64xa:15/AE3A.240806.043/12960925:userdebug/dev-keys' Revision: '0' ABI: 'x86_64' Timestamp: 2025-10-22 10:09:12.118100600+0000 Process uptime: 11s Cmdline: com.hxfl.hxapp pid: 14595, tid: 14811, name: om.cn:18085/... >>> com.hxfl.hxapp <<< uid: 10213 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000010 Cause: null pointer dereference rax 0000000000000000 rbx 0000749487dc12b0 rcx 0000000014296ef0 rdx 0000749141327b30 r8 0000000000000000 r9 0000000000000040 r10 000000006fabcd38 r11 0000000000000007 r12 00007491429f9e48 r13 0000749141329048 r14 0000749141328f30 r15 0000749141327b30 rdi 000074934d952950 rsi 0000749141328f30 rbp 0000749141328f30 rsp 00007491413279e0 rip 00007491dd18fe0f 25 total frames backtrace: #00 pc 000000000098fe0f /apex/com.android.art/lib64/libart.so (artQuickGenericJniTrampoline+79) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #01 pc 000000000022b59b /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+139) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #02 pc 0000000000208a15 /apex/com.android.art/lib64/libart.so (nterp_helper+165) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #03 pc 0000000000ad6e48 /data/app/~~fAOZcC2xk59ZmH--znteuA==/com.hxfl.hxapp-Ucuju3wOtE4rgx0qkUGesw==/oat/x86_64/base.vdex (com.hxfl.core.base.net.gateway.GatewayConfigManager.encrypt+232) #04 pc 0000000000209808 /apex/com.android.art/lib64/libart.so (nterp_helper+3736) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #05 pc 0000000000ad7470 /data/app/~~fAOZcC2xk59ZmH--znteuA==/com.hxfl.hxapp-Ucuju3wOtE4rgx0qkUGesw==/oat/x86_64/base.vdex (com.hxfl.core.base.net.gateway.StandardGatewayInterceptor.oo00OoOOoo0+200) #06 pc 000000000000ee13 [anon_shmem:dalvik-jit-code-cache] (offset 0x2000000) (com.hxfl.core.base.net.gateway.StandardGatewayInterceptor.intercept+1139) #07 pc 000000000000216c [anon_shmem:dalvik-jit-code-cache] (offset 0x2000000) (okhttp3.internal.http.RealInterceptorChain.proceed+972) #08 pc 000000000000aad5 [anon_shmem:dalvik-jit-code-cache] (offset 0x2000000) (com.hxfl.core.base.net.http.LoggingInterceptor.intercept+1541) #09 pc 000000000000216c [anon_shmem:dalvik-jit-code-cache] (offset 0x2000000) (okhttp3.internal.http.RealInterceptorChain.proceed+972) #10 pc 000000000020a621 /apex/com.android.art/lib64/libart.so (nterp_helper+7345) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #11 pc 0000000000ad915c /data/app/~~fAOZcC2xk59ZmH--znteuA==/com.hxfl.hxapp-Ucuju3wOtE4rgx0qkUGesw==/oat/x86_64/base.vdex (com.hxfl.core.base.net.http.RequestInterceptor.intercept+224) #12 pc 000000000000216c [anon_shmem:dalvik-jit-code-cache] (offset 0x2000000) (okhttp3.internal.http.RealInterceptorChain.proceed+972) #13 pc 000000000000ce8c [anon_shmem:dalvik-jit-code-cache] (offset 0x2000000) (okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp+1148) #14 pc 000000000020986d /apex/com.android.art/lib64/libart.so (nterp_helper+3837) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #15 pc 00000000013824ea /data/app/~~fAOZcC2xk59ZmH--znteuA==/com.hxfl.hxapp-Ucuju3wOtE4rgx0qkUGesw==/oat/x86_64/base.vdex (okhttp3.internal.connection.RealCall$AsyncCall.run+102) #16 pc 000000000028a1c1 /system/framework/x86_64/boot.oat (java.util.concurrent.ThreadPoolExecutor.runWorker+769) (BuildId: 68b5d9df423be4ebd4a6c38087fc90e635afb135) #17 pc 000000000028795b /system/framework/x86_64/boot.oat (java.util.concurrent.ThreadPoolExecutor$Worker.run+59) (BuildId: 68b5d9df423be4ebd4a6c38087fc90e635afb135) #18 pc 000000000015c3ba /system/framework/x86_64/boot.oat (java.lang.Thread.run+74) (BuildId: 68b5d9df423be4ebd4a6c38087fc90e635afb135) #19 pc 0000000000212154 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+756) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #20 pc 0000000000474bf5 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+181) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #21 pc 00000000008c5cc3 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+1427) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #22 pc 00000000008c5725 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallbackWithUffdGc(void*)+5) (BuildId: 62338b1c62e3991543c9b8b8bae2b361) #23 pc 000000000006d62a /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+58) (BuildId: eb58b4d427279994f00c0e1818477e4f) #24 pc 0000000000060348 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+56) (BuildId: eb58b4d427279994f00c0e1818477e4f) ***
10-23
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值