虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的。html
多是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik Virtual Machine。java
而4.4版本的Android的「开发者选项」中已经添加了Art模式和Dalvik模式切换的功能,而前几天Google I/O宣布 下一代Android(代号L)会正式移除Dalvik。android
由于:安全
对于非预装软件,ART的编译是在手机端现场进行,这远比dalvik环境下制做optimized dex慢。带有大量java代码的应用(好比淘宝,好比微信,好比QQ)会受到很大影响,它们安装时间可达数十秒乃至超出一分钟。微信
更多关于Dalvik与Art:Link架构
-----------------------------------------------------------------socket
Dalvik在2007年Android SDK发布的时候进入人们的实现,名字来源于做者Dan Bornstein的祖先居住过Dalvik小渔村。特色:函数
Dalvik虚拟机与传统Java虚拟机并不兼容,不一样点主要有:工具
1.Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码
Java虚拟机经过解码class文件中的内容来运行程序;
Dalvik虚拟机运行的Dalvik字节码由Java字节码转换而来,并被打包成一个DEX(Dalvik Executable)可执行文件,Dalvik虚拟机经过解释DEX文件来执行这些字节码。
2.Dalvik可执行文件体积更小
Android SDK 中有一个叫作dx的工具负责将Java字节码转换为Dalvik字节码。
dx对Java类文件从新排列,消除冗余信息,避免反复加载与解析。
dx对常量池进行压缩,使相同的字符串、常量在DEX中指出现一次,减少了文件的体积。
3.Java虚拟机与Dalvik虚拟机架构不一样
Java虚拟机基于栈架构,程序运行时须要频繁从栈上读取或写入数据,耗费很多CPU时间。
Dalvik基于寄存器架构,数据访问直接经过寄存器传递。
做者经过一个例子对比Java字节码与Dalvik字节码的区别:
编译了一个Hello.class而后分别反编译成Java和Dalvik字节码:
(Sony的渣相机真够屎)
经过对比做者证实基于寄存器架构的Dalvik字节码与基于栈架构的Java字节码相比,生成的代码指令要少,执行速度会快一些。
Android系统架构采用分层思想,好处是:
Android系统由Linux内核、函数库、Android运行时、应用程序框架、应用程序 组成。
Dalvik虚拟机属于Android运行时环境,它与一些核心库共同承担Android应用程序的运行工做(这个图每次看都有新理解)。
Android系统启动加载完内核后的步骤:
Dalvik虚拟机执行程序流程:
虚拟机线程--->装载程序类--->验证字节码--->查找主类--->执行字节码流--->结束
JIT(Just-in-time Compilation,即时编译)又称动态编译,是一种经过在运行时将字节码翻译成机器码的技术,使程序执行速度更快。从Android2.2开始引入。
JIT的两种字节码编译方式:method方式和trace方式。method方式编译整个方法的代码,是的在「冷路径」上浪费不少编译时间。trace方式更快的获取热路径的代码,效率更高。Dalvik默认采用trace方式编译。