Android多包加載

https://developer.android.com/studio/build/multidex.html#about

隨著 Android 平臺的持續(xù)成長浴韭,Android 應(yīng)用的大小也在增加狞玛。當您的應(yīng)用及其引用的庫達到特定大小時,您會遇到構(gòu)建錯誤浩姥,指明您的應(yīng)用已達到 Android 應(yīng)用構(gòu)建架構(gòu)的極限。早期版本的構(gòu)建系統(tǒng)按如下方式報告這一錯誤:

Conversion to Dalvik format failed:Unable to execute dex: method ID not in [0, 0xffff]: 65536

較新版本的 Android 構(gòu)建系統(tǒng)雖然顯示的錯誤不同,但指示的是同一問題:

trouble writing output:Too many field references: 131000; max is 65536.You may try using --multi-dex option.

這些錯誤狀況都會顯示下面這個數(shù)字:65,536相味。這個數(shù)字很重要尼酿,因為它代表的是單個 Dalvik Executable (DEX) 字節(jié)碼文件內(nèi)的代碼可調(diào)用的引用總數(shù)爷狈。本頁介紹如何通過啟用被稱為?Dalvik 可執(zhí)行文件分包的應(yīng)用配置來越過這一限制,使您的應(yīng)用能夠構(gòu)建并讀取 Dalvik 可執(zhí)行文件分包 DEX 文件裳擎。

關(guān)于 64K 引用限制

Android 應(yīng)用 (APK) 文件包含?Dalvik?Executable (DEX) 文件形式的可執(zhí)行字節(jié)碼文件涎永,其中包含用來運行您的應(yīng)用的已編譯代碼。Dalvik Executable 規(guī)范將可在單個 DEX 文件內(nèi)可引用的方法總數(shù)限制在 65,536,其中包括 Android 框架方法羡微、庫方法以及您自己代碼中的方法谷饿。在計算機科學領(lǐng)域內(nèi),術(shù)語千(簡稱 K)表示 1024(或 2^10)妈倔。由于 65,536 等于 64 X 1024博投,因此這一限制也稱為“64K 引用限制”。

如果您的?minSdkVersion?為 21 或更高值盯蝴,則不需要 Dalvik 可執(zhí)行文件分包支持庫毅哗。

Android 5.0(API 級別 21)之前的平臺版本使用 Dalvik 運行時來執(zhí)行應(yīng)用代碼。默認情況下捧挺,Dalvik 限制應(yīng)用的每個 APK 只能使用單個?classes.dex?字節(jié)碼文件虑绵。要想繞過這一限制,您可以使用?Dalvik 可執(zhí)行文件分包支持庫闽烙,它會成為您的應(yīng)用主要 DEX 文件的一部分翅睛,然后管理對其他 DEX 文件及其所包含代碼的訪問。

Android 5.0 及更高版本的 Dalvik 可執(zhí)行文件分包支持

Android 5.0(API 級別 21)及更高版本使用名為 ART 的運行時黑竞,后者原生支持從 APK 文件加載多個 DEX 文件宏所。ART 在應(yīng)用安裝時執(zhí)行預(yù)編譯,掃描classesN.dex?文件摊溶,并將它們編譯成單個?.oat?文件爬骤,供 Android 設(shè)備執(zhí)行。因此莫换,如果您的?minSdkVersion?為 21 或更高值霞玄,則不需要 Dalvik 可執(zhí)行文件分包支持庫。

:如果將應(yīng)用的?minSdkVersion?設(shè)置為 21 或更高值拉岁,使用?Instant Run?時坷剧,Android Studio 會自動將應(yīng)用配置為進行 Dalvik 可執(zhí)行文件分包。由于 Instant Run 僅適用于調(diào)試版本的應(yīng)用喊暖,您仍需配置發(fā)布構(gòu)建進行 Dalvik 可執(zhí)行文件分包惫企,以規(guī)避 64K 限制。

規(guī)避 64K 限制

在將您的應(yīng)用配置為支持使用 64K 或更多方法引用之前陵叽,您應(yīng)該采取措施減少應(yīng)用代碼調(diào)用的引用總數(shù)狞尔,包括由您的應(yīng)用代碼或包含的庫定義的方法。下列策略可幫助您避免達到 DEX 引用限制:

