• 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的使用呢?

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

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

  • 相关阅读:
    构建业务用例
    CentOS 7使用Redis Cluster
    pymysql.err.OperationalError: (1054, "Unknown column 'aa' in 'field list'")(已解决)
    Flask框架实现登录注册功能(mysql数据库)
    C#实现登录功能(连接SQLServer数据库)
    大数据智能加工系统——纸上原型分析
    Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)
    HBase数据库基础操作
    决策树——非正常企业数目预测
    MongoDB启动报错:Unrecognized option: storage try 'mongod --help' for more information(已解决)
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6228496.html
Copyright © 2020-2023  润新知