安卓多分包-multidex的使用

當每個dex包超過65535個方法的時候,程序在運行時會報:NoClassDefFoundError

1 在build.grade中配置defaultConfig:

defaultConfig {
    ...
    // Enabling multidex support.
    multiDexEnabled true
}

2 在build.grade中配置dependencies:

dependencies {
    compile 'com.android.support:multidex:1.0.1'
}

3 使用MultiDexApplication取代Application:

① 如果沒有自定義Application,那么在AndroidManifest.xml中指定MultiDexApplication即可。
② 如果有自定義的MyApplaction extends Application,那么改成MyApplaction extends MultiDexApplication。
③ 如果有自定義的MyApplaction繼承了一個不能修改的XApplication,那么覆蓋attachBaseContext()方法,在其中調用一下MultiDex.install(this)也可以。

4 實現主要的頁面編譯在主 classes.dex 中,其它的頁面編譯到 classes1.dex中。

android studio 留了個坑,在 build.gradle 中提供了下面這種方式在項目的app目錄下放入 multidex-keep.txt 文件,文件內容是保留在 maindex 的類名列表。

// 格式如下:
com/edo/sample/mutildex_demo/MyApplication.class
com/edo/sample/mutildex_demo/MainActivity.class
defaultConfig {
    ...
    // multidex-keep.txt
     multiDexKeepFile file('multidex-keep.txt')
}

然而現實是這種方式并無卵用,實現不了我們的需求,(不太確定是否還有其它配置)。

大家都知道,將 class 打包成 classes.dex 使用的是 build-tools 下的 dx.bat 命令,所以可以從這里下手。
Note: 要在 cmd 中直接使用 dx 命令需要將其加入環境變量。

// 需要將下面的路徑加入到環境變量中。
ANDROID_SDK\build-tools\25.0.2\
 dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
  [--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
  [--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
  [--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
  [--num-threads=<n>] [--incremental] [--force-jumbo] [--no-warning]
  [--multi-dex [--main-dex-list=<file> [--minimal-main-dex]]
  [--input-list=<file>]
  [<file>.class | <file>.{zip,jar,apk} | <directory>]

使用其中的 --multi-dex --main-dex-list= multidex-keep.txt --minimal-main-dex 參數可以實現設置哪些類包含在maindex (classes.dex) 中。

// 進入項目生成的class文件所在的目錄
cd project\app\build\intermediates\classes\release
dx --dex --multi-dex --main-dex-list=multidex-keep.txt --minimal-main-dex --output ../release ../release

android studio 中也提供了配置dex參數的方式:

android {
    ...
    dexOptions {
            additionalParameters '--multi-dex', '--main-dex-list=' + file('multidex-config.txt').absolutePath, '--minimal-main-dex'
        }
}

Note:基于dex2jar和jd-gui寫了個小工具可以雙擊直接反編譯 classes.dex,猛戳下載

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容