最近遇到了使用第三方的时候不显示、白屏的情况,网上搜了好多解决办法,最后找到了这个,因为项目导包太多所导致的,通过下面方法解决了,给大家分享下
什么是dex?
Dex就是Dalvik VM executes的全称,可以认为是安卓虚拟机的可执行程序。
为什么用到分包 ?
大致可以分为2个原因。
- dex中包含的方法囊括了所有依赖的jar包和源码中的方法。在稍微大一些的项目中,这个方法数目是很可观的。而dex中表示方法数目的是short类型。所有最大只能表示到65536. 因此会出现一个dex无法保存所有方法的情况,此时需要分包。这里一般都是报错:
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
或者其他类似的包含65536的错误。一般都是这个原因导致的。
- 还有一个情况是,方法数并没有达到上限,但是安装运行报错。因为在android虚拟机有一个optdex来优化dex,在优化过程中每个optdex都有固定大小的缓冲区。最初的时候3.0之前只有5m, 现在最大的好像是16m了。但是无论多大,如果出现了超过上限的情况也会报错。一般报错内容包含optde字样。
因此针对以上两种情况。需要使用分包机制。避开这些限制。
-
mutidex使用方法
目前安卓系统已经提供了可用的方法。以studio开发为例。
defaultConfig {
applicationId "com.example.demo"
minSdkVersion 15
targetSdkVersion 22
versionCode 20180727
versionName "8.0.8"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
首先在defaultConfig中添加mutilDexEnabled 为true。之后在dependependecies中添加依赖
api 'com.android.support:multidex:1.0.1'
添加完依赖之后有两种方法可以实现分包。
- 项目中的Application子类不要直接继承Application,而是继承MultiDexApplication。例如:
public class MyApp extends MultiDexApplication {
@Override
public void onCreate(){
super.onCreate();
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false)
.sendNoSubscriberEvent(false).eventInheritance(false).build();
}
2.如果不想修改Application的继承关系。那么可以复写applicaiton子类中的attachBaseContext方法:
@Override
protected void attachBaseContext(Context base){
super.attachBaseContext(base);
MultiDex.install(this);
}
网友评论