2016-11-22 47 views
3

我正在做代碼審查,並告訴某人刪除一個只使用過一次的私有方法。他們說這並不重要,因爲dex count不會因私人方法引用而增加。這是真的?我無法通過簡單的谷歌搜索找到答案。私人方法在Android中增加Dex Count嗎?

回答

5

64k限制是dex文件中唯一方法引用數量的限制。方法引用由特定的類名稱,方法名稱和方法原型組成,並且在您調用方法或聲明/定義/重寫方法時創建。

所以是的,定義一個新的私有方法將添加一個方法引用到dex文件。


欲瞭解更多信息,請參見:https://source.android.com/devices/tech/dalvik/dex-format.htmlhttps://source.android.com/devices/tech/dalvik/dalvik-bytecode.html,這些都爲DEX格式的主要參考。

「方法參考列表」是dex文件中method_id_items的排序列表。例如請在dex-format.html的「文件佈局」部分查找「method_ids」。在頁面下方,method_id_item被定義爲由類引用,方法名稱和方法原型組成。

class_data_item部分用於定義由類定義的方法和字段。「direct_methods」和「virtual_methods」列表是指向method_ids列表中的索引列表 - 這需要method_ids列表中存在該方法的引用。

而在dalvik-bytecode.html中,invoke- *指令使用方法索引來引用要調用的方法。

有趣的是,方法引用列表本身是用一個32位大小的值定義的(在dex-format.html中搜索「method_ids_size」)。所以方法引用的列表本身可以大到4294967296個條目。

但是,當您需要引用這些方法時,問題就出現了。 invoke- *指令只使用16位來編碼方法索引。

此外,class_data項中的方法引用可以達到完整的32位。因此,理論上你可以在dex文件中定義超過64k限制的方法,只要你從未嘗試從該dex文件中調用它們即可。但是他們仍然可以從另一個dex文件中調用。

+0

謝謝耶穌。 – Tiensi

1

他們說這沒關係,因爲dex數量不會因私人方法引用而增加。這是真的?

我打算假設您擔心64K DEX方法參考限制。在這種情況下,審閱者是正確的:該代碼是否包含在方法中沒有影響。

「64K DEX方法參考限制」中相關的「方法參考」是指one DEX referring to a method in another DEX。在傳統的Android項目中,有兩個相關的DEX:您的和框架。你自己的代碼分成多少種方法並不重要。重要的是你引用的框架有多少種方法(「你」的意思是你的代碼加上你包含的任何庫模塊和JAR)。

當您在一個項目中啓用multidex時,您將代碼拆分爲多個DEX文件。每個可以引用其他DEX文件中的64K方法。這裏,「其他DEX文件」指的是由multidex創建的自己的應用程序的框架DEX和其他DEX文件。但是,AFAIK,multidex不會在DEX文件中分割單個類。由於這是一個 private方法,因此它只能被同一類中的另一個方法引用,所以這兩個方法應該在同一個DEX文件中。因此,即使在這種情況下,使私有方法不會添加到包含該方法的DEX的DEX方法引用計數。

根據JesusFreke的評論,我收回原來的位置。定義私有方法將增加DEX方法的引用計數。

這就是說,在一次性的基礎上,擔心內聯一個單獨的方法,只是爲了減少DEX方法引用計數,是過早優化恕我直言。如果您碰到DEX方法參考限制(並且Android Studio的APK分析器可以幫助您確定這一點),請首先關注庫中的「修剪胖子」。否則,擔心可維護性。現在,移除該方法實際上可能會有所幫助(例如,這是一種雙線方法,不值得單獨提出)。但是,如果有方法的可維護性價值,請保持獨立。

+0

我明白你要去的地方,但我需要更多的澄清。我在另一篇文章中讀到,有65536個空方法的類仍然會達到dex限制,dex如何影響這個?按照這個邏輯,這個類應該在它自己的dex文件中,並且沒有任何引用。 – Tiensi

+0

@Tiensi:「我在另一篇文章中讀到,有65536個空方法的類仍然會達到dex限制」 - 我不知道情況是這樣。雖然,實際上,我懷疑一個使用64K方法的類可能無法編譯,因爲可能會有一些編譯器限制,你會首先觸及。 「按照這個邏輯,這個類應該在它自己的dex文件中,並且沒有任何引用」 - 正確。 – CommonsWare

+0

@CommonsWare「相關性的方法引用......指的是涉及另一個DEX中方法的一個DEX」這是不正確的。內部dex和dex方法之間沒有區別。但除此之外,只有在dex文件中定義方法(私有或其他方法)的事實才會將該方法的方法引用添加到dex文件。 – JesusFreke