我知道Android使用自己的名为Dalvik的虚拟机,并运行.dex文件而不是.class文件。
程序通常用Java编写,并编译为字节码 Java虚拟机,然后转换为Dalvik字节码和 存储在.dex(Dalvik EXecutable)
为什么Android需要首先编译为JVM(.class)的字节码然后转换为Dalvik字节码(.dex),为什么它不能直接从.java
文件编译成Dalvik字节码? ?
如果它使用两个VM,第一个JVM然后是Dalvik,那么它不会使编译过程变慢吗?
更新:
如果我在Java中运行一个程序,它将.java
文件编译成字节码(.class
)然后解释它,如果我在Android中运行相同的程序,它将首先编译{{1将文件导入.java
,将.class
导入.class
然后再运行...相比之下,Android会不会更慢?
答案 0 :(得分:3)
为什么Android需要首先编译为JVM的字节码,然后转换为Dalvik字节码。为什么不能直接从.java文件编译成Dalvik字节码?
如果你想为此编写一个完整的编译器,它可能。 new Jack compiler for Android显然是这样做的。
通常,编写字节码转换器比编写完整编译器更容易。
那么它是否会使编译过程变慢?
转换过程会增加开销。 "慢动作"是一个意见陈述,所以我不知道字节码转换是否会使编译过程变慢"为你定义"慢"。
答案 1 :(得分:2)
Android使用Dalvik的主要原因是应用和系统范围的资源。 Dalvik运行你的应用程序的方式是分配一个已经拥有你的应用程序需要运行的大部分资源的进程(更不用说这种方法使得沙盒变得微不足道了。)
有一个伟大的(虽然旧的,因为ART是块中的新孩子)文章,关于为什么Dalvik在移动设备环境中如此有用:http://davidehringer.com/software/android/The_Dalvik_Virtual_Machine.pdf