Android ART Dex2Oat相关笔记

前言

最近在了解ART相关的内容,这里做下笔记记录下。

  • 官方文档:Android Runtime (ART) 和 Dalvik:详细的介绍了ART的特性和功能。

ART

概念

Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。

ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。不过,Dalvik 采用的一些技术并不适用于 ART。有关最重要问题的信息,请参阅在 Android Runtime (ART) 上验证应用行为。

优化点

更多请见:ART概览

  • 垃圾回收优化
  • 开发和调试方面优化

Android 8.0的改进

这里仅仅摘录了一个优化点,更多请见:Android 8.0 中的 ART 功能改进

Dexlayout

  • Dexlayout 是在 Android 8.0 中引入的一个库,用于分析 dex 文件,并根据配置文件对其进行重新排序。Dexlayout 旨在使用运行时配置信息,在设备的空闲维护编译期间对 dex 文件的各个部分进行重新排序。通过将经常一起访问的部分 dex 文件集中在一起,程序可以因改进文件位置而拥有更好的内存访问模式,从而节省 RAM 并缩短启动时间。
  • 由于配置文件信息目前仅在运行应用后可用,因此系统会在空闲维护期间将 dexlayout 集成到 dex2oat 的设备编译中。

运行时机

  1. 应用前几次运行,系统会对经常执行的方法进行JIT编译。
  2. 当设备闲置和充电时,编译守护进程会运行,根据在应用前几次运行期间生成的配置文件对常用代码进行 AOT 编译。
  3. 下一次重新启动应用时将会使用配置文件引导型代码,并避免在运行时对已经过编译的方法进行 JIT 编译。在应用后续运行期间经过 JIT 编译的方法将会添加到配置文件中,然后编译守护程序将会对这些方法进行 AOT 编译。

工具链

ART 包括一个编译器(dex2oat 工具)和一个为启动 Zygote 而加载的运行时 (libart.so)。dex2oat 工具接受一个 APK 文件,并生成一个或多个编译工件文件,然后运行时将会加载这些文件。文件的个数、扩展名和名称因版本而异,但在 Android O 版本中,将会生成以下文件:

文件 说明
.vdex 其中包含 APK 的未压缩 DEX 代码,以及一些旨在加快验证速度的元数据。
.odex 其中包含 APK 中已经过 AOT 编译的方法代码。
.art (optional) 其中包含 APK 中列出的某些字符串和类的 ART 内部表示,用于加快应用启动速度。

dex2oat

dex2oat是ART提供的一个工具链,这里简单介绍下一些命令。

ART编译DEX类型

参数 说明
verify 只运行 DEX 代码验证。
quicken 运行 DEX 代码验证,并优化一些 DEX 指令,以获得更好的解译器性能。
speed 运行 DEX 代码验证,并对所有方法进行 AOT 编译。
speed-profile 运行 DEX 代码验证,并对配置文件中列出的方法进行 AOT 编译。

系统ROM配置

类型 说明
启动类路径代码 默认使用 speed 编译过滤器进行编译。
系统服务器代码 默认使用 speed 编译过滤器进行编译。
产品专属的核心应用 默认使用 speed 编译过滤器进行编译。
所有其他应用 默认使用 quicken 编译过滤器进行编译。

开启JIT日志记录

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

停用 JIT

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

强制编译

如果需要强制oat,可以执行以下命令:

adb shell cmd package compile

强制编译特定软件包的用例:

  • 基于配置文件:
    • adb shell cmd package compile -m speed-profile -f my-package
  • 全量oat:
    • adb shell cmd package compile -m speed -f my-package

强制编译所有软件包的常见用例:

  • 基于配置文件:
    • adb shell cmd package compile -m speed-profile -f -a
  • 全面oat:
    • adb shell cmd package compile -m speed -f -a

清除配置文件

  • 针对一个软件包:
    • adb shell cmd package compile --reset my-package
  • 针对所有软件包:
    • adb shell cmd package compile --reset -a

附录

  • 官方文档:Android Runtime (ART) 和 Dalvik:详细的介绍了ART的特性和功能。
  • ART相关整理:推荐阅读该博主的分析内容
    • Android 9.0 ART编译分析(一)-编译通路梳理
    • Android 9.0 ART编译分析(二)-Installd触发dex2oat编译流程
    • Android 9.0 ART编译分析(三)-虚拟机触发dex2oat编译流程
    • 启动耗时分析(三)-ART编译分析

你可能感兴趣的:(Android进阶)