【发布时间】:2012-01-03 12:10:30
【问题描述】:
我意识到这是不可能的,因为 Android 没有 JVM,但是有解决这个问题的方法吗?我需要为 Android 应用程序执行字节码注入操作。有什么建议吗?
【问题讨论】:
我意识到这是不可能的,因为 Android 没有 JVM,但是有解决这个问题的方法吗?我需要为 Android 应用程序执行字节码注入操作。有什么建议吗?
【问题讨论】:
您不能直接将字节码注入到已加载的类/方法中。但是,您可以动态创建新类,将它们写入 dex 文件,然后动态加载它们
有关从磁盘上的 dex 文件动态加载类的更多信息,请参阅 this blog 帖子。
为了动态创建新的 dex 文件,您可能会考虑使用 dexlib component,它是 smali/baksmali 代码库的一部分,这是一个用于读取/写入 dex 文件的通用库。
或者,或者,您可以在您的应用程序中包含 smali,并以 smali 汇编格式生成您的类,然后直接使用 smali 将它们汇编成一个新的 dex 文件。
【讨论】:
Android 中可以进行代码注入,请查看 Github 上托管的 Disabler 项目。
Disabler 允许使用代码注入现有项目来动态优化、跟踪和修改 Android 项目。代码是即时注入的,无需修改旧功能来添加日志记录/分析或禁用部分流程。
工具的主要功能:
在底层,它使用 AspectJ 和 Eclipse 构建机制(javac 被 ajc 取代)
【讨论】:
你想在运行时还是编译时注入?
对于编译时——有几个非常成熟的处理java源代码/字节码的解决方案——ASM、java-assist等
专门针对android,试试ASMDEX
【讨论】: