java - 是否可以通过分析Java字节码来估计Dalvik字节码执行的指令数

标签 java android bytecode dalvik

我正在构建一个静态代码分析器,用于估计 Android 应用程序中 Java 方法执行的指令数。我想知道设备方法的资源密集程度如何。因此,我很想知道运行 Dalvik 字节码时执行的指令数。目前,我正在使用以下命令来获取有关要执行的指令的信息。

$ dexdump -d Class.dex | less

我知道 Dalvik 字节码是通过包装 Java 字节码创建的,就像这样

public class Foo{

  public static void main (String[] args){

  System.out.println("Here we do smt");

  }

}

$ javac Foo.java

$ dx --dex --output=foo.jar Foo.class

由于我的静态分析器的输入是应用程序的 Java 源代码。我一开始想的是把每个源文件都转成dex,然后对我需要的信息执行dexdump命令。但是,我想避免转换为 dex 文件,而是直接在源代码上使用以下命令。理想情况下,我计划使用现有工具进行 Java 代码分析。

$ javap -c Classes

但是,由于 Java VM 是基于堆栈的,而 Dalvik VM 是基于寄存器的。我对这个策略有点怀疑。我认为,尽管我比较的是相同的源代码,但 Dalvik 字节码需要的指令数量少于 Java 字节码。因此,我的估计可能会失去一些准确性。我对吗?或者我在这里遗漏了什么?对此的任何想法或对任何其他方法的建议,我将不胜感激。谢谢

最佳答案

根据Does dx conversion to dex include verification of original class files?的回答,进行了一些优化,但优化不多,但我同意检查 dx 源以获取有关实际转换的更多信息的建议。

如果您发现转换大部分是一对一的,那么您当前计算 Java 字节码指令的策略可能会给出 Dalvik 指令计数的合理估计,但请记住有 许多除了影响性能的简单指令数之外的许多其他因素(包括但绝对不限于在运行时确定的值,例如用户输入、缓存性能、指令执行时间、流水线特性、非 CPU 资源的使用等),这并不能真正为您提供代码“资源密集型”程度的合理估计(考虑紧密无限 while 循环与更高指令数的简单示例在每次迭代中包含 1 秒 hibernate 的循环)。

关于java - 是否可以通过分析Java字节码来估计Dalvik字节码执行的指令数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22579661/

相关文章:

android - 删除在 Play 商店中以 alpha 版本发布的应用程序

lua - 将所有内容保存在单个 lua 字节码 block 中?

Javap 输出 : difference static {} and public {}

java - 在常量池中看不到整数值

java - 我可以把字符串变成一个变量吗?

java检查具有不同小数的零

java - 如何检查 Whatsapp 视频通话的 Intent Activity 状态

java - GWT 日期格式

java - 使用最新的 Jetty 和 Jersey 在上传到 Heroku 的 WAR 文件中找不到依赖类

安卓工作室 : the debugger detaches but the app stops too