Android 整體設計及背后意義

目錄

1. Android設計的現實意義

1.1 發展的前提:硬件抽象

1.2 能力的樞紐:組件化

1.3 應用的基礎-接口層

2. 對于我們的象征意義和實踐

3. 小結


阿里妹導讀:現實工作中經常可以聽到這樣的說法:框架的升級帶來協議性能的提升、編程模式的變革帶來業務的飛躍...... 姑且不論這些表述是否有問題,實際上如果系統地看待事物整體,可能會有不一樣的發現。以LINUX為例,盡管其內核大獲成功,但如果不是遵循POSIX、并成為一個開源、精簡的UNIX實現,很難想象其最終會有何種發展。因此,對事物進行全局和一定深入的探究有時會有更多啟發。

?

今天,阿里高級無線開發專家所為將結合自己多年的經驗,為你深入闡述整個?Android?技術域及移動研發生態,期待與大家共同探討。

?

1. Android設計的現實意義

?

架構的工程意義在于:定義并解決一類問題,為需求到實現的平穩過渡提供保障。傳統意義的Android架構(圖1)已被人熟知,但不同角色的視角不同,例如認為Runtime和框架是其核心、或者將Android看做是一種特異性JVM平臺、還有從嵌入式出發將其看做是Linux…… 實際上,Android是極少數幾個用設計來解決自身發展問題的系統,其核心在于通過硬件抽象、組件化、接口層三種能力來為發展提供基礎,并為諸多變數預留大量可操作、斡旋的空間。

?

圖1. 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的能力。

?

圖2. Android對硬件驅動的設計

?

受益于HAL這一設計,Google在全球獲得更廣泛的支撐,尤其是Android 8.0在國內廠商的迅速適配可見一斑。HAL為Android設備量的持續增長提供了基礎,并促進有實力的廠商向設備上層及基礎設施兩個領域縱深發展(圖3),體現在掌握核心技術的廠商(如高通、華為、MTK),通過不斷建設系統能力來強化競爭力(支持5G標準、硬件能力、軟硬結合以及系統能力的深度定制等),而具備渠道和資源整合優勢的手機制造商(華為、OPPO、小米、VIVO等),則立足OS持續構建更高效的應用來拓展版圖(UI、推送、商店、輕應用等),這都體現出Android HAL對整個產業的凝聚和影響,間接彌補Android自身的諸多不足。

圖3. 具備核心競爭力的廠商的發展趨勢

?

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),可以發現其各類能力已按照組件化標準和粒度進行組織(能力的注冊發現、接口和通信的標準化、運行空間的隔離等),讓快速迭代的手機硬件和持續升級的系統能力以最小代價透出,將復用的價值在移動設備系統上具體化并最大化,從而具備更高的靈活性和兼容性;其背后軟件工程的意義在于為軟件需求、設計之間架起一座橋梁,解決了系統結構和研發需求向實現平坦過渡的問題。

?

圖4. Android系統進程架構概要

?

圖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/8、版權上Oracle訴訟紛至沓來等諸多挑戰。為應對這一切,Google從Android N開始,將JAVA的支持變更為OpenJDK。另外,Kotlin因為特性相近、又可被編譯為class或者dx字節碼,也獲得了Google青睞和收編(圖6)。

?

圖6. Android接口層的過去和未來

?

實際上,之所以Android敢這么做,還是因為有其設計基礎的支撐,根據個人的一點粗鄙了解,從Android API的調用鏈路(圖7)上能發現端倪:無論底層依賴、實現和流程如何變化,上層的使用形式并不會改變。

?

圖7. Android內部對調用鏈路的3種實現

?

這意味著幾乎所有系統能力的核心,已在native library被實現殆盡,并結合上層提供良好屏蔽。這為其他語言實現Framework提供了可能,尤其是一門特性與JAVA相近的語言。所以是什么語言、是不是kotlin都只事先設計規范下的一種合適的選擇。

?

圖8. 一種未來用kotlin代替java的極端可能

?

2. 對于我們的象征意義和實踐

?

綜上所述,Android從三個方面來解決其發展的關鍵問題:

?

  • 硬件驅動:形成廠商的合作基礎,并反過來對整個產業施加影響。

  • 組件化:高效組織各種內部能力,尋求自身的更快發展。

  • 接口層:滿足上層對系統和硬件能力的各種使用訴求。

?

移動互聯網產業巨頭發展因為起點以及執行理念不同而有所不同,Apple圍繞著其App Store構建其整個體系并精心維護,而且在現代化API編程、整機體驗、垂直領域技術如網絡/算法等各縱深領域走在前列;Google則用Android帶路,需要在各個層面維護和團結不同力量來形成自己的發展特色。所以,Android為系統如何發展提供了另外一種答案:除關注系統自身能力的發展,如何維護好系統不斷發展的基礎和前提、如何更好地暴露和讓外界使用系統能力也至關重要(見圖九)。

?

圖9. Android設計對解決問題的啟示

?

回到我們自身,在重用戶、重交互、手機即人的今天,我們的產品有理由也有必要用其內涵延展并放大服務的價值。要做到這一點并非易事。首先,業務迭代越來越快,各種應用層出不窮對中間件意味著廣泛的需求;其次,環境在改變,無論是運行硬件和設備的五花八門、還是對接集群的復雜多樣,都對阿里原有端側中間件帶來巨大沖擊;再次,在基礎技術發展變緩的今天,技術的價值需要被持續放大,我們希望基于自身能力來構建服務和業務的泛連接基礎,并將其作為發展愿景。這要求我們基于集團背景以及核心APP發展的主要目標下,來綜合思考這個發展問題(圖10)。

?

圖10. 對泛連接能力建設的思考

?

通過Android的啟發,結合環境和現狀,在滿足業務目標的同時我們從三個層面不斷演進網絡能力(圖11)。

?

  • 首先,通過覆蓋線上線下、各類場景、形態各異的設備,不斷打造高效私有、支持通用標準的協議,并提供部分其他端側網絡不能或者及其難以提供的特殊能力,來幫助我們構建設備和服務、用戶與業務的泛連接基礎。

  • 其次,自底向上地抽象,將非阻塞的IO復用、用戶態網絡棧支持、通道能力擴展以及可支持混合集群的多實例架構進行高效組織,從而保障了數據在不通層面的流轉和管理訴求。

  • 最后,基于SDK矩陣和接入能力的建設,我們實現了服務接入到業務、業務透出給用戶的目的,并通過提供豐富的數據帶來更多價值。

    ?

圖11. 泛連接能力的系統性建設

?

基于以上的不斷沉淀,目前我們已能觸達海量設備和用戶,成為接入阿里內外各服務和平臺的接口,并為終端和服務分別屏蔽集群的多元化及設備的多樣性,實現新零售系統能力與用戶的泛連接(圖12)。

?

圖12.團隊能力在集團中所處的位置

?

3. 小結

?

結合傳統的C/S觀念,服務端獲取的信息來源于各網絡終端,網絡+協議屏蔽或規范了外界對服務輸入的多樣性,使得服務端過去關注的是集群和高并發,但現在無論是上云還是利用率,背后都是業務、成本規模和邊際效應在驅動,這里面發展的代際主旨鮮明。但回到客戶端,由于受到環境和交互等多樣性直接影響,即便是動態性的技術也難以代表端側的全部甚至是主流。所以在某種局部技術比拼武功,成為過去客戶端的一種行業“潮流”。
?

在局部技術和單點深入的確有其意義,筆者也曾有過一些班門弄斧,如非輪詢方式獲取手機棧頂Activity、面向阿里特有復雜集群的SDK多實例設計、Sophix熱修復及云上產品等。但結合過往經驗及Android設計,可以更系統性地看待這一現象:即除了滿足業務核心訴求(因為投入大量資源,必須、肯定要成,至少小成),更應該關注技術如何更好地服務業務以及如何持續挖掘能力護城河這兩頭的問題。所以要打造和發展好一個系統,除構建系統各中堅能力外,還需維護好系統發展的前提、組織好各系統能力的內聚、滿足好外部對系統的訴求。
?

以上是個人從Android系統設計到技術支撐系統發展的一點淺薄看法,期待和業界同仁共同探討。

?

作者:?所為?轉自:?阿里技術

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數學的意蘊與價值(建議收藏)

數學的意蘊與價值,內容包括數學運算、長度面積等位換算等等,建議收藏。 意蘊1: 1x8+1=912x8+2=98123x8+3=9871234x8+4=987612345x8+5=98765123456x8+6=9876541234567x8+7=987654312345678x8+8=98765432123456789x8+9=987654321意蘊2: 1x9+2=1112x9+3=111123x9+4=11111234x9…

85、交換機安全MAC層***配置實驗之Port-Security

1、Port Security解析觸發Port Security的條件:未授權的MAC地址端口MAC地址數量超過了限制觸發Port Security后的動作:protect Security violation protect mode 丟棄數據,不發送SNMP Trap消息 restrict Security violation restr…

C#-Linq源碼解析之Concat

前言在Dotnet開發過程中,Concat作為IEnumerable的擴展方法,十分常用。本文對Concat方法的關鍵源碼進行簡要分析,以方便大家日后更好的使用該方法。使用Concat 連接兩個序列。假如我們有這樣的兩個集合,我們需要把兩個集合進行連接…

11 驗證器《ThinkPHP6 入門到電商實戰》

注:示例來源于官方手冊 一、驗證器定義 驗證器用于對數據進行驗證,你可以理解為一個“層”,在傳入數據時可以使用這個層對數據進行驗證,這樣就可以不用頻繁的在方法中編寫代碼去驗證,只需要編寫一個驗證層即可&#…

合作開發和委托開發完成成果的歸屬

據專利法第8條的規定:“兩個以上單位或者個人合作完成的發明創造、一個單位或者個人接受其他單位或者個人委托所完成的發明創造,除另有協議的以外,申請專利的權利屬于完成或者共同完成的單位或者個人;申請被批準后,申請…

C語言試題六十三之請編寫函數fun:將s所指字符串中ascii值為偶數的字符刪除,串中剩余字符形成一個新串放在t所指的數組中。

1、 題目 請編寫函數fun,其功能是:將s所指字符串中ascii值為偶數的字符刪除,串中剩余字符形成一個新串放在t所指的數組中。 2 、溫馨提示 C語言試題匯總里可用于計算機二級C語言筆試、機試、研究生復試中C程序設計科目、幫助C語言學者打好程序基礎、C語言基礎,鍛煉您…

nginx+php

nginxphp基礎架構 生產實踐 nginx配置文件: 主配置文件 123456789101112131415161718192021222324252627282930313233[rootlinux-node1 conf.d]# cat /etc/nginx/nginx.conf user nginx;worker_processes auto;error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load…

【ArcGIS風暴】ArcGIS10.8中柵格數據金字塔的來龍去脈,你知道嗎?

如下圖所示,通常情況下,當將沒有金字塔的柵格數據集添加至 ArcGIS時,系統將提示您構建金字塔。金字塔指不同比例下分辨率降低的數據概視圖。金字塔十分有用,因為金字塔提升了分辨率低于其全分辨率的柵格數據集的繪制速度。建議構建用于大型柵格數據集的金字塔。 點擊【是】…

斯坦福大學Andrew Ng - 機器學習筆記(8) -- 推薦系統 大規模機器學習 圖片文字識別...

大概用了一個月,Andrew Ng老師的機器學習視頻斷斷續續看完了,以下是個人學習筆記,入門級別,權當總結。筆記難免有遺漏和誤解,歡迎討論。 鳴謝:中國海洋大學黃海廣博士提供課程視頻和個人筆記,在…

表單按鈕實現 type=image

<input type"image" src"http://img01.51jobcdn.com/im/2012/index/main_login_btn.gif" border"0" οnfοcus"blur()">轉載于:https://www.cnblogs.com/zxmbest1/p/5121666.html

.NET7之MiniAPI(特別篇) .NET Preview5參數綁定

.NET Preview5中&#xff0c;給MiniAPI帶來了一個參數綁定的功能&#xff0c;看到這個功能&#xff0c;我一下子就開心了&#xff0c;因為它提供了一個把松散的傳入數據或注入功能耦合在一起的能力&#xff0c;并且可以根據自己的需求自由組合&#xff0c;結合上原來的Fromxxx(…

C語言試題六十四之請編寫函數fun:求勾股數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

【CSS動效實戰(純CSS與JS動效)】02 flex 布局實戰(仿 JD 及 gitCode 布局)及 media 自適應初探 下

二、flex 仿 gitCode 布局 及 自適應 首先查看我們的頁面&#xff1a; 這個時候直接頂部一個塊&#xff0c;下面分為左中右三個塊&#xff0c;然后就解決了&#xff0c;是不是很簡單&#xff1f;相比剛剛那么這個簡單多了。那就來做吧。 2.1 基本布局 首先給一個 style 價格…

C語言按行和列求平均成績代碼(指針,二維數組)

如下所示成績表,如何按行(每個人)或按列(每門課)的平均成績? 結果: 文章目錄 1. 自定義行平均函數2. 自定義列平均函數3. main()函數調用平均函數1. 自定義行平均函數 float save(float **PA,int M,int

架構師必須知道的架構設計原則

目錄 一、前言 二、軟件設計原則 GRASP通用職責分配軟件模式 1. 信息專家(Information Expert) 2. 創建者(Creator) 3. 低耦合(Low Coupling) 4. 高內聚(High Cohesion) 5.控制器(Controller) 6. 多態(Polymorphism) 7. 純虛構(Pure Fabrication) 8. 間接(Indirectio…

LeetCode:Minimum Path Sum(網格最大路徑和)

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 典型的動態規劃問題。 設dp[i][j]表示從左…

delete在js里為引用刪除

delete 運算符從對象中刪除一個屬性&#xff0c;或從數組中刪除一個元素。delete expressionexpression 參數是一個有效的 JScript 表達式&#xff0c;通常是一個屬性名或數組元素。說明如果 expression 的結果是一個對象&#xff0c;且在 expression 中指定的屬性存在&#xf…

C語言試題六十五之請編寫函數實現猴子吃桃問題

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 猴子吃桃問…

百度:病種類貼吧全面停止商業合作

新浪科技訊 1月12日上午消息&#xff0c; 百度今日就熱門疾病被出賣一事向新浪科技發布對外公告&#xff1a;病種類貼吧全面停止商業合作 只對權威公益組織開放。百度方面在公告中表示&#xff0c;為了規范具有明顯商業屬性貼吧的運營管理&#xff0c;并提升貼吧的內容質量和用…

【CSS動效實戰(純CSS與JS動效)】02 flex 布局實戰(仿 JD 及 gitCode 布局)及 media 自適應初探

一、flex 仿 JD 布局 首先&#xff0c;我們在編輯器中&#xff0c;寫上基礎代碼&#xff0c;當然要在 style 中加上一個 flex 類&#xff0c;用于 flex 布局的定義&#xff0c;這個是必然需要的&#xff0c;在此一定得加上。 <!DOCTYPE html> <html lang"en&qu…