转: http://www.th7.cn/Program/Android/201512/719494.shtml

Android从4.4开始正式引入了ART虚拟机,并从5.0开始取代了Dalvik成为默认的虚拟机。ART与Dalvik最大的不同就是,在程序安装的时候就将其编译成本地指令集(即所谓的Ahead Of Time,AOT),而不像Dalvik是在运行的时候对经常掉用的函数动态编译的(即所谓的Just In Time,JIT)。但是最终编译的动作,还是通过程序dex2oat来执行的。这个程序本身可带非常多的参数,本文就对一些常用参数的含义做一个简要的解释。

1)--dex-file=<dex-file>

指定要编译的文件路径,这个文件既可以是一个dex文件,也可以是一个内部包含dex文件的apk或jar文件。

对于一次要编译多个文件的情况,每个文件都要用单独的一个--dex-file来指定。

2)--dex-location=<dex-location>

指定要写入最终编译出目标oat文件内部的编译文件的路径。

对于一次要编译多个文件的情况,每一个路径都需要用--dex-location来指定,且出现的次序要和--dex-file指定的次序相同。

3)--zip-fd=<file-descriptor>

指定要编译文件的文件描述符。--zip-fd和--dex-file必须指定一个,但两者也相互冲突,不能同时出现,否则都会报错退出。

4)--zip-location=<zip-location>

说明前面通过--zip-fd参数传入的那个文件描述符号对应的文件的路径。这个参数和--zip-location必须配对使用,也就是说,如果没有--zip-fd但是传入了--zip-location,或者有--zip-fd但是没有传入--zip-location,两种情况dex2oat都会报错退出。

5)--oat-file=<file.oat>

指定编译输出的oat文件的路径。

6)--oat-fd=<number>

指定编译输出的oat文件的文件描述符。--oat-fd和--oat-file必须指定一个,但两者也是冲突的,不能同时出现,否则都会报错退出。

7)--oat-location=<oat-name>

也是指定编译输出的oat文件的路径,不过与--oat-file不同,--oat-location是必须要和--oat-fd配对使用的,两个参数必须同时出现。

通过上面可以看出,dex2oat接受两种方式指定要编译的文件和输出的文件,分别是通过文件路径或通过文件的描述符。如果是通过文件的描述符的话,dex2oat虽然可以对这个文件进行操作,但并不知道这个文件在什么位置,因此还需要通过以location结尾的参数来告之;而如果是通过文件路径的话,则dex2oat会直接打开这个文件,再对其进行操作。

而对于结尾为fd的参数来说,一般都是父进程先将文件打开,获得文件描述符后,在fork出的子进程中掉用execv来运行dex2oat程序,因为子进程是继承父进程所打开的文件描述符的,因此可以直接对其操作。

8)--oat-symbols=<file.oat>

也是指定编译要输出的oat文件,但和--oat-file不同的是,如果使用--oat-symbols,则输出的oat文件会包含所有的符号,而--oat-file则不会。

并且--oat-symbols和--oat-fd是冲突的,只允许出现一个,如果两个同时出现,则会报错退出。

9)--image=<file.art>

指定要编译出的ART镜像文件(Image)所存放的路径。如果指定了这个参数,就说明此次掉用dex2oat是为了编译出系统镜像文件,而不是编译一个普通的应用程序。

这个参数和--oat-fd是冲突的,两者不能同时出现,否则dex2oat会报错退出。

10)--image-classes=<classname-file>

指定要编译处的ART镜像文件(Image)需要包含哪些类的一个列表。

对于Android 5.x和6.x系统来说,这个参数被设置成“/system/etc/preloaded-classes”。

11)--image-classes-zip=<classname-zip-file>

有时候--image-classes指定的那个文件非常的大,需要先用ZIP压缩一下。如果是这样的话,就需要用--image-classes-zip指定那个压缩文件的路径,这时候就会在这个指定的ZIP文件中找--image-classes指定的那个文件读取类列表。

因此,--image-classes-zip一定要和--image-classes一起使用。当然也可以只有--image-classes而没有--image-classes-zip,这时候dex2oat就直接从--image-classes指定的文件中读取类列表。

对于Android 5.x和6.x系统来说,没有用到这个参数。

12)--base=<hex-address>

指定image加载进内存时,被映射到的起始内存地址。

13)--boot-image=<file.art>

指定系统镜像文件存放的路径。如果不指定的话,默认系统将其设置成“/system/framework/boot.art”。但是,实际上镜像文件并不是存放在这个位置,而是在“/system/framework/<image_isa>/boot.art”,比如在arm平台上(非64位),其镜像文件是放在“/system/framework/arm/boot.art”中的。

14)--android-root=<path>

指定Android系统的根路径。如果不指定的话,默认情况下dex2oat会读取当前系统的环境变量ANDROID_ROOT,将其值作为Android系统的根路径,继续编译下去。如果连环境变量ANDROID_ROOT也读不到的话,则报错退出。

