日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dex分包之--------multidex包的配置使用

發(fā)布時(shí)間:2023/12/13 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dex分包之--------multidex包的配置使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄:
  • 一、前言
  • 二、產(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.

很明顯,方法數(shù)65536上限了,那為什么直接運(yùn)行又沒問題呢??

沒辦法只好查資料:?

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限制。

原來當(dāng)android sdk大于21的時(shí)候debug自動(dòng)支持multidex;好了回到正文multidex分包

二、產(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。