中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在android開發中使用multdex的方法-IT藍豹為你整理

發布時間:2020-04-11 01:41:04 來源:網絡 閱讀:420 作者:楊光成 欄目:移動開發

在android開發中使用multdex的方法-IT藍豹為你整理

Android系統在安裝應用時,往往需要優化Dex,而由于處理工具DexOpt對id數目的限制,導致其處理的數目不能超過65536個,因此在Android開發中,需要使用到MultiDex來解決這個問題,MultiDex可以配合Android Studio實現一個apk包含多個dex的功能,現在就讓我們來看看MultiDex究竟是怎么一回事?

 

1、MultiDex的工作原理

關于這個問題,以APK中有兩個dex文件為例,第二個dex文件為classes2.dex。

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

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

隨著Android設備的發展,App包含的功能將越來越完善,其大小勢必會變得越來越大。當在開發App的時候由于報的大小和引用庫的原因,編譯項目時候通常會遇到下面這個錯誤:

Conversion <spanclass="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> <spanclass="hljs-title">not</span> <spanclass="hljs-title">in</span> [0, 0<spanclass="hljs-title">xffff</span>]:</span> <spanclass="hljs-number">65536</span>

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

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

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

如果你已經構建了一個AndroidApp時,并收到了這個錯誤,那么表示你有很多代碼!為什么會出現這個問題,而這個問題又怎么解決呢?且看下面分析。

3、關于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文件和它們所包含的代碼。

4、避免65K限制

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

去掉一些未使用的import和library

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

5、用Gradle配置使用Multidex

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

在應用程序中設置multidex配置,需要對對程序做以下修改:

修改Gradle的配置,支持multidex

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

修改Gradle的build如下:

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

在manifest文件中,添加MultidexApplication Class的引用,IT藍豹為你演示:

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

當然,如果重寫了 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系統版本,請先確保完整的測試和使用。

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

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

以上便是關于MultiDex的原理及使用方法的簡單介紹,如果在Android開發中,遇到65K方法限制,可以嘗試使用MultiDex來解決。


本文作者:《IT藍豹》:www.itlanbao.com

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

从江县| 自治县| 寻乌县| 汾阳市| 青龙| 沙洋县| 全椒县| 固原市| 綦江县| 绥滨县| 山西省| 曲麻莱县| 孟连| 宁津县| 南华县| 容城县| 资溪县| 丰原市| 介休市| 伊金霍洛旗| 龙南县| 清新县| 绵阳市| 六盘水市| 克东县| 灯塔市| 康保县| 武定县| 福鼎市| 遂川县| 邢台县| 阿勒泰市| 四子王旗| 汾西县| 昌宁县| 浦县| 西丰县| 云龙县| 黄浦区| 洛隆县| 舒城县|