私有方法会增加Android中的Dex Count吗?

时间:2016-11-22 17:41:46

标签: android dex

我正在进行代码审查,并告诉某人删除仅使用过一次的私有方法。他们说这没关系,因为dex count不会因私有方法引用而增加。这是真的?我无法通过简单的谷歌搜索找到答案。

2 个答案:

答案 0 :(得分: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文件中调用。

答案 1 :(得分:2)

  

他们说这并不重要,因为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分析器可以帮助你确定这个),首先要担心"修剪脂肪"在图书馆。否则,担心可维护性。现在,删除该方法实际上可能有助于此(例如,它是一个双线方法,不值得分开拉出)。但是如果在使用该方法时存在可维护性价值,请不要管它。