Android ART
这几天在做一个项目时需要在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.cnblogs.com/programfish/
Android ART的更多相关文章
- Android ART运行时与Dalvik虚拟机
这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验. 实验内容很简单:把felix包里的feli ...
- Android ART简介
一. Android ART简介 Android DEX/ODEX/OAT文件
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
Android ART运行时无缝替换Dalvik虚拟机的过程分析 分类: Android2014-01-13 00:59 42722人阅读 评论(66) 收藏 举报 AndroidARTDalvikV ...
- android ART hook
0x00 前言 之前一直都是在Dalvik 虚拟机上在折腾,从Android 4.4开始开始引入ART,到5.0已经成为默认选择.而且最近看到阿里开源的 Dexposed 框架,已经提供了对于andr ...
- Android ART、Dalvik在multidex上的差异、关联
为提升应用运行性能,谷歌官方从5.0(api level:21)版本开始,将虚拟机运行环境默认为ART, 此处主要研究ART.Dalvik在multidex处理上的差异和关联,做了一个简单的手绘,如下 ...
- Android ART介绍
1.ART之所以会比Dalvik快,是由于ART运行的是本地机器指令,而Dalvik运行的是Dex字节码.通过通过解释器运行. 虽然Dalvik也会对频繁运行的代码进行JIT生成本地机器指令来运行,但 ...
- Android ART runtime简述
此文章原始是PPT格式已转换为PDF,完整内容也能够下载文档阅读: AndroidARTruntimeOverview watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5 ...
- Android执行时ART载入OAT文件的过程分析
在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ...
- 【朝花夕拾】Android性能篇之(五)Android虚拟机
前言 Android虚拟机的使用,使得android应用和Linux内核分离,这样做使得android系统更稳定可靠,比如程序中即使包含恶意代码,也不会直接影响系统文件:也提高了跨平台兼容性.在And ...
随机推荐
- java代码如何读取properties文件
我们在开发工程中,有时候需要在Java代码中定义一些在部署生产环境时容易改变的变量,还需要我们单独放在一个外部属性文件中,方便我们将来修改.这里列出了两种比较方便的方式. 一.在Spring配置文件中 ...
- git简单使用教程
git 的基本使用指令 我们先来简单熟悉一下 git 的简单使用的指令, 作为最基本的 git 指令一定要熟悉 12345678910111213141516171819202122232425262 ...
- php数据排序---array_multisort
PHP代码 <?php $ar1 = array(10, 100, 100, 0); $ar2 = array(1, 3, 2, 4); array_multisort($ar1, $ar2); ...
- 今天开通博客,记录我作为一个小菜鸟在iOS学习中的点点滴滴
一直以来都是默默的关注各位同仁,没有为网站作什么贡献. 现在借开始学习iOS开发的这个机会开博,集中于介绍这个过程,激励我自己. 谢谢大家!
- 客户端 HttpUtils.java
package com.http.post; import java.io.ByteArrayOutputStream; import java.io.IOException; import java ...
- Nginx配置性能优化与压力测试webbench【转】
这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...
- Inno Setup入门(二)——修改安装过程中的图片
修改安装过程中的图片 一般编译之后,安装过程中出现在左边图片是是下图这个样子的: 其实也可以修改它,只需要在setup段中作一点稍微的修改,加一行代码即可: [setup] AppName=Test ...
- MVC(@html.action)调用子操作方法
1*简单调用 子操作方法: 服务端 客户端 2.带有参数的调用 子操作方法 服务端 客户端
- 为什么要 urlencode()
1.是因为当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的2. 因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 ...
- Hibernate 系列教程6-双向多对多
双向多对多inverse配置 如果关系两边都使用默认inverse=false配置,表示关系两边都可以管理中间表的数据 关系其中一边设置inverse=true配置,表示自己放弃管理中间表关系,由对方 ...