在JVM里面运行Android字节码文件(.class)是否可行?
Android应用也是基于Java的,只是用到了一些额外的安卓的库,不同的是,dalvik虚拟机在执行安卓程序是会先将.class 文件转换为.dex文件。那么是否有办法在JVM里面通过Class Loader 动态加载一个Android .class 文件,并解释执行呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
我之前想过对dalvik 进行移植,但是感觉工作量会比较大吧。因为我不是在传统的Linux上进行移植,而是在现在一种还不是很成熟的LibOS(Unikernel)上进行。所以我在想能否让JVM去直接解释执行apk反编译后的.class文件。
回复
应该执行不了,因为那个里面没有main函数入口,但是如果打包的apk里面包含了带main函数的类,而且你也知道混淆后的类名,我觉得应该可以执行的,还有就是要设置对classpath
把ART移植到服务器上,然后把服务器端代码最终编译成oat文件运行,感觉速度会加快不少啊
回复
@fneg : 我不需要执行全部的代码,我要的只是根据需要执行特定的代码,比如我通过一个ClassLoader加载了一个Android的class文件,然后通过反射去显式的调用这个类的某个特定方法。这样有没有什么问题?
你的意识是JVM能直接解释apk反编译后得到的.class文件么?Android的源码文件里面一般都会import一些Android的库,比如 android.graphics.Bitmap; android.util.Log; 这些文件对应的字节码文件能在JVM里面执行么?
回复
理论上可以,但是像Bitmap这种类都有JNI调用,也就是说你要把它调用的C++代码移植好。
回复
@chunquedong : 好的,谢谢,我尝试一下,估计工作量也挺大的。有问题再向大家请教!
apk的反编译工具就是把dex文件转为.class文件的,所以当然能。
感谢您的纠正。所以,如果我将Android dex文件反编译得到了 .class字节码文件,是否可以用JVM来解释执行这些字节码文件呢?
android 系统中使用的虚拟机是 Dalvik虚拟机(Dalvik Virtual Machine),java 程序在执行时使用的是 Java虚拟机(Java Virtual Machine)。javac 将 java 源文件编译成 Java虚拟机 可执行的 .class 文件。dx 工具(android sdk 里面)将 java字节码文件(.class)转换成可以在 Dalvik 中执行的 .dex 文件。
dalvik 虚拟机执行的 .dex 文件是在生成 apk 过程中由 dx 转换完成的,而不是 dalvik 虚拟机转换的。
class 文件是针对 jvm 的字节码文件,dex 文件是针对 dalvik 的字节码文件。