Android dex分包方法簡介

目錄

 

什麼是dex

爲什麼用到分包 

mutidex使用方法


  • 什麼是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);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章