Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
私有方法会增加Android中的Dex计数吗?_Android_Dex - Fatal编程技术网

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

私有方法会增加Android中的Dex计数吗?,android,dex,Android,Dex,我正在做代码审查,并告诉某人删除一个只使用过一次的私有方法。他们说这无关紧要,因为私有方法引用不会增加dex计数。这是真的吗?我无法通过简单的谷歌搜索找到答案 他们说这无关紧要,因为私有方法引用不会增加dex计数。这是真的吗 我假设您担心64K DEX方法参考极限。在这种情况下,被审查者是正确的:此代码是否包装在方法中没有影响 “64K DEX方法参考限值”中相关的“方法参考”是指。在传统的Android项目中,有两个相关性指标:你的和框架的。您自己的代码被划分成多少个方法并不重要。重要的是您引

我正在做代码审查,并告诉某人删除一个只使用过一次的私有方法。他们说这无关紧要,因为私有方法引用不会增加dex计数。这是真的吗?我无法通过简单的谷歌搜索找到答案

他们说这无关紧要,因为私有方法引用不会增加dex计数。这是真的吗

我假设您担心64K DEX方法参考极限。在这种情况下,被审查者是正确的:此代码是否包装在方法中没有影响

“64K DEX方法参考限值”中相关的“方法参考”是指。在传统的Android项目中,有两个相关性指标:你的和框架的。您自己的代码被划分成多少个方法并不重要。重要的是您引用了多少个框架方法(我所说的“您”是指您的代码加上您包含的任何库模块和JAR)

在项目上启用multidex时,将代码拆分为多个DEX文件。每个都可以引用其他DEX文件中的64K方法。然而,在这里,“其他DEX文件”指的是框架DEX和由multidex创建的您自己的应用程序的其他DEX文件。但是,好吧,multidex不会在DEX文件中拆分单个类。由于这是一个
private
方法,因此它只能由同一类中的另一个方法引用,因此这两个方法应该位于同一个DEX文件中。因此,即使在这种情况下,拥有私有方法也不会增加包含该方法的DEX的DEX方法引用计数

基于JesusFreke的评论,我收回了我原来的立场。定义私有方法将增加DEX方法引用计数


这就是说,在一次性的基础上,担心内联单个方法,只是为了减少DEX方法引用计数,是过早的优化IMHO。如果您正朝着DEX方法引用限制前进(androidstudio的APK分析器可以帮助您确定这一点),首先要担心库中的“修剪脂肪”。否则,请担心可维护性。现在,删除该方法实际上可能会有所帮助(例如,它是一个两行的方法,不值得单独删除)。但是,如果拥有该方法有可维护性价值,就不要管它。

64k限制是对dex文件中唯一方法引用数量的限制。方法引用由特定的类名、方法名和方法原型组成,并在调用方法或声明/定义/重写方法时创建

因此,是的,定义一个新的私有方法将向dex文件添加一个方法引用


有关更多信息,请参阅:和,它们是dex格式的主要参考

“方法参考列表”是dex文件中方法id项的排序列表。e、 g.在的“文件布局”部分中查找“方法ID”。再往下看,method_id_项被定义为由类引用、方法名称和方法原型组成

class_data_item部分用于定义该类定义的方法和字段。“直接_方法”和“虚拟_方法”列表是方法_id列表中的索引列表,这要求方法_id列表中存在该方法的引用

在中,invoke-*指令使用方法索引来引用要调用的方法

有趣的是,方法引用列表本身是用32位大小值定义的(在中搜索“method_id_size”)。因此,方法引用列表本身可以多达4294967296个条目

但是,当您需要引用这些方法中的任何一种时,就会出现问题。invoke-*指令仅使用16位对方法索引进行编码


此外,class_数据项中的方法引用最多可达到32位。因此,从理论上讲,可以在dex文件中定义超过64k限制的方法,只要您从未实际尝试从该dex文件中调用它们。但它们仍然可以从另一个dex文件调用。

我理解您的部分意图,但我需要进一步澄清。我在另一篇文章中读到,一个拥有65536个空方法的类仍然会达到dex限制,dex是如何影响这一点的?按照这个逻辑,这个类应该在它自己的dex文件中,并且没有任何引用。@Tiensi:“我在另一篇文章中读到,一个有65536个空方法的类仍然会达到dex限制”——我不知道是这样的。不过,事实上,我怀疑一个具有64K方法的类可能无法编译,因为您可能会首先遇到一些编译器限制。“按照这个逻辑,这个类应该在它自己的dex文件中,并且没有任何引用”--正确。@commonware“相关的方法引用…指的是一个dex引用另一个dex中的方法”这是不正确的。索引内方法参考和索引间方法参考之间没有区别。但除此之外,仅仅是在dex文件中定义了方法(私有或其他)这一事实就将该方法的方法引用添加到了dex文件中。@JesusFreke:好的。我怎样才能使你所说的和安迪·法登在那个答案中所写的相一致呢?我想你误读了他所说的。看起来你在阅读以“我想指出,限制是在引用的方法数量上,而不是定义的方法数量上”开头的段落。这只是一个示例,用于说明从外部dex文件引用的方法也包括在方法引用列表中。“引用的方法”和“定义的方法”的集合不是互斥的——区别在于从外部dex文件引用的方法集合。