虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的。

可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik Virtual Machine。

  而4.4版本的Android的「开发者选项」中已经添加了Art模式和Dalvik模式切换的功能,而前几天Google I/O宣布 下一代Android(代号L)会正式移除Dalvik。

因为:

  • 1,ART的性能比Dalvik好
  • 2,ART对dex的检验比Dalvik严格,某些经过后处理(如混淆)的dex文件即便能在Dalvik环境正常运行,但也可能无法通过ART的检查。用于代码混淆/加密的软件可能需要针对ART做出变动。
  • 3,改进了垃圾回收
  • 4,更好的debug工具

  对于非预装软件,ART的编译是在手机端现场进行,这远比dalvik环境下制作optimized dex慢。带有大量java代码的应用(比如淘宝,比如微信,比如QQ)会受到很大影响,它们安装时间可达数十秒乃至超出一分钟。

  更多关于Dalvik与Art:Link

  Introducing ART

-----------------------------------------------------------------

Dalvik虚拟机概述

Dalvik在2007年Android SDK发布的时候进入人们的实现,名字来源于作者Dan Bornstein的祖先居住过Dalvik小渔村。特点:

  1.   体积小,占用内存空间小;
  2.   专有的DEX可执行文件格式,体积小速度快;
  3.   常量池采用32位索引值,寻址更快;
  4.   基于寄存器架构(JVM基于stack),拥有完整的指令系统;
  5.   提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能。
  6.   所有的Android程序都运行在系统进程里,每一个进程对应一个Dalvik虚拟机实例。

Dalvik虚拟机与Java虚拟机的区别

  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字节码相比,生成的代码指令要少,执行速度会快一些。

Dalvik虚拟机是如何执行程序的

Android系统架构采用分层思想,好处是:

  • 减少各层之间依赖性
  • 便于独立分发
  • 容易收敛问题和错误

  Android系统由Linux内核、函数库、Android运行时、应用程序框架、应用程序 组成。

  

  Dalvik虚拟机属于Android运行时环境,它与一些核心库共同承担Android应用程序的运行工作(这个图每次看都有新理解)。

  Android系统启动加载完内核后的步骤:

  1.   执行init进程进行初始化;
  2.   读取init.rc脚本文件并启动系统中的外部程序Zygote([ˈzaɪˌɡot],受精卵)。Zygote是Android所有进程的孵化器进程;
  3.   Zygote首先初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令;
  4.   执行一个Android程序时,system_server进程通过Binder IPC方式发送命令给Zygote,Zygote收到命令后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。

  Dalvik虚拟机执行程序流程:

  虚拟机线程--->装载程序类--->验证字节码--->查找主类--->执行字节码流--->结束

即时编译JIT

  JIT(Just-in-time Compilation,即时编译)又称动态编译,是一种通过在运行时将字节码翻译成机器码的技术,使程序执行速度更快。从Android2.2开始引入。

  JIT的两种字节码编译方式:method方式和trace方式。method方式编译整个方法的代码,是的在「冷路径」上浪费很多编译时间。trace方式更快的获取热路径的代码,效率更高。Dalvik默认采用trace方式编译。

  

Android Dalvik虚拟机的更多相关文章

  1. Android逆向基础----Android Dalvik虚拟机

    Android Dalvik虚拟机的特点: l  体积小,占用内存空间小. l  专有DEX可执行文件. l  常量池采用32位索引值,寻址类方法名,字段名,常量更快. l  基于寄存器架构,并拥有一 ...

  2. 转 Android Dalvik虚拟机初识

    首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题 ...

  3. Android Dalvik虚拟机初识(转)

    原文地址:http://blog.csdn.net/andyxm/article/details/6126907 android虚拟机jvmjava优化linux内核 首先,让我们来思考下面几个问题: ...

  4. Android Dalvik 虚拟机

    简介 Android 平台虽然是使用java语言来开发应用程序,但Android程序却不是运行在标准java虚拟机上的.谷歌专门为Android平台设计了一套虚拟机来运行Android程序.它就是Da ...

  5. Android Dalvik虚拟机初识

    摘自:http://blog.csdn.net/andyxm/article/details/6126907 首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有 ...

  6. Chapter3——进入Android Dalvik虚拟机(二)

    Dalvik汇编语言基础 Dalvik虚拟机为自己设计了一套指令集,并制定了自己的指令格式和调用规范. 位描述约定如下: 每16位的字采用空格分隔开来 每个字母表示4位,每个字母按顺序从高字节开始,排 ...

  7. Dalvik虚拟机结构——1

    Dalvik核心内容:libdvm.so  主要有C语言实现,依赖于Linux内核的一部分功能:线程机制,内存管理机制,每一个Android应有都对应一个dalvik实例 Dalvik虚拟机功能:主要 ...

  8. Android ART运行时与Dalvik虚拟机

    这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验. 实验内容很简单:把felix包里的feli ...

  9. Android(java)学习笔记156:Java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

随机推荐

  1. Android Intent调用 Uri的使用几种格式

    打开百度 Uri uri = Uri.parse("http://www.baidu.com"); Intent intent =new Intent(Intent.ACTION_ ...

  2. 进程间通信IPC、LPC、RPC

    进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法.进程是计算机系统分配资源的最小单位.每个进程都有自己的一部分独立的系 ...

  3. 21. Spring Boot过滤器、监听器【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/52069490 上一篇文章已经对定义Servlet 的方法进行了说明,过滤器(Filter) ...

  4. java 发送微信客服消息

    package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...

  5. LinearLayout具体解释三:LayoutInflater创建View过程分析

    上次讲到以下这么一段代码,这段代码的作用就是解析xml文件成为view并显示到屏幕上的. @Override //设置contentview,也就是activity或fragment载入视图,即vie ...

  6. java 重定向和转发(转载)

    jsp中result的默认类型为dispatcher. dispatcher:与<jsp:forward page=""/>效果相同 redirect:与respons ...

  7. Linux 中权限的再讨论( 下 )

    前言 上篇随笔讲述了Linux中权限的大致实现机制以及目录权限的相关规则.本文将讲解Linux中的三种特殊权限:SUID,SGID,Sticky权限.看完这两篇文章,你一定会对Linux的权限有个更深 ...

  8. 顺序容器vector,deque,list的选用规则

    前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(v ...

  9. 解决Linq.ToDictionary()时的键重复问题

    今天在使用 Linq 的 ToDictionary() 时发生了异常,提示: System.ArgumentException: 已添加了具有相同键 因为以前一直没有遇到有相同键的情况,所以从来没关注 ...

  10. iOS开发之加载、滑动翻阅大量图片优化解决方案

    本文转载至 http://mobile.51cto.com/iphone-413267.htm 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制.我要详 ...