在安卓上获取类字节码

3
我想在远程服务器上执行一个类文件(.class),并通过网络传输。由于服务器端不存在该类,而我又需要动态添加新的类,因此无法使用序列化。我不想使用RMI。
在桌面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();

有没有办法将Android上的Dalvik字节码转换为常规的类字节码,以便我可以从中重建一个.class文件并在网络上传输?谢谢。

可能更简单的方法是通过黑客手段构建一个系统,将特定的类以中间Java字节码的形式复制到Android资源系统中,这样您就可以在运行时从那里读取它们。 - Chris Stratton
@Chris Stratton,是的,这是最好的 - 也许是唯一的解决方案。我想避免它,因为它需要我的软件用户执行一个小程序。谢谢。 - Nico
1个回答

1
Android不使用`.class`文件,它使用完全不同的格式——`.dex`文件。像`dx`和`dex2jar`这样的工具大多数情况下可以相互转换,但并不完美,因为每种格式都有不同的特点,不能完全映射到另一种格式。总之,我认为最简单的方法是在桌面上编译并将所有的`.class`文件作为资源打包到您的apk中。实际执行的代码仍然是`classes.dex`,但这样您就可以检索存储的类文件并将它们发送到您的服务器。顺便说一句,将任意类文件发送到服务器进行执行听起来像是一个非常糟糕的主意,请不要在您关心的计算机上这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接