Android ART运行时与Dalvik虚拟机

这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验。

实验内容很简单:把felix包里的felix.jar包和一些bundles的jar包用android sdk里的dx及aapt工具转化为包含dex字节码的jar 包。这样使这些jar包能在Android上跑起来。(因为Android上使用的是在Dalvik虚拟机而不是标准的java虚拟机,所以“原生”的 jar包不能直接在Android上跑) 然后当我把所有的jar包转换后拷贝到已有的那台Android平板上运行它们时却报出这样的错误:

java.lang.unsupportedOperationException: can`t load this type of class file.

当时还以为是jar包转换时出错了,然后删掉了所有的包,重新下载重新转换,不料还是报这样的错。

纠结了一天后,也想到可能是因为art与Dalvik模式的问题。于是把同样的jar包拷贝到自己的Android手机(4.4.4版本运行于dalvik模式)上居然顺利运行了。然后把手机调为art模式再次运行jar包就又报平板上的报出的错误。

ART(Android Runtime)

ART 是一种执行效率更高且更省电的运行机制,ART模式在Android 4.4版本开始引入,在“开发者选项”-“选择运行模式”里可以设置。而目前最新版本的Android L将会把ART模式设为默认。

Dalvik虚拟机

用于Android上运行java的“java 虚拟机”。但它运行的不是 .class文件(java字节码),而是.dex文件(dex字节码)。 Dalvik虚拟机包含有一个解释器,用来执行dex字节码

这里必须清楚两个重要的不同的地方

Dalvik虚拟机解释执行的是dex字节码。

ART虚拟机执行的是本地机器码。(而这些本地机器码是从dex字节码转换而来)

看看如下的转换过程:

java–>java bytecode(.jar)–>dalvik bytecode(.dex)

java–>java bytecode(.jar)–>dalvik bytecode(.dex)–>optimized android runtime machine code(.odex)

ART的优势

ART采用的是AOT(Ahead-Of-Time)编译,应用在第一次安装的时候,字节码就会预先编译成机器码存储在本地。 而在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码再执行。

在App运行时,ART模式就较Dalvik模式少了解释字节码的过程,所以App的运行效率会有所提高,占用内存也会相应减少。

所以谷哥在最新的Android L版本里默认了ART模式启动,就是希望Android能摆脱卡顿这个毛病。我们也希望Android L能够如丝般顺滑,话说个人感觉Android L的纸张式设计真的很舒服很酷。

小小代价

ART模式相对于dalvik模式高效的同时也会付出些代价,由于要转换成机器码,所以APP占用的存储也会相应增加一些(详情可以见结尾的测试链 接),同时这个转换的过程是在APP的安装过程,所以APP的安装时长也会相应增加一些,但是这些都是小事,因为App只安装一次,为了运行可以如丝顺 滑,安装久那么一点也是很值得的。

ART运行时无缝替换Dalvik虚拟机

而目前的大多数的Android设备都是dalvik模式下运行的,那么ART怎么可以慢慢替换掉dalvik而又不影响原有的dalvik的使用呢?

这里由于笔者不是走Android 开发这个方向的,所以不深入去研究里面的细节,这里强烈推荐下面的博文,讲得很详细:

http://blog.csdn.net/luoshengyang/article/details/18006645 Android ART运行时无缝替换Dalvik虚拟机的过程分析

阅读推荐:

http://www.zhihu.com/topic/19905311  知乎Android Runtime (ART)

http://www.pcpop.com/doc/0/967/967006.shtml ART与Dalvik 测试对比

注意:转载请注明出处:http://www.programfish.com/blog/?p=113

欢迎访问本人个人网站:http://www.programfish.com/

时间: 2024-10-26 19:28:44

Android ART运行时与Dalvik虚拟机的相关文章

Android 源码分析-Dalvik 虚拟机创建过程

更多完整项目下载.未完待续.源码.图文知识后续上传github.可以点击关于我?联系我获取 一. 介绍Dalvik 1.java的运行需要JVM,同样android中使用了java语言,也需要一个VM.针对手机处理器和内存等硬件资源不足而推出来的一款VM,为android运行提供环境,叫DVM. 2.Dalvik虚拟机允许多个instance的存在.实际上android中的每一个app都是运行在自己VM实例之中(沙盒).每一个VM实例在linux中又是一个单独的进程,所以可以认为是同一个概念.运

ART运行时垃圾收集(GC)过程分析

ART运行时与Dalvik虚拟机一样,都使用了Mark-Sweep算法进行垃圾回收,因此它们的垃圾回收流程在总体上是一致的.但是ART运行时对堆的划分更加细致,因而在此基础上实现了更多样的回收策略.不同的策略有不同的回收力度,力度越大的回收策略,每次回收的内存就越多,并且它们都有各自的使用情景.这样就可以使得每次执行GC时,可以最大限度地减少应用程序停顿.本文就详细分析ART运行时的垃圾收集过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! ART运行

AndroidART运行时无缝替换Dalvik虚拟机的过程分析(转载)

AndroidART运行时无缝替换Dalvik虚拟机的过程分析 Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题.老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机的.毕竟在原来的系统中,大量的代码都是运行在Dalvik虚拟机里面的.开始觉得这个替换工作是挺复杂的,但是分析了相关代码之后,发现思路是很清晰的.本文就详细分析这个无缝的替换过程. 老罗的新浪微博:http://we

转 Android Dalvik虚拟机初识

首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息. Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.它有自己完善的硬件架构(如处理器.堆 栈.寄存器等),还具有相应的指令系

Android Dalvik虚拟机初识

摘自:http://blog.csdn.net/andyxm/article/details/6126907 首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息. Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计

Dalvik虚拟机JNI方法的注册过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923483 在前面一文中,我们分析了Dalvik虚拟机的运行过程.从中可以知道,Dalvik虚拟机在调用一个成员函数的时候,如果发现该成员函数是一个 JNI方法,那么就会直接跳到它的地址去执行.也就是说,JNI方法是直接在本地操作系统上执行的,而不是由Dalvik虚拟机解释器执行.由此也可看 出,JNI方法是Android应用程序与本地操作系统

Dalvik虚拟机进程和线程的创建过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923484 我们知道,在Android系统中,Dalvik虚拟机是运行Linux内核之上的.如果我们把Dalvik虚拟机看作是一台机器,那么它也有进程 和线程的概念.事实上,我们的确是可以在Java代码中创建进程和线程,也就是Dalvik虚拟机进程和线程.那么,这些Dalvik虚拟机所创建的进程 和线程与其宿主Linux内核的进程和线程有什么关

dalvik虚拟机简单介绍

首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息. Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.它有自己完善的硬件架构(如处理器.堆栈.寄存器等),还具有相应的指令系统

Android Dalvik虚拟机和ART虚拟机对比

1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.Dalvik vs ARTDalvik Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex