Android的每次版本升級都會帶來一些改變,有些改變對于應用開發者來說并沒有什么影響,但對于一些重大的改變,我認為Android開發是必要關注和了解一下的,有些改變也許會成為以后的Android進化方向。
面試時,我也比較喜歡問一些每個版本的不同之外,或者問問對方喜歡哪個新版本的特性(如Android 7.0的新特性)。如果比較了解每個版本的不同之外,一般來說都是實踐經驗比較豐富的,很多都是踩過坑的。而對新版本是否關注,其實也是一個檢測一個人的學習熱情最好的題目,興趣是最好的老師,對Android有熱情的人很容易從各種途徑獲知相關的資訊。而沒有興趣的人,仿佛與世無爭,只要還能用原來的方式寫代碼就感覺沒有學習新東西的必要。
如,ART和Dalvik,對于應用開發者來說是無縫過渡的,那么你不奇怪Google是怎么做到的嗎?
面試題:知道什么是ART嗎?它和Dalvik有什么區別?
我們知道到,計算機只能識別機器碼,而Java的運行是將class字節碼在JVM上進行解析最后再翻譯成機器碼執行。Dalvik虛擬機就是針對Android應用(.dex)的一個JVM,雖然他們實現和原理有很多不同,但我們可以簡單這樣理解。
每個應用的進程中都會有一個Dalvik虛擬機實例,它們是相互獨立的,一個應用的Dalvik虛擬機Crash了并不影響其他的。APK應用在運行時,就需要Dalvik虛擬機去加載類并轉化成機器碼執行,這個過程就是JIT(Just-In-Time),雖然dex經過優化會生成一個odex文件,但這個過程仍然是運行時讓編譯器去解釋字節碼,相當于多了一道轉換工序,對性能的影響不小。
在Android 4.4的版本里用戶還可以選擇是用Dalvik還是ART,而5.0后的版本直接換成了ART,把Dalvik刪除了。
而ART(Android runtime)和Dalvik不一樣的地方,就是想法去掉了中間解釋字節碼的過程,Dalvik是JIT的機制,與JIT相對的是AOT(Ahead-Of-Time),它發生在程序運行之前。如我們用靜態語言(例如C/C++)來開發應用程序的時候,編譯器直接就把它們翻譯成目標機器碼。這種靜態語言的編譯方式也是AOT的一種。
但是很多Android應用開發者并不知道有ART的存在,因為ART虛擬機并不要求開發者將自己的應用直接編譯成目標機器碼,而是在應用安裝時由ART將應用的dex字節碼翻譯成本地機器碼。所以你會發現,新的版本安裝應用的時間比之前要長一點。
小結
關于ART方面,我也沒有深入研究,有些東西確實是需要興趣或者壓力才能深入進去的。我們在應用層上開發,基本上也很少涉及Framework層以下的修改,但是我們一定要改變一些想法,如感覺和我們無關的就不舍得花時間看一看,然后故步自封偏安一隅。你不看清楚外面的東西,怎么確認和你有沒有關呢?