檢查您的應(yīng)用的直接和傳遞依賴項?- 確保您在應(yīng)用中使用任何龐大依賴庫所帶來的好處大于為應(yīng)用添加大量代碼所帶來的弊端巩掺。一種常見的反面模式是偏序,僅僅為了使用幾個實用方法就在應(yīng)用中加入非常龐大的庫。減少您的應(yīng)用代碼依賴項往往能夠幫助您規(guī)避 dex 引用限制胖替。

通過 ProGuard 移除未使用的代碼?- 為您的版本構(gòu)建啟用代碼壓縮以運行 ProGuard研儒。啟用壓縮可確保您交付的 APK 不含有未使用的代碼豫缨。

使用這些技巧使您不必在應(yīng)用中啟用 Dalvik 可執(zhí)行文件分包,同時還會減小 APK 的總體大小端朵。

配置您的應(yīng)用進行 Dalvik 可執(zhí)行文件分包

將您的應(yīng)用項目設(shè)置為使用 Dalvik 可執(zhí)行文件分包配置需要對您的應(yīng)用項目進行以下修改好芭,具體取決于應(yīng)用支持的最低 Android 版本。

如果您的?minSdkVersion?設(shè)置為 21 或更高值冲呢,您只需在模塊級?build.gradle?文件中將?multiDexEnabled?設(shè)置為?true栓撞,如此處所示:

android {

defaultConfig{...

minSdkVersion ?21

targetSdkVersion ?26

multiDexEnabled true

}...}

但是,如果您的?minSdkVersion?設(shè)置為 20 或更低值碗硬,則您必須按如下方式使用?Dalvik 可執(zhí)行文件分包支持庫

修改模塊級?build.gradle?文件以啟用 Dalvik 可執(zhí)行文件分包瓤湘,并將 Dalvik 可執(zhí)行文件分包庫添加為依賴項,如此處所示:

android {

defaultConfig

{...

minSdkVersion ?15

targetSdkVersion ??26

multiDexEnabled true ?

}...}

dependencies{

compile 'com.android.support:multidex:1.0.1'

}

根據(jù)是否要替換?Application?類恩尾,執(zhí)行以下操作之一:

如果您沒有替換?Application?類弛说,請編輯清單文件,按如下方式設(shè)置 <?application>標記中的?android:name:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

? ? ? ? ? ? ? ? ? package="com.example.myapp">

<application ?android:name="android.support.multidex.MultiDexApplication"?>

</application>

</manifest>

如果您替換了?Application?類翰意,請按如下方式對其進行更改以擴展?MultiDexApplication(如果可能):

public class MyApplication extends MultiDexApplication { ... }

或者木人,如果您替換了?Application?類,但無法更改基本類冀偶,則可以改為替換?attachBaseContext()?方法并調(diào)用?MultiDex.install(this)?來啟用 Dalvik 可執(zhí)行文件分包:

public class MyApplication extends SomeOtherApplication {

@Override

protected void attachBaseContext(Context base) {

super.attachBaseContext(context);Multidex.install(this);

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醒第,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子进鸠,更是在濱河造成了極大的恐慌稠曼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客年,死亡現(xiàn)場離奇詭異霞幅,居然都是意外死亡,警方通過查閱死者的電腦和手機量瓜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門司恳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绍傲,你說我怎么就攤上這事扔傅。” “怎么了烫饼?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵猎塞,是天一觀的道長。 經(jīng)常有香客問我枫弟,道長邢享,這世上最難降的妖魔是什么鹏往? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任淡诗,我火速辦了婚禮骇塘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘韩容。我一直安慰自己款违,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布群凶。 她就那樣靜靜地躺著插爹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪请梢。 梳的紋絲不亂的頭發(fā)上赠尾,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音毅弧,去河邊找鬼气嫁。 笑死,一個胖子當著我的面吹牛够坐,可吹牛的內(nèi)容都是我干的寸宵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼元咙,長吁一口氣:“原來是場噩夢啊……” “哼梯影!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庶香,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤甲棍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赶掖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體救军,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年倘零,在試婚紗的時候發(fā)現(xiàn)自己被綠了唱遭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈驶,死狀恐怖拷泽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袖瞻,我是刑警寧澤司致,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站聋迎,受9級特大地震影響脂矫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霉晕,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一庭再、第九天 我趴在偏房一處隱蔽的房頂上張望捞奕。 院中可真熱鬧,春花似錦拄轻、人聲如沸颅围。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院促。三九已至,卻和暖如春斧抱,著一層夾襖步出監(jiān)牢的瞬間常拓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工辉浦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墩邀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓盏浙,卻偏偏與公主長得像眉睹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子废膘,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容