【问题标题】:What does 'String count' mean in Dex file Android?Dex文件Android中的“字符串计数”是什么意思?
【发布时间】:2016-11-22 21:57:44
【问题描述】:

来自adt-21-preview DOC

建筑

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

我也给这个what-are-the-dex-method-and-string-limits-in-an-android-app 加红,@SamWise 回答:

启用 jumbo dex 后,字符串引用限制在 110K 和 120K 之间。

问题:

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

private String foo = "fessy";

这是否意味着 string 为 3 或值长度,在我的情况下为 5?


子问题:

我使用以下脚本 dex-method-counts 来计算方法 Count 但我没有找到任何参考来计算 String 计数。

请帮忙,

【问题讨论】:

    标签: java android dex


    【解决方案1】:

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

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

    所以,最大字符串数为 2^32 = 4294967296

    【讨论】:

    • 所以在我的情况下private String foo = "fessy"; 是字符串常量 1?
    • 字符串在写入 dex 文件之前不会有索引,然后它取决于它与 dex 文件中所有其他字符串的匹配位置。
    【解决方案2】:

    回答 OP 的具体问题:

    private String foo = "fessy";
    

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

    如果多个独立类对它们的变量/字符串文字使用相同的名称,它只会向字符串表添加一个条目。这是遵循一致命名约定(最好基于 Android 框架代码)的原因之一。除了提高可读性外,它还有助于降低字符串数量。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多