在android上获取类字节码

时间:2015-03-06 19:47:15

标签: android bytecode dalvik android-package-managers bytecode-manipulation

我想在线路上发送一个类文件(.class),以便在远程服务器上执行。我不能使用序列化,因为该类在服务器端不存在,我想动态添加新类。我不想使用RMI。

在Dekstop Java上,它很容易做到:

  • 使用Class<?> clazz = Class.forName("mypackage.MyClass")加载课程。
  • 使用URL url = clazz.getResource("MyClass.class")
  • 访问文件(或jar容器)

在Android上,我成功加载了一个具有此hack的类实例,但clazz.getResource()始终返回null。 (这是合乎逻辑的,因为Dalvik存储格式不同)。

我尝试过Apache BCEL,但它不起作用。以下代码抛出ClassNotFoundException

 JavaClass clazz = Repository .lookupClass("mypackage.mMyClass");
 byte[] b = clazz.getBytes();

有没有办法将Dalvik字节代码转换为Android上的常规类字节代码,以便我可以从中重建.class文件,然后通过网络发送它?

感谢。

1 个答案:

答案 0 :(得分:1)

Android不使用.class个文件。它使用.dex个文件,这是一种完全不同的格式。诸如dxdex2jar之类的工具可以在大多数时间来回翻译,但它并不完美,因为每种格式都有不同的功能,而这些功能并不完全映射到另一种格式。

无论如何,我认为最简单的方法是在桌面上编译它并将所有.class文件捆绑为apk中的资源。执行的实际代码仍然是classes.dex,但这样您就可以检索存储的类文件并将它们发送到您的服务器。

顺便说一句,将任意类文件发送到服务器执行听起来像是一个非常非常糟糕的主意。请不要在您关心的任何计算机上执行此操作。