【问题标题】:Java byte-code injection on androidandroid上的Java字节码注入
【发布时间】:2012-01-03 12:10:30
【问题描述】:

我意识到这是不可能的,因为 Android 没有 JVM,但是有解决这个问题的方法吗?我需要为 Android 应用程序执行字节码注入操作。有什么建议吗?

【问题讨论】:

标签: java android jvm dalvik


【解决方案1】:

您不能直接将字节码注入到已加载的类/方法中。但是,您可以动态创建新类,将它们写入 dex 文件,然后动态加载它们

有关从磁盘上的 dex 文件动态加载类的更多信息,请参阅 this blog 帖子。

为了动态创建新的 dex 文件,您可能会考虑使用 dexlib component,它是 smali/baksmali 代码库的一部分,这是一个用于读取/写入 dex 文件的通用库。

或者,或者,您可以在您的应用程序中包含 smali,并以 smali 汇编格式生成您的类,然后直接使用 smali 将它们汇编成一个新的 dex 文件。

【讨论】:

    【解决方案2】:

    Android 中可以进行代码注入,请查看 Github 上托管的 Disabler 项目。

    Disabler 允许使用代码注入现有项目来动态优化、跟踪和修改 Android 项目。代码是即时注入的,无需修改旧功能来添加日志记录/分析或禁用部分流程。

    工具的主要功能:

    1. trace:进入/退出to/from方法,收集参数和退出值)
    2. 配置文件:测量方法调用的频率和持续时间
    3. 禁用:通过覆盖用户定义的方法的返回值来禁用/跳过部分程序流
    4. 延迟:在代码的某些部分(即某些包)引入延迟

    在底层,它使用 AspectJEclipse 构建机制(javacajc 取代)

    【讨论】:

    【解决方案3】:

    你想在运行时还是编译时注入?

    对于编译时——有几个非常成熟的处理java源代码/字节码的解决方案——ASM、java-assist等

    专门针对android,试试ASMDEX

    http://asm.ow2.org/doc/tutorial-asmdex.html

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2016-01-11
      相关资源
      最近更新 更多