这几天在做一个项目时需要在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的使用呢?

这里强烈推荐下面的博文,讲得很详细:

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 测试对比

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

  1. Android ART运行时无缝替换Dalvik虚拟机的过程分析

    Android ART运行时无缝替换Dalvik虚拟机的过程分析 分类: Android2014-01-13 00:59 42722人阅读 评论(66) 收藏 举报 AndroidARTDalvikV ...

  2. Android虚拟机器学习总结Dalvik虚拟机创建进程和线程分析

    Dalvik调用一个成员函数时,虚拟机,假设发现,该成员函数是一个JNI办法,然后,它会直接跳转到其地址来运行.也就是说.JNI方法是直接在本地操作系统上运行的.而不是由Dalvik虚拟机解释器运行. ...

  3. Android Dalvik 虚拟机

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

  4. 转 Android Dalvik虚拟机初识

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

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

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

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

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

  7. Android Dalvik虚拟机初识

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

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

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

  9. Android ART

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

随机推荐

  1. SharePoint 2013 通过审计获取文档下载次数

    1.创建一个文档库,进入库设置,找到”Information management policy settings”,点进去,如下图: 2.分别设置”Document”.”Folder”两个,如下图: ...

  2. 无线安全审计工具 Fern WiFi Cracker

    使用这款工具前最好自定义一个MAC地址,以便隐藏我们的真实MAC地址信息. 由于Fern WiFi Cracker是图形界面的,不需要敲命令,所以操作起来比Aircrack-ng简单了许多. 首先选择 ...

  3. Atitti.java android反编译解决方案-----虚拟机方案

    Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...

  4. switch-枚举

    在swift中,如果switch的枚举,可以不写default,因为系统知道有多少种情况,如果不是枚举,必须要写default enum WBComposeToolBarButtonType:Int ...

  5. Binder中的asInterface解析

    在使用AIDL通信的时候,在Stub类中都会生成一个asInterface函数,以<Android开发艺术探索>中的例子来分析,其生成的asInterface函数源码为: /** * Ca ...

  6. 窗口activity

    android:theme="@style/FloatActivity" E:\day9\mobilesafe\res\values\style

  7. Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

    说到聚集索引,我想每个码农都明白,但是也有很多像我这样的猥程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引, 然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,, ...

  8. 【故障处理】队列等待之enq IV - contention案例

    [故障处理]队列等待之enq IV -  contention案例 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

  9. jquery中attr和prop的区别、 什么时候用 attr 什么时候用 prop (转自 芈老头 )

    jquery中attr和prop的区别. 什么时候用 attr 什么时候用 prop   在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这 ...

  10. hibernate和mybatis的区别

    本文出自 alicejiyayun原创 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的 ...