Android中编译工具链的改动----LLVM份量的增加

作者:史宁宁

-----------------------------------------------------------------------------------转载请注明出处---------------------------------------------------------------------------------

       最近,Android中的编译工具链发生了改动,这个改动是Android的runtime(也可以说是VM,这两种说法在Google官方文档中也多次交互出现)改动引发的。之前Android采用的是Dalvik VM,在Android2.2之前,连JIT都没有使用,只是解释执行,所以速度很慢,从Android2.2之后加入了JIT之后,一直用了相当长的时间。直到ART(Android
Runtime)的出现,ART的出现也是为了进一步提高运行速度,据早期的测试结果表明,ART上的执行速度可以比Dalvik上的执行速度快一倍。所以总的来说,不管是添加JIT支持,还是现在的ART,都是为了速度更快。

         ART是在Android4.4正式出现的,就是它引起了Android中编译工具链的改动。之前Dalvik拿到.dex或者优化过的.odex文件,是使用JIT然后执行的。现在ART是直接使用LLVM去做AOT(Ahead of Time),这样的话,执行速度自然就上来了,带来的牺牲是应用的安装速度会降下来,因为AOT编译是在安装的时候做的,后续的启动和执行,都使用的是AOT之后的结果。所以等于是用一次时间牺牲,换来之后的多次时间节省。
       ART目前是和Dalvik同时存在系统中的,用户也可以自己选择。在系统中它们分别以Dalvik runtime (libdvm.so) 和 ART (libart.so)这两个库的形式存在,ART的源码位置也是在和Dalvik的同级位置,直接在Android目录下有个art目录。目前art目录下的设置基本上也是参照Dalvik的形式来的,几个工具也都是类似,只是把与原来的dexopt工具给换成了dex2oat,然后引入了LLVM去做编译的工作。到这个程度,LLVM等于已经参与了Android上的所有应用的编译工作,在art出现之前,LLVM只是处理Android
Renderscript中的rs文件。

       ART目前所带来的缺点就是占用空间增大和首次安装时间延长,这都是由AOT导致的,目前看来是没有办法避免的。还有一个问题就是目前为了同时支持Dalvik和ART,依然采用dex格式文件作为输入,但是dex格式本身就是给Dalvik所设计的可执行格式,所以如果将来真的丢掉Dalvik的话,这个dex格式就有点不伦不类了,可能到那时候这个dex格式也终将作出改变。

参考资料:

Google关于ART的介绍: https://source.android.com/devices/tech/dalvik/art.html

Dalvik: http://en.wikipedia.org/wiki/Dalvik_(software)

AOT: http://en.wikipedia.org/wiki/AOT_compiler

JIT: http://en.wikipedia.org/wiki/Just-in-time_compilation

CSDN一篇不错的分析ART机制的文章:http://blog.csdn.net/androidsecurity/article/details/17462529

一个关于ART的YOUTUBE视频:http://www.youtube.com/watch?v=USgXkI-NRPo

一篇介绍ART的很通俗易懂的文章:http://www.extremetech.com/computing/170677-android-art-google-finally-moves-to-replace-dalvik-to-boost-performance-and-battery-life

时间: 2024-12-07 20:54:03

Android中编译工具链的改动----LLVM份量的增加的相关文章

android反编译工具AXMLPrinter2.jar 解码的问题

问题描述 android反编译工具AXMLPrinter2.jar 解码的问题 用AXMLPrinter2.jar反编译安卓里的xml文件只有AndroidManifest.xml可以成功, 如果反编译layout里的布局xml文件只能看到<?xml version="1.0" encoding="utf-8"?> 解决方案 我上传了一个apksetup.exe很强悍的,下载应该可以解决你的问题 解决方案二: 这个我也用过..也是不行 dex2jar试试

总结:Android中DDMS工具的使用

问题描述 本帖最后由 邂逅潇湘 于 2015-5-21 18:01 编辑 在android-sdk-windows-1.5_r1tools目录下,有一个ddms.bat命令:在eclipse中,Window->Open Perspective->Other->DDMS.那么什么是DDMS呢?在android SDK的文档中可以找到其准确定义和使用方法,如下图:http://www.apkbus.com/data/att ... q.jpg 下面,我简单介绍一下在我的工作中使用到了哪些DD

Android 反编译apk 详解

测试环境:         win 7    使用工具:      CSDN上下载地址:        apktool (资源文件获取)  下载          dex2jar(源码文件获取) 下载        jd-gui  (源码查看) 下载          Android反编译整合工具包(最新) 下载        官方最新版本下载地址:        apktool(google code)   dex2jar(google code)      jd-gui(google cod

编译mini2440工具链

原文:http://www.adamjiang.com/pukiwiki/index.php?%E7%BC%96%E8%AF%91mini2440%E5%B7%A5%E5%85%B7%E9%93%BE          首先,从下面的地址下载工具链  http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2          等待下载完成后,将工具链解压到/usr/

[Android]转-Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)!

原文地址  一.前言:  大家好,今天给大家分享一下Android中的拿来主 义,我们时常会碰到一个自己觉得很漂亮很帅气的应用(apk),所以我们会尝试用WinRAR等之类工具查看,而一般的应用程序打包后的目录通常是这样的 如下图:   当然res里的图片是可以拿来就用的(笔者的好多应用的图片都是从别人的apk里扣出来的),而诸如layout里的布局及权限文件 (AndroidManifest.xml)已经是一堆乱码了,完全看不懂,想看看别人是怎么布局的都不容易.还有源代码都被编译成了 clas

Android中如何反编译apk文件

相信大家在安装使用了一个apk后,看到一些好的效果或实现,一般会很想知道这个是如何实现的.还好,android选的是java开发语言,所以经过一些小步骤,而作者又没有用混淆的话,差不多可以返原70 ~ 90 的java实现,下面我就来说下Android apk 的反编译步骤: 解压缩apk包:将apk文件的后缀改名为.zip,然后对zip文件进行解压. 反编译dex文件:解压apk文件后,你会发现res目录的图片没有加密,但java源码编译成了一个classes.dex文件,无法用普通的反编译c

Eclipse与Android源码中ProGuard工具的使用

由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的理解和认识简要的做个笔记,有异议或者不解的,可以直接留言. 什么是ProGuard工具? ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类.字段和函数等,达到压缩.优化和混淆代码的功能.具体来说,使用ProGuard工具

在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg0.8.1版-Android中使用FFmpeg媒体库(一)

原文:http://doandroid.info/?p=465 最近想通过FFmpeg库来练习在Android中使用其他第三方库进行开发.本文基本按照Ubuntu 10.10 64bit下使用Android NDK r6编译FFmpeg 0.8.1实现,感谢原作者辛苦的工作. 1 下载相应的Android NDK r6文件2 下载FFmpeg0.8.1的版本 截至到2011年10月2日已经发布了FFmpeg 0.8.5版本. 本文中系统之前已经配置过了NDK r6,我们通过控制台使用ndk-bu

android中应用编译报错

问题描述 android中应用编译报错 一个带下拉列表的应用,在编译的时候报错: The constructor ArrayAdapter(LayoutNext, int, String[]) is undefined 不知道应该怎么解决? 我的实现代码: public class LayoutNext extends Fragment implements OnClickListener,OnItemSelectedListener{ TimePicker timepicker; privat