9

我最近從Android中發現了新的MultiDex功能,用於處理具有超過65,000個引用的應用程序。請參閱:https://developer.android.com/tools/building/multidex.htmlAndroid MultiDex - 關於內部工作的問題

有人可以幫助我瞭解以下問題:

1)如何在搖籃建立插件決定要放什麼東西在主DEX文件(classes.dex)與二級DEX文件?基於文檔,某些東西需要在主要的dex中,但它沒有給出任何示例。所有活動都需要在主要的dex文件中嗎?

引用的文字:

有關於在Dalvik運行時執行時 需要什麼類的主DEX文件複雜的要求。 Android 構建工具更新處理Android要求,但它是 其他包含的庫可能具有附加依賴關係 要求,包括使用內省或調用本地代碼的Java 方法。有些庫可能無法使用 ,直到multidex構建工具更新爲允許您指定 必須包含在主dex文件中的類。

2)當僅針對Android API Level 21(Android L)及更高版本構建時,Gradle Build Plugin中存在不同的行爲。它說速度要快得多,因爲它「將應用程序的每個模塊(包括依賴項)構建爲單獨的dex文件,這通常稱爲預分離。」 Android中模塊的定義是什麼?這是這裏提到的Java庫,Android庫和Android應用程序模塊:http://developer.android.com/sdk/installing/studio-build.html#projectModules?遠程或本地二進制相關性(例如:Jars)是否作爲單獨的模塊計算,從而被放入不同的dex文件中,還是根據它們被包含在模塊中?

回答

4

1)Gradle插件內部使用Proguard在intermediates/multi-dex構建文件夾中創建兩個jar文件。其中一個將是主要的dex,其餘的將分佈在dex 2,3等

collect{variant}MultiDexComponents任務負責爲proguard創建keep文件,您可以看到該文件和其他proguard參數在變體中使用我上面提到的文件夾的特定子目錄。希望從長遠來看這將是可定製的。

目前在gradle插件的1.0.0-rc1(https://code.google.com/p/android/issues/detail?id=80741)中還有一個與測試項目相關的bug。通過一些小的更改,我發佈的解決方法也可以用於將您自己的條目添加到保留列表中(從而確保您的類最終位於主dex中)。 2)模塊從Gradle角度來看是指模塊,但這些確實可以是您鏈接到的列表中提到的不同項目。如果你使用--info作爲標誌在命令行中做一個前棒棒糖gradle,你可以看到所有的dex文件都被傳遞給dx。 (請注意,這不應該是啓用multidex的版本或preDexLibraries = false)。

+0

很棒的回答。基於collect {variant} MultiDexComponents任務,活動是否始終保留在主要dex中? – AnDev123 2014-11-25 17:02:38

+0

還有一個問題:此功能是否嘗試獲取低於極限的方法數量,以便二級dex文件中的方法儘可能小?又名它刪除的方法數量是否明智? – AnDev123 2014-11-25 18:13:47

+0

它只存儲*第一個jar/dex中保留列表中指定的類。在我的保存文件中,我可以看到這至少是所有活動,服務,BackupAgents和您的應用程序以及註釋。 – thoutbeckers 2014-11-25 18:22:31

12

什麼是在主dex?

有跡象表明,計算哪些類應該在主DEX被打包三個連續的任務:

收集{變種} MultiDexComponents任務

這個任務寫入所有的應用程序組件的類名(應用程序,活動,服務,接收者,提供者)根據清單文本文件。也就是說,如果你有一個未在清單中註冊的組件,它將不會被放置在main-dex中。還有其他非清單類 - 例如註釋。要查看完整列表,請查看插件源中的CreateManifestKeepList.groovy任務。
此任務的輸出是manifest_keep.txt文件。

收縮{}變種任務MultiDexComponents

這個任務調用ProGuard的創建萎縮罐子只在manifest_keep.txt文件提到的類。
此任務的輸出是componentClasses.jar文件。

創建{}變種任務MainDexClassList

此任務需要的componentClasses.jar文件,併爲每個類計算的直接引用層次結構(詳細信息見implementation)。也就是說,如果你的一個組件類有一個X類型的字段,那麼這個X類也將被添加到main-dex列表中。
該任務的輸出是maindexlist.txt,其中包含將打包到主dex中的所有類的列表。

如果我的minSdk是21,會發生什麼?

如果您的minSdk版本是21,則不運行上述任何任務 - 不需要進行主-dex列表計算。這是因爲在ART中,應用程序安裝期間所有dex文件都會轉換爲一個.oat文件。因此不需要運行時ClassLoader補丁。