2016年8月份,Andioid Nougat(Andiord版本为7.X,以下简称为Andioid N)第一个正式固件推送。作为一整个年度的大版本更新,Andioid N为我们带来了近250项新特性。而其中最受消费者关注的,莫过于应用安装速度的巨大提升,以及应用安装后,更低的存储空间占用。
在感受Android N所带来飞快体验的同时,你一定会有这样的疑问:为什么应用的安装速度提升如此地明显。并且应用的空间占用还变小了?
在解答这个问题前,我们需要先来了解几个基本概念,它们是Android N中,使得应用安装速度变得如此之快的核心,分别是:JIT、ART和AOT。
JIT编译器(Just in time )
JIT的全称是Just in time compilation,中文称之为即时编译,指的是动态编译的一种形式,用于提高程序的运行效率。值得注意的是,这里说的是广义上的JIT,在Android中,人们通常把以JIT编译形式工作的编译器称为JIT编译器。这个时候,我们应当把JIT理解为Just In Time Compiler,也就是我们常说的即时编译器。
现在,我们要来深入了解一下JIT编译器。
谈到JIT编译器,我们就不得不提到,安卓最初的一些程序特性。在安卓诞生之初,其运行程序的核心组件依赖于一个叫做Dalvik的运行环境,又称为Dalvik虚拟机,它的作用是用于运行.dex(Dalvik Executable)格式的程序,由名字可以看出来,.dex格式是专为Dlavik设计的一种压缩格式,对于当时安卓设备有限的硬件机能来说非常合适。
那么Dalvik跟JIT编译器有什么关系呢?我们上面也提到了,在硬件机能有限的当时,Dalvik确实算是一个合适的解决方案。但是,时代在发展,安卓硬件的发展速度大家也都有目共睹,很快一个单纯的Dalvik虚拟机满足不了日益发展的硬件了。
于是,谷歌在Android 2.2版本中提出了使用JIT提高安卓的运行速度的方案。此后,JIT编译器便与Dalvik虚拟机如同共生关系般,一直为后续版本所支持。直至Android 4.4版本。因为在Android 4.4以后,Dalvik与JIT将结束它们的历史使命,转而由一个全新的后辈来接替它们,它就是-ART。
ART(Android Runtime)
ART是Android 4.4以后,用于取代老前辈Dalvik的全新运行环境,我们也可以把它称之为ART虚拟机。那么新的ART带来了什么呢?
首先回忆一下,为了提高Dalvik的运行效率,谷歌在Android 2.2后引入了JIT,而与之对应的,ART则带来了全新的AOT技术。
AOT(Ahead-of-time)
AOT是谷歌在ART中引入的一种全新的编译策略,又可以称其为预编译技术。它与JIT最核心的差异是:JIT是一种动态编译技术,而AOT则属于静态编译。它们运行方式的不同在于:JIT是运行时编译,可以对执行次数频繁的dex代码进行编译与优化。使得在Dalvik中运行应用的响应时间大大减小。
而AOT预编译策略使得ART在应用第一次安装时就完成了所有的编译工作,使得应用程序接近原生应用,之后打开应用时,不再需要额外的翻译工作,直接使用本地机器码运行,因此运行速度大大提升。
Android N 与 Android M对比实测
以上的一些基本概念理解完毕,现在,为了理解Android N的“极速之谜”,我们选用了Android N与Android M(Android版本号为6.X)作对比,不选用其他版本的原因也很简单,差距太大没有可比性。并且Android N之所以安装快的原因也可以从两个大版本之间的一些改动中找出来。(原计划有视频,已pass)
经过实测,应用的安装速度几乎提升了一倍,同时在Android N中,应用的体积不增反减,这是如何做到的呢。
其实答案已经在上面所说的三个基础概念之中了。在Android M中,ART的编译策略是如上所说的AOT预编译,因此使得应用的执行效率无限接近原生应用。但是随之带来的坏处便是在应用安装时,ART需要花大量的时间将应用编译成原生指令。
想必你已经知道了,Android N的“极速之谜”谜底便是剩下的这个——JIT。
Android N安装应用为什么这么快
如大家所想,谷歌在Android N中,JIT即时编译器再次回归,使之成为了一种JIT/AOT混合编译模式。在Android N中,应用在安装时不再做编译,而是解释字节码。省去了冗长的编译时间,安装速度自然大大提升。
这个时候你可能就有新的疑问了,在应用安装时不做编译,那应用执行起来不是会变得很慢么?然而事实上是,Android N中的应用执行速度相比Android M并没有太大的差异,甚至使用一段时间后,Android N的应用执行速度比Android M还要快上不少。
这就要归功于新加入的这个JIT/AOT混合编译技术了。新增的JIT编译器用于对ART进行代码分析,使之可以在应用运行时,持续优化Android应用的性能。使得安装时不做编译,也能达到与安装时完整编译一样的效果。这种编译模式我们依旧同称为AOT,只不过它的含义不再是预编译,而是全时编译技术(All Of the Time compilation)。
此外,JIT的分析结果会被保存起来。当Android设备空闲或充电时,ART就会根据JIT的分析结果,将代码中的常用方法进行编译,而不常用的方法则待到需要时再编译,因而省下了部分存储空间。直观的体现就是我们安装完应用后,存储空间的占用变少了。
应用占用空间对比
根据实测,手机淘宝6.5.0安装完后在Android M中占用空间为171MB,而Android N中占用空间为156MB。王者荣耀1.17.1.23安装完后在Android M中占用空间为439MB,在Android N中占用空间为428MB。以下为个人推测,王者荣耀在两个版本中的占用空间差没有手机淘宝的大的原因,很可能是因为手游中多为常用的交互代码,而手机淘宝中大多数交互都能在web中完成,因而不常用的代码可能更多。造成了这个现象。
总结
最后总结一下。
Android N安装应用快,是因其在安装时只解释字节码,省去了编译所用的时间。之所以能省去编译环节,是因其加入了全新的AOT全时编译技术,使得应用执行效率保持与Android M相同甚至更好。因而ART不再编译所有代码,所以省下了部分存储空间。