原因:
**
Dalvik可执行文件.dex中的Java方法数引用超过65536,64k的计算方法是65536除以1024,65K的计算方法是65536除以1000,如果方法数超过64k编译器编译将无法通过.
解决原理:分包
**
但是现在一个大的应用,尤其是集成第三方库的,很容易超过这个数目,所以Android 5.0 之后的版本谷歌试用了名为ART的虚拟机来代替Dalvik虚拟机,ART支持从APK文件中加载多个.dex文件. 在安装期间,他会执行一个预编译操作,对.dex文件编译成一个个单一的.oat文件,在运行应用时去加载.oat文件,而不是.dex文件
解决方法:
1: 在Module中的bulid.gradle中添加: multiDexEnabled true**
android {defaultConfig {minSdkVersion 17targetSdkVersion 25versionCode 1versionName "1.0.0.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"multiDexEnabled true}
2:在Module中的bulid.gradle中添加:**compile ‘com.android.support:multidex:1.0.1’
dependencies {/**第三方依赖库**/compile 'com.android.support:multidex:1.0.1'}
3:在的的Application中,onCreate方法里, super.onCreate()方法之前调用
MultiDex.install(this);
public class MyApplication extends Application {@Overridepublic void onCreate() {MultiDex.install(this);super.onCreate();}}
碎碎念:
不建议使用MultiDex Support Library来将APK中单一的dex拆分成多个,从而规避64k方法数限制引起的变异错误 ,因为会在大多数情况下降低应用的性能
- 减少不必要的依赖,对于lib的体积,方法数,性能进行考察,选择合适的库
- 使用Proguard移除无用的代码,配置并在Release版本中使能ProGuard,它的压缩功能通过分析字节码,能够检测并移除没有使用到的类,字段,方法和属性,
