关闭

[置顶] Android 修改multiDexEnabled true后友盟显示java.lang.IncompatibleClassChangeError的一种解决方案

标签: android友盟
5425人阅读 评论(0) 收藏 举报
分类:

今天遇见了一个比较坑的问题,我会把问题描述一下,供以后查阅。
因为自己的项目方法超过了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还是需要更完备的文档啊)~

2
0
查看评论

其实你不知道MultiDex到底有多坑

就在前几天,公司正在做的项目遇到了方法数越界的问题,当时真是醉了。想想也难怪,项目中的依赖库就有三十多个,方法数不越界才怪。所以马上上网寻找解决方法,于是找到了下面这篇文章,觉得文章讲解的很全面,所以转载过来,分享给更多的人。最后感谢作者的分享精神。
  • qq_17766199
  • qq_17766199
  • 2016-04-30 11:22
  • 9766

androidstudio MultiDex慎用

遭遇MultiDex 愉快地写着Android代码的总悟君往工程里引入了一个默默无闻的jar然后Run了一下, 经过漫长的等待AndroidStudio构建失败了。 于是总悟君带着疑惑查看错误信息。 UNEXPECTED TOP-LEVEL EXCEPTION:...
  • S1107432915SL
  • S1107432915SL
  • 2016-04-01 14:47
  • 2687

MultiDex精补篇,进一步知道MultiDex的配置

MultiDex精补篇,进一步知道MultiDex的配置
  • changsimeng
  • changsimeng
  • 2017-04-29 11:11
  • 4810

MultiDex使用方法及由此导致的crash、ANR问题解决方案

Google MultiDex可以解决method id超过65536的问题,但是使用MultiDex又无形之中可能引进了一些坑,比较常见的就是crash和ANR,比如Could not find class,NoClassDefFoundError, Could not find method,...
  • zhuobattle
  • zhuobattle
  • 2016-10-28 17:44
  • 3066

关于MultiDex 分包

0x00背景 –在逆向分析apk的过程中,会发现里面会出现多个dex的情况。 一个正常APK文件通常包含以下文件: classes.dex: Dalvik字节码,可被Dalvik虚拟机执行。 AndroidManifest.xml: 一个的Android清单文件,用于描述该应用程序的名字、版本...
  • s13383754499
  • s13383754499
  • 2018-01-12 09:50
  • 84

Android Multidex 遇到的问题

Android 的classLoader在加载APK的时候限制了class.dex包含的Java方法总数不能超过65535,但是现在随便一个复杂一点的App,轻而易举就能超过65535。为了解决这个问题,google推出了官方的解决方案——Multidex 一、使用之后,相信很多人都遇到过以下几个问...
  • wangbaochu
  • wangbaochu
  • 2016-04-18 14:15
  • 8933

AndroidStudio利用android-support-multidex解决65536问题64k问题

当你的应用程序和库引用达到一定规模,你遇到构建错误显示你的应用已经达到了一个Android应用程序构建体系结构的限制。上面的错误显示一个共同的数字:65536。这个数字是重要的,它代表了引用的总数,可以在单个调用的代码Dalvik可执行(Dex)字节码文件。如果你的Android应用发生这个错误,恭...
  • yanzhenjie1003
  • yanzhenjie1003
  • 2016-07-04 06:45
  • 19846

AndroidStudio中包冲突问题(使用解析和Multidex重复条目)

以这个错误 Error:Execution failed for task ':app:dexDebug'. com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecExcept...
  • u011930471
  • u011930471
  • 2015-12-23 19:29
  • 11999

Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚

随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentExcept...
  • t12x3456
  • t12x3456
  • 2014-11-10 00:05
  • 157536

android MultiDex multiDex原理(一)

android MultiDex 原理(一) Android分包MultiDex原理详解 MultiDex的产生背景 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程...
  • DJY1992
  • DJY1992
  • 2016-04-15 15:25
  • 17686