【问题标题】:What are "ins" and "outs" in Dalvik bytecode?Dalvik 字节码中的“入”和“出”是什么?
【发布时间】:2014-12-03 22:48:54
【问题描述】:

在 dex 代码中(例如,由 dexdump 工具生成),对于每个方法定义,除了“寄存器”、“insns 大小”等其他元数据之外,我还会看到“ins”和“outs”。

我正在检测 dex 代码以引入新的寄存器。仪器出现故障,我怀疑我可能必须根据我添加的新寄存器的数量来更改“输入”和“输出”值。

所以我的问题是:那些“入”和“出”代表什么?

(仅供参考:我为此使用 dexlib2。)

【问题讨论】:

  • 在 Stackoverflow 的超级用户中发布这个问题:D

标签: android dalvik dex smali


【解决方案1】:

这些字段记录在http://source.android.com/devices/tech/dalvik/dex-format.html

ins_size |此代码所针对的方法的传入参数的字数

out_size |此代码调用方法所需的传出参数空间的字数

ins_size 大部分是不言自明的——它是存储方法参数(包括隐含的“this”参数,用于非静态方法)所需的 32 位字数。所有参数都需要 1 个“单词”,除了 longs (J) 和 doubles (D),它们需要 2 个单词。

outs_size 基本上相反。 outs_size 必须设置得足够大,以容纳方法内发生的任何方法调用的参数。

如果您想检测 dex 文件而不必担心此类细节,您可以考虑使用dexlib2(为 smali/baksmali 开发并用于读取/写入 dex 文件的库)。该库在 maven repository 中提供,因此如果您使用 gradle/mvn,则可以轻松链接。

【讨论】:

  • 我正在使用 dexlib2 的 MutableMethodImplementation 进行检测。
  • 那你就不用担心来龙去脉了。当你写出新的 dex 文件时,dexlib2 会适当地计算它们。您的问题可能在于您所做的修改或类似的东西破坏了一些寄存器。我建议在应用安装期间查看 logcat 是否有任何 dalvik/art 验证错误。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多