目錄
-
什麼是dex
Dex就是Dalvik VM executes的全稱,可以認爲是安卓虛擬機的可執行程序。
-
爲什麼用到分包
大致可以分爲2個原因。
1 dex中包含的方法囊括了所有依賴的jar包和源碼中的方法。在稍微大一些的項目中,這個方法數目是很可觀的。而dex中表示方法數目的是short類型。所有最大隻能表示到65536. 因此會出現一個dex無法保存所有方法的情況,此時需要分包。這裏一般都是報錯:
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
或者其他類似的包含65536的錯誤。一般都是這個原因導致的。
2 還有一個情況是,方法數並沒有達到上限,但是安裝運行報錯。因爲在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'
添加完依賴之後有兩種方法可以實現分包。
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);
}