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不再編譯所有代碼,所以省下了部分存儲空間。