细说dex2oat(1)
来源:互联网 发布:忘仙商人软件 编辑:程序博客网 时间:2024/06/06 02:02
细说dex2oat(1)
dex2oat的命令行参数
首先我们先看一下dex2oat都支持一些什么样的命令行参数:
通用类
- -j<线程数>:编译时使用多少个线程。缺省值为默认的CPU核数。例:-j8
输入输出的文件类
- –dex-file=
指令集类
- –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=
编译选项类
- –print-pass-names: 打印pass name信息
- –disable-passes=
临时文件类
- –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 APK9293# $(1): the input .jar or .apk file94# $(2): the output .odex file95define dex2oat-one-file96$(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_LOCATION23my_dex_preopt_image_location := $(LOCAL_DEX_PREOPT_IMAGE_LOCATION)24else25my_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 := default608else609DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_ARCH_VARIANT)610endif611else612DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_CPU_VARIANT)613endif614DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default615
其他参数
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也需要配置相关的权限:
# dex2oattype dex2oat, domain;type dex2oat_exec, exec_type, file_type;allow dex2oat dalvikcache_data_file:file write;# Read symlinks in /data/dalvik-cacheallow 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)
- 细说dex2oat(1)
- 细说dex2oat(3)
- dex2oat
- dex2oat: dex2oat
- Dex2Oat源码流程(1)——Android6.0
- 细说DLNA(1)
- 细说多线程1
- 1-细说Cookie
- 细说php --1
- dex2oat程序参数总结
- dex2oat程序参数总结
- dex2oat程序参数总结
- dex2oat 加载多次
- Dex2Oat执行参数总结
- dex2oat源码流程分析
- Android profile-guided dex2oat
- 从头细说统计机器翻译(1)
- c#—细说多线程(1)
- 对线程的一点点新理解
- 什么是类型安全的
- hdu 4747 线段树
- HDOJ 2200 Eddy's AC难题(数学组合概率题)
- ural 1013. K-based Numbers. Version 3
- 细说dex2oat(1)
- C++类的特性相关题目
- ORACLE 交叉报表固定列实现方法
- hdu1015(dfs)
- Codeforces 585E Present for Vitalik the Philatelist (莫比乌斯反演)
- C#-Math基本方法
- 深拷贝和浅拷贝
- JAVA多线程之基础部分
- 专题一 Problem G