实现 ART 即时 (JIT) 编译器

Android Runtime (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,该编译器可以在 Android 应用运行时持续提高其性能。JIT 编译器对 Android 运行组件当前的预先 (AOT) 编译器进行了补充,可以提升运行时性能,节省存储空间,加快应用和系统更新速度。相较于 AOT 编译器,JIT 编译器的优势也更为明显,因为在应用自动更新期间或在无线下载 (OTA) 更新期间重新编译应用时,它不会拖慢系统速度。

尽管 JIT 和 AOT 使用相同的编译器,它们所进行的一系列优化也较为相似,但它们生成的代码可能会有所不同。JIT 会利用运行时类型信息,可以更高效地进行内联,并可让堆栈替换 (OSR) 编译成为可能,而这一切都会使其生成的代码略有不同。

JIT 架构


图 1. JIT 架构。

JIT 编译

JIT 编译涉及以下活动:

配置文件指导的编译

图 2. 配置文件引导的编译。

  • 用户运行应用,此举随后触发 ART 加载 .dex 文件。

    • 如果有 .oat 文件(即 .dex 文件的 AOT 二进制文件),ART 会直接使用该文件。虽然 .oat
      文件会定期生成,但文件中不一定会包含经过编译的代码(即 AOT 二进制文件)。
    • 如果 .oat 文件不含经过编译的代码,ART 会通过 JIT 和解释器执行 .dex 文件。
  • 针对任何未根据 speed 编译过滤器编译的应用启用 JIT(也就是说,要尽可能多地编译应用中的代码)。
  • 将 JIT 配置文件数据转储到只有该应用可以访问的系统目录下的文件中。
  • AOT 编译 (dex2oat) 守护程序通过解析该文件来推进其编译。


图 3. JIT 守护程序活动。
举例来说,Google Play 服务就是一种由其他应用使用的类似于共享库的服务。

JIT 工作流程


图 4. JIT 数据流。

  • 分析信息会存储在代码缓存中,并会在内存紧张时作为垃圾被回收。

    • 无法保证在应用处于后台运行状态时所捕获的快照能够包含完整的数据(即 JIT 编译的所有内容)。
    • 该过程不会尝试确保记录所有内容(因为这会影响运行时性能)。
  • 方法可能有三种不同的状态:
    • 已经过解释(dex 代码)
    • 已经过 JIT 编译
    • 已经过 AOT 编译

如果同时存在 JIT 和 AOT 代码(例如,由于反复进行逆优化),经过 JIT 编译的代码将是首选代码。

  • 在不影响前台应用性能的情况下运行 JIT 所需的内存取决于相关应用。大型应用比小型应用需要更多内存。一般来说,大型应用所需的内存稳定维持在 4 MB 左右。

开启 JIT 日志记录

要开启 JIT 日志记录,请运行以下命令:

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

停用 JIT

要停用 JIT,请运行以下命令:

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

强制编译

要强制编译,请运行以下命令:

adb shell cmd package compile

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

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

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

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

清除配置文件数据

要清除配置文件数据并移除经过编译的代码,请运行以下命令:

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

本文整理翻译自Google Developer网站Implementing ART Just-In-Time (JIT) Compiler

Android ART 即时 (JIT) 编译器详解相关推荐

  1. CUDA中的NVCC编译器详解

    NVCC编译器详解 CUDA C++ 为熟悉 C++ 编程语言的用户提供了一种简单的途径,可以轻松编写由设备执行的程序. 它由c++语言的最小扩展集和运行时库组成. 编程模型中引入了核心语言扩展.它们 ...

  2. iPhone和Android的WEB应用开发详解

    iPhone和Android的WEB应用开发详解 在我们现在的生活中,移动设备的作用日益重要.我们使用它们进行交流.我们使用它们进行导航.我们甚至可以将它们用作方便的手电筒.面向 iPhone 和 A ...

  3. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  4. JNI开发之-Android.mk和Application.mk 详解

    Android.mk和Application.mk 详解 Android.mk 基础知识 变量和宏 NDK 定义的 include 变量 目标信息变量 模块描述变量 NDK 提供的函数宏 Applic ...

  5. libraries 和android runtime之间的关系,《Android Studio应用开发实战详解》——第1章,第1.3节Android系统架构...

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.3节Android系统架构,作者 王翠萍,更多章节内容可以访问云栖社区"异步社区&quo ...

  6. 《Android Studio应用开发实战详解》——第1章,第1.4节Android和Linux的关系

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.4节Android和Linux的关系,作者 王翠萍,更多章节内容可以访问云栖社区"异步社 ...

  7. Android中的四大组件详解

    Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity.Service.BroadcastReceiver.Conte ...

  8. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  9. android+发邮件,Android发送邮件的方法实例详解

    Android发送邮件的方法实例详解 时间:2021-05-20 本文实例讲述了Android发送邮件的方法.分享给大家供大家参考,具体如下: 在android手机中实现发送邮件的功能也是不可缺少的. ...

最新文章

  1. 木兰编程语言python_国产编程语言木兰换皮Python 中科院重罚当事人
  2. 当用户将鼠标悬停在列表项上时,使光标成为手
  3. SSM中实现CRUD并配置输出sql语句
  4. 拥有一个高性能低延时数据库是什么样的体验?
  5. CentOS6.5下安装JDK
  6. c#语言程序设计上机实验,《C#语言程序设计》实 验 报 告
  7. Oracle10g安装教程、配置实例、监听、客户端程序详解_Windows篇
  8. mql5计算机语言函数库,MQL5 函数列表 - MQL5参考 - 参考MetaTrader 5的算法/自动交易语言...
  9. 小程序组件传值解决页面数据刷新
  10. 计算机组装与维护重点难点,计算机组装与维修复习重难点.doc
  11. django.relatedField-关联域
  12. 推荐一些stm32和DSP的学习视频和教程(资料)
  13. es6 javascript 尾调用
  14. Matlab绘制Sigmod、Tanh、ReLU
  15. Java反射获取类,方法
  16. for循环的几种写法
  17. Linux——samba服务器部署
  18. linux教程试卷_Linux 系统安装试题
  19. Halcon 关于角度问题的总结
  20. modelnet40介绍_三维形状数据的深度特征表示

热门文章

  1. 【微信小程序调用百度API实现图像识别功能】----项目实战
  2. TSC打印机,利用javascript实现连续扫码自动打印,配置说明
  3. 是时候好好审视下自己了
  4. 信息安全-网络物理隔离技术原理与应用
  5. 无处不在_电动汽车无处不在。 那丰田为什么还要继续投资氢呢?
  6. CRM项目实战第一天
  7. Polychain重仓的Findora公链,想带领DeFi脱虚向实
  8. HTML页面可视化快速设计
  9. 重复一下:关于Flash停止支持后Chrome如何启用过期插件
  10. 鸿蒙系统和安卓的区别在哪里,有什么不同