Dex文件中的’字符串数’是什么意思?

来自adt-21-preview DOC

建造

有一个新的标志来强制dex的“巨型模式”,它允许在dex文件中有更多的字符串 ; 在project.properties中设置dex.force.jumbo = true

我在这个安卓程序和字符串限制在Android的应用程序中也是@SamWise ,其中@SamWise回答:

使用jumbo dex时,字符串引用限制介于110K和120K之间。

题:

Dex中的StringString引用是什么? 他们的意思是变长吗? 例如,如果我写:

 private String foo = "fessy"; 

它的意思是字符串是3还是值长度,在我的情况下是5?


子问题:

我使用以下脚本dex-method-counts来计算方法Count但是我没有找到任何计算String count的引用。

请帮忙,

所有字符串常量都存储在单个排序列表中的dex文件中。 然后通过该列表中的索引在dex文件中的其他位置引用字符串。

这些字符串索引通常是无符号的32位整数。 就实际指令而言,有2条指令可以引用字符串: const-stringconst-string/jumbo 。 第一个采用16位字符串索引,第二个采用32位字符串索引。

因此,最大字符串数是2 ^ 32 = 4294967296

回答OP的具体问题:

 private String foo = "fessy"; 

这将在字符串表中添加两个新条目 ,假设没有其他类使用名为foo的变量,并且字符串"fessy"不会出现在应用程序的任何其他位置。

如果多个独立类对其变量/字符串文字使用相同的名称,则它只向字符串表添加单个条目 。 这是遵循一致命名约定(理想情况下基于Android Framework代码)的原因之一。 除了提高可读性外,它还有助于保持字符串数量较少。

您可以通过首先从apk文件中提取classes.dex,然后在偏移量56处转储4个字节的DEX标头来轻松检查字符串计数 (请参阅Dalvik可执行文件格式 ):

 $ jar xvf app.apk classes.dex && hexdump -s 56 -n 4 -e '1/4 "%d\n"' classes.dex 

(非巨型模式)dex文件的最大字符串数是2 ^ 16 = 65,536。