欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android分包MultiDex策略詳解

 更新時間:2017年10月30日 09:35:40   作者:灰色飄零  
這篇文章主要介紹了Android分包MultiDex策略詳解,具有一定參考價值,需要的朋友可以了解下。

1.分包背景

這里首先介紹下MultiDex的產(chǎn)生背景。

當(dāng)Android系統(tǒng)安裝一個應(yīng)用的時候,有一步是對Dex進(jìn)行優(yōu)化,這個過程有一個專門的工具來處理,叫DexOpt。DexOpt的執(zhí)行過程是在第一次加載Dex文件的時候執(zhí)行的。這個過程會生成一個ODEX文件,即Optimised Dex。執(zhí)行ODex的效率會比直接執(zhí)行Dex文件的效率要高很多。

但是在早期的Android系統(tǒng)中,DexOpt有一個問題,DexOpt會把每一個類的方法id檢索起來,存在一個鏈表結(jié)構(gòu)里面。但是這個鏈表的長度是用一個short類型來保存的,導(dǎo)致了方法id的數(shù)目不能夠超過65536個。當(dāng)一個項目足夠大的時候,顯然這個方法數(shù)的上限是不夠的。盡管在新版本的Android系統(tǒng)中,DexOpt修復(fù)了這個問題,但是我們?nèi)匀恍枰獙Φ桶姹镜腁ndroid系統(tǒng)做兼容。

為了解決方法數(shù)超限的問題,需要將該dex文件拆成兩個或多個,為此谷歌官方推出了multidex兼容包,配合AndroidStudio實現(xiàn)了一個APK包含多個dex的功能。

我們在Android開發(fā)中,會不斷的在App代碼里面增加新功能,引入新的類庫,如果不加控制的話,那么會碰到編輯器IDE爆出一下錯誤:

Error:Execution failed for task ':ttt:transformClassesWithDexForDebug'.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

這個錯誤是Android應(yīng)用的對方法總數(shù)有限制造成的。Android平臺的Java虛擬機(jī)Dalvik在執(zhí)行DEX格式的Java應(yīng)用程序時,使用原生類型short來索引DEX文件中的方法。這意味著單個DEX文件可被引用的方法總數(shù)被限制為65536。通常APK包含一個classes.dex文件,因此Android應(yīng)用的方法總數(shù)不能超過這個數(shù)量,這包括Android框架、類庫和你自己開發(fā)的代碼。

這個問題可以通過將一個DEX文件分拆成多個DEX文件解決。

2. 分包策略實現(xiàn)

Gradle 配置:

defaultConfig {  
    applicationId "XXX"
    minSdkVersion 14
    targetSdkVersion 23
    multiDexEnabled true
}
.......
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

在應(yīng)用的Application 類重寫方法:

@Override
protected void attachBaseContext(Context base) {
  super.attachBaseContext(base);
  MultiDex.install(this);
}

3.分包效果說明

經(jīng)過以上的配置,你的應(yīng)用已經(jīng)可以實現(xiàn)多個DEX文件了。當(dāng)應(yīng)用構(gòu)建時,構(gòu)建工具會分析哪些類必須放在第一個DEX文件,哪些類可以放在附加的DEX文件中。當(dāng)它創(chuàng)建了第一個DEX文件后,如果有必要會繼續(xù)創(chuàng)建附加的DEX文件,如classes2.dex, classes3.dex。Multidex的支持類庫將被包含在應(yīng)用的第一個DEX文件中,幫助實現(xiàn)對其它DEX文件的訪問。

雖然Google解決了應(yīng)用總方法數(shù)限制的問題,但并不意味著開發(fā)者可以任意擴(kuò)大項目規(guī)模。Multidex仍有一些限制:

DEX文件安裝到設(shè)備的過程非常復(fù)雜,如果第二個DEX文件太大,可能導(dǎo)致應(yīng)用無響應(yīng)。此時應(yīng)該使用ProGuard減小DEX文件的大小。

由于Dalvik linearAlloc的Bug,應(yīng)用可能無法在Android 4.0之前的版本啟動,如果你的應(yīng)用要支持這些版本就要多執(zhí)行測試。
同樣因為Dalvik linearAlloc的限制,如果請求大量內(nèi)存可能導(dǎo)致崩潰。Dalvik linearAlloc是一個固定大小的緩沖區(qū)。在應(yīng)用的安裝過程中,系統(tǒng)會運(yùn)行一個名為dexopt的程序為該應(yīng)用在當(dāng)前機(jī)型中運(yùn)行做準(zhǔn)備。dexopt使用LinearAlloc來存儲應(yīng)用的方法信息。Android 2.2和2.3的緩沖區(qū)只有5MB,Android 4.x提高到了8MB或16MB。當(dāng)方法數(shù)量過多導(dǎo)致超出緩沖區(qū)大小時,會造成dexopt崩潰。

-Multidex構(gòu)建工具還不支持指定哪些類必須包含在首個DEX文件中,因此可能會導(dǎo)致某些類庫(例如某個類庫需要從原生代碼訪問Java代碼)無法使用。

4.對開發(fā)者的建議

開發(fā)者應(yīng)該避免使用Google Guava這樣的類庫,它包含了13000多個方法。

盡量使用專為移動應(yīng)用設(shè)計的Lite/Android版本類庫,或者使用小類庫替換大類庫,例如用Google-gson替換Jackson JSON。而對于Google Protocol Buffers這樣的數(shù)據(jù)交換格式,其標(biāo)準(zhǔn)實現(xiàn)會自動生成大量的方法。采用Square Wire的實現(xiàn)則可以很好地解決此問題。

在出現(xiàn)應(yīng)用分包后低版本手機(jī)無法使用,高版本正常使用的問題時,可以考慮檢查一下分包的配置是否正確。

總結(jié)

以上就是本文關(guān)于Android分包MultiDex策略詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)內(nèi)容,如有不足之處,歡迎留言指出。

相關(guān)文章

  • 入門tensorflow教程之TensorBoard可視化模型訓(xùn)練

    入門tensorflow教程之TensorBoard可視化模型訓(xùn)練

    在本篇文章中,主要介紹 了TensorBoard 的基礎(chǔ)知識,并了解如何可視化訓(xùn)練模型中的一些基本信息,希望對大家的TensorBoard可視化模型訓(xùn)練有所幫助
    2021-08-08
  • 詳解PyCharm安裝MicroPython插件的教程

    詳解PyCharm安裝MicroPython插件的教程

    PyCharm可以說是當(dāng)今最流行的一款Python IDE了,大部分購買TPYBoard的小伙伴都會使用PyCharm編寫MicroPython的程序。這篇文章給大家介紹了PyCharm安裝MicroPython插件的教程,需要的朋友參考下吧
    2019-06-06
  • tensorflow之讀取jpg圖像長和寬實例

    tensorflow之讀取jpg圖像長和寬實例

    這篇文章主要介紹了tensorflow之讀取jpg圖像長和寬實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 一文帶你吃透Python中的日期時間模塊

    一文帶你吃透Python中的日期時間模塊

    Python?提供了?日期和時間模塊用來處理日期和時間,還可以用于格式化日期和時間等常見功能。這篇文章就來帶大家了解一下它的使用,需要的可以參考一下
    2023-02-02
  • python-pyinstaller、打包后獲取路徑的實例

    python-pyinstaller、打包后獲取路徑的實例

    今天小編就為大家分享一篇python-pyinstaller、打包后獲取路徑的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python定時器線程池原理詳解

    Python定時器線程池原理詳解

    這篇文章主要介紹了Python定時器線程池原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python正則捕獲操作示例

    Python正則捕獲操作示例

    這篇文章主要介紹了Python正則捕獲操作,結(jié)合具體實例形式分析了Python基于正則表達(dá)式的分組、捕獲、替換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 使用python下載大型文件顯示進(jìn)度條和下載時間的操作代碼

    使用python下載大型文件顯示進(jìn)度條和下載時間的操作代碼

    大家都知道下載大型文件時存在一個問題,那就是內(nèi)存使用量迅速上升,可能會造成電腦卡死,所以我們需要換一個方式進(jìn)行下載,這篇文章主要介紹了使用python下載大型文件的方法顯示進(jìn)度條和下載時間,需要的朋友可以參考下
    2022-11-11
  • 關(guān)于Python解包知識點總結(jié)

    關(guān)于Python解包知識點總結(jié)

    在本篇文章里小編給各位分享的是關(guān)于Python解包知識點總結(jié),有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-05-05
  • python之如何復(fù)制excel模板并保留表格樣式

    python之如何復(fù)制excel模板并保留表格樣式

    這篇文章主要介紹了python之如何復(fù)制excel模板并保留表格樣式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論