先说结果,加入下列混淆:
-keep class org.json.** {
*;
}
记录下排除步骤
在集成阿里云登录的时候,不混淆的情况不会出现,但开启混淆后就报下面代码
java.lang.NoSuchMethodError: no non-static method "Lcom/mobile/auth/gatewayauth/model/RStruct;.toJson()Lorg/json/JSONObject;" at com.mobile.auth.gatewayauth.utils.EncryptUtils.encryptToken(Native Method) at com.mobile.auth.gatewayauth.utils.TokenGenerator.assembleToken(Native Method) at com.mobile.auth.gatewayauth.utils.TokenGenerator.a(Unknown Source:21) at com.mobile.auth.gatewayauth.manager.TokenMaskManager.a(Native Method) at com.mobile.auth.gatewayauth.manager.TokenMaskManager.a(Unknown Source:0) at com.mobile.auth.gatewayauth.manager.TokenMaskManager$11.a(Unknown Source:36) at com.mobile.auth.gatewayauth.manager.TokenMaskManager$11.a(Unknown Source:2) at com.mobile.auth.ak.d.a(Unknown Source:140) at com.mobile.auth.ak.d$b.run(Unknown Source:27) at java.util.concu 2021-05-13 18:25:05.186 4749-5857/com.
首先想到的是 会不会是一键登录混淆代码没加?
然而在查看官方文档发现无需添加,查看了下阿里云的arr包发现确实添加了混淆代码
各种尝试无果后觉得还是得反编译看下,由于代码提示
"Lcom/mobile/auth/gatewayauth/model/RStruct;.toJson()Lorg/json/JSONObject;"
at com.mobile.auth.gatewayauth.utils.EncryptUtils.encryptToken(Native Method)
首先是担心是native方法给混淆了(其实想想提示也不会是native方法),就找到EncryptUtils类看下反编译代码,发现没啥问题
然后查看RStruct类 发现了问题点
aar源码
其中有个JSONObject给混淆了,然后回想起jni中,c层调java层代码不单止要指定类路径 还要指定方法的参数和返回值否则回找不到
由于返回类型给混淆到了所以会提示找不到非静态的toJson方法
解决方法就是不混淆org.json.JSONObject文件
-keep class org.json.** {
*;
}
其实想想也不应该,排查了这么久,看提示就很明显了,大意了没有闪。