原先跑得好好的项目,在studio3里面build出来后居然在好几台Android 4.2的机器上运行不了。(Android 5以上的机器就没发现问题。) 都是一启动就爆错误:
java.lang.RuntimeException: Unable to get provider com.alibaba.sdk.android.feedback.util.FBFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.alibaba.sdk.android.feedback.util.FBFileProvider" on path: DexPathList[dexElements=[zip file "/data/app/com.boosj.boosjapp-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.boosj.boosjapp-1, /vendor/lib, /system/lib]]
配置调了半天并没有什么卵用。 后来搜到一篇文章说是多重dex加载机制上的问题。 解决方法如下。
1、在module下的build.gradle文件 ,添加multiDexEnabled true
除了在build.gradle的defaultConfig里配置multiDexEnabled true外,还要在dependencies内加入implementation 'com.android.support:multidex:1.0.0'
defaultConfig {
multiDexEnabled true
}
dependencies {
implementation 'com.android.support:multidex:1.0.0'
}
defaultConfig {
applicationId "com.kakaxi.xx"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0.1"
multiDexEnabled true
testInstrumentationRunner "android.test.InstrumentationTestRunner"
2、在android节点内部添加jumboMode = true
dexOptions {
javaMaxHeapSize "4g"
jumboMode = true
}
3、添加分包依赖,谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能
compile 'com.android.support:multidex:1.0.1'
//或者
implementation 'com.android.support:multidex:1.0.0'
4、让自己的Application继承MultiDexApplication类,或者在Application下重新attachBaseContext(Context base)方法,初始化 MultiDex.install(this);如何下图
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
搞定,收工。
其实原理还没整明白,改天翻一下源码理解一下。
补充说明,偶尔修改类文件名之后也会报DexPathList相关的错误,这种一般clear project再rebuild project就可以解决了。
附加
如何查看apk方法数
方法一:dexdump -f apkName.apk | findstr method_ids_size
dexdump.exe直接用android_sdk\build-tools下的,用高版本下的,低版本有的有问题,dexdump.exe和apk放同一目录下,方式运行;
方法二:采用dex-method-counts.jar
java -jar dex-method-counts.jar apkName.apk
注意dex-method-counts.jar 和apk的完整路径 |