原文參考:Android技術架構演進與將來html
目前,移動開發已經處於飽和的階段,Android開發也不如當年盛況,已經再也不像前幾年前那麼火爆。正如一種編程語言若是經歷過盛極一時,那麼必然有這樣的一條曲線,像咱們學的正弦曲線先急速上升,而後到達頂點,而後再降低,最後再趨近一個平穩的值。 能夠看到,從2016年的下半年開始,移動互聯網基本處於緩慢發展的階段,不少大佬稱之爲互聯網的下半場。若是移動互聯網的前半場是粗放式的強地盤階段,那麼下半場就是守地盤的階段,這一階段,會出現衆多的寡頭。 在技術上,相比以前以前面試只問Android四大組件,數據庫,網絡和項目經驗不一樣,如今面試Android崗位會設計各類原理(包括系統的一些原理以及第三方庫的原理及流程)、Android優化以及與Android相關的跨平臺技術。除此以外,稍微大點的公司還會對App的用戶體驗、流暢度等等提出要求,因此說,Android的面試已經不可同日而語。前端
關於Android的面試,能夠參考我以前的文章:java
Android開發初級中級高級怎麼劃分
史上最全的Android面試題集錦linux
從Android 1.0版本誕生至今,Android已經走過了10餘年,這一路走來Android遇到哪些問題?大版本升級朝着什麼方向演進?Android的將來如何?面試
先來看看Android系統的發展過程,從2008年發佈Android 1.0系統,到2019年發佈的Android 10.0系統,Android延續着每一年發佈新系統的頻率。每一年Android都會帶來不少的系特性,特別是最近幾年,隨着Android對底層系統的優化,Android和iOS的差距愈來愈小。數據庫
下面咱們來看一下Android發佈重要時間節點。編程
無論是什麼系統,必然會面臨多個版本的迭代。做爲目前最流行的移動操做系統之一,Android系統也歷經10餘年的迭代和更新,在用戶體驗、流暢性、續航、安全、隱私、機器學習等方面都取得較大的改進。下圖演示了Android每一個版本的更新狀況。 瀏覽器
圖中是每一個大版本中最具表明性的特徵標記在圖中,並不表明着該版本所有特徵,一樣專項計劃也不是隻在某一個版本執行,好比續航和性能優化,每個版本都在持續改進中,Treble計劃也一直在迭代至今。下面,咱們來看一下Android歷個版本的更新狀況。Android 1.0到Android 4.0,系統各項功能和特性迭代到一個較完善的階段。安全
Android 4.1系統,Google開展了黃油計劃(Project Butter),爲了讓Android系統擺脫UI交互上的嚴重滯後感,但願能像「黃油」同樣順滑。 核心原理是系統框架中的渲染和動畫統一採用垂直同步技術(VSYNC),以及三重緩衝技術(Triple Buffer),讓滑動、翻頁等操做更加一致與順滑。性能優化
Android 4.4系統,Google開展了瘦身計劃(Project Svelte),力求下降安卓系統的內存使用,解決低端機型升級難的問題,讓Android 4.4可正常運行在全部Android手機,從而減小安卓系統繼續碎片化。UI設計上,支持新的「沉浸式模式」,用戶界面由過去的黑色與藍色爲主的色調轉向帶有透明度的淺色系,視覺語言變得更加明亮與現代化。
Android 5.0系統,Google開展了伏特計劃(Project Volta),力求提高續航能力,這方面Google落後於業界廠商,廠商直面用戶對續航尤其迫切,每每系統資源管控更爲嚴格。另外,系統採用全新的ART,拋棄Dalvik虛擬機,大幅提高運行效率。UI設計上,使用全新的扁平化Material Design設計風格,更加清新與質感的設計,統一Android設備的外觀和使用體驗。
Android 6.0系統,Google引入新的運行時權限,讓用戶可以更好地瞭解和控制權限;引入了Doze模式,進一步提高電池續航能力。UI設計上,新增夜間模式,大幅改進通知欄,讓通知更簡潔。
Android 7.0系統,引入新的JIT編譯器,對AOT編譯器的補充,可節省存儲空間和加快更新速度;進一步優化Doze喚醒機制;UI設計上,支持分屏功能。
Android 8.0系統,Google開展了計劃(Project Treble),從新架構Android,將安卓系統框架與Vendor層解耦,力求完全解決安卓碎片化這一老大難的問題,這是安卓系統架構最大的變化。系統層面增強對後臺服務、廣播、位置的管控限制。UI設計上,改進通知欄,智能文本選擇和自動填充功能。
Android 9.0系統,引入神經網絡API,採用機器學習的思路來預測用戶使用習慣來作省電優化,繼續強化Treble計劃;文件系統(sdcardf/F2FS)持續提高;私有API的限制進一步規範化Android生態,強化隱私和安全,硬件安全性模塊以及統一輩子物識別身份驗證界面。 UI設計上,新的手勢導航,增強支持劉海屏,UI搜索界面使用到機器學習,AI正在逐步強化Android系統。
Android 10.0系統,Google開展了主線計劃(Project Mainline),相關模塊(Modules)不容許廠商直接修改,只能由Google應用商店來更新升級,強化用戶隱私、系統安全與兼容性,支持臉部生物識別。
無論Android系統如何升級,可是Android的總體架構是基本沒有改變的,即從上到下能夠分爲應用程序層、 應用框架層、系統運行庫層和Linux內核層,以下圖所示。
頂層中有全部的Android應用程序,包括通信錄、瀏覽器等,你寫的應用程序也被安裝在這層;全部的的應用程序都是使用Java語言編寫的。
這一層主要提供構建應用程序是可能用到的各類API,Android自帶的一些核心應用就是使用這些API完成的,開發者也能夠經過使用API來構建本身的應用程序。
Android包含一些C/C++庫,這些庫能被Android系統中不一樣的組件使用。他們經過Android應用程序框架爲開發者提供服務,如下是一些核心庫:
Android包括了一個核心庫,該核心庫提供了Java編程語言核心庫的大多數功能。
每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。Dalvik被設計成一個設備能夠同時高效地運行多個虛擬系統。Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該個稅文件針對小內存使用作了優化。同時虛擬機是基於寄存器的,全部的類都經由java編譯器編譯,而後經過SDK中的」dx」工具轉化成 .dex格式由虛擬機執行
Dalvik虛擬機依賴於linux內核的一些功能,好比線程機制和底層內存管理機制。
Android系統基於Linux2.6內核,這一層爲Android設備各類硬件提供了底層驅動,如顯示驅動,音頻驅動,照相機驅動,藍牙驅動,WIFI驅動,電源管理等
Android歷經10餘年的迭代,在流暢性、內存、續航、安全、隱私等方面都取得很大的進步,但Android系統的碎片化一直是痛點問題,帶來不一致的用戶體驗。
Android的開放性,是其長久發展的主要緣由,讓大多數的廠商都選擇Android系統,但開放性的背後是碎片化,從Android誕生至今問題就一直存在,Google一直在努力從技術角度來解決碎片化問題。從Android 8.0提出Treble項目,從新架構系統將system與vendor解耦合,用於加快Android新版本的適配,效果並不明顯,Google繼續在後續的Android P以及Android Q一直在竭盡全力地持續完善Treble項目,力爭加快系統升級速度。
Android系統碎片化,讓安全、隱私問題存在風險,且存在體驗不一致性問題,但老版本手機的OTA維護升級對廠商來講成本是昂貴的,Google感受到對Android系統掌控力度不足,要想完全改變,除非不讓各大廠商定製化,這勢必致使Android手機徹底同質化,手機廠商就無法玩了,等於自掘墳墓,Google確定不會這麼幹。因而,Google在Android 10.0提出了」Project Mainline「,將對隱私、安全、兼容性形成重大影響的少數模塊獨立成module,每一個module打包成APEX格式(一種相似於APK的新格式),由Google經過應用商店按期來升級,從而保證低版本的手機不會由於碎片化而得不到隱私、安全與兼容性的更新。這些module是由Google維護的主線,各大廠商只能跟Google溝通並將代碼upstream到AOSP主線。Google花費了大量的人力在努力完善並推行Mainline,Google但願統一管控的機制,廠商但願最大的自由定製空間,這是一場有趣的角逐,筆者跟團隊一塊兒跟Google協商落地module的落地計劃,最終將某些module影響較大模塊爭取Android 11再上線,Mainline更新機制以下圖。
Android系統離不開各App來提供豐富的功能,下面再來講一說應用開發涉及的一些技術演進。
從最開始以Cordova爲基礎(依賴於WebView)的Hybrid混合開發技術,到React Native的橋接(將JS轉爲Native)的技術,再到最新的Flutter技術,都說明如今移動端在多端開發中的嘗試。 Flutter是Google發佈的全新的移動跨平臺UI框架,渲染引擎依靠跨平臺的Skia圖形庫來實現,依賴系統的只有圖形繪製相關的接口,能夠在最大程度上保證不一樣平臺、不一樣設備的體驗一致性,邏輯處理使用Dart語言,執行效率比JavaScript高。另外,Google內部正在開發的另外一個操做系統Fuchsia的UI layer採用的是Flutter,也就是說Flutter自然能夠支持Android、IOS以及將來的Fuchsia。在大前端方向,對於跨平臺開發中一直在不斷迭代中尋找更好、更優的解決方案,目前來看Flutter仍是更有優點。
跨平臺相關的內容能夠參考:移動跨平臺技術方案總結
所謂軟件架構(Software Architecture),是指軟件開發過程當中涉及的一系列抽象模式,用於指導大型軟件系統各個方面的設計,軟件架構是構建計算機軟件系統的理論基礎。在Android開發中,前後提出了MVC、MVP和MVVM等軟件架構模式,這些軟件架構模式爲Android項目開發提供了理論基礎。
MVC模式(Model–view–controller)但Activity類過於臃腫,爲解決這個問題,有了MVP(Model–view–presenter),presenter不只要操做數據,並且要更新view;再到MVVM(Model-View-ViewModel)解決了MVP大量的手動View和Model同步的問題,提供雙向綁定機制。
所謂熱修復,指的是爲了修復線上問題而提出的修補方案,程序修補過程無需從新發版!熱修復的主要應用場景是爲了讓用戶無感得修復線上缺陷,好比Tinker,Andfix,Sophix等。 插件化則是爲了減小模塊耦合,可減小主程序的規模,可按需加載,好比DroidPlugin,OpenAtlas等。關於各個熱修復與插件化的細節再也不展開,這裏就說一點,Android 7.0對Native的NDK的調用限制是手銬,尤爲是Android 9.0對Java層SDK的調用限制就是腳銬,那麼對於Android應用想再搞插件化之類的黑科技即是帶着腳手銬跳舞,能跳但舞姿可能不太美觀。
關於熱修復能夠參考:
Android熱修復技術總結
Android 熱修復框架比較
關於插件化則能夠參考:
深刻理解Android插件化技術
Android插件化常見衝突解決
Android 插件化的Hook方案
攜程Android App的插件化和動態加載技術剖析
蘑菇街Android組件化與插件化
Android 插件化之ClassLoader詳解
隨着應用不斷演講,功能愈來愈複雜,且應用針對不一樣屏幕設備、不一樣國家語言資源都打包在同一個App,致使應用包不斷增大,據統計自2012年以來應用包大小增加5倍。雖然如今手機的存儲空間愈來愈大,但用戶照片、視頻等媒體文件品質在逐漸提高,致使設備可用空間逐漸緊縮。爲此Google在去年Google I/O大會講述Android引入新的App動態化框架(即Android App Bundle,縮寫爲AAB)。利用Split Apk完成動態加載,使用AAB動態下發方式,可顯著縮小應用體積,減小對存儲空間的佔用。
App Bundle相關的內容能夠參考:
Kotlin是Google推薦的官方靜態編程語言,與Java互通,可相互轉換。Kotlin編譯成Java字節碼,也能夠編譯成JavaScript,運行在沒有JVM的設備上,簡潔安全。使用Kotlin更快速地編寫Android應用,能夠提升開發者的工做效率,少編寫樣板代碼,被稱之爲 Android 世界的Swift。 谷歌開發者社區作過一個問卷調查,大概有50%的Android開發者已使用過Kotlin。這裏並不是鼓勵你們必定都要使用Kotlin,學習新語言就像一次投資,要權衡團隊成本與收益之間的利弊。若是你是一位原生Android開發,那麼掌握Kotlin將是你必須掌握的技能。做爲一名移動開發老兵,筆者在2018年出版了一本《Kotlin入門與實戰》,Kotlin簡潔的語法至今令我印象深入。
Fuchsia,是由Google公司開發的繼Android和Chrome OS以後的第三個系統,已在Github中公開的部分源碼能夠得知。不一樣於安卓使用的Linux內核,Fuchsia採用的比較新的Zircon的內核。該系統與當下Android相比,不管是存儲器仍是內存之類的硬件要求都大幅下降,能夠看出這是一款面向物聯網的家用電器用的系統。據悉Flutter引擎+Dart語言將頗有可能成爲Fuchsia系統主要的UI開發框架。谷歌Fuchsia選擇Flutter做爲UI並不使人意外,畢竟Dart語言由谷歌親生,一方面不用擔憂被人起訴,另外當Fuchsia有須要時,也能靈活地在Dart虛擬機作出針對性的改變。
Fuchsia會是Android的終結者嗎? 筆者認爲至少將來三五年內不太可能取代Android。當年爲了和蘋果iOS抗衡,Android系統研發做爲Google重中之重,在這種狀況下,Android誕生依然花費了Google 3年時間。而Fuchsia只是公司目前的實驗項目,且Fuchsia並不是基於業界成熟Linux內核,而是採用全新Zircon內核,項目工程路還很遠。下面是Fuchsia的整個技術架構圖。
從Fuchsia技術架構來看,內核層zircon的基礎LK是專爲嵌入式應用中小型系統設計的內核,代碼簡潔,適合嵌入式設備和高性能設備,好比IOT、移動可穿戴設備等,目前這些領域標準化級別的壟斷者。以及在框架層中有着語音交互、雲端以及智能化等模塊,由此筆者揣測將來Fuchsia率先應用在音控等智能設備。Fuchsia基於功能的模塊化操做系統,應該會使各組件模塊能獨立升級更新能力,保證體驗一致性。Fuchsia在IOT領域佔據必定份額後,加之其良好的跨平臺,能夠再逐步滲透到移動手機、筆記本電腦等設備,進而三位一體,打造手機、電腦與IOT完美的互聯互通的統一平臺體驗,讓多端設備都離不開Fuchsia。在2018年10月,在「藍牙特別興趣小組(Bluetooth SIG)」舉辦的UnPlugFest(UPF)測試大會上,Google再展現了Fuchsia與Android設備的互聯性,能夠窺見一斑。Fuchsia的定位是物聯網,相信隨着5G時代的到來,Fuchsia將可能一統江湖。不過,目前來看,Fuchsia還有至關長的路要走。
移動操做系統的演變過程,從按鍵交互的塞班功能機到觸摸屏交互的Android/IOS智能機,從小屏幕手機到全面屏、劉海屏、水滴屏。總結一下,任何系統無非幹兩件事:輸入和輸出,接收到外部輸入信號後通過操做系統處理後輸出信息。
Android發展至今,已成爲全球用戶量最普遍的移動操做系統,手機行業競爭異常激烈,通過幾番洗牌,國內手機廠商主要是華米OV四大公司,而且隨着移動互聯網增加見頂,國內Android開發的需求也愈來愈少,那麼Android的將來在哪裏呢?
目前,Android在應用層次的發展已經見頂,將來的發展主要集中在人工智能和5G結合的產業,智能汽車、智能家居、IOT都將是Android發展的廣闊市場。但就目前人工智能的奇點還沒到來,技術還處於前期階段,一旦奇點來臨將會爆炸式發展,或將從新定義生活方式。汽車的智能化和互聯網化是將來一大趨勢,Google這兩年確實在汽車領域發力,Android Auto在過去一年的用戶增加250%。天生的移動特性加上愈來愈多的互聯網服務需求,汽車須要一個具有多種感知能力的系統,或將成爲是繼手機、電視後Android的下一重點開拓領域。
對於Android開發人員來講,我有如下幾點建議: