3
回答
在JVM里面运行Android字节码文件(.class)是否可行?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
Android应用也是基于Java的,只是用到了一些额外的安卓的库,不同的是,dalvik虚拟机在执行安卓程序是会先将.class 文件转换为.dex文件。那么是否有办法在JVM里面通过Class Loader 动态加载一个Android .class 文件,并解释执行呢?
举报
Milk丿小庄
发帖于1年前 3回/222阅
共有3个答案 最后回答: 1年前

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

--- 共有 1 条评论 ---
Milk丿小庄感谢您的纠正。所以,如果我将Android dex文件反编译得到了 .class字节码文件,是否可以用JVM来解释执行这些字节码文件呢? 1年前 回复

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

--- 共有 3 条评论 ---
Milk丿小庄回复 @chunquedong : 好的,谢谢,我尝试一下,估计工作量也挺大的。有问题再向大家请教! 1年前 回复
chunquedong回复 @Milk丿小庄 : 理论上可以,但是像Bitmap这种类都有JNI调用,也就是说你要把它调用的C++代码移植好。 1年前 回复
Milk丿小庄你的意识是JVM能直接解释apk反编译后得到的.class文件么?Android的源码文件里面一般都会import一些Android的库,比如 android.graphics.Bitmap; android.util.Log; 这些文件对应的字节码文件能在JVM里面执行么? 1年前 回复

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

--- 共有 3 条评论 ---
Milk丿小庄回复 @fneg : 我不需要执行全部的代码,我要的只是根据需要执行特定的代码,比如我通过一个ClassLoader加载了一个Android的class文件,然后通过反射去显式的调用这个类的某个特定方法。这样有没有什么问题? 1年前 回复
fneg回复 @Milk丿小庄 : 应该执行不了,因为那个里面没有main函数入口,但是如果打包的apk里面包含了带main函数的类,而且你也知道混淆后的类名,我觉得应该可以执行的,还有就是要设置对classpath 1年前 回复
Milk丿小庄我之前想过对dalvik 进行移植,但是感觉工作量会比较大吧。因为我不是在传统的Linux上进行移植,而是在现在一种还不是很成熟的LibOS(Unikernel)上进行。所以我在想能否让JVM去直接解释执行apk反编译后的.class文件。 1年前 回复
顶部