純Linux而不需要虛擬機的手機系統當然有,火狐的FirefoxOS、UbuntuTouch、三星Tizen操作系統、以及曾經大名鼎鼎的Megoo都是沒有虛擬機的。
Android使用虛擬機是因為采用了Java作為核心開發語言,Java足夠成熟、生態健全、開發者眾多,這是Android早期發展迅速的主要原因,當然Android的高速發展也給了Java第二春。Oracle公司現在又在作死,各種用Java的問題刁難Google,Google推出Flutter框架、扶持Kotlin,以及打造Fuchsia操作系統,就是為了能夠找到取代Java甚至直接取代Android的解決方案。
Android為什么要用虛擬機
Android誕生之初并不是師出名門,后來被Google收購也算是傍上了大款,Android使用虛擬機的主要原因還是因為Java,因為Java有足夠好的凱源生態,更重要的是Java有成熟的開發者生態,最最重要的當然還是Java是第一大編程語言、背后有最多的開發者。
Android誕生之初,跟Java普遍使用JVM家在字節碼文件(
.class
),Android的虛擬機是Dalvik虛擬機,每次運行程序,Dalvik負責加載dex/odex文件然后解析成機器碼讓Android系統調用。2010年5月20日,Google正式向外界發布了版本代號為Froyo凍酸奶的Android2.2版本,這是Android第一個成熟版本,Google在這個版本的虛擬中加入了即時編譯、也就是我們通常所說的Just-In-TimeCompiler(JIT)編譯器,Dalvik使用JIT進行編譯,JIT可以對經常使用的dex/odex進行編譯和優化,將其翻譯成精簡的NativeCode執行,引入JIT之后Dalvik性能提升了3到6倍。
2013年10月31日,Google正式對外發布代號為Kitkat的Android4.4,Google為了改善Android糟糕的用戶體驗,開發了全新的虛擬機運行環境,也就是AndroidRuntime(ART),在這個版本中Google還有了新的編譯策略Aheadoftime(AOT),不過這時候ART和Dalvik共存,直到2014年10月16日代號為Lollipop棒棒糖的Android5.0版本,ART徹底取代Dalvik,AOT成為了唯一的編譯模式,AOT相對于JIT的優點是,JIT是運行時動態編譯,每次運行程序的時候都要編譯,AOT則是靜態編譯,應用在安裝的時候就已經完成了編譯,程序運行的時候不用重新編譯,這才是真正的本地應用概念。
ART還對垃圾回收機制進行了改革,ART只有一次垃圾回收暫停、而Dalvik有兩次,ART在垃圾回收保持暫停的時候并行處理,ART還優化了垃圾回收的效率,讓系統能夠及時垃圾回收、及時減少后臺內存使用和碎片化問題。