[alibaba/fastjson]Android Kotlin 新版本1.3.50 ProGuard 错误

2024-10-16 864 views
4

Kotlin 新版本1.3.50 ProGuard 之后 json 转换 object 出错,我把 '1.3.50' 改成 '1.3.21' 才不会出错。

#proguard 内容

-keep class kotlin.reflect.jvm.internal.** { *; }
-dontwarn com.alibaba.fastjson.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.cheekiat.fastjson.model.** {*;}
-keep class com.alibaba.fastjson.** {*;}

回答

7

添加kotlin-reflect库,并对kotlin.reflect子包添加混淆keep规则;数据bean(即data class)也要keep住,另data class类需要给他一个无参构造器

5

Android Studio 升级Gradle6.5(Gradle Plugin 4.1)之后,Kotlin中使用fastjason出问题,无法把json串反序列化为Kotlin对象。研究了很久才发现需要这样解决:Kotlin代码中不仅要在data类上添加@Keep标注,还需要在其宿主类上添加@Keep标注。在Gradle Plugin4.0版没有没有在其宿主类上添加@Keep标注也是可以正常工作的,不知道为何升级之后需要这样做,可以解答一下吗? @liminghuanghengtian

目前我让fastjson正常逆序列化Kotlin对象的做法如下:

  • Kotlin代码中需要用fastjson逆序列化的data类,以及其宿主类上都需要添加 @Keep 标注
  • data类每个属性都要赋初值,确保Kotllin自动生成空的构建方法
  • 在app的gradle配置中添加kotlin-reflect依赖:
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
  • proguard的混淆规则需要添加一下内容:
# 按照Gradle Plugin升级说明添的规则
-keep class kotlin.Metadata { *; }
-keepattributes RuntimeVisibleAnnotations

# 因为fastjason需要通过kotlin-reflect完成工作,还需要添加一下规则
-dontwarn kotlin.reflect.jvm.internal.**
-keep class kotlin.reflect.jvm.internal.** { *; }