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还是需要更完备的文档啊)~

猜你喜欢

转载自blog.csdn.net/y505772146/article/details/64130833