一般情况下,Android设备上,环境变量ANDROID_ROOT被设置成了“/system”。

15)--instruction-set=(arm|arm64|mips|mips64|x86|x86_64)

指定要用什么指令集来编译dex文件。目前共支持六种指令集,三种平台(arm、mips和x86),每种平台有分为32位和64位两种。

16)--instruction-set-features=...,

对于一个处理器来说,除了要知道其能执行代码的指令集之外,还需要知道它的一些特别的属性,从而可以在编译中的代码中使用到。

对于支持arm指令集的处理器来说,有“smp”(对称多处理器,也就是多核)、“div”(硬件除法器)和“lpae”(大内存模式)三个。

17)--compile-pic

用PIC(Position Independent Code,位置无关代码)模式来编译。

18)--compiler-backend=(Quick|Optimizing)

指定编译器的后端使用哪种模式,可选的是所谓快模式(Quick)或优化模式(Optimizing)。如果没有特别指定的话,编译镜像使用快模式,而编译一般的应用程序则使用优化模式。

什么是编译器的后段呢?其实这是LLVM引入的概念。所有的程序先用前端翻译成中间表示层,然后进行优化,最后用后端将优化过的中间表示层代码编译成平台相关的代码。Android虽然没有直接用LLVM编译器(以前也确实用过,但从6.0开始就废弃掉了),但是借鉴了这种编译器的设计结构。

值得一提的是,如果使用优化模式,则一定是用PIC模式进行编译。

19)--compiler-filter=(verify-none|interpret-only|verify-at-runtime|space|balanced|speed|everything|time)

指定一些编译选项,默认是speed,以速度优先。

20)--huge-method-max=<method-instruction-count>

告诉dex2oat,当发现一个函数内包含的指令数目超过多少时,被当作巨大函数来处理。如果不指定,默认的值是10000。

21)--large-method-max=<method-instruction-count>

告诉dex2oat,当发现一个函数内包含的指令数目超过多少时,被当作大函数来处理。如果不指定,默认的值是600。

22)--small-method-max=<method-instruction-count>

告诉dex2oat,当发现一个函数内包含的指令数目超过多少时,被当作小函数来处理。如果不指定,默认的值是60。

23)--tiny-method-max=<method-instruction-count>

告诉dex2oat,当发现一个函数内包含的指令数目超过多少时,被当作微型函数来处理。如果不指定,默认的值是20。

24)--num-dex-methods=<method-count>

告诉dex2oat,当发现一个dex文件内部包含的方法数少于多少时,将被当作小dex文件来处理。

具体的来说,如果一个dex文件内部的方法数小于这个指定值的话,且--compiler-filter编译过滤器不是被设置成verify-none或interpret-only的话,将编译过滤器强制设置成speed。

25)-j<number>

指定要用多少个线程对文件进行编译。默认情况下,如果不指定的话,dex2oat会用当前系统的处理器能同时执行的最大线程数来编译。

26)--include-patch-information

通知dex2oat要把patch的信息也写入编译出的oat文件中。

27)--no-include-patch-information

通知dex2oat不要把patch的信息也写入编译出的oat文件中。

28)-g或--generate-debug-info

通知dex2oat,要在编译出的oat文件中包含调试的信息。

29)--no-generate-debug-info

通知dex2oat,不要在编译出的oat文件中包含调试的信息。

30)--debuggable

告知dex2oat,编译出来的oat文件要支持调试。当指定了这个参数之后,默认就会将调试信息写入oat文件(既默认带上了--generate-debug-info参数)。

31)--runtime-arg <argument>

告诉ART运行时(Runtime)的参数,例如初始堆大小和最大堆大小之类的,且对每一个不通的参数都要在前面加上--runtime-arg。

顺便提一句,dex2oat在编译的时候会在内部创建一个ART运行时。

32)--swap-file=<file-name>

指定编译所需要的交换文件的路径。

33)--swap-fd=<file-descriptor>

指定编译所需要的交换文件的文件描述符。

这个交换文件是用来临时存放编译过程中所产生的一些数据的,并不是指定了这个交换文件dex2oat就一定会使用,还必须要满足一定条件。

如果是编译镜像文件的话,则一定不会用交换文件。如果要编译的所有dex文件的数目小于2的话,也不会使用。最后,如果要编译的所有dex文件的总大小小于20MB的话,也不会用(这么说基本上都不会使用了)。

最后,举一个例子,在Android 5.1上,当安装一个新的应用程序的时候,都会执行下面的命令对其进行编译:

/system/bin/dex2oat --zip-fd=6 --zip-location=/data/app/<Package Name>-1/base.apk --oat-fd=7 --oat-location=/data/dalvik-cache/arm/data@app@<Package Name>-1@base.apk@classes.dex --instruction-set=arm --instruction-set-features=div --runtime-arg -Xms64m --runtime-arg -Xmx512m --swap-fd=8

看了前面的介绍,解释这个命令就很简单了。

dex2oat程序参数总结相关推荐

  1. linux环境程序参数

    当我们为Linux编写程序时,我们必须考虑到程序会运行在多任务环境下.这就意味着多个程序会同时运行,并且共享机器资源,例如内存,磁盘空间以及 CPU周期.也许在同一时刻会一个程序多个实例在运行.这时最 ...

  2. dex2oat 加载多次

    我是一个做插件开发的人员,插件就是动态加载dex文件. 然后4.4以后,Android dalvik虚拟机,和ART. art运行的必须要把dex转换为oat elf文件. 然后,这个dex2oat需 ...

  3. 【Android 逆向】ART 脱壳 ( dex2oat 脱壳 | aosp 中搜索 dex2oat 源码 | dex2oat.cc#main 主函数源码 )

    文章目录 前言 一.搜索 dex2oat 源码 二.dex2oat.cc#main 主函数源码 前言 在 [Android 逆向]ART 脱壳 ( DexClassLoader 脱壳 | exec_u ...

  4. Android 系统(36)---Android O、N版本修改dex2oat编译选项

    Android O.N版本修改dex2oat编译选项,减少占用ROM空间或者加快安装速度 内容 (2018-02-09) Android O版本.AndroidN版本 1.ROM过大可以通过调整--c ...

  5. Android 系统性能优化(50)---dex2oat对应用启动性能的影响

    dex2oat对应用启动性能的影响 问题描述 初步分析 systrace分析 问题猜想 刨根溯源 总结 不可忘记用爱心接待客旅,因为曾有接待客旅的,不知不觉就接待了天使.-希伯来书13:2 问题描述 ...

  6. idea程序参数program arguments,vm arguments,Environment variable

    Java启动命令可选项(options) 大致可分为标准和非标准两种,非标准的可选项不保证在所有平台上都实现,并且未来的版本中可能会被修改且不告知,是不稳定的(Unstable). 标准可选项(Sta ...

  7. Android ART dex2oat 加载加速浅析

    前言 手机淘宝插件化框架Atlas在ART上首次启动的时候,会通过禁用dex2oat来达到插件迅速启动的目的.之后后台进行dex2oat,下次启动如果dex2oat完成了则启用dex2oat,如果没有 ...

  8. 解析android系统下Dex2oat的实现

    简介 在Android系统5.0及以上系统开始逐渐丢弃Dalvik虚拟机,由于ART虚拟机对内存分配和回收都做了算法优化,降低了内存碎片化程度,回收时间也得以缩短,所有android系统5.0及以上都 ...

  9. 剖析 Android ART Runtime (2) – dex2oat

    在上一篇文章中我们介绍了 Android 4.4 新开发的运行时 ART 项目,其中的一个重要模快是 dex2oat,简单讲就是使用 LLVM 把 dex 文件编译成 oat 文件(Optimized ...

  10. dex2oat对应用启动性能的影响

    问题描述 初步分析 systrace分析 问题猜想 刨根溯源 总结 不可忘记用爱心接待客旅,因为曾有接待客旅的,不知不觉就接待了天使.-希伯来书13:2 问题描述 chrome应用冷启动缓慢,跟参考机 ...

最新文章

  1. 漫画:有趣的海盗问题 (完整版)
  2. ERP的风险及其预防
  3. Spring Boot基础学习笔记12:组件注册整合Servlet三大组件
  4. RN通信机制和渲染流程
  5. 语言(文化)代码与国家地区对照表,各国手机号正则
  6. 三菱plc c语言模块,FX5-80SSC-S 三菱PLC简易运动控制器模块
  7. Windows照片图片便捷查看分类软件——照片分类猫
  8. 路飞学城Python-Day8
  9. SMTP 发送邮件错误码和解决方法
  10. xp镜像文件的product key
  11. matlab解韩信点兵问题,小学数学题目巧解—韩信点兵问题
  12. 多图详解:解决onenote英文输入自动切换字体为calibri
  13. 阿里云服务器 API 的使用
  14. linux系统漏洞升级方法,OpenSSL “Heartbleed”心脏流血漏洞升级方法
  15. 【亲测有效!!!】解决git did not exit cleanly (exit code 1) 错误
  16. Burp suite 暴力破解shell密码详细教程
  17. 完全备份、增量备份和差异备份
  18. 【流媒体协议】RTMP和RTSP的区别
  19. linux 查看网卡连接网线,查看网卡是否连接网线
  20. win10系统修改hosts文件无法保存

热门文章

  1. 2016依然会给我惊喜,谢谢
  2. 数据仓库和数据挖掘基础知识点
  3. php mysql scalar_symfony和doctrine及数据库操作 | 学步园
  4. Qt简述如何实现不规则按钮
  5. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
  6. IDEA felix osgi项目搭建(1)
  7. 我的MBTI职业性格测试
  8. Android安卓身份证识别SDK
  9. 实现旋转六面体(含动画的基本介绍)
  10. dede分类名称_dede常用标签分类整理