ART是否为虚拟机

art运行时最理想的方式也是实现为一个java虚拟机的形式,这样就可以很轻易得将dalvik虚拟机替换掉,即提供一套完全与java兼容的接口

三个关键参数,JNI_GetDefaultJavaVMinitArgs--获取虚拟机的默认初始化参数
JNI_CreateJavaVM--在进程中创建虚拟机实例
JNI_GetCreatedJavaVMs--获取进程中创建的虚拟机实例

实现dalvik虚拟机在libdvm.so中,ART虚拟机实现在libart.so中,也就是说libdvm.so和libart.so导出了JNI_GetDefaultJavaVMInitArgs JNI_CreatJavaVM和JNI_GetCreatedJavaVms这三个接口供外界调用。

利用系统属性值persist.sys.dalvik.vm.lib它的值要不等于libdvm.so要不等于libart.so
当等于libdvm.so时候表示当前使用的是dalvik虚拟机,如果等于libart.so就表示当前使用的是art虚拟机

从android2.2开始,包含了jit,运行时侯动态的将执行频率很高的dex字节码翻译成为本地机器码,然后在执行,提高了dalvik虚拟机的执行效率。但是dex字节码的翻译过程发生在运行过程,并且应用程序每次重新运行的时候,都要做这个翻译工作,因此,即使采用了jit,Dalvik虚拟机的总体性能还是不能与直接执行本地机器码的art虚拟机相比。

开发者开发出的应用程序经过编译和打包之后,仍然是一个包含dex字节码的apk文件,既然应用程序包含的仍然是dex字节码,而art虚拟机需要的是本地机器码,翻译过程发生在程序运行前。即为AOT,dex字节码翻译成本地机器码的最恰当的时机发生在程序安装的时候。

dalvik虚拟机安装的时候,dex——》odes也是一部优化,这个过程由安装服务packagemanagerservice请求守护进程installed来执行,对原来的应用安装过程不会产生什么影响。

应程序安装发生 在两个时机,第一个时机是系统启动的时候,第二个时机是系统启动后用户自行安装的时候,在第一个时机中,系统会对/system/app和data/app目录下的所有apk进行dex字节码到本地机器码的翻译之外,还会对/system/framework目录下的apk或者jar文件,以及这些apk所引用的外部jar,进行dex字节码到本地机器码的翻译,这样就可以保证除了应用之外,系统中除了应用之外系统中使用java来开发的系统服务也会统一的从dex字节码翻译为本地机器码。将系统的dalvik虚拟机替换成art运行时之后,系统中的代码都是由art运行时来执行,这时候不会对dalvik虚拟机产生依赖。

posted on 2015-12-29 13:03  小帅叔叔  阅读(437)  评论(0编辑  收藏  举报

导航