ART 配置

编译配置选项

  • WITH_DEXPREOPT 开启DEX文件编译优化,将会对系统镜像中所有内容进行预先优化;更大的系统镜像,但是能显著的减小First Boot(包括OTA后) 的启动时间。
  • DONT_DEXPREOPT_PREBUILTS 防止对预构建进行预先优化,指的是那些在Android.mk中指定了 include $(BUILD_PREBUILT)的应用。
  • WITH_DEXPREOPT_BOOT_IMG_ONLY 预先优化启动映像,启动映像由含有映像类的 boot.art 和含有启动相关的类路径代码的 boot.oat 组成。
  • LOCAL_DEX_PREOPT 针对单个应用启用或停用预先优化功能。有助于节省主要版本升级 OTA 的空间,因为用户的数据分区中可能已经有了较新版本的应用。
    支持通过值“true”和“false”分别表示启用和停用预先优化。此外,如果预先优化不应将 classes.dex 文件从 apk 或 jar 文件中剥离,还可以指定“nostripping”。通常情况下,此文件会被剥离,因为预先优化之后便不再需要该文件;但若要使第三方 APK 签名保持有效状态,则最后一个选项必不可少。
  • PRODUCT_DEX_PREOPTBOOT* 预编译选项控制,e.g PRODUCT_DEX_PREOPT_BOOT_FLAGS 将选项传递给 dex2oat 以控制启动映像的编译方式;PRODUCT_DEX_PREOPT_DEFAULT_FLAGS 控制传递给 dex2oat 的默认标记,以编译除启动映像之外的所有文件,即 jar 和 apk 文件;PRODUCT_DEX_PREOPT_MODULE_CONFIGS 为特定模块和产品配置传递 dex2oat 选项。

zygote 预加载

类预加载

zygote在启动时会有一个预加载类的列表,通过该列表,每个应用无需单独运行这些类初始化程序,从而可以更快地启动并共享这些在共享内存中的类。预加载类列表文件默认位于 frameworks/base/preloaded-classes 中。

1
PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes

映像预加载

映像类列表是 dex2oat 预先初始化并存储在 boot.art 文件中的类列表。通过该列表,zygote 可以在启动时从 boot.art 文件中加载这些结果,而无需在预加载期间自行运行这些类的初始化程序。其中一个重要特点是,从映像加载并在进程之间共享的页面是干净的,因此可在内存不足的情况下轻松将它们交换出去。

1
PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=<filename>

已编译类的列表

指定使用已编译类的列表,在预先优化期间编译来自启动的类路径的类子集。对于空间非常紧张且无法满足整个预先优化启动映像需求的设备来说,此选项很有帮助。不过,请注意,此列表未指定的类将不会被编译(即使在设备上也不会被编译),且必须对其进行解释,这可能会影响运行时性能。

1
PRODUCT_COPY_FILES += <filename>:system/etc/compiled-classes

WITH_DEXPREOPT_PIC

指定 WITH_DEXPREOPT_PIC 以启用位置无关代码 (PIC)。这样一来,就不必将来自映像的编译代码从 /system 迁移到 /data/dalvik-cache,因此可以节省数据分区中的空间。不过,因为该选项会停用利用位置相关代码进行的优化,所以会对运行时产生轻微的影响。

1
2
WITH_DEXPREOPT := true
WITH_DEXPREOPT_PIC := true

WITH_ART_SMALL_MODE

此选项仅编译启动相关的类路径,由于跳过了大多数编译,因此可以大大缩短首次启动时间。此选项还可以节省存储空间,因为没有针对应用的编译代码。但是,由于必须解释应用代码,因此这会影响运行时性能。不过,由于仍会编译框架中的大部分性能敏感型代码,因此对运行时性能的影响非常有限,但是在基准化分析中的表现可能会出现退化的情况。

1
WITH_ART_SMALL_MODE := true

属性配置

dex2oat

这些属性在机器编译期和预编译优化期均会影响dex2oat,新增属性:

boot.img
  • dalvik.vm.image-dex2oat-Xms 初始化堆大小
  • dalvik.vm.image-dex2oat-Xmx 最大的堆大小
  • dalvik.vm.image-dex2oat-filter 编译过滤选项
  • dalvik.vm.image-dex2oat-threads 可使用的线程数
除了boot.img以外的配置
  • dalvik.vm.dex2oat-Xms 初始化堆大小
  • dalvik.vm.dex2oat-Xmx 最大堆大小
  • dalvik.vm.dex2oat-filter 编译过滤选项
  • dalvik.vm.dex2oat-threads 可使用的线程数

Android 6.1之后, dalvik.vm.dex2oat-threads 变为两个单独配置:

  • dalvik.vm.boot-dex2oat-threads boot-time 时期可以使用的线程数
  • dalvik.vm.dex2oat-threads boot-time 之后可以使用的线程数
memory
  • dalvik.vm.dex2oat-very-large 当dex文件超过多少size之后就禁用AOT
  • dalvik.vm.dex2oat-swap 是否使用swap file

JIT

  • dalvik.vm.usejit 是否使用JIT
  • dalvik.vm.jitinitialsize (default 64K) VM代码缓存的初始化大小
  • dalvik.vm.jitmaxsize (default 64M) VM代码缓存的最大限制
  • dalvik.vm.jitthreshold 被JIT compiled的 “热点(Hotness)”方法计数
  • dalvik.vm.usejitprofiles 是否启用JIT Profiler
  • dalvik.vm.jitprithreadweight (default to dalvik.vm.jitthreshold / 20) 用于加速那些会影响前台用户体验的的方法编译
  • dalvik.vm.jittransitionweight: (default to dalvik.vm.jitthreshold / 10) 衡量在进行方法调用时,来自已编译代码和解释器的程度。该值越小,就需要更大的内存来保存已经编译的过的代码,才能保证对同一个方法调用时,使用的是保存在代码缓存中的方法引用,而不需要重新通过解释器来编译生成机器代码。

PackageManager

Android 7.0之后,在编译进 SystemProperties 中的属性中控制.

  • pm.dexopt.install=quicken 加快安装速度(只影响从Gooogle Play安装)
  • pm.dexopt.bg-dexopt=speed-profile 可以使用 profile-guided compilation,只会在设备待机、充电、完全充完电时。
  • pm.dexopt.boot=verify 指示boot时(通常是OTA之后) 是否需要进行验证。强烈建议使用该项配置,以减少OTA之后boot时耗费在验证上的时间。

摘自AOSP官网资料https://source.android.com/devices/tech/dalvik/configure?hl=en#compilation_options