在android開發(fā)中使用multdex的方法-IT藍豹為你整理
Android系統(tǒng)在安裝應用時,往往需要優(yōu)化Dex,而由于處理工具DexOpt對id數(shù)目的限制,導致其處理的數(shù)目不能超過65536個,因此在Android開發(fā)中,需要使用到MultiDex來解決這個問題,MultiDex可以配合Android Studio實現(xiàn)一個apk包含多個dex的功能,現(xiàn)在就讓我們來看看MultiDex究竟是怎么一回事?
1、MultiDex的工作原理
關于這個問題,以APK中有兩個dex文件為例,第二個dex文件為classes2.dex。
在Android應用安裝中,兼容包在Applicaion實例化之后,會檢查系統(tǒng)版本是否支持 multidex,classes2.dex是否需要安裝,如果需要安裝則會從APK中解壓出classes2.dex并將其拷貝到應用的沙盒目錄下。通過反射將classes2.dex注入到當前的classloader中。
2、APP的函數(shù)方法超過65K
隨著Android設備的發(fā)展,App包含的功能將越來越完善,其大小勢必會變得越來越大。當在開發(fā)App的時候由于報的大小和引用庫的原因,編譯項目時候通常會遇到下面這個錯誤:
Conversion
當然,也有一些系統(tǒng)設備會出現(xiàn)以下log信息,不過反饋的都是同一個問題:
trouble writingoutput: Too many field references:
這兩個錯誤條件顯示一個共同的數(shù)字:65536。這個數(shù)字,它表示的是你在一個dex包中的函數(shù)方法超過了65535個。
如果你已經構建了一個AndroidApp時,并收到了這個錯誤,那么表示你有很多代碼!為什么會出現(xiàn)這個問題,而這個問題又怎么解決呢?且看下面分析。
3、關于65K方法限制
Android開發(fā)人員應該都清楚,Android的所有可執(zhí)行文件都存在dex文件中,其中包含已編譯的代碼來運行你的應用程序。Dalvik虛擬機對可執(zhí)行dex文件的規(guī)格是有方法限制的,即一個單一的dex文件的方法總數(shù)最多為65536,包括:
引用的Android Framework方法、library的方法及編程中寫入代碼的方法等。
怎么突破限制呢?很簡單,就是多生成幾個dex文件,而這個多個dex文件,就是multidex方案配置。
Multidex支持Android 5.0之前使用Dalvik Runtime執(zhí)行程序代碼的版本。默認情況下,限制應用到一個單一的classes.dex。
Dalvik字節(jié)碼文件沒APK,為了繞過這個限制,你可以使用multidex支持庫,成為你的應用程序的主要部分,以及對DEX文件進行管理并獲得額外的dex文件和它們所包含的代碼。
4、避免65K限制
當確定使用multidex的分包策略時,除了確保你的代碼是優(yōu)秀的代碼以外,還需要做到以下兩個步驟:
去掉一些未使用的import和library
使用ProGuard去掉一些未使用的代碼
5、用Gradle配置使用Multidex
Android 的 Gradle插件在 Android Build Tool 21.1開始就支持使用multidex了。
在應用程序中設置multidex配置,需要對對程序做以下修改:
修改Gradle的配置,支持multidex
修改你的manifest。讓其支持multidexapplication類
修改Gradle的build如下:
android { compileSdkVersion
在manifest文件中,添加MultidexApplication Class的引用,IT藍豹為你演示:
"1.0"encoding=
當然,如果重寫了 Application,就對自定義Application的繼承方式做一個修改。
6、Multidex的方式的局限性
在上面的介紹中,multidex看起來感覺很棒,雖然如此,但multidex還是存在一些局限性,具體如下:
(1)如果DEX文件太大,安裝分割dex文件是一個復雜的過程,可能會導致應用程序無響應(ANR)的錯誤。在這種情況下,你應該盡量的減小dex文件的大小和刪除無用的邏輯,而不是完全依賴于multidex。
(2)在Android 4.0設備(API Level 14)之前,由于Dalvik linearalloc bug(問題22586),multidex很可能是無法運行的。如果希望運行在Level 14之前的Android系統(tǒng)版本,請先確保完整的測試和使用。
(3)應用程序使用了multiedex配置的,會造成使用比較大的內存。當然,可能還會引起dalvik虛擬機的崩潰(issue 78035)。
(4)對于應用程序比較復雜的,存在較多的library的項目。multidex可能會造成不同依賴項目間的dex文件函數(shù)相互調用,找不到方法。
以上便是關于MultiDex的原理及使用方法的簡單介紹,如果在Android開發(fā)中,遇到65K方法限制,可以嘗試使用MultiDex來解決。
本文作者:《IT藍豹》:www.itlanbao.com
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。