2016年8月份,Andioid Nougat(Andiord版本為7.X汗销,以下簡稱為Andioid N)第一個正式固件推送犹褒。作為一整個年度的大版本更新骆膝,Andioid N為我們帶來了近250項(xiàng)新特性砰嘁。而其中最受消費(fèi)者關(guān)注的呕乎,莫過于應(yīng)用安裝速度的巨大提升蝙斜,以及應(yīng)用安裝后精算,更低的存儲空間占用鲤嫡。
在感受Android N所帶來飛快體驗(yàn)的同時(shí)钙畔,你一定會有這樣的疑問:為什么應(yīng)用的安裝速度提升如此地明顯蕴忆。并且應(yīng)用的空間占用還變小了茧跋?
在解答這個問題前朦拖,我們需要先來了解幾個基本概念,它們是Android N中厌衔,使得應(yīng)用安裝速度變得如此之快的核心璧帝,分別是:JIT、ART和AOT富寿。
JIT編譯器(Just in time )
JIT的全稱是Just in time compilation睬隶,中文稱之為即時(shí)編譯锣夹,指的是動態(tài)編譯的一種形式,用于提高程序的運(yùn)行效率苏潜。值得注意的是银萍,這里說的是廣義上的JIT,在Android中恤左,人們通常把以JIT編譯形式工作的編譯器稱為JIT編譯器贴唇。這個時(shí)候,我們應(yīng)當(dāng)把JIT理解為Just In Time Compiler飞袋,也就是我們常說的即時(shí)編譯器戳气。
現(xiàn)在,我們要來深入了解一下JIT編譯器巧鸭。
談到JIT編譯器瓶您,我們就不得不提到,安卓最初的一些程序特性纲仍。在安卓誕生之初呀袱,其運(yùn)行程序的核心組件依賴于一個叫做Dalvik的運(yùn)行環(huán)境,又稱為Dalvik虛擬機(jī)郑叠,它的作用是用于運(yùn)行.dex(Dalvik Executable)格式的程序夜赵,由名字可以看出來,.dex格式是專為Dlavik設(shè)計(jì)的一種壓縮格式乡革,對于當(dāng)時(shí)安卓設(shè)備有限的硬件機(jī)能來說非常合適寇僧。
那么Dalvik跟JIT編譯器有什么關(guān)系呢?我們上面也提到了署拟,在硬件機(jī)能有限的當(dāng)時(shí)婉宰,Dalvik確實(shí)算是一個合適的解決方案。但是推穷,時(shí)代在發(fā)展心包,安卓硬件的發(fā)展速度大家也都有目共睹,很快一個單純的Dalvik虛擬機(jī)滿足不了日益發(fā)展的硬件了馒铃。
于是蟹腾,谷歌在Android 2.2版本中提出了使用JIT提高安卓的運(yùn)行速度的方案。此后区宇,JIT編譯器便與Dalvik虛擬機(jī)如同共生關(guān)系般娃殖,一直為后續(xù)版本所支持。直至Android 4.4版本议谷。因?yàn)樵贏ndroid 4.4以后炉爆,Dalvik與JIT將結(jié)束它們的歷史使命,轉(zhuǎn)而由一個全新的后輩來接替它們,它就是-ART芬首。
ART(Android Runtime)
ART是Android 4.4以后赴捞,用于取代老前輩Dalvik的全新運(yùn)行環(huán)境,我們也可以把它稱之為ART虛擬機(jī)郁稍。那么新的ART帶來了什么呢赦政?
首先回憶一下,為了提高Dalvik的運(yùn)行效率耀怜,谷歌在Android 2.2后引入了JIT恢着,而與之對應(yīng)的,ART則帶來了全新的AOT技術(shù)财破。
AOT(Ahead-of-time)
AOT是谷歌在ART中引入的一種全新的編譯策略掰派,又可以稱其為預(yù)編譯技術(shù)。它與JIT最核心的差異是:JIT是一種動態(tài)編譯技術(shù)狈究,而AOT則屬于靜態(tài)編譯碗淌。它們運(yùn)行方式的不同在于:JIT是運(yùn)行時(shí)編譯盏求,可以對執(zhí)行次數(shù)頻繁的dex代碼進(jìn)行編譯與優(yōu)化抖锥。使得在Dalvik中運(yùn)行應(yīng)用的響應(yīng)時(shí)間大大減小。
而AOT預(yù)編譯策略使得ART在應(yīng)用第一次安裝時(shí)就完成了所有的編譯工作碎罚,使得應(yīng)用程序接近原生應(yīng)用磅废,之后打開應(yīng)用時(shí),不再需要額外的翻譯工作荆烈,直接使用本地機(jī)器碼運(yùn)行拯勉,因此運(yùn)行速度大大提升。
Android N 與 Android M對比實(shí)測
以上的一些基本概念理解完畢憔购,現(xiàn)在宫峦,為了理解Android N的“極速之謎”,我們選用了Android N與Android M(Android版本號為6.X)作對比玫鸟,不選用其他版本的原因也很簡單导绷,差距太大沒有可比性。并且Android N之所以安裝快的原因也可以從兩個大版本之間的一些改動中找出來屎飘。(原計(jì)劃有視頻妥曲,已pass)
經(jīng)過實(shí)測,應(yīng)用的安裝速度幾乎提升了一倍钦购,同時(shí)在Android N中檐盟,應(yīng)用的體積不增反減,這是如何做到的呢押桃。
其實(shí)答案已經(jīng)在上面所說的三個基礎(chǔ)概念之中了葵萎。在Android M中,ART的編譯策略是如上所說的AOT預(yù)編譯,因此使得應(yīng)用的執(zhí)行效率無限接近原生應(yīng)用羡忘。但是隨之帶來的壞處便是在應(yīng)用安裝時(shí)锡足,ART需要花大量的時(shí)間將應(yīng)用編譯成原生指令。
想必你已經(jīng)知道了壳坪,Android N的“極速之謎”謎底便是剩下的這個——JIT舶得。
Android N安裝應(yīng)用為什么這么快
如大家所想,谷歌在Android N中爽蝴,JIT即時(shí)編譯器再次回歸沐批,使之成為了一種JIT/AOT混合編譯模式。在Android N中蝎亚,應(yīng)用在安裝時(shí)不再做編譯九孩,而是解釋字節(jié)碼。省去了冗長的編譯時(shí)間发框,安裝速度自然大大提升躺彬。
這個時(shí)候你可能就有新的疑問了,在應(yīng)用安裝時(shí)不做編譯梅惯,那應(yīng)用執(zhí)行起來不是會變得很慢么宪拥?然而事實(shí)上是,Android N中的應(yīng)用執(zhí)行速度相比Android M并沒有太大的差異铣减,甚至使用一段時(shí)間后她君,Android N的應(yīng)用執(zhí)行速度比Android M還要快上不少。
這就要?dú)w功于新加入的這個JIT/AOT混合編譯技術(shù)了葫哗。新增的JIT編譯器用于對ART進(jìn)行代碼分析缔刹,使之可以在應(yīng)用運(yùn)行時(shí),持續(xù)優(yōu)化Android應(yīng)用的性能劣针。使得安裝時(shí)不做編譯校镐,也能達(dá)到與安裝時(shí)完整編譯一樣的效果。這種編譯模式我們依舊同稱為AOT捺典,只不過它的含義不再是預(yù)編譯鸟廓,而是全時(shí)編譯技術(shù)(All Of the Time compilation)。
此外辣苏,JIT的分析結(jié)果會被保存起來肝箱。當(dāng)Android設(shè)備空閑或充電時(shí),ART就會根據(jù)JIT的分析結(jié)果稀蟋,將代碼中的常用方法進(jìn)行編譯煌张,而不常用的方法則待到需要時(shí)再編譯,因而省下了部分存儲空間退客。直觀的體現(xiàn)就是我們安裝完應(yīng)用后骏融,存儲空間的占用變少了链嘀。
應(yīng)用占用空間對比
根據(jù)實(shí)測,手機(jī)淘寶6.5.0安裝完后在Android M中占用空間為171MB档玻,而Android N中占用空間為156MB怀泊。王者榮耀1.17.1.23安裝完后在Android M中占用空間為439MB,在Android N中占用空間為428MB误趴。以下為個人推測霹琼,王者榮耀在兩個版本中的占用空間差沒有手機(jī)淘寶的大的原因,很可能是因?yàn)槭钟沃卸酁槌S玫慕换ゴa凉当,而手機(jī)淘寶中大多數(shù)交互都能在web中完成枣申,因而不常用的代碼可能更多。造成了這個現(xiàn)象看杭。
總結(jié)
最后總結(jié)一下忠藤。
Android N安裝應(yīng)用快,是因其在安裝時(shí)只解釋字節(jié)碼楼雹,省去了編譯所用的時(shí)間模孩。之所以能省去編譯環(huán)節(jié),是因其加入了全新的AOT全時(shí)編譯技術(shù)贮缅,使得應(yīng)用執(zhí)行效率保持與Android M相同甚至更好榨咐。因而ART不再編譯所有代碼,所以省下了部分存儲空間携悯。