原因:
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 17 targetSdkVersion 25 versionCode 1 versionName "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 { @Override public void onCreate() { MultiDex.install(this); super.onCreate(); } }
碎碎念:
不建议使用MultiDex Support Library来将APK中单一的dex拆分成多个,从而规避64k方法数限制引起的变异错误 ,因为会在大多数情况下降低应用的性能
1.减少不必要的依赖,对于lib的体积,方法数,性能进行考察,选择合适的库
2.使用Proguard移除无用的代码,配置并在Release版本中使能ProGuard,它的压缩功能通过分析字节码,能够检测并移除没有使用到的类,字段,方法和属性,
更多问题加群:584275290