现在再说Android Runtime
和以前说的Android Runtime
有所不同了,因为现在的Android Runtime
是ART
机制,是google android4.4
新的运行机制。ART
的机制与 Dalvik
不同。在 Dalvik
下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在 ART
环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time
)。这样的话,应用的启动和执行都会变得更加快速。
开篇就说了这么多专业词是不是有点蒙了,说实话我自己也晕,因为我是应用开发,而且是半路转行做的开发,对计算机原理一类的东西认知度接近于0
,先说说以前的Dalvik
吧。知过去才能懂现在。
关于Dalvik
的文章写了好几天,本来已经总结了好几百字了,发现说的条例有点乱,后来无意中发现一位大侠写的相当好,但是太深了,所以我就直接将做了一个精简,重新整理了一下,原帖网址为http://blog.csdn.net/andyxm/article/details/6126907,文中大部分专业知识引用于此,有兴趣的童鞋可以自己做更深的研究。
我们通过四个问题来了解Dalvik:
Dalvik VM
与JVM
有什么区别?Dalvik VM
的架构是怎么样的?前三个问题下文中做了总结和引导,这第四个问题。。。尼玛,这个架构看的我是头昏眼花,研究了好久,只明白了冰山一角。反正我不明白也就不随便乱说了,有兴趣的自己去原博客看吧。
首先,回顾一下什么是java虚拟机。Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它有自己完善的硬件架构(如处理器、堆栈、寄存器等),还具有相应的指令系统。使用“Java虚拟机”程序就是为了支持与操作系统无关、在任何系统中都可以运行的程序。
因此,我们不妨对Dalvik虚拟机作出这样的描述:
Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so
),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
Dalvik VM ≠Java VM
Dalvik 执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。
Dalvik 基于寄存器,而JVM基于栈。
基于栈与基于寄存器的架构,谁更快?现在实际的处理器,大多都是基于寄存器的架构,从侧面反映出基于寄存器比基于栈的架构更与实际的处理器接近。但对于VM来说,源架构的求值栈或者寄存器都可能是用实际机器的内存来模拟的,所以性能特性与实际硬件又有不同。一般认为基于寄存器架构的Dalvik VM
比基于栈架构JVM执行效率更高,原因是:虽然零地址指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派(instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完成操作,指令分派与内存访问次数都较少。
Dalvik优势:
A. 在编译时提前优化代码而不是等到运行时
B. 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例。
C. 常量池已被修改为只使用32位的索引,以简化解释器
Dalvik VM
的新特点可以概括为:一个应用,一个虚拟机实例,一个进程!!!
每一个Android应用都运行在一个Dalvik
虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。每个进程之间可以通信(IPC
,Binder机制实现)。虚拟机的线程机制,内存分配和管理,Mutex
等等都是依赖底层操作系统而实现的。
不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。
这是android4.4
的新东西,还在研究呢,除了官网没有太多可参考的材料,加上时间有限,我就从百度百科里扒下来一部分内容略作修改,以后慢慢再做总结改进。
从 Android 4.4 开始,Google 开发者引进了新的Android 运行环境 ART(意思就是 Android Runtime
。Android 官方页面的介绍中,也将其称作新的虚拟机),以替代旧的 Dalvik VM
。它现在是实验选项,系统默认的运行环境仍然是 Dalvik
。ART
会为 Android 带来怎样的改变?AndroidPolice
网站对此进行了分析。
ART
的机制与 Dalvik
不同。在 Dalvik
下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在 ART
环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time
)。这样的话,应用的启动和执行都会变得更加快速。
根据一些基准测试,新的运行环境能够使大多数应用的执行时间减半。这意味着,CPU 消耗大、运行时间长的应用能够更加快速地完成,而一般的应用也能更加流畅,比如动画效果更顺畅,触控反馈更加即时。在多核处理器的设备上,多数情况下只需激活少量的核心,或者能够更好的利用 ARM 的 big.LITTLE
架构。另外,它将会显著提升电池的续航能力以及系统的性能。
预编译也会带来一些缺点。一方面,机器码占用的存储空间更大。字节码变为机器码之后,可能会增加 10%-20%,不过在应用包中,可执行的代码常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代码只有 6.9 MB。另一方面,应用的安装时间会变长。至于延长多少时间,取决于应用本身,一些复杂的应用如 Facebook 和 Google+ 会让你等待更长时间。
总的来说,ART 的优点还是远远超越其缺点的,运行起来更有效率、耗电更少、占的内存也更低。毕竟,影响用户体验的要素中,电池续航和应用顺畅运行更为重要。我们仍然不知道 ART 何时能够替代 Dalvik
,不过 AndroidPolice 网站说,Google 已经秘密开发了两年之久。Android 摆脱卡顿的希望,看来就是它了。