最近工作中遇到了android中的權限問題,發現Android確實是開源的,但并不開放,比如權限控管就相當嚴格,限制做很多事情,這一點得意于linux內核。這也勾起來對其架構研究的興趣,不知到哪位能夠深度剖析下android架構設計的思想與原則?
最近,開發者在知乎社區中就Android的架構設計展開了討論。
有人問“Android 架構設計的思想與原則是什么?”:
最近工作中遇到了Android中的權限問題,發現Android確實是開源的,但并不開放,比如權限控管就相當嚴格,限制做很多事情,這一點得益于Linux內核。這也勾起來對其架構研究的興趣,不知到哪位能夠深度剖析下Android架構設計的思想與原則?
rlei分析了Android的設計哲學:
理解好Intent,就可以理解Android哲學("所有應用生來平等")的一部分。舉個簡單的例子,iOS里面應用要集成SNS如facebook/twitter/sina weibo等,都需要應用自己實現(iOS5也只是集成twitter一家);Android上只需要廣播一個share內容的intent。從理解Intent如何工作開始,你就在慢慢理解Activity Manager, Package Manager, Services這些Android的重要組件是如何工作的。
另外Binder是Android架構里非常核心的一塊。Android基于Intent的消息傳遞和組件/應用解耦,下面的基礎都是Binder IPC。在這一點上,Android實際上是光榮的傳承了BeOS和Palm OS 6(悲催的OS6...)未能發揚光大的一部分。
MVC(Content Provider, Activity, Layout, Adapters)這個比較基礎,也不算Android特有的。
Content Provider對數據訪問的抽象也是比較有意思的一塊。理想情況下,content provider可以讓客戶端用URI以語義化的方式訪問數據(URI本身即表示數據層次結構和查詢條件),而下面數據庫表的結構可以任意變動,不影響客戶端代碼。當然實做的時候content provider還是會被各種復雜的where子句暴露出SQL的實現細節……
至于Android的權限管理,其實比較簡單,主要是利用現成的Linux安全模型,進程之間相互隔離。API級別的權限管理和JVM類似。
Billy Cui重點解析了權限系統的設計:
Android的權限系統是基于Linux,但又增加了很多自己的控制模塊。
總體上來說,其分為以下幾部分權限系統:
1. userid : 繼承于linux,對于多個app,通過shareuid的方式可以使用同一個userid,主要承擔一些目錄訪問權限之類的工作,比如私有目錄只能由同一uid應用訪問。
2. 安裝level:system level or app level,這個是根據應用的安裝位置決定的,在system/app下安裝的應用就是system level,在權限訪問中會得到更多的權限,比如靜默安裝應用的權限等。
3. permission : 這個是最主要的權限控制,一般開發者開發應用主要是接觸這個部分,在這部分中,會根據應用在AndroidManifest.xml中聲明的use-permission而在訪問相應api或資源時判斷其是否有訪問權限,比如常用的android.permission.INTERNET等。
4. signature: 簽名,是Android權限系統中的重要組成部分,對于系統簽名的應用,會有一些特殊的功能,而shareuid等特性也是需要同一簽名作為基礎。此外,permission在設置/自定義其權限時也經常會使用到簽名,比如控制只有我自己的應用才可以訪問我自己定義的公開API。
除此以外,其實Android在uid的里面設置了一些預定義有特殊功能的uid,比如system/media等,在配置其system level的services的時候會用到。
董兆輝則認為Android主要是基于組件搭配思想:
Android是開源的,不過開源不意味著可以亂來,開源只是告訴你我是怎么做的,至于為什么這么做,就是另外一個問題了。任何一個系統如果沒有權限管理,那不是亂套了么?我倒是覺得Android的權限管理設計的還不錯,有些地方比iOS好,也較靈活,不過同樣是因為這一點,容易被利用。
說到Android架構的設計思想和原則,按我的理解主要是組件搭配,即在用戶看來,所有的module或者組件,都是可以重復利用和簡單組合的。想法是好的,不過有得必有失,或者說Android現在做的還不夠好,在性能方面是很低的,否則的話Android也不會推出補丁(NDK之類的,dalvik的不斷升級)。
我覺得所有Framework或者平臺或者語言都想給應用開發者最方便使用的接口,最人性化的體驗,同時又要爭取最大的性能,兩者權衡折中吧。不過隨著硬件速度的飛速增長,性能的權重會變低。
范懷宇還談到了資源體系:
Android架設在Linux之上,因此,繼承了Linux可移植性、用戶管理機制、文件系統,等等。
Android的核心在Framework層,本質上,這是一個基于組件的應用開發系統,組件間通過消息(Intent)進行通信。一方面,Intent是通信信息的載體,另一方面,Intent也定義了Android組件的通信協議。
Android可以對組件所運行的進程做托管,在Android中,進程概念相當薄弱。依賴于進程托管,Android可以輕松支撐多任務多進程的應用模型。
除了組件,資源體系也是Android中比較特色的一塊,它提供了完整的資源支持,可以用來描述一切與UI相關的內容,并實現多設備的適配。
讀者對Android的架構有何理解?歡迎發表自己的看法。
原文轉自:http://www.kuqin.com/system-analysis/20120802/323767.html