细说dex2oat(1)

细说dex2oat(1)

dex2oat的命令行参数

首先我们先看一下dex2oat都支持一些什么样的命令行参数:

通用类

  • -j<线程数>:编译时使用多少个线程。缺省值为默认的CPU核数。例:-j8

输入输出的文件类

  • --dex-file=:待编译的.dex, .jar或者.apk文件
  • --dex-location=:dex文件的路径
  • --zip-fd=:包含classes.dex文件的zip的文件描述符
  • --zip-location=:zip文件路径
  • --oat-file=<输出的oat文件名>:输出的oat文件名
  • --oat-fd=<输出文件描述符>:输出文件描述符
  • --oat-location=<输出的oat文件的路径>:输出的oat文件的路径
  • --oat-symbols=:指定输出完整符号的oat路径
  • --image=:指定输出的image文件名
  • --image-classes=<预编译文件列表>:指定preloaded-classes的路径,例:--image=frameworks/base/preloaded-classes
  • --base=:指定boot image的基地址,例:--base=0x50000000
  • --boot-image=:指定boot class的文件。例:--boot-image=/system/framework/boot.art,默认值为:$ANDROID_ROOT/system/framework/boot.art
  • --android-root=<路径>:portable linking所用的库的路径。例:--android-root=out/host/linux-x86,默认值:$ANDROID_ROOT

指令集类

  • --instruction-set=(arm|arm64|mips|mips64|x86|x86_64):指定编译的指令集。例:--instruction-set=x86,默认:arm
  • --instruction-set-features=<指令集参数>。例:--instruction-set-features=div,默认:default

编译器优化选项类

  • --compile-pic:Force indirect use of code, methods, and classes. 默认:disabled
  • --compiler-filter=(verify-none| interpret-only| space |balanced |speed |everything |time):选择compiler filter。例:--compiler-filter=everything。默认值:speed
  • --huge-method-max=<方法指令数>:巨型方法的指令数,用于编译器调优。例:--huge-method-max=10000,默认值:10000
  • --large-method-max=<方法指令数>:大型方法的指令数,用于编译器调优。例:--large-method-max=600,默认值:600
  • --small-method-max=<方法指令数>:小型方法的指令数,用于编译器调优。例:--small-method-max=60,默认值:60
  • --tiny-method-max=<方法指令数>:微型方法的指令数,用于编译器调优。例:--tiny-method-max=20,默认值:20
  • --num-dex-methods=<方法数>:小型dex文件的方法上限,用于编译器调优。如果发现是个小型的dex文件,而编译器的filter不是interpret-only或者verify-none的话,就用speed filter。例:--num-dex-method=900,默认值:900
  • --inline-depth-limit=<深度限制>:编译器调优用,只建议开发和实验用。例:--inline-depth-limit=5,默认值:5
  • --inline-max-code-units=<方法数>:inline调优用,实验用。例:--inline-max-code-units=100,默认值:100
  • --dump-timing: 显示时间都花到哪儿去了。

重定位信息类

  • --include-patch-information:编译时包含patch信息,可以在不重编的情况下重定位。
  • --no-include-patch-information:不包含patch信息。

调试信息类

  • -g:与--generate-debug-info相同
  • --generate-debug-info:生成所有可用的调试信息。可以通过标准的strip命令或者objcopy命令来压缩掉无用信息。
  • --no-generate-debug-info:不生成调试信息

运行参数类

  • --runtime-arg <参数>:指定运行时参数,如:初始堆大小,最大堆大小,详细输出等。每次只能传一个参数。例:--runtime-arg -Xms256m
  • --profile-file=:指定profile信息,供编译器例用

编译选项类

  • --print-pass-names: 打印pass name信息
  • --disable-passes=:禁止某些pass项,例:--disable-passes=UseCount,BBOptimizations
  • --print-pass-options:打印当前配置的pass信息
  • --pass-options=Pass1Name:Pass1OptionName:Pass1Option#,Pass2Name:Pass2OptionName:Pass2Option#:指定pass信息。

临时文件类

  • --swap-file=<交换文件名>:指定交换文件,例:--swap-file=/data/tmp/swap.001
  • --swap-fd=<文件描述符>:指定交换文件的描述符

Makefile中指定的编译参数

上面我们学习了dex2oat的参数的简介,下面我们学以致用,看看在真实的环境中它们是如何被使用的。

运行时的Xms和Xmx参数

我们直接看build时,dex2oat的参数是如何被传进去的,在build/core/dex_preopt_libart.mk中:

91# For a single jar or APK
92
93# $(1): the input .jar or .apk file
94# $(2): the output .odex file
95define dex2oat-one-file
96$(hide) rm -f $(2)
97$(hide) mkdir -p $(dir $(2))
98$(hide) $(DEX2OAT) \
99  --runtime-arg -Xms$(DEX2OAT_XMS) --runtime-arg -Xmx$(DEX2OAT_XMX) \

首先指定两个运行时参数,这两个参数是在前面定义的:

44DEX2OAT_XMS := $(call get-product-default-property,dalvik.vm.dex2oat-Xms)
45DEX2OAT_XMX := $(call get-product-default-property,dalvik.vm.dex2oat-Xmx)

也就是说,这两个值取自属性dalvik.vm.dex2oat-Xms和vm.dex2oat-Xmx。这两个属性是哪里来的呢,是在/build/target/product/runtime_libart.mk中,编译的时候指定进来的:

48PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
49    dalvik.vm.image-dex2oat-Xms=64m \
50    dalvik.vm.image-dex2oat-Xmx=64m \
51    dalvik.vm.dex2oat-Xms=64m \
52    dalvik.vm.dex2oat-Xmx=512m \
53    ro.dalvik.vm.native.bridge=0 \

这样,这两个值分别是64m和512m。

boot-image

我们回到dex_preopt_libart.mk中继续看:

100 --boot-image=$(PRIVATE_DEX_PREOPT_IMAGE_LOCATION) \

查这个PRIVATE_DEX_PREOPT_IMAGE_LOCATION,定义于/build/core/setup_one_odex.mk中:

30$(my_built_odex): PRIVATE_DEX_PREOPT_IMAGE_LOCATION := $(my_dex_preopt_image_location)

然后再向上追my_dex_preopt_image_location

22ifdef LOCAL_DEX_PREOPT_IMAGE_LOCATION
23my_dex_preopt_image_location := $(LOCAL_DEX_PREOPT_IMAGE_LOCATION)
24else
25my_dex_preopt_image_location := $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION)
26endif

LOCAL_DEX_PREOPT_IMAGE_LOCATION没有定义,继续顺藤摸瓜。

23$(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/boot.art

再继续追DEXPREOPT_BOOT_JAR_DIR_FULL_PATH:

17DEXPREOPT_BOOT_JAR_DIR_FULL_PATH := $(DEXPREOPT_PRODUCT_DIR_FULL_PATH)/$(DEXPREOPT_BOOT_JAR_DIR)

先看后面的DEXPREOPT_BOOT_JAR_DIR,原来就是system/framework

16DEXPREOPT_BOOT_JAR_DIR := system/framework

再看前面的DEXPREOPT_PRODUCT_DIR_FULL_PATH,是out下的dex_bootjars

14DEXPREOPT_PRODUCT_DIR_FULL_PATH := $(PRODUCT_OUT)/dex_bootjars

最后--boot-image的值为out/dex_bootjars/system/framework/boot.art

dex文件和oat文件的路径

这个就不多说了

101 --dex-file=$(1) \
102 --dex-location=$(PRIVATE_DEX_LOCATION) \
103 --oat-file=$(2) \
104 --android-root=$(PRODUCT_OUT)/system \

指令集相关

105 --instruction-set=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH) \

追查:

604DEX2OAT_TARGET_ARCH := $(TARGET_ARCH)

这个板级驱动已经配好了。

106 --instruction-set-variant=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT) \
107 --instruction-set-features=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) \

在同样的位置定义:

604DEX2OAT_TARGET_ARCH := $(TARGET_ARCH)
605ifeq ($(TARGET_CPU_VARIANT),)
606ifeq ($(TARGET_ARCH_VARIANT),)
607DEX2OAT_TARGET_CPU_VARIANT := default
608else
609DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_ARCH_VARIANT)
610endif
611else
612DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_CPU_VARIANT)
613endif
614DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default
615

其他参数

108 --include-patch-information --runtime-arg -Xnorelocate --no-generate-debug-info \
109 --abort-on-hard-verifier-error \
110 $(PRIVATE_DEX_PREOPT_FLAGS)
111endef

include-patch-information兼runtime-arg -Xnorelocate,生成重定位的信息,因为后面还要走patchoat呢。

no-generate-debug-info,不生成调试信息

dex2oat的selinux权限配置

大家留神啊,现在已经是selinux的时代了,dex2oat也需要配置相关的权限:

# dex2oat
type dex2oat, domain;
type dex2oat_exec, exec_type, file_type;

allow dex2oat dalvikcache_data_file:file write;
# Read symlinks in /data/dalvik-cache
allow dex2oat dalvikcache_data_file:lnk_file read;
allow dex2oat installd:fd use;

# Read already open asec_apk_file file descriptors passed by installd.
# Also allow reading unlabeled files, to allow for upgrading forward
# locked APKs.
allow dex2oat asec_apk_file:file read;
allow dex2oat unlabeled:file read;
allow dex2oat oemfs:file read;
allow dex2oat apk_tmp_file:file read;

这还不算,在installd的权限配置/external/sepolicy/installd.te中,明确设置了

71# Run dex2oat in its own sandbox.
72domain_auto_trans(installd, dex2oat_exec, dex2oat)
时间: 2024-08-22 15:24:01

细说dex2oat(1)的相关文章

细说dex2oat(3)

细说dex2oat(3) dex2oat是如何在makefile中落地的 在Android的mk系统中,调用dex2oat中有几处,但是真正被调用来生成目标系统上的oat的是下面这个,位于/build/core/dex_preopt_libart.mk中: # For a single jar or APK # $(1): the input .jar or .apk file # $(2): the output .odex file define dex2oat-one-file $(hid

细说dex2oat(2)

生成boot.art和boot.oat 前面讲的参数中,有一项是--boot-image.我们先看一下这个boot-image是如何编出来的,正好是一个完整的dex2oat的例子. 我们看下在MediaTek MT6753平台下,是如何生成的. MT6753是64位Cortex-A53的架构,所以boot.art也是64位和32位两套. 64位的boot.art 先看64位的吧: out/host/linux-x86/bin/dex2oat --runtime-arg -Xms64m --run

ART世界探险(13) - 初入dex2oat

ART世界探险(13) - 初入dex2oat dex2oat流程分析 进入整个流程之前,我们先看一下地图,大致熟悉一下我们下一步要去哪里: 主函数 dex2oat的main函数,直接是dex2oat工厂函数的封装. int main(int argc, char** argv) { int result = art::dex2oat(argc, argv); // Everything was done, do an explicit exit here to avoid running Ru

细说VB.NET(上)

细说VB.NET(上)(作者:青苹果工作室编译 2001年03月07日 14:47) 微软公司提出的.NET概念,正从各个方面渗入到我们的生活中.它将产生的作用,诚如一位业内名家所描述的:"请忘掉你认为你所知道的,.NET将改变一切"!既然如此,无论是IT业内人士.还是企业决策者,快速领会这个新概念的含义及深远影响,都显得非常必要. 概要 VB正在不断地发展中,它具备了以前VB编程人员作梦都想拥有的性能,想象一下你将随心所欲的利用这些性能,是不是很令人激动?然而,这个计划于2001年第

细说VB.NET(中)

细说VB.NET(中)(作者:青苹果工作室编译 2001年03月07日 14:47) 易于反编译的中间语言 无论你用VB.C#或其它.NET语言编写应用程序,VS.NET代码都编译成为中间语言(IL).当应用程序运行时,一个即时编译器(JITter)处理IL代码并把它编译成为机器语言.这意味着在理论上可能为Windows以外的平台创建.NET运行库,但现在关于类似的事情还没有任何官方消息.中间语言的一个缺陷是:它像VB5以前的VB版本一样,容易被反编译.这种可能性使许多开发者普遍地质疑.NET架

PHP中的目录遍历细说教程

HP学习教程文章简介: Php中的目录遍历细说教程 在编写php应用的过程当中,对指定目录的遍历.文件的筛选是在所难免也是至关重要 的,PHP本身提供了解析和读取目录的强大方法.牢牢掌握这些方法是每一个phper所   Php中的目录遍历细说教程 在编写php应用的过程当中,对指定目录的遍历.文件的筛选是在所难免也是至关重要 的,PHP本身提供了解析和读取目录的强大方法.牢牢掌握这些方法是每一个phper所必须的.本文将对几个重要方法总结和归纳,笔者经验尚浅,如有错误 和疏漏希望网友们加以指正,

转:细说ASP中Counters 组件

细说ASP中Counters 组件 概述 Counter 组件创建一个可创建.存储.增长和检索任何数量的独立计数器的 Counters 对象. 计数器是一个包含整数的持续值.可以使用 Counters 对象的 Get.Increment.Set 和 Remove 方法控制计数器.一旦您创建了计数器,它将一直持续下去直到被删除为止. 计数器不会在一个事件比如访问一页时自动增加.您必须使用 Set 和 Increment 方法人工的设置或增长计数器. 计数器不受作用域限制.一旦您创建了一个计数器,那

细说Seo即将进入“自然为王”的新时代

Seo有一句说到烂的老话:内容为王,外链为皇.正因为众多seoer对这句话产生了误解,才导致如今互联网垃圾满天飞,于是百度一怒之下,让外链不再为皇.同时也因为蜘蛛对原创的识别能力不够,导致"内容为王"也成为了一句空话,那么谁来当这个王呢?babyliu认为,新时代的seo应该以自然为王,未来的seo也即将随着这个趋势而发展. 什么才是自然?自然就是不去刻意人工修饰,而让其顺应时代去发展,babyliu对seo的所谓"自然为王"的理解是:不以seo为目的去做seo.是

细说360buy的内部结构系列 SEO不完美篇(2)

前段时间写了一篇"细说360buy的内部结构系列 - seo不完美篇(1)",介绍了一下360buy之中,并不完美的几点,下面笔者接着来写一下第一部分,进一步探讨seo并不完美的部分,虽并非完美,但是有一些却真正的对用户会有所帮助. 3)地区商品分类页的内容大量重复 相信很多朋友在京东上购物之后,总是会被京东上的购买过后的记录所直接跳转到该地区的网页之上,而实现对于用户体验最完美的解释,但是呢,对于seo而言的话,却有一定的不恰当之处,具体说来如下,我们选取了浙江和天津两个笔记本省的页