現實工做中常常能夠聽到這樣的說法:框架的升級帶來協議性能的提高、編程模式的變革帶來業務的飛躍...... 姑且不論這些表述是否有問題,實際上若是系統地看待事物總體,可能會有不同的發現。以LINUX爲例,儘管其內核大獲成功,但若是不是遵循POSIX、併成爲一個開源、精簡的UNIX實現,很難想象其最終會有何種發展。所以,對事物進行全局和必定深刻的探究有時會有更多啓發。算法
今天,阿里高級無線開發專家所爲將結合本身多年的經驗,爲你深刻闡述整個 Android 技術域及移動研發生態,期待與你們共同探討。編程
架構的工程意義在於:定義並解決一類問題,爲需求到實現的平穩過渡提供保障。傳統意義的Android架構(圖1)已被人熟知,但不一樣角色的視角不一樣,例如認爲Runtime和框架是其核心、或者將Android看作是一種特異性JVM平臺、還有從嵌入式出發將其看作是Linux…… 實際上,Android是極少數幾個用設計來解決自身發展問題的系統,其核心在於經過硬件抽象、組件化、接口層三種能力來爲發展提供基礎,併爲諸多變數預留大量可操做、斡旋的空間。網絡
1.1 發展的前提:硬件抽象架構
2008年,我國邁入3G時代前夜,基礎設施的變革讓移動領域充滿變數,不管設備、硬件仍是軟件都均未定型。擅長架構和軟件的Google在這一領域要得到生存和長足發展,須要團結一切可能的、甚至是未知的力量,取得移動運營商、芯片供應商、手機制造商的支持則是生存的第一步。併發
硬件抽象層(HAL)在必定程度上起到這樣的目的:它爲移動領域五花八門、標準不統一的硬件驅動定義標準接口,避免Android過度依賴Linux,讓後續的擴展和整機集成更加高效,知足了手機制造商的重要訴求;同時還起到隔離Linux內核的做用,避免廠商充滿硬件祕密的驅動源碼受GPL協議影響而開源,保障了芯片等硬件製造商的核心利益。傳統手機OS的定製和集成流程須要修改大量代碼,負擔很多,從這個角度來看Android HAL其設計是領先的。結合AOSP優良的代碼分支、模塊管理,加上基於GNU automake巨集造成的Android build system,廠商享受到超越以往的便捷。框架
然而HAL並沒有固定作法(如圖2所示),Android 8.0以前,最初大量採用HAL舊版方式,表現爲framework直接加載*.so並依賴,主要集中在網絡、藍牙等模塊;舊版方式致使framework與具體驅動接口耦合過緊,後來造成HAL傳統方式,即提供必定規範和接口進行改進,從而減小直接耦合,但每次廠商支持新版Android依舊有大量改動和適配;爲更有效地解決這一問題,Android 8.0開啓Treble項目,今後芯片廠商能經過基於Binder的HIDL提供穩定接口,製造商則可不受芯片廠商影響而直接更新Framework,甚至得到無需從新編譯HAL便可OTA的能力。less
受益於HAL這一設計,Google在全球得到更普遍的支撐,尤爲是Android 8.0在國內廠商的迅速適配可見一斑。HAL爲Android設備量的持續增加提供了基礎,並促進有實力的廠商向設備上層及基礎設施兩個領域縱深發展(圖3),體如今掌握核心技術的廠商(如高通、華爲、MTK),經過不斷建設系統能力來強化競爭力(支持5G標準、硬件能力、軟硬結合以及系統能力的深度定製等),而具有渠道和資源整合優點的手機制造商(華爲、OPPO、小米、VIVO等),則立足OS持續構建更高效的應用來拓展版圖(UI、推送、商店、輕應用等),這都體現出Android HAL對整個產業的凝聚和影響,間接彌補Android自身的諸多不足。微服務
1.2 能力的樞紐:組件化高併發
對能力進行如何組織和複用是架構的最大挑戰,借鑑現有能力是發展的捷徑。不管是Mircosoft的COM,仍是OMG的CORBA,或是從EJB到Spring、從SOA到Serverless,隨着基礎設施如網絡、終端設備的能力提高,這些技術的發展呈現出從重量到輕量、從對中心(總線)的重度依賴到輕量級依賴的趨勢。Android充分結合各領域先進技術,並基於移動端資源受限這一最大特點,造成了自身的技術特點:AIDL衍生自複雜的CORBA IDL,組件由SOA精簡而來,各獨立生老病死的System Service相似一個個微服務,Binder能夠看作是對一種弱化總線、性能更好、可點對點通訊的DBUS,UI佈局系統則極大程度受到SWING的影響、manifest實際上就是APP與系統通訊所必須的組件接口描述文件......工具
上面提到的領域技術的確有利於Android發展,但遠遠不夠。回想以前談到的HAL以及總體架構,咱們看到Android實際上就是個大雜燴,使用的是諸多技術的混合。過去除Palm等Web OS外,不管是基於Linux/Unix構建的系統如Meego,仍是Symbian、MTK、UCOS、WindowsCE,不管是實時系統仍是非實時系統,這些移動端系統都以C/C++爲主且小巧精悍,對內存使用和要求極爲考究,雖然知足了資源受限設備的使用訴求但帶來了門檻;虛擬機類的平臺如KJava、.NET on Windows Phone雖然內存使用和能耗方面比較大方,卻勝在研發效率和容錯性,於是受到很多開發者歡迎。
因此選擇混合架構對於缺少完整移動領域產業鏈支撐的Google既符合其自身技術理念、又勝算最大,因而量身定製的組件化能力便肩負起這一使命,使得各組件獲得有機組合、應用之間以及應用和系統的溝通更爲明確和有約束,最終幫助整個系統靈活運轉,能力被迅速放大。
觀察Android系統的啓動運行流程(圖4)以及APP對系統能力的使用(圖5),能夠發現其各種能力已按照組件化標準和粒度進行組織(能力的註冊發現、接口和通訊的標準化、運行空間的隔離等),讓快速迭代的手機硬件和持續升級的系統能力以最小代價透出,將複用的價值在移動設備系統上具體化並最大化,從而具有更高的靈活性和兼容性;其背後軟件工程的意義在於爲軟件需求、設計之間架起一座橋樑,解決了系統結構和研發需求向實現平坦過渡的問題。
固然,歷史上其餘公司面臨這類挑戰時也有不同的想法,例如Windows Phone 8.0選擇了另一條路,不管是提供媲美JAVA的C#及VB.NET框架、仍是基於Sliverlight Dependency Property + XAML的UI系統、甚至是爲了支持C++研發出來的C++/CX及一套運行時,都彷彿無時無刻標榜着其系統技術的多樣化與複雜性,算得上是一場技術盛宴。
Meego則是另一個例子,被期待救Nokia於危難,並由Intel聯袂推出,經過各類開源能力的組合來完成系統的建設,如Linux內核+QEMU模擬器+QT+QML界面,但實際上曇花一現。
1.3 應用的基礎-接口層
系統能力基本就緒,如何迎來更多開發者對Android長遠發展相當重要。選擇JAVA做爲上層語言,既須要勇氣又足夠彰顯其野心;爲迎合資源受限這一移動領域過去、如今也是將來的最大客觀事實,其設計了基於寄存器架構、可執行文件更小的Dalvik虛擬機,並經過淨室工程來高質量實現,同時結合諸多工具對外提供了流暢的JAVA編程方式,擺脫相似MTK feature phone只能用KJava寫些小遊戲的侷限,使得Android研發兼具JAVA的便利和不錯的性能。
天有不測風雲,SUN在09年4月被Oracle收購,距離Android 1.0發佈還不到一年。雖然最初選擇Apache Harmony來提供JAVA API十分明智,但卻遭遇到技術上不支持JAVA 7/八、版權上Oracle訴訟紛至沓來等諸多挑戰。爲應對這一切,Google從Android N開始,將JAVA的支持變動爲OpenJDK。另外,Kotlin由於特性相近、又可被編譯爲class或者dx字節碼,也得到了Google青睞和收編(圖6)。
實際上,之因此Android敢這麼作,仍是由於有其設計基礎的支撐,根據我的的一點粗鄙瞭解,從Android API的調用鏈路(圖7)上能發現端倪:不管底層依賴、實現和流程如何變化,上層的使用形式並不會改變。
這意味着幾乎全部系統能力的核心,已在native library被實現殆盡,並結合上層提供良好屏蔽。這爲其餘語言實現Framework提供了可能,尤爲是一門特性與JAVA相近的語言。因此是什麼語言、是否是kotlin都只事先設計規範下的一種合適的選擇。
綜上所述,Android從三個方面來解決其發展的關鍵問題:
移動互聯網產業巨頭髮展由於起點以及執行理念不一樣而有所不一樣,Apple圍繞着其App Store構建其整個體系並精心維護,並且在現代化API編程、整機體驗、垂直領域技術如網絡/算法等各縱深領域走在前列;Google則用Android帶路,須要在各個層面維護和團結不一樣力量來造成本身的發展特點。因此,Android爲系統如何發展提供了另一種答案:除關注系統自身能力的發展,如何維護好系統不斷髮展的基礎和前提、如何更好地暴露和讓外界使用系統能力也相當重要(見圖九)。
回到咱們自身,在重用戶、重交互、手機即人的今天,咱們的產品有理由也有必要用其內涵延展並放大服務的價值。要作到這一點並不是易事。首先,業務迭代愈來愈快,各類應用層出不窮對中間件意味着普遍的需求;其次,環境在改變,不管是運行硬件和設備的五花八門、仍是對接集羣的複雜多樣,都對阿里原有端側中間件帶來巨大沖擊;再次,在基礎技術發展變緩的今天,技術的價值須要被持續放大,咱們但願基於自身能力來構建服務和業務的泛鏈接基礎,並將其做爲發展願景。這要求咱們基於集團背景以及核心APP發展的主要目標下,來綜合思考這個發展問題(圖10)。
經過Android的啓發,結合環境和現狀,在知足業務目標的同時咱們從三個層面不斷演進網絡能力(圖11)。
基於以上的不斷沉澱,目前咱們已能觸達海量設備和用戶,成爲接入阿里內外各服務和平臺的接口,併爲終端和服務分別屏蔽集羣的多元化及設備的多樣性,實現新零售系統能力與用戶的泛鏈接(圖12)。
結合傳統的C/S觀念,服務端獲取的信息來源於各網絡終端,網絡+協議屏蔽或規範了外界對服務輸入的多樣性,使得服務端過去關注的是集羣和高併發,但如今不管是上雲仍是利用率,背後都是業務、成本規模和邊際效應在驅動,這裏面發展的代際主旨鮮明。但回到客戶端,因爲受到環境和交互等多樣性直接影響,即使是動態性的技術也難以表明端側的所有甚至是主流。因此在某種局部技術比拼武功,成爲過去客戶端的一種行業「潮流」。
在局部技術和單點深刻的確有其意義,筆者也曾有過一些班門弄斧,如非輪詢方式獲取手機棧頂Activity、面向阿里特有複雜集羣的SDK多實例設計、Sophix熱修復及雲上產品等。但結合過往經驗及Android設計,能夠更系統性地看待這一現象:即除了知足業務核心訴求(由於投入大量資源,必須、確定要成,至少小成),更應該關注技術如何更好地服務業務以及如何持續挖掘能力護城河這兩頭的問題。因此要打造和發展好一個系統,除構建系統各中堅能力外,還需維護好系統發展的前提、組織好各系統能力的內聚、知足好外部對系統的訴求。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。