我正在做代碼審查,並告訴某人刪除一個只使用過一次的私有方法。他們說這並不重要,因爲dex count不會因私人方法引用而增加。這是真的?我無法通過簡單的谷歌搜索找到答案。私人方法在Android中增加Dex Count嗎?
回答
64k限制是dex文件中唯一方法引用數量的限制。方法引用由特定的類名稱,方法名稱和方法原型組成,並且在您調用方法或聲明/定義/重寫方法時創建。
所以是的,定義一個新的私有方法將添加一個方法引用到dex文件。
欲瞭解更多信息,請參見:https://source.android.com/devices/tech/dalvik/dex-format.html和https://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文件中調用。
他們說這沒關係,因爲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分析器可以幫助您確定這一點),請首先關注庫中的「修剪胖子」。否則,擔心可維護性。現在,移除該方法實際上可能會有所幫助(例如,這是一種雙線方法,不值得單獨提出)。但是,如果有方法的可維護性價值,請保持獨立。
我明白你要去的地方,但我需要更多的澄清。我在另一篇文章中讀到,有65536個空方法的類仍然會達到dex限制,dex如何影響這個?按照這個邏輯,這個類應該在它自己的dex文件中,並且沒有任何引用。 – Tiensi
@Tiensi:「我在另一篇文章中讀到,有65536個空方法的類仍然會達到dex限制」 - 我不知道情況是這樣。雖然,實際上,我懷疑一個使用64K方法的類可能無法編譯,因爲可能會有一些編譯器限制,你會首先觸及。 「按照這個邏輯,這個類應該在它自己的dex文件中,並且沒有任何引用」 - 正確。 – CommonsWare
@CommonsWare「相關性的方法引用......指的是涉及另一個DEX中方法的一個DEX」這是不正確的。內部dex和dex方法之間沒有區別。但除此之外,只有在dex文件中定義方法(私有或其他方法)的事實才會將該方法的方法引用添加到dex文件。 – JesusFreke
- 1. MobileFirst Platform 7.1 Android Dex Loader無法執行dex:方法ID不在
- 2. 我可以使用私人方法嗎?
- 3. Ruby:私人方法3:Fixnum
- 4. 增加max count azure移動服務android
- 5. 登錄私人iPhone方法
- 6. 嘲笑私人方法
- 7. 可可的私人方法?
- 8. RSpec:stubbing SFTP - 私人方法
- 9. Android Dex優化和方法計數
- 10. PHP的session_set_save_handler中的回調方法可以是私人的嗎?
- 11. jython中的私人方法開始
- 12. 控制器中的私人方法`received_messages'
- 13. 本機C++方法是以dex文件方法計數嗎?
- 14. 方法限制64K每個Android中的dex文件
- 15. 「私人方法`分裂」要求「
- 16. Android無法執行dex
- 17. 私有方法調用另一個私有方法,做對嗎?
- 18. 如何規範私人方法
- 19. 在Android應用程序中爲雙方啓動私人電話
- 20. Android私人發佈
- 21. 類之間的私人方法調用
- 22. 私人領域的公共方法
- 23. 私人方法調用noMethodError ruby
- 24. 我應該用Func <T>代替私人方法嗎?
- 25. 可以創建私人的getter和setter方法嗎?
- 26. 更改私人課程方法
- 27. 擊中65K方法DEX限制建立
- 28. 私人方法調用垃圾回收
- 29. 不能反映私人方法
謝謝耶穌。 – Tiensi