liangjingkanji / Net

Android 基于协程/OkHttp网络请求工具
http://liangjingkanji.github.io/Net/
MIT License
1.87k stars 211 forks source link

使用AGPv8代码混淆后Gson解析报错:Missing type parameter. #203

Closed op123355569 closed 1 year ago

op123355569 commented 1 year ago

问题描述

从3.5.9开始,代码混淆之后Gson解析报错,报Caused by: java.lang.RuntimeException: Missing type parameter. 应该是3.5.9的升级内容导致的,我退回到3.5.8就没问题了,3.6.0和3.6.1都试过,都不行 Gradle:gradle-8.0-bin Gradle tool:8.1.1

期望行为

希望在下个版本修复,谢谢大佬。

如何复现

fork仓库并复现问题可以快速解决, 猜测只会让问题晦涩难懂, 耽误所有人时间

截图

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

版本

liangjingkanji commented 1 year ago

你确定在gradle版本不变的情况下降级到3.5.8就能立刻解决问题吗

liangjingkanji commented 1 year ago

Duplicate of #201 相同问题, AGPv8.0导致

推测以下代码导致即使AGPv8.0也不会报错

3.5.8

@OptIn(ExperimentalStdlibApi::class)
inline fun <reified T> typeTokenOf() = typeOf<T>().javaType

3.5.9以上

inline fun <reified T> typeTokenOf() = object : TypeToken<T>() {}.type

之所以这么改当初应该是为了支持基础类型(例如Long)解析

op123355569 commented 1 year ago

你确定在gradle版本不变的情况下降级到3.5.8就能立刻解决问题吗

确定,我昨天晚上从3.6.1一个版本一个版本往下降进行尝试了,到3.5.8就没问题了。然后有两点需要注意的:

  1. 因为之前升级了AGPV8,3.5.8也报过类似的问题,然后加了混淆规则就解决了,当时查阅了资料后的处理方式为: `

    Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.

    -keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken -keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken `

  2. 后来我把Net升到了3.5.9 3.6.0 直到最新的3.6.1,但是直到昨天才打了release包,中途一直都是debug包没加混淆,所以一直到昨天才发现问题,试过各种混淆规则都解决不了,降到3.5.8就解决了
liangjingkanji commented 1 year ago

@op123355569 看到你提供的信息, 的确需要给Net也单独添加混淆规则

Duplicate of google/gson#2069

liangjingkanji commented 1 year ago

你试下以下版本

implementation 'com.github.liangjingkanji:Net:8dba7488fc'
op123355569 commented 1 year ago

你试下以下版本

implementation 'com.github.liangjingkanji:Net:8dba7488fc'

可以了,用这个库就正常了

liangjingkanji commented 1 year ago

已发布新的正式版本

SaltedFish-Extreme commented 1 year ago

牛,我上周打包发现这个问题,然后在gradle.properties里设置

# 兼容自定义的Proguard混淆规则
android.enableR8.fullMode=false

就好了,虽然打的包会大一点,但是r8的fullMode模式,混淆会更加激进,优点是体积更小,混淆程度更高,但是要额外配置混淆规则