Dex文件中的’字符串数’是什么意思?
来自adt-21-preview DOC
建造
有一个新的标志来强制dex的“巨型模式”,它允许在dex文件中有更多的字符串 ; 在project.properties中设置dex.force.jumbo = true
我在这个安卓程序和字符串限制在Android的应用程序中也是@SamWise
,其中@SamWise
回答:
使用jumbo dex时,字符串引用限制介于110K和120K之间。
题:
Dex中的String或String引用是什么? 他们的意思是变长吗? 例如,如果我写:
private String foo = "fessy";
它的意思是字符串是3还是值长度,在我的情况下是5?
子问题:
我使用以下脚本dex-method-counts来计算方法Count但是我没有找到任何计算String count的引用。
请帮忙,
所有字符串常量都存储在单个排序列表中的dex文件中。 然后通过该列表中的索引在dex文件中的其他位置引用字符串。
这些字符串索引通常是无符号的32位整数。 就实际指令而言,有2条指令可以引用字符串: const-string
和const-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。