所以我正在尝试为 Android 编写一些低级代码,我主要担心的是我想避免 JIT 编译器(或其他任何东西)进行的所有优化。经过一些研究,最好的方法似乎是:
- 手写Java字节码
- 使用“dx”命令将其转换为dex文件
- 使用指定了“-Xverify:none -Xdexopt:none”参数的“dalvikvm”命令(通过 adb shell)在程序上运行它
我的问题是:这实际上会避免所有优化吗?之前的讨论在这里https://groups.google.com/forum/#!topic/android-platform/Y-pzP9z6xLw让我不确定,我无法通过阅读文档 100% 说服自己。
非常感谢任何一种方式的确认。
最佳答案
某些由 dexopt
执行的指令重写无法禁用。例如,对 volatile long
字段的访问必须与对 long
字段的访问进行不同的处理,并且通过用不同的指令替换 field-get 指令来处理特殊化。
dexopt
执行的优化采用指令替换的形式,通常是某种“加速”,允许 VM 少做一些工作。所有此类优化都是提前静态执行的,而不是在运行时动态执行的,因此您将获得一致的行为。启用 dexopt
优化不会引入未知数,它只是从一组已知数更改为另一组已知数。
最大的变化来源将是 Dalvik 的 JIT 编译器,您可以使用 -Xint:fast
禁用它。参见 this slightly outdated doc有关如何在系统范围内配置此内容的说明。
关于android - 关闭 Dalvik VM 的所有优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663083/