Android 修改multiDexEnabled true后友盟显示java.lang.IncompatibleClassChangeError的一种解决方案
Posted YuNansen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 修改multiDexEnabled true后友盟显示java.lang.IncompatibleClassChangeError的一种解决方案相关的知识,希望对你有一定的参考价值。
今天遇见了一个比较坑的问题,我会把问题描述一下,供以后查阅。
因为自己的项目方法超过了65536个,我必须在项目里加入multiDexEnabled true,才可以继续编包,但是这个时候,发现友盟分享的时候出现了如下的错误:
java.lang.IncompatibleClassChangeError: Expected 'java.lang.String com.umeng.socialize.a.b.a.o' to be a instance field rather than a static field (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
at com.umeng.socialize.a.b.a.q(a.java)
at com.umeng.socialize.a.b.g.onClick(g.java)
at com.umeng.socialize.bean.a.c(a.java)
at com.umeng.socialize.controller.impl.b$7.aa(b.java)
at com.umeng.socialize.controller.impl.b$7.q(b.java)
at com.umeng.socialize.controller.impl.c.postShare(c.java)
hasShareContent(c.java)
at com.android.app.activity.share.ShareActivity.share(ShareActivity.java)
at com.android.app.activity.share.ShareActivity.onClick(ShareActivity.java)
at android.view.View.performClick(View.java:4909)
at android.view.View$PerformClick.run(View.java:20390)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:192)
at android.app.ActivityThread.main(ActivityThread.java:5865)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1021)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:816)
但是经过反复的测试,我发现当我的代码使用了混淆的时候,才会出现如上的问题;而项目没有使用混淆的时候,相应的友盟的代码没有崩溃。
那么我来总结一下我遇到的问题:当我没有使用multiDexEnabled true的时候,项目没有出现如上的java.lang.IncompatibleClassChangeError;当我使用multiDexEnabled true的时候,当项目没有混淆的时候,也是没有出现这个问题,但是当项目混淆的时候,友盟那部分代码就会报java.lang.IncompatibleClassChangeError的问题导致崩溃。
但是我已经按照友盟的文档做了相应的混淆处理,但还是会有这个问题。最后,我只能自己在项目中加入混淆,在proguard-rules.pro文件中加入如下代码:
-keep class com.umeng.socialize***;
发现这个问题消失了。这个方案可能是一种遇到这种问题的解决方案,大家如果遇到类似的问题可以尝试一下,我也是摸索着才采用了这个方案。如果大家知道原理或者有更好的方案麻烦告知我一下(同时吐槽一下,第三方SDK还是需要更完备的文档啊)~
以上是关于Android 修改multiDexEnabled true后友盟显示java.lang.IncompatibleClassChangeError的一种解决方案的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件BuildType 编译类型配置 ④ ( minifyEnabled 配置 | multiDexEnabled | pseudoLocalesEnabled )