Art是Google公司对Dalvik虚拟机的一种优化,他们相同又不同,相同的是一套完全兼容Java虚拟机的接口;不同的是Dalvik虚拟机执行的是dex字节码,当程序运行时需要通过还需一个解释器,将dex字节码转换成本地机器码,而Art执行的是本地机器码,这个速度当然要快很多了。
Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。因此,ART运行时最理想的方式也是实现为一个Java虚拟机的形式,这样就可以很容易地将Dalvik虚拟机替换掉。
为什么说是优化了?
Dalvik虚拟机,在系统首次启动的场景中,系统会对/system/app、/system/priv-app、/data/app目录下的所有APK进行dex字节码到odex的优化翻译,同样也会对/system/framework目录下的APK或者JAR文件,以及这些APK所引用的外部JAR,通过进行dex字节码到odex的的翻译,这种翻译只是一种优化,并不是一步到位的直接将dex字节码翻译到字节码。当应用程序运行时,Dalvik虚拟机通过JIT动态的将odex翻译成本地字节码,这就相当的消耗内存和时间了,当然app第一次安装的时候也是相同的过程。
Art虚拟机(一般叫做运行时的),系统会对/system/app、/system/priv-app、/data/app目录下的所有APK进行dex字节码到odex的优化翻译,同样也会对/system/framework目录下的APK或者JAR文件,以及这些APK所引用的外部JAR,直接将dex字节码翻译到本地机器码,应用程序运行时直接执行本地机器码就可以了,不用做任何的转换,当然app第一次安装的是很好也是差不多的过程。
既然Art可以把dex优化生成本地机器码,那么jni调用是不是就没什么必要了?
不是的,主要有以下几点
1.功能更加细化。
2.使用的内存更少。
3.执行的效率更高。