今天调试安卓程序(Android Studio 3.0),ksoap2上传数据报错:
NoClassDefFoundError: org.ksoap2.serialization.SoapObject
奇怪的现象,同样的功能,两个月前还是正常的,今天突然就报错了。jar是正常引用的,也能运行,就是遇到特定的jar里面函数调用的时候报错。
网上查了一圈,大多是关于64K限制、MultiDex相关的,不过试了一些方法,都不起作用。无奈自己找思路:
1. 不同设备的对比:
报错是在工作用的工业安卓板上,但是软件在我的小米平板上却不报错:
工业安卓屏(安卓4.4) 报错
小米平板4(安卓8.0) 正常
既然在小米平板上正常运行,说明代码逻辑本身没问题,是调试配置、或者是安装包的信息在不同版本的安卓系统中有不同的表现。
2. 对比安装包:
用当前安装包和两个月前的前期版本安装包对比,反编译之后
当前版本安装包里面有两个dex
先前版本里面有一个dex
看来确实是MultiDex起作用了。在看看具体的包结构:
当前版本中,ksoap2的内容被分在了第二个dex中
先前版本种,ksoap2和其他部分都在一起
原因清楚了,因为MultiDex机制的问题,导致在那个4.4的设备上,jar包的引用没能起作用。
参考https://stackoverflow.com/questions/15209831/unable-to-execute-dex-method-id-not-in-0-0xffff-65536
我的解决办法
1. 配置信息:
build.gradle(Module)中的defaultConfig,确保multiDexEnabled为true
defaultConfig {
//...
multiDexEnabled true
}
dependencies中:
dependencies {
//...
compile 'com.android.support:multidex:1.0.0'
//...
}
2.代码中
在项目的Application类(我这里名字是TheApplicaiton,原来继承了Application类)中,继承MultiDexApplication类
public class TheApplication extends MultiDexApplication {
//...
}
重新运行,问题解决。