我正在构建一个静态代码分析器,用于估算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字节码。因此,我估计可能会失去一些准确性。我对吗?或者我在这里遗失了什么?对此有任何想法或任何其他方法的建议,我会很感激。感谢
答案 0 :(得分:1)
根据Does dx conversion to dex include verification of original class files?的答案,我们会进行一些但不多的优化,但我同意检查dx
来源的建议,以获取有关实际转化的更多信息。
如果您发现转换主要是一对一,那么您当前计算Java字节码指令的策略可能会给出Dalvik指令计数的合理估计,但请记住 >许多除了简单的指令计数之外的其他因素影响性能(包括但不限于在运行时确定的值,例如用户输入,缓存性能,指令执行时间,流水线特性,非CPU资源的使用)等等,这并不能真正让你合理估计代码的“资源密集程度”(考虑一个紧密的无限while
循环的简单例子与一个包含更高指令数的循环每次迭代都要休息1秒钟。