国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Android分包MultiDex策略詳解

2020-02-16 10:32:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.分包背景

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

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

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

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

我們?cè)贏ndroid開(kāi)發(fā)中,會(huì)不斷的在App代碼里面增加新功能,引入新的類庫(kù),如果不加控制的話,那么會(huì)碰到編輯器IDE爆出一下錯(cuò)誤:

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

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

這個(gè)問(wèn)題可以通過(guò)將一個(gè)DEX文件分拆成多個(gè)DEX文件解決。

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

Gradle 配置:

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

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

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

3.分包效果說(shuō)明

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 曲周县| 唐山市| 茶陵县| 海安县| 扶沟县| 冀州市| 龙陵县| 竹山县| 石屏县| 保定市| 策勒县| 叶城县| 拉萨市| 越西县| 乐至县| 梧州市| 本溪市| 高雄县| 天津市| 香格里拉县| 丹凤县| 博兴县| 奇台县| 防城港市| 芜湖县| 海伦市| 临汾市| 永川市| 屏东县| 长丰县| 工布江达县| 广灵县| 扬中市| 遂川县| 宽城| 大荔县| 西藏| 河曲县| 讷河市| 阜南县| 介休市|