[置顶] Android 修改multiDexEnabled true后友盟显示java.lang.IncompatibleClassChangeError的一种解决方案
2017-03-20 19:24
671 查看
今天遇见了一个比较坑的问题,我会把问题描述一下,供以后查阅。
因为自己的项目方法超过了65536个,我必须在项目里加入multiDexEnabled true,才可以继续编包,但是这个时候,发现友盟分享的时候出现了如下的错误:
但是经过反复的测试,我发现当我的代码使用了混淆的时候,才会出现如上的问题;而项目没有使用混淆的时候,相应的友盟的代码没有崩溃。
那么我来总结一下我遇到的问题:当我没有使用multiDexEnabled true的时候,项目没有出现如上的java.lang.IncompatibleClassChangeError;当我使用multiDexEnabled true的时候,当项目没有混淆的时候,也是没有出现这个问题,但是当项目混淆的时候,友盟那部分代码就会报java.lang.IncompatibleClassChangeError的问题导致崩溃。
但是我已经按照友盟的文档做了相应的混淆处理,但还是会有这个问题。最后,我只能自己在项目中加入混淆,在proguard-rules.pro文件中加入如下代码:
发现这个问题消失了。这个方案可能是一种遇到这种问题的解决方案,大家如果遇到类似的问题可以尝试一下,我也是摸索着才采用了这个方案。如果大家知道原理或者有更好的方案麻烦告知我一下(同时吐槽一下,第三方SDK还是需要更完备的文档啊)~
因为自己的项目方法超过了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还是需要更完备的文档啊)~
相关文章推荐
- java.lang.IncompatibleClassChangeError: Implementing class
- java.lang.IncompatibleClassChangeError
- java.lang.IncompatibleClassChangeError:Implementing class
- java.lang.IncompatibleClassChangeError: Implementi
- java.lang.IncompatibleClassChangeError错误的解决
- 异常:java.lang.IncompatibleClassChangeError: Implementing class
- [show] java.lang.IncompatibleClassChangeError:Implementing class
- Hibernate3.5却报异常 java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings ha
- java.lang.IncompatibleClassChangeError: Implementing class异常解决方法
- Exception in thread "main" java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but i
- java.lang.IncompatibleClassChangeError:
- SSH整合抛出java.lang.IncompatibleClassChangeError: Implementing class
- java.lang.IncompatibleClassChangeError: class org.springframework.cglib.core.DebuggingCla
- fastjson parseObject java.lang.IncompatibleClassChangeError
- java.lang.IncompatibleClassChangeError
- java.lang.IncompatibleClassChangeError
- java.lang.IncompatibleClassChangeError: class net.sf.cglib.core.DebuggingClassWriter has interface o
- Caused by: java.lang.IncompatibleClassChangeError: Implementing class
- Hibernate3.5却报异常 java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface
- 异常:Error: java.lang.IncompatibleClassChangeError: Implementing class