昨天公司给了部p30,开机体验了下,确实不错。运存8g+内存128g+cpu麒麟980搭载EMUI9.1,重点是华为公布的方舟编译器。并向业界开源改工程,于是赶紧上网学习了下关于Android ART JVM的知识,也可以给别人吹吹牛逼方舟编译器到底干了个啥。
简介
方舟编译器可供开发者在开发环境一次性的将高级语言编译为机器码,手机安装应用程序后可全速运行程序,带来效率上的极大提升。根据华为实验室的测试数据,EMUI 9.1在仅仅对系统组件System Server应用了华为方舟编译器后,就带来了系统操作流畅度提升24%,系统响应性能提升44%。官方公布在8月份会开源.
安卓编译器的发展
做安卓开发三年了但不得不说安卓手机用久了确实会卡,这和安卓系统有关。Android 平台的绝大多数应用是使用 Java 语言写的,CPU 只能理解汇编指令,无法直接识别 Java 语言的虚拟机指令;为了让 CPU 能运行 Java 语言编写的程序,一般有两种办法:
解释执行
引入一个中间层,这个中间层负责 Java代码的执行,然后这个中间层本身编译为 CPU 能理解的汇编指令,也就是 CPU -> 中间层 -> Java 代码。如果这个中间层采用 Java 语言直接作为输入,理解一句 Java 语句就把Java语言翻译一下让CPU 执行一段,我们一般称这种模式为「解释执行」。毋庸置疑这种方式效率是相当低效的。
直接把 Java 语言翻译成 CPU 能理解的机器语言。这里又有两种方式:
AOT (Ahead of time)
在程序运行之前直接把 Java 代码编译为机器语言。这种模式我们称之为 AOT (Ahead of time)编译。
JIT(Just in time)
在程序运行起来之后,实时地把 Java 语言编译为机器语言然后执行。这种模式称之为 JIT(Just in time) 编译。
Android 平台分为几个阶段:
-
在 Android 5.0 正式采用 ART 之前,Android 采用的是 解释执行 + 辣鸡JIT 的方式执行 Java代码。在这个阶段是货真价实的「边解释边执行」的模式,代码效率相当低下,再加上那时候同样辣鸡的 GC (垃圾回收),Android 用起来真是惨不忍睹。
-
Android 5.0 ~ Android 6.0 。Google 推出了 ART (Android Runtime)来解决之前的 Java 代码执行效率问题。这个阶段采用的是完全 AOT 模式;Android 应用在安装的时候,系统会把所有Java代码提前编译为机器码。这种模式有两个缺点不能忍:
-
- 安装速度巨慢。即使是现在吊炸天的 855 采用 AOT 模式编译一下安装包比较大的应用(如支付宝)可能就要一分钟。那个时候的 CPU 可不如现在,安装一个应用都让你等得头皮发麻。更要命的时候,系统 OTA 开机会对所有的应用执行 AOT 操作,这时候你的开机速度可能要半个小时。。。
- 占用磁盘空间,Java 代码编译为机器码之后体积会急剧膨胀。
-
Android 7.0 ~ 现在。Google做了很大的改进,基于这样一个事实:我们使用一个应用的时候,基本每个人只使用它一小部分功能,为什么要把所有代码全编译呢?只编译你经常用的那部分代码不就 OK 了,这样安装的时候啥也不干速度飞快,等你用的时候系统就能知道哪部分代码经常被执行,把这部分代码编译为机器码,运行起来速度也快。于是 Google 又引入了 JIT,这时候的执行模式是 AOT + JIT + 解释执行。
-
- 应用安装的时候不执行 AOT 编译,安装速度飞快。初次使用应用的时候没有机器码,因此只能解释执行。
- 应用运行起来之后,系统收集经常被运行的代码的信息,做两件事:1)在必要的时候在运行时直接把 Java 代码编译为机器码 (JIT),然后使用机器码执行提高运行效率。2)把这个「经常被运行的代码信息保存起来」
- 设备空闲的时候,系统拿出应用运行时候保存的「热点代码信息」直接把这些代码编译为机器码 (AOT)
Android 8.0上改进了解释器,解释模式执行效率大幅提升;Android 10.0上提供了预先放置热点代码的方式,应用在安装的时候就能知道常用代码会被提前编译。可以看到,当前 Android 平台的执行模式在空间占用+安装速度+运行速度上已经达到了一个很好的平衡。
参考链接:https://www.zhihu.com/question/319688949/answer/648358786