【问题标题】:Is bytecode manipulation safe字节码操作安全吗
【发布时间】:2015-10-12 12:55:17
【问题描述】:

使用javaassist 等API 执行字节码操作,在编译后修改类文件。但是,如果java代码被优化了,是不是就不能在错误的地方进行修改呢?有没有办法避免这个问题?普通 Java 和 Android 之间的故事有什么不同吗?

【问题讨论】:

  • 字节码从未优化过,至少在重要方面没有优化。
  • 我没有完全理解你的意思。你的意思是javac从.java到.class的转换不需要太多优化?
  • 是的,在该步骤中几乎没有进行任何优化。它主要是一个简单的翻译。实际上,优化字节码的尝试可能会破坏 JIT 编译器的优化并导致代码变慢。
  • 你的意思是混淆工具(比如 ProGuard)?
  • 而且,回答你的标题问题,字节码操作是不安全的,你总是可以产生无效的字节码,并可能导致 JVM 在加载(或执行)期间崩溃。

标签: java android java-bytecode-asm javassist bytecode-manipulation


【解决方案1】:

一个典型的 Java 程序会被编译多次。第一步,Java 源代码被翻译成Java 字节码。第二步,Java 字节码被翻译成机器码

这个过程的细节当然取决于运行代码的虚拟机。例如,Java 的早期版本不包括所谓的 just-in-time 编译器。在这种情况下,字节码是逐条指令解释的,其中字节码操作当然会对性能产生影响。但这不再是真的。 OpenJDK 的 HotSpot 虚拟机以及 Android 的 ARTDEX 运行时都执行字节码的优化。

将源代码转换为字节码的 javac 编译器执行的优化很少。您通常不应该担心 to-byte-code 转换步骤对性能的影响。但是,在某些情况下,运行时代码生成生成的字节码可能会对性能产生影响。当即时编译器观察到难以优化的字节码时,就会发生这种情况。通常,这是由难以优化的不必要的对象分配引起的。

如果你想了解这件事的细节,我已经给出了这个演示文稿,我在这里稍微谈谈这个问题:https://www.youtube.com/watch?v=XMY6HA7_h5Y

至于安全:只要字节码操作不破坏字节码,就没有问题。如果它确实损坏了字节码,Java 虚拟机将拒绝加载带有损坏代码的类。这对于 HotSpot 和 Android 都是如此,它们会在加载类之前验证任何字节码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2012-01-30
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多