Android MultiDex兼容包怎麼使用?

在Android系統中安裝應用的時候,須要對Dex進行優化,但因爲其處理工具DexOpt的限制,致使其id的數目不可以超過65536個。而MultiDex兼容包的出現,就很好的解決了這個問題,它能夠配合Android Studio實現一個APK包含多個dex的功能。今天小編就和你們詳細分享下MultiDex相關概念及具體使用方法。android

 

一、MultiDex是怎麼工做的?編程

      對於這個問題,咱們經過具體實例爲你們進行分享,以APK中有兩個dex文件爲例,第二個dex文件爲classes2.dex。app

在Android應用安裝中,兼容包在Applicaion實例化以後,會檢查系統版本是否支持 multidex,classes2.dex是否須要安裝。若是須要安裝則會從APK中解壓出classes2.dex並將其拷貝到應用的沙盒目錄下。經過反射將classes2.dex注入到當前的classloader中。ide

 

二、APP的函數方法超過65K函數

隨着Android設備的發展,App包含的功能將愈來愈完善,其大小勢必會變得愈來愈大。當咱們在開發App的時候因爲報的大小和引用庫的緣由,編譯項目時候一般會遇到下面這個錯誤:工具

 Conversion <span class="hljs-keyword">to</span> Dalvik format failed: Unable <span class="hljs-keyword">to</span> execute dex: <span class="hljs-function"><span class="hljs-keyword">method</span> <span class="hljs-title">ID</span> <span class="hljs-title">not</span> <span class="hljs-title">in</span> [0, 0<span class="hljs-title">xffff</span>]:</span> <span class="hljs-number">65536</span>測試

固然,也有一些系統設備會出現如下log信息,不過反饋的都是同一個問題:優化

 

trouble writing output: Too many field references: <span class="hljs-number">131000</span>; <span class="hljs-built_in">max</span> is <span class="hljs-number">65536.</span> You may <span class="hljs-keyword">try</span> <span class="hljs-keyword">using</span> <span class="hljs-comment">--multi-dex option.</span>ui

這兩個錯誤條件顯示一個共同的數字:65536。這個數字,它表示的是你在一個dex包中的函數方法超過了65535個。spa

 

若是你已經構建了一個Android App時,並收到了這個錯誤,那麼表示你有不少代碼!爲何會出現這個問題,而這個問題又怎麼解決呢?且看下面分析。

 

三、關於65K方法限制

       Android開發人員應該都清楚,Android的全部可執行文件都存在dex文件中,其中包含已編譯的代碼來運行你的應用程序。Dalvik虛擬機對可執行dex文件的規格是有方法限制的,即一個單一的dex文件的方法總數最多爲65536,包括:

引用的Android Framework方法、library的方法及編程中寫入代碼的方法等。

     怎麼突破限制呢?很簡單,就是多生成幾個dex文件,而這個多個dex文件,就是multidex方案配置。

Multidex支持Android 5.0以前使用Dalvik Runtime執行程序代碼的版本。默認狀況下,限制應用到一個單一的classes.dex。

Dalvik字節碼文件沒APK,爲了繞過這個限制,你可使用multidex支持庫,成爲你的應用程序的主要部分和DEX文件進行管理,得到額外的dex文件,它們包含的代碼。

 

四、避免65K限制

       當肯定使用multidex的分包策略時,除了確保你的代碼是優秀的代碼之外,還須要作到如下兩個步驟:

 

去掉一些未使用的import和library

使用ProGuard去掉一些未使用的代碼

 

五、用Gradle配置使用Multidex

Android 的 Gradle插件在 Android Build Tool 21.1開始就支持使用multidex了。

 

 

在應用程序中設置multidex配置,須要對對程序作如下修改:

修改Gradle的配置,支持multidex

修改你的manifest。讓其支持multidexapplication類

修改Gradle的build以下:

 

android {     compileSdkVersion <span class="hljs-number">21</span>     buildToolsVersion <span class="hljs-string">"21.1.0"</span>      defaultConfig {         <span class="hljs-keyword">...</span>         minSdkVersion <span class="hljs-number">14</span>         targetSdkVersion <span class="hljs-number">21</span>         <span class="hljs-keyword">...</span>          // Enabling multidex support.         multiDexEnabled true     }     <span class="hljs-keyword">...</span> }  dependencies {   compile <span class="hljs-string">'com.android.support:multidex:1.0.0'</span> }

Tips: 你能夠在Gradle配置文件中的 multiDexEnabled 在 defaultConfig、buildType、productFlavor選項設置。

 

在manifest文件中,添加MultidexApplication Class的引用,以下所示:

 

<?xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span>?> <manifest xmlns:android=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>     package=<span class="hljs-string">"com.example.android.multidex.myapplication"</span>>     <application         <span class="hljs-keyword">...</span>         android:name=<span class="hljs-string">"android.support.multidex.MultiDexApplication"</span>>         <span class="hljs-keyword">...</span>     </application> </manifest>

固然,若是你重寫了 Application,就對自定義Application的繼承方式作一個修改。

 

六、Multidex的方式的侷限性

在上面的介紹中,multidex看起來感受很棒,雖然如此,但multidex仍是存在一些侷限性,具體以下:

(1)若是DEX文件太大,安裝分割dex文件是一個複雜的過程,可能會致使應用程序無響應(ANR)的錯誤。在這種狀況下,你應該儘可能的減少dex文件的大小和刪除無用的邏輯,而不是徹底依賴於multidex。

(2)在Android 4.0設備(API Level 14)以前,因爲Dalvik linearalloc bug(問題22586),multidex極可能是沒法運行的。若是但願運行在Level 14以前的Android系統版本,請先確保完整的測試和使用。

(3)應用程序使用了multiedex配置的,會形成使用比較大的內存。固然,可能還會引發dalvik虛擬機的崩潰(issue 78035)。

(4)對於應用程序比較複雜的,存在較多的library的項目。multidex可能會形成不一樣依賴項目間的dex文件函數相互調用,找不到方法。

 

以上就是安卓系統分包MultiDex的原理及使用方法的簡單介紹,你們若是在開發中,遇到65K方法限制,不妨可使用這個方法來解決。

 

相關閱讀:《Android Studio 安裝報錯:'reg'不是內部或外部命令

相關文章
相關標籤/搜索