dex分包之--------multidex包的配置使用
目錄: - 一、前言
- 二、產(chǎn)生原因
- 三、MultiDex的簡(jiǎn)要原理
- 四、MultiDex的使用
一、前言
首先說一下我遇到的情況,最近接手了一個(gè)項(xiàng)目是在已有的項(xiàng)目里進(jìn)行更新添加一些功能,然后該項(xiàng)目導(dǎo)了N多的包,在我使用Android Studio的run”App”直接安裝到手機(jī)上運(yùn)行是正常的,然后正式打包安裝后就崩潰了,當(dāng)時(shí)覺得很奇怪,然后一看日志:
trouble writing output:?
Too many field references: 131000; max is 65536.?
You may try using --multi-dex option.
沒辦法只好查資料:?
Note: While using Instant Run, Android Studio automatically configures your app for multidex when your app's minSdkVersion is set to 21 or higher. Because Instant Run only works with the debug version of your app, you still need to configure your release build for multidex to avoid the 64K limit.
大概意思就是:
如果使用Instant Run,當(dāng)app的minSdkVersion大于或等于21時(shí),Android Studio會(huì)自動(dòng)配置支持multidex,但是僅debug版本有效,release版仍然需要配置multidex來突破64K限制。
二、產(chǎn)生原因
在Android系統(tǒng)中,一個(gè)App的所有代碼都在一個(gè)Dex文件里面。Dex是一個(gè)類似Jar的存儲(chǔ)了多有Java編譯字節(jié)碼的歸檔文件。因?yàn)锳ndroid系統(tǒng)使用Dalvik虛擬機(jī),所以需要把使用Java Compiler編譯之后的class文件轉(zhuǎn)換成Dalvik能夠執(zhí)行的class文件。這里需要強(qiáng)調(diào)的是,Dex和Jar一樣是一個(gè)歸檔文件,里面仍然是Java代碼對(duì)應(yīng)的字節(jié)碼文件。當(dāng)Android系統(tǒng)啟動(dòng)一個(gè)應(yīng)用的時(shí)候,有一步是對(duì)Dex進(jìn)行優(yōu)化,這個(gè)過程有一個(gè)專門的工具來處理,叫DexOpt。DexOpt的執(zhí)行過程是在第一次加載Dex文件的時(shí)候執(zhí)行的。這個(gè)過程會(huì)生成一個(gè)ODEX文件,即Optimised Dex。執(zhí)行ODex的效率會(huì)比直接執(zhí)行Dex文件的效率要高很多。但是在早期的Android系統(tǒng)中,DexOpt有一個(gè)問題,也就是這篇文章想要說明并解決的問題。DexOpt會(huì)把每一個(gè)類的方法id檢索起來,存在一個(gè)鏈表結(jié)構(gòu)里面。但是這個(gè)鏈表的長(zhǎng)度是用一個(gè)short類型來保存的,導(dǎo)致了方法id的數(shù)目不能夠超過65536個(gè)。當(dāng)一個(gè)項(xiàng)目足夠大的時(shí)候,顯然這個(gè)方法數(shù)的上限是不夠的。盡管在新版本的Android系統(tǒng)中,DexOpt修復(fù)了這個(gè)問題,但是我們?nèi)匀恍枰獙?duì)低版本的Android系統(tǒng)做兼容。
為了解決方法數(shù)超限的問題,需要將該dex文件拆成兩個(gè)或多個(gè),為此谷歌官方推出了multidex兼容包,配合AndroidStudio實(shí)現(xiàn)了一個(gè)APK包含多個(gè)dex的功能。
三、MultiDex的簡(jiǎn)要原理?
我們以APK中有兩個(gè)dex文件為例,第二個(gè)dex文件為classes2.dex。?
兼容包在Applicaion實(shí)例化之后,會(huì)檢查系統(tǒng)版本是否支持 multidex,classes2.dex是否需要安裝。?
如果需要安裝則會(huì)從APK中解壓出classes2.dex并將其拷貝到應(yīng)用的沙盒目錄下。?
通過反射將classes2.dex注入到當(dāng)前的classloader中。?
下面引入一下官方的文檔:?
https://developer.android.com/tools/building/multidex.html#about
四、MultiDex的使用
1、在Gradle中配置使用Multidex
由于Android的Gradle插件在Android Build Tool 21.1開始支持使用multidex,所以我們需要使用Android Build Tools 21.1及以上版本,修改app目錄下的build.gradle文件,有兩點(diǎn)需要修改。
(1)在defaultConfig中添加multiDexEnabled true這個(gè)配置項(xiàng)。?
(2)在dependencies中添加multidex的依賴:?
compile ‘com.android.support:multidex:1.0.1’
2、在Gradle中配置好之后,我們還需要在代碼中加入支持multidex的功能,有三種方案可選
方案一:在manifest文件中指定Application為MultiDexApplication,如下:
方案二:寫一個(gè)Application類并繼承MultiDexApplication,并在AndroidManifest.xml的application標(biāo)簽中進(jìn)行注冊(cè)(在application標(biāo)簽中增加name屬性,并添加自己的Application類名即可),如果不是想重寫MultiDexApplication中一些方法的話,還是方案一更方便些。如下:
注冊(cè)如下:
方案三:如果不想按方案二繼承,我們可以重寫Application的attachBaseContext方法,注意,這個(gè)方法比onCreate方法先執(zhí)行。具體方法是創(chuàng)建一個(gè)新類,繼承Application,然后重寫attachBaseContext方法,并在AndroidManifest.xml的application標(biāo)簽中進(jìn)行注冊(cè)(與方案二注冊(cè)相同)如下:
對(duì)于在AndroidManifest.xml中注冊(cè),與方案二的注冊(cè)相同。
總結(jié)
以上是生活随笔為你收集整理的dex分包之--------multidex包的配置使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行燃梦信用卡大湾区版额度多少?可以这么
- 下一篇: live555 接收rtsp视频流流程分