-
假如你的项目用了fastjson库或许其他利用反射来进行序列化反序列化操作的库,并且反序列化的对象是kotlin 的 data class类,那么你需求引进
org.jetbrains.kotlin:kotlin-reflect:$kotlin_version
这个库,由于data class 类默认是没有空的结构函数的,所以假如反射获取类的默认(空)结构函数会失败,fastjson就会抛出com.alibaba.fastjson.JSONException: default constructor not found.
。引进这个库一起还需求加上反混杂配置-keepattributes *Annotation* -keep class kotlin.** { *; } -keep class org.jetbrains.** { *; }
关于为什么引进这个依赖就可以了,期望有路过的大佬点拨一番 : )
-
假如项目运用了fastJson,并且混杂之后呈现崩溃
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.reflect.AccessibleObject.isAccessible()' on a null object reference
那有或许的原因是你没有加fastjson的反混杂代码,在proguard-rules.pro里加上就好了
#FastJson反混杂 -keepattributes Signature -dontwarn com.alibaba.fastjson.** -keep class com.alibaba.fastjson.**{*; }
-
假如项目运用了fastJson,并且混杂之后呈现了反常
Caused by: com.alibaba.fastjson.JSONException: default constructor not found. class com.company.module.net.bean.NetBean
这个反常一看便是混杂导致fastjson找不到空结构函数而引起的问题,由于fastjson反序列化是经过反射来实现的,所以项目里在fastjson里用到的类都需求加反混杂,这里我随意拿一个类举例
package com.company.module.net.bean data class NetBean( val url: String, val host: String, val method: String, val type: Int, ) { fun toRequest(requestBody: RequestBody): Request { return Request.Builder().method(method, requestBody).url(url).build() } }
假如你要给这个类加反混杂,那你就需求在这个类地点的modlue的proguard-rules.pro里加上
-keep class com.company.module.net.bean.NetBean {*;}
这样就能坚持这个类和它的子类以及它所有的字段和办法都不被混杂,关于混杂的更多写法以及阐明,引荐看这篇文章,讲的很细由浅入深 Android 混杂实战
-
假如给你的类加了反混杂之后,运行仍是报同样的错误
default constructor not found
,或许什么其他的办法在反射的时分找不到,那很或许是由于敞开了代码优化之后,编译器在编译的时分把没有引用过的办法字节码给优化掉了,导致实践打出来的包确实是没有结构办法/反射要调用的办法,所以只加反混杂还不行。下面是我把一个类反混杂之后,jadx查看混杂后的代码,可以看到是没有结构办法的,至于它的成员办法toRequest还在的原因是由于我在其他当地调用了它,而把这个类实例化的办法是经过fastjson反射,并没有调用这个类的结构办法,所以结构办法被编译器优化掉了
解决办法很简单,便是在你会用反射调用的类/办法/字段上加上一个@Keep注解
这个注解能运用的当地许多,不过主要是用在办法和类上,注释的翻译如下: 表示在构建时缩小代码时不该删去带注释的元素。 这一般用于仅经过反射拜访的办法和类,因此编译器或许以为代码未被运用。
目前踩到的关于kotlin/fastjson/反射/混杂的坑便是这么多,假如遇到其他类似的问题,都会归总到这里,欢迎路过的各位大佬多多弥补 ; )