Android ART机制分析

摘自:http://www.2cto.com/kf/201401/270288.html
一、Android系统性能提升之路

Dalvik虚拟机作为Android平台的核心组成部分之一,允许在有限的内存资源中同时运行多个虚拟机实例。Dalvik虚拟机通过以下方式提升性能:
1、DEX代码安装时或第一次动态加载时odex化处理。
2、Android2.2版本提供了JIT机制提升性能,号称性能提升3~5倍。
3、提升硬件配置,如更多核CPU、更高频率CPU、更大的RAM等。

但是Android的系统流畅度与IOS系统还是有一定得差距。Android代码必须运行在Dalvik虚拟机上,而IOS直接是本地代码,性能差距也在情理之中。如果Android系统想拥有与IOS系统相同的系统性能。Dalvik虚拟机运行机制就成为Android系统性能提升唯一的障碍。
Android Kitkat 提供了一种与Dalvik截然不同的运行环境-ART(Android Runtime)的支持。目前用户可以选择设备的运行环境,在不久的将来ART肯定会替代Dalvik Runtime。

二、Dalvik vs ART
Dalvik运行环境使用JIT(Just-In-Time)来进行转译,应用每次运行的时候,字节码都需要通过JIT转换为机器码,这会拖慢应用的运行效率。而ART则是使用AOT进行处理(Ahead-Of-Time),并会在应用程序安装完毕时,进行预先的基础性编译作业,这就减去了JIT运行时的机器码转化时间,应用的启动和执行都会变得更加快速。ART优点:1、系统性能的显著提升。2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。3、更长的电池续航能力。
4、支持更低的硬件。
ART缺点:1、更大的存储空间占用,可能会增加10%-20%。2、更长的应用安装时间。

总的来说ART的功效就是“空间换时间”。

三、初步感知ART

1、设备如何选择ART运行环境

通过以下步骤开启:设置→关于手机→点击最下面的版本号7次→开发者模式出现→返回→进入开发者模式,然后选择runtime-使用ART
目前官方Android模拟器并不能开启ART模式,可以通过该网址下载支持ART模式的Android模拟器镜像 ( http://blog.csdn.net/coolypf/article/details/17069015

2、Dalvik切换ART后系统变化

2.1、应用安装时采用的代码优化方式不同:
Dalvik Runtime : dex2opt(http://124.16.139.131:24080/lxr/source/dalvik/dexopt/OptMain.cpp?v=android-4.0.4#f_OptMain.cpp
ART Runtime : dex2oat (https://android.googlesource.com/platform/art/+/kitkat-release/dex2oat/dex2oat.cc)

/

2.2、优化后的文件大小及格式不同:
两个运行环境产生的优化代码路径及文件名都为:/data/dalvik-cache/app/data@app@{package name}.apk@classes.dex
ART环境产生的优化代码文件大小明显比Dalvik环境产生大:
[图片上传中。。。(2)]

虽然都为.dex文件结尾,但是文件格式却是天壤之别:
ART环境文件格式:ELF Shared Object
[图片上传中。。。(3)]

Dalvik环境文件格式:
[图片上传中。。。(4)]

三、ART相关源代码

ART相关源代码下载地址:(https://android.googlesource.com/platform/art/+archive/kitkat-release.tar.gz
从源代码文件目录名称可以很清楚的了解各文件夹中相关文件的功能,我们最关心的主要有compiler、dex2oat、runtime三个文件夹:
compiler:主要负责Dalvik字节码到本地代码的转换,编译为libart-compiler.so
dex2oat :完成DEX文件到ELF文件转换。编译为dex2oat
runtime :Android ART运行时源代码,编译为libart.so
[图片上传中。。。(5)]

四、dex2oat优化流程

在应用安装时,installd通过dex2oat优化APK安装包classes.dex的Dalvik字节码为本地机器代码。整个优化为:

[图片上传中。。。(6)]

更多LLVM编译器的信息可查看:
http://llvm.org/
http://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/
http://www.chinaicexpo.com/market/1104-llvm.html

五、OAT文件格式

OAT文件其实就是基于ELF格式的一种私有文件格式。

OAT的ELF 段信息:


/

OAT的ELF export信息:
[图片上传中。。。(8)]

OAT文件加载流程,通过分析ART相关源码,当通过DexClassLoader加载一个OAT文件基本流程如下:
1、读取oatdata符号地址获取Oat数据 startAddress。
2、读取oatlastword符号地址获取OAT数据 endAddress。
3、通过startAddress和endAddress定位Oat数据。
4、解析Oat数据。构建方法定位所需数据结构。
然后就可以调用加载OAT文件的代码了。

整个的方法定位过程和Dalvik运行环境没有太大区别,读者可以通过(http://blog.csdn.net/androidsecurity/article/details/8664778)来了解如何定位到一个类的某个方法。
您可以简单的认为ART和Dalvik区别就是:Dalvik定位到的方法是Davlik字节码,但是ART定位到的方法是本地代码。仅是方法代码内容发生了变化,但是方法的定位过程基本相同。

我们以关键的地址点为分割截取OAT文件数据段:
ELF头:


/

OAT数据内容开始:(注意0x10BB位置,DexHeader开始)
[图片上传中。。。(10)]
可执行本地代码部分:


/

OAT数据结束位置:
/

具体的OAT文件格式可以查看源代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,062评论 25 707
  • 两年前阿里开源了Dexposed 项目,它能够在Dalvik上无侵入地实现运行时方法拦截,正如其介绍「enable...
    weishu阅读 4,535评论 3 42
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,360评论 2 44
  • 时间飞逝,离上次的日记过了一年了竟然。这一年,发生了太多事,你有了新恋情,现在也失去了恋情。我呢?还是一个人飘着,...
    一會兒阅读 168评论 0 1
  • 文、图/盖是那么美 秋风起,秋意浓如碧妆如灿金如丹霞如玉带缠腰层层叠叠,曲曲折折,萦萦绕绕秋色撩人心 用心作画,开...
    盖是那么美阅读 641评论 38 42