一、    Android ART简介

  1. Android DEX/ODEX/OAT文件

.class文件:JVM虚拟机(Java VM)执行的字节码文件;

.dex文件:DVM虚拟机(Dalvik VM)执行的字节码文件;

.odex文件:.dex文件经过优化生成的字节码文件;

  • oat文件:.dex文件经过dex2oat翻译生成的机器码。

1)  .class文件与.dex文件的主要区别在于:.class文件只包含一个类,而.dex文件可以包含多个类。

我们编译生成的classes.dex文件还包含第三方jar包等。

2)  (Android KK为例)USER Binary与ENG Binary的生成.odex文件区别:

USER版本的system分区:

在USER Binary中,.odex文件是在我们编译版本的时候生成的(并不是全部的apk都在编译时生成)。编译时将.dex优化生成.odex文件,我们可以看到生成.odex文件的apk中是没有.dex文件的。

下图是将LogsProvider.apk解压后的结果:

我们将Kies.apk解压后可以看到,还是包含.dex文件的(它对应的.odex文件会在烧完USER binary后第一次开机时生成在/data/dalvik-cache中,为什么不在编译时直接生成,以节省开机时间?):

ENG版本的system分区以及/data/dalvik-cache:(odex文件在ENG binary烧录完第一次开机时生成在/data/dalvik-cache)

3)  (Android L)USER Binary与ENG Binary的生成OAT文件区别:

跟Android KK类似,USER binary在我们编译时就会将apk中的dex翻译成机器码。

以Telecom.apk为例,在Telecom/arm目录下有两个xz压缩文件 ,其中Telecom.odex.xz就是OAT机器码的压缩文件,Telecom.odex.art.xz文件目前不清楚细节。

所以,USER binary在烧完第一次开机时,只需解压缩xz文件到/data/dalvik-cache中:

ENG binary在烧完第一次开机时,会将apk中的dex文件翻译成OAT文件放到/data/dalvik-cache中:

这也是为什么Android L ENG binary比USER binary第一次启动时间长很多的原因。

2. Android Dalvik

Dalvik虚拟机是Goole设计用于Android平台的Java虚拟机,Dalvik虚拟机通过解释执行dex文件,每个应用程序都对应与一个单独的Dalvik虚拟机实例。Android L之前使用的虚拟机。

3. Android ART

ART(Android Runtime)是Android 4.4以后新增加的一种运行时,主要是为了提升Android系统的流畅性。Android 4.4默认采用Dalvik,可以更改为ART,从Android L(Android 5.0)默认采用ART。

4. ART相比Dalvik的优缺点

优点:我们知道Dalvik通过解释执行dex文件,而ART则直接执行机器码,ART的执行效率比Dalvik要高很多,提升了系统的流畅性(目前感觉性能提升不是很大);

缺点:ART执行的是机器码,通过前面的分析我们知道机器码大多在烧完binary第一次开机时,翻译dex文件生成,与Dalvik相比显然这会增加启动时间;另外ART执行的OAT文件(机器码)远比Dalvik虚拟机执行的dex文件要大,会增加系统system分区以及data分区占用的空间。

Android ART简介的更多相关文章

  1. JVM Davilk ART 简介 区别

    JVM和DVM JavaSE 程序使用的虚拟机叫 Java Virtual Machine,简称 JVM.Android 平台虽然是使用java语言来开发应用程序,但Android程序却不是运行在标准 ...

  2. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

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

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

  4. "浅谈Android"第一篇:Android系统简介

    近来,看了一本书,名字叫做<第一行代码>,是CSDN一名博主写的,一本Android入门级的书,比较适合新手.看了书之后,有感而发,想来进行Android开发已经有一年多了,但欠缺系统化的 ...

  5. 【译】Android系统简介—— Activity

    续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面( ...

  6. 被遗忘的Android mipmaps简介

    被遗忘的 Android mipmaps 简介 [导读]已经发布的 Android Studio1.1 版本是一个 bug 修复版本.在这个版本中,当你创建工程时一项改变将会吸引你的眼球.工程创建登陆 ...

  7. Android系统简介(中):系统架构

    Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries  & Android Runtime.Linux  ...

  8. Android系统简介(上):历史渊源

    上个月,看到微信的一系列文章,讲到Linux的鼻祖-李纳斯的传记<Just for Fun>, 其人神乎其能, 其人生过程非常有趣,值得每个程序员细细品味. 而实际上,对我而已,虽然做软件 ...

  9. Android插件简介

    /** * @actor Steffen.D * @time 2015.02.06 * @blog http://www.cnblogs.com/steffen */ Android插件简介 Andr ...

随机推荐

  1. 使用GSoap开发WebService客户端与服务端

    Gsoap 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现, 从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多. 用gsoap开发web service的大致思路 我 ...

  2. HDU 2102 A计划(三维BFS)

    这题太欢乐了......虽然wa了几次,但是想到骑士在两幅图的传送门中传来传去就觉得这骑士太坑了 #include <cstdio> #include <iostream> # ...

  3. Linux安装Team Service Agent

    (1)下载linux agent文件(在windows中下载后,通过WinSCP复制至linux服务器中) 或者可以在linux直接下载文件(直接下载不会因为网络问题而导致传输中断) 首先使用命令建立 ...

  4. Mina学习之IoSession

    Session(会话)是Mina的核心部分:每当一个clinent连接到server时,都会创建一个新的session,并且保存在内存中知道该链接断开. session 是用来存储一些关于连接信息,加 ...

  5. DevExpress 用户控件 分页(上)

    说明:使用用户控件分页,完成后,使用时非常简单,数据绑定,调用自己写的一个事件就OK了 前期准备工作: (1)添加一个用户控件 命名PageCtrl (2)打开代码:   [csharp] view ...

  6. 实时的.NET程序错误监控产品Exceptionless开源了

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:实时的.NET程序错误监控产品Exceptionless开源了.

  7. 半斤八两(创业兴家版 打工仔心声'98 Remix)

    创业兴家打工仔 刻苦工作热诚日夜维系天天专心向上依足正轨 结力好比兄弟努力一生打工仔 相亲相爱朋情日夜传递彼此一家那用分高与低 要互相多鼓励 半斤八两 莫记往昔的创伤半斤八两 面对春光应插秧半斤八两 ...

  8. 动态规划入门——Eddy's research II

    转载请注明出处:http://blog.csdn.net/a1dark 分析:找规律 #include<stdio.h> int main(){ int m,n; while(scanf( ...

  9. UNIX环境高级编程---标准I/O库

    前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...

  10. android开发之Parcelable使用详解

    想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是a ...