1、classes.dex文件初识
    我们先把QQ_236.apk后缀改为QQ_236.zip,然后解压。发现有一个classes.dex文件,这个classes.dex是java源代码编译后生成的java字节码文件.但因为Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode(机器语言操作码)都不一样.

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvcWlmYTI5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

2、Android Dalvik虚拟机跟一般的Java虚拟机的对照介绍

tips:
①Android使用的Dalvik虚拟机载入.dex文件并翻译运行。一般的虚拟机载入.class文件进行翻译运行;
②一般的反编译步骤是:首先利用dex2jar工具将classes.dex文件转制成.jar文件。然后利用jd-gui将.jar反编译成java源代码;

③ Android系统在安装应用时对.dex进行改动和优化。结果保存在 /data/dalvik-cache文件夹。这样载入应用时无需每次都进行优化;

④JIT(just in time)是运行时环境的一部分。它把解释型语言的可运行文件程序集转换成native机器码运行。

⑤ART仍把.dex文件作为标准输入文件。可是ART会把dex文件再编译成native字节码,仍把编译后的结果保存在 /data/dalvik-cache文件夹;

3、Dalvik
    Dalvik是一个开源软件,最開始由名叫Dan Bornstein的人进行编写的。Android 4.4之前的版本号一直使用Dalvik虚拟机。

应用程序一般使用java进行编写,并编译成java虚拟机字节码。然后被转制成Dalvik字节码并保存在.dex(Dalvik运行字节码)文件和.odex(优化后的Dalvik运行字节码)文件里。

    Dalvik虚拟机跟java虚拟机不同。java虚拟机是基于栈的(stack machines),而Dalvik使用基于寄存器的架构(register-based
architecture)(须要更少的复杂的虚拟机指令集)。dx工具将java生成的.class文件转换成.dex格式。多个class文件保存在一个.dex文件里。被多个class文件使用的strings和常量在.dex文件里仅仅会包括一份存根以节省空间。
    当应用安装时Dalvik可运行文件.dex可能会被再一次改动。为了进一步优化。字节码可能被交换顺序。简单的数据结构和功能lib库可能在内部进行链接(linked inline)。

    为了优化内存占用,Dalvik虚拟机跟其它java虚拟机相比做了下面处理:①对虚拟机做了精简以节省空间;②常量池已被改动为仅使用32位索引。以简化解释;③标准的Java字节码运行8位栈指令集,局部变量必须拷贝或通过指令从栈中指定,而Dalvik使用自己的16位指令集直接操作局部变量。局部变量一般从4字节的虚拟寄存器中取出。这些使得更少的Dalvik指令数目并提升了翻译运行速率。

4、ART(Android Runtime)

Android L上默认用ART替代了Dalvik。

在Android 2.2时为Dalvik引入了JIT编译器,通过在应用运行时不断地剖析应用字节码和动态地把那些频繁运行的短的段落字节码编译成native机器码。那些未翻译成native的字节码便靠Dalvik虚拟机翻译运行。

跟Dalvik不同的是,ART引入提前编译(AOT),也就是在应用安装时便把整个应用编译成native机器码。去掉了Dalvik的翻译运行和JIT,ART提升了整个运行效率并降低了电量消耗。

    ART带来的更快的应用运行效率,优化了内存分配和垃圾回收机制。增加了新的应用调试feature(applications debugging features)和更精确的高等级的应用剖析(more
accurate high-level profiling of applications)。

    为了向后进行兼容,ART仍把.dex文件作为apk文件的一部分,可是.odex文件被ELF( Executable
and Linkable Format )文件替代了。

一旦应用程序被ART设备上的dex2oat工具编译后,执行时便是基于前面编译好的ELF可执行文件。

    ART让人不爽的地方有两个,一个是ART在应用安装时须要额外的时间进行编译。还有一个便是须要消耗大量的Flash存储空间来保存编译出来的字节码。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvcWlmYTI5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

Dalvik和ART简单介绍的更多相关文章

  1. Android开发——JVM、Dalvik以及ART的区别【转帖】

    转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52354964 0. 前言 Dalvik是Google公司自己设计用于Android平 ...

  2. Android Dalvik、ART及APK编译过程

    0.1 先对Dalvik以及ART做简单介绍: 什么是Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机.dex格式是专为Dalvik应用设计的一种压缩格式, ...

  3. [转]Oracle数据库ASH和AWR的简单介绍

    在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容.       1.10g之前 用户的连接将产生会话,当 ...

  4. Android发展简单介绍

    Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动 ...

  5. Smali语法简单介绍

    Smali语言其实就是Davlik的寄存器语言: Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示 ...

  6. c++ 头文件 及 sort 和 vector简单介绍

    c++  sort :http://www.16kan.com/post/997260.html http://wenku.baidu.com/view/e064166daf1ffc4ffe47ac6 ...

  7. VBox虚拟机与主机(宿主)通讯原理以及socat(套接字猫)简单介绍

    前言 尝试虚拟机使用socat建立服务器端接口转发时,发现对虚拟机接入网络原理不是非常了解,于是乎上网查找资料想搞明白是怎么回事,于是乎有了这篇总结博文.socat可以在服务器端口间建立全双工通信通道 ...

  8. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  9. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

随机推荐

  1. Linux Shell Scripting Cookbook 读书笔记 7

    ping, du, ps, kill, 收集系统信息 判断网络中哪些主机是活动主机 #!/bin/bash for ip in 10.215.70.{1..255}; do ( ping $ip -c ...

  2. python 下 excel,csv 文件的读写

    python 可以用利用xlrd 库读取数据excel数据,可以用xlwt写入excel数据,用csv 操作csv文件 xlrd xlwt  python 模块 官方链接  https://pypi. ...

  3. Hadoop MapReduce编程 API入门系列之网页流量版本1(二十二)

    不多说,直接上代码. 对流量原始日志进行流量统计,将不同省份的用户统计结果输出到不同文件. 代码 package zhouls.bigdata.myMapReduce.flowsum; import ...

  4. CI中的超级对象

    CI中的超级对象就是当前控制器对象,它提供了很多属性,可以通过var_dump($this)打印所有的超级对象: load可以理解为一个加载器,加载了很多功能,可以理解为当你使用 $this -> ...

  5. List 常用方法解析

    1.Count属性 (获得List中元素数目) 2.Add( ) 在List中添加一个对象的公有方法 3.AddRange( ) 公有方法,在List尾部添加实现了ICollection接口的多个元素 ...

  6. [原创]C++中一些重要概念

    1.虚函数 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数.当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予 ...

  7. Python 中文注释报错解决方法

    代码中一旦有了中文注释便会报错. 原因 如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明. 解决方法 在第一行或是第二行加入这么一句# -- coding: utf-8 -- 完美解决

  8. VTK读取序列化图像

    vtk获取内存中图像数据 原文链接:http://blog.csdn.net/zmy3376365/article/details/7717721 内存中有段图片数据  ,使用VTK来读入,然后就可以 ...

  9. C# window服务操作

    public int GetWindowsServiceStartType(String sServiceName) //判断服务状态是手动还是禁用还是自动 { string sState = &qu ...

  10. iframe里面开启全屏allowfullscreen="true"

    <iframe id="J_iframe" width="100%" height="100%" src="client-a ...