随着你的Apk不断的迭代更新,到你的apk到达一定大小的时候,你在编译apk的时候可能会出现下面的错误:
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
最近的apk编译出现的错误日志如下:
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
这个编译错误产生的主要原因是因为每个DEX文件中方法数是以一个short类型结构保存,这样就限制了每个DEX的方法数大小。
Dex主要组成:
- Android FrameWork 方法数
- Lib 方法数
- 你自己写的代码方法数
Android5.0以下:
由于Android5.0以下使用的是Dalvik虚拟机,Dalvik虚拟机在Apk运行的时候去load Dex文件,所以我们可以使用Google提供的multiDex的那个jar包进行分包和合包,在Apk启动的时候进行多dex合包过程。
Android5.0以上:
Android5.0以上我们默认是实用ART虚拟机,ART虚拟机是直接支持Dex合包生成.oat文件,在apk启动后直接加在oat文件。
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 25
multiDexEnabled true
}
...
}
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 25
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
重写或者配置Application:
1. 当你没有重写Application的时候,你要在AndroidManifest.xml中进行如下配置:
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
package="com.example.myapp">
"android.support.multidex.MultiDexApplication" >
...
2.如果你重写了Application,你可以直接用继承MultiDexApplication,具体如下所示:
public class MyApplication extends MultiDexApplication { ... }
也可以不继承MultiDexApplication,直接在Application的初始化中对MultiDex进行初始化
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
Multidex.install(this);
}
}
上面几个步骤完成了MultiDex的初始化,接下来要完成分包dex的配置
我们可以动态的配置哪些文件加在到第一个dex文件中,具体配置如下:
com/example/MyClass.class
com/example/MyOtherClass.class
android {
buildTypes {
release {
multiDexKeepFile file('dex.keep')
...
}
}
}
以上就完成了MultiDex的配置工作了,现在65535的问题就基本解决了。
目前我们解决65535主要有如下方法:
1. 缩减代码,减小apk大小,这是治标不治本的方法。
2. 使用多Dex技术,这个技术导致冷加载时常变长,有的时候还会出现一些的崩溃