在JVM里面运行Android字节码文件(.class)是否可行?

发布于 2021-11-30 13:05:03 字数 137 浏览 877 评论 10

Android应用也是基于Java的,只是用到了一些额外的安卓的库,不同的是,dalvik虚拟机在执行安卓程序是会先将.class 文件转换为.dex文件。那么是否有办法在JVM里面通过Class Loader 动态加载一个Android .class 文件,并解释执行呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

悲喜皆因你 2021-12-03 18:30:15

我之前想过对dalvik 进行移植,但是感觉工作量会比较大吧。因为我不是在传统的Linux上进行移植,而是在现在一种还不是很成熟的LibOS(Unikernel)上进行。所以我在想能否让JVM去直接解释执行apk反编译后的.class文件。

把昨日还给我 2021-12-03 18:30:11

回复
应该执行不了,因为那个里面没有main函数入口,但是如果打包的apk里面包含了带main函数的类,而且你也知道混淆后的类名,我觉得应该可以执行的,还有就是要设置对classpath

平定天下 2021-12-03 18:30:09

把ART移植到服务器上,然后把服务器端代码最终编译成oat文件运行,感觉速度会加快不少啊

疾风者 2021-12-03 18:30:09

回复
@fneg : 我不需要执行全部的代码,我要的只是根据需要执行特定的代码,比如我通过一个ClassLoader加载了一个Android的class文件,然后通过反射去显式的调用这个类的某个特定方法。这样有没有什么问题?

冷清清 2021-12-03 18:30:07

你的意识是JVM能直接解释apk反编译后得到的.class文件么?Android的源码文件里面一般都会import一些Android的库,比如 android.graphics.Bitmap; android.util.Log; 这些文件对应的字节码文件能在JVM里面执行么?

傾城如夢未必闌珊 2021-12-03 18:29:36

回复
理论上可以,但是像Bitmap这种类都有JNI调用,也就是说你要把它调用的C++代码移植好。

如此安好 2021-12-03 18:29:15

回复
@chunquedong : 好的,谢谢,我尝试一下,估计工作量也挺大的。有问题再向大家请教!

蓝颜夕 2021-12-03 18:28:40

apk的反编译工具就是把dex文件转为.class文件的,所以当然能。

臻嫒无言 2021-12-03 17:21:55

感谢您的纠正。所以,如果我将Android dex文件反编译得到了 .class字节码文件,是否可以用JVM来解释执行这些字节码文件呢?

南汐寒笙箫 2021-12-02 20:46:12

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 的字节码文件。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文