關于Android系統
Android,本義指“機器人”,是Google于2007年11月5日宣布的基于Linux平臺的操作系統。
Android系統優缺點
開放性
在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。
開發性對于Android的發展而言,有利于積累人氣,這里的人氣包括消費者和廠商,而對于消費者來講,最大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。
豐富的硬件
這一點還是與Android平臺的開放性相關,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟件的兼容,如同從諾基亞Symbian風格手機一下改用蘋果iPhone,同時還可將Symbian中優秀的軟件帶iPhone上使用、聯系人等資料更是可以方便地轉移。
跨平臺
由于使用Java進行開發,Android繼承了Java跨平臺的優點。任何Android應用幾乎無需任何修改就能運行于所有的Android設備。包括但不限于手機,平板,手環,車載系統,智能家居。
方便開發
Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如何控制正是留給Android難題之一。
Google應用
在互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成為連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。
太碎片化
紛繁復雜的屏幕尺寸,分辨率,不同版本且訂制開發的Android系統,各個廠家硬件,虛擬菜單等,給開發者帶來一定的復雜性。
截至目前發行歷史版本:
每個版本都是按照英文字母順序取的字母,然把它作為單詞第一個字母,去拼一個甜點的單詞,可是到了M,N,O,P,到了Q的時候就變了,改為就叫Android 10了。
- 1.5 Cupcake(紙杯蛋糕)
- 1.6 Donut(甜甜圈)
- 2.2 Froyo(凍酸奶)
- 2.3 Gingerbread(姜餅)
- 3.x Honeycomb(蜂巢)
- 4.0 Ice Cream Sandwich(冰激凌三明治)
- 4.1 Jelly Bean(果凍豆)
- 4.4 KitKat(奇巧巧克力)
- 5.0 Lollipop(棒棒糖)
- 6.0 Marshmallow(棉花糖)
- 7.0 Nougat(牛軋糖)
- 8.0 Oreo(奧利奧)
- 9.0 Pie (派)
- 10.0 Android 10
系統架構圖:
基于Android 8.0的系統根目錄結構圖:
Android從下往上層主要分為4層,如同網絡的七層協議,這樣做的好處是屏蔽本層與下層的差異。
- linux內核層(Linux Kernel)
- 系統運行時庫層 (Libraries and Android Runtime)
- 應用程序框架層(Application Framework)
- 應用程序層 (Applications)
linux內核層(Linux Kernel)
驅動名稱 | 簡介 |
---|---|
Android電源管理(Power Management) | 針對嵌入式設備的,基于標準Linux電源管理系統的,輕量級的電源管理驅動 |
低內存管理器 (Low Memory Keller) | 選擇性殺死進程來釋放需要的內存 |
匿名共享內存 (Ashmem) | 為進程之間提供共享內存資源,同時為內核提供回收和管理內存的機制 |
日志(Android Logger) | 一個輕量級的日志設備 |
定時器(Android Alarm) | 提供一個定時器把設備從睡眠狀態喚醒 |
物理內存映射管理 (Android PMEM) | DSP及其他設備只能工作在連續的物理內存上,PMEM用于向用戶空間提供 連續的物理內存區域映射 |
Android定時設備(Android Timed device) | 執行對設備的定時控制功能 |
Yaffs2文件系統 | Android采用大容量的NAND閃存作為存儲設備,使用Yaffs2作為文件系統管理大容量MTD NAND Flash;Yaffs2占用內存小,垃圾回收簡潔迅速 |
硬件抽象層
在linux內核層和系統運行時庫層之間還有一層硬件抽象層(Hardware Abstract Layer,HAL),它是對硬件設備的具體實現加以抽象。鑒于許多硬件設備廠商不希望公開其設備驅動的源代碼,如果能將android的應用框架層與linux系統內核的設備驅動隔離,使應用程序框架的開發盡量獨立于具體的驅動程序,則android將減少對Linux內核的依賴。HAL由此而生,它是對Linux內核驅動程序進行的封裝,將硬件抽象化,屏蔽掉了底層的實現細節。
系統運行庫層
由系統類庫和Android運行時組成。
-
系統類庫(Libraries)
系統類庫大部分由C/C++編寫,提供的功能通過Android應用程序框架來調用。
名稱 | 簡介 |
---|---|
Surface Manager | 管理應用顯示,另外也對2D和3D圖形提供支持 |
Media Framework | 基于PacketVideo的OpenCORE的多媒體庫,支持多種常見音視頻格式的錄制和播放 |
SQLite | 本地小型關系數據庫,如平時用數據庫用到 |
OpenGL | 基于OpenGL ES 1.0API標準實現的3D跨平臺圖形庫 |
FreeType | 用于顯示位圖和矢量字體 |
WebKit | Web瀏覽器的軟件引擎 |
SGL | 基于2D圖形引擎 |
Libc(bionic ibc) | C函數庫bionic libc,更適合基于嵌入式Linux的移動設備 |
SSL | 安全套接層,為網絡通信提供安全及數據完整性的一種安全協議,如https請求需認證 |
幾個常用且比較重要的C/C++程序庫所在的目錄如圖:
-
Android運行時(Android Runtime)
由核心庫和Dalvik虛擬機組成。
核心庫:核心庫提供了Java5 se API的多數功能,并提供Android的核心API,如android.os,android.net,android.media等。
Dalvik虛擬機:Dalvik虛擬機是基于apache的java虛擬機,并被改進以適應低內存,低處理器速度的移動設備環境。Dalvik虛擬機依賴于Linux內核,實現進程隔離與線程調試管理,安全和異常管理,垃圾回收等重要功能。
Jvm、Dalvik和Art
java虛擬機 | Dalvik虛擬機 |
---|---|
java虛擬機基于棧,基于棧的機器必須使用指令來載入和操作棧上數據 | Dalvik虛擬機基于寄存器 |
java虛擬機運行的是java字節碼。(java類會被編譯成一個或多個字節碼.class文件,打包到.jar文件中,java虛擬機從相應的.class文件和.jar獲取相應的字節碼) | Dalvik運行的是自己專屬的.dex字節碼格式。(java類被編譯成.class文件后,會通過一個dx工具將所有的.class文件轉換成一個.dex文件,然后dalvik虛擬機會從其中讀取指令和數據) |
- | 一個應用對應一個Diavik虛擬機實例,獨立運行 |
Android應用編譯及運行流程:
aapt:
即Android Asset Packaging Tool(Android 打包工具),在SDK的build-tools目錄下,也行平時沒有用到過,但是開發工具生成Apk時會自動使用aapt將代碼和資源文件打包在其中。
Apk打包流程:
SDK和NDK的關系:
ndk可以通過native code跨過使用dalvik runtime,直接調用到android內核資源,而sdk則需要在dalvik runtime環境下才能調用到內核資源。然而兩者并不是各司其職,各不相關。android提供了JNI(java native interface)使兩者可以進行相互調用和通信。
應用框架層(Application Framework)
應用程序框架層提供開發Android應用程序所需的一系列類庫,高度封裝直接調用。
應用框架層的主要實現代碼在frameworks/base和frameworks/av目錄下,其中frameworks/base目錄結構如圖:
類庫名稱 | 簡介 |
---|---|
視圖系統(View System) | 創建應用所需的組件 |
活動管理器(ActivityManager) | 管理各個應用程序生命周期,為所有程序的窗口提供交互的接口 |
窗口管理器(Window Manager) | 對窗口程序進行管理 |
內容提供者(Content Provider) | 提供一個應用程序訪問另一個應用程序數據的功能,實現應用間共享數據 |
通知管理器(Notification Manager) | 使應用可以在系統狀態欄中顯示通知消息 |
包管理器(Package Manager) | 管理應用安裝、卸載,應用版本號、版本名,查詢相關權限等功能 |
資源管理器(Resource Manager) | 提供各種非代碼資源供應用程序使用,如字符串,顏色,圖片,音頻等 |
位置管理器(Location Manager) | 提供位置服務 |
電話管理器(Telephony Manager) | 提供設備電話相關功能 |
XMPP服務 | Google在線即時交流軟件中一個通用的進程,提供后臺推送服務 |
系統應用
根據Google給出的官方架構圖,Android系統應用開發處于Android架構的System Apps層,像桌面,撥號盤,日歷,相機,郵件,設置等,但這些app屬于系統app,系統app本質上跟第三方app沒什么區別,只是最終存放在Android系統中的位置不同,系統app存放在/system/priv-app/和/system/app/中,第三方app存放在/data/app/當中,這三個目錄的權限不一樣,按照權限大小排序分別為,/system/priv-app/ > /system/app/ > /data/app/。
應用層(Applications)
系統內置的應用程序以及非系統級的應用程序都屬于應用層,負責與用戶進行直接交互,通常都是用Java進行開發的。包括設備系統自帶的工具,日歷,音樂,瀏覽器,圖片查看等應用,還有開發者開發應用程序。
源碼根目錄中的packages目錄對應著系統應用層,目錄結構圖:
在線閱讀Android源碼
在Android系統源碼官網,各個Android版本的源碼任君挑選。
Android在線閱讀源碼地址
雖然我們平時開發應用主要行走在Applications層上,但是并不限制我們往下走,雖然這條路是艱難漫長的,堅持下去總有撥云見霧的一天。該篇文章保持更新。