运用 dex2oat 提前把dex编译成oat文件,提高应用运行效率。

AOT & JIT

Android从L开始,引入了ART虚拟机,拥有了预先(AOT)编译的新特性,即在安装时ART就通过 dex2oat 工具来编译应用,提高应用运行时的效率。但是,安装过程执行dex2oat会增加安装应用的时间。

于是Android N引入了新的机制,运行时 (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,有助于提高运行时性能,节省存储空间,以及加快应用及系统更新速度。JIT在软件安装时不进行编译而是根据用户的使用习惯来记录值得编译的内容 (包括软件运行时编译并保存,在闲时编译记录的需要编译而没来得及干的事情,而这些事情就是记录为speed-profile)。

编译模式

从Android O开始,官方支持4个编译模式。

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

强制编译

强制编译可通过如下命令

1
adb shell cmd package compile

强制编译特定软件包

1
adb shell cmd package compile -m speed -f my-package

强制编译所有软件包

1
adb shell cmd package compile -m speed -f -a

日常在手机上手动执行dex2oat只需要

1
2
su
cmd package compile -m speed -a

清除配置文件数据并移除编译后的代码

对特定软件包

1
adb shell cmd package compile --reset my-package

对所有

1
adb shell cmd package compile --reset -a