大綱:
1. Android剖析
Linux核心本地庫(Native Libraries)Android運行時(Android Runtime)應用程式框架
2. Android運行機制
啟動流程層間互動(Layer Interaction)
一、 Android剖析
如所示為Android的架構圖
1. Linux核心
Android系統基於Linux核心,但是Android不是Linux。沒有本地的視窗系統。沒有glibc庫的支援。不包括完整的標準Linux工具集。標準的Linux 2.6.24核心。核心增強補丁來支援Android。
1) 為什麼選擇Linux核心? 強大的核心和進程管理。基於許可權的安全模型。可靠的驅動模型。支援共用庫。已經是開源的。
2)核心增強 AlarmAshmemBinderPower ManagementLow Memory KillerKernel DebuggerLogger
Binder介紹 問題: 應用和服務會運行在各自的進程當中,而進程之間必須要通訊和共用資料。而IPC(處理序間通訊)會引入巨大的處理開銷和安全性漏洞。
解決方案: 使用驅動來協助處理序間通訊(IPC)。通過共用記憶體來獲得高效能。對於處理請求,每個進程一個線程池。引用計數,對象的引用是跨進程映射的。進程之間是同步調用。
Binder的實現機制如所示:
Android的介面定義語言(AIDL)見:http://developer.android.com/guide/components/aidl.html
PM介紹 問題: 行動裝置是依賴電池供電來啟動並執行,電池只有有限的容量。
解決方案: 基於Linux的功率管理(PM)構建更加強大的功率管理原則通過“wake locks”來進行功率管理支援不同類型的wake locks Android中的PM實現: 如中所示
Android核心源碼可以通過如下http://git.android.com擷取
2 本地庫
本地庫包括: Bionic LibcFunction LibrariesNative ServersHardware Abstraction Libraries
什麼是Bionic? 定製的libc實現,最佳化用於嵌入式。
為什麼選用Bionic? 為什麼要構建一個定製的libc庫呢?主要從如下方面考慮: 許可證:從使用者角度,保持GPL許可。大小:由於將載入到各個進程,所以需要比較小。速率:有限的CPU能力意味著我們需要足夠的快。 對於Bionic libc: BSD許可小而快的代碼路徑非常快和小的定製的pthread實現內建支援重要的特定Androud服務,像1)系統屬性,getprop(my.system.property, buff, default); 2)log能力,LOGI(Logging a message with priority 'Info' );不支援某些POSIX特性。與GNU Libc(glibc)不相容。由於Native代碼必須依賴bionic來進行編譯。
功能庫(Function Libraries) WebKit 基於開源的WebKit瀏覽器:http://www.webkit.org在全視圖渲染頁完全支援CSS,Javascript,DOM,AJAX支援單列和自適應的視圖渲染 Media Framework 基於PacketVideo OpenCORE平台支援標準的video,audio,still-frame格式支援硬體/軟體編碼器外掛程式
SQLite 輕量級事務性資料存放區大多數平台的後端資料存放區
Native Servers
主要有兩大類Surface Flinger和Audio Flinger 對於Surface Flinger 提供系統範圍的外觀“組合器”,處理所有的外觀渲染到幀buffer裝置中。可以結合2D與3D外觀和多個應用的外觀。Surfaces傳遞是作為Buffer來通過Binder IPC調用。可以使用OpenGL ES和2D硬體加速器作為其組成部分。使用page-flip的雙buffer機制。 如展示所示
對於Audio Flinger 管理所有的audio輸出裝置。處理多個audio流到PCM audio 輸出路徑。處理audio路由到各個輸出。 如示意
硬體抽象層(HAL) 硬體抽象層在Android系統階層中的位置如所示。
硬體抽象層具有如下特點: 使用者空間C/C++庫層。定義了介面,以便讓Android請求硬體“驅動”來實現。分離了Android平台邏輯和硬體介面。
那麼為什麼在Android中需要一個使用者空間的HAL呢?主要有如下原因: 不是所有的組件具有標準的核心驅動介面;核心驅動是GPL的,其將暴露了所有的智慧財產權;Android對於硬體驅動具有特定的要求。
HAL Header例子:
// must be provided by each Acme hardware implementationtypedef struct {int (*foo)( void );char (*bar)( void );…} AcmeFunctions;const AcmeFunctions *Acme_Init(const struct Env *env, int argc, char **argv);
庫在runtime時按需動態載入
dlHandle = dlopen(“/system/lib/libacme.so”, RTLD_NOW);...acmeInit = (const AcmeFunctions *(*)(const struct Env *, int, char **))dlsym(dlHandle, ”Acme_Init);...acmeFuncs = acmeInit(&env, argc, argv);
3.Android Runtime
Dalvik虛擬機器 是Android中定製的淨化實現的虛擬機器,由於如下特點: 提供了應用程式的可移植性和運行時的一致性運行最佳化的檔案格式(.dex)和Dalvik位元組Java .class/ .jar檔案在構建時轉換為.dex格式 Dalvik設計用於嵌入式環境 在每個裝置上支援多個虛擬機器進程;高度最佳化CPU的位元組碼解譯器;高效的使用runtime記憶體。
核心庫(Core Libraries) Java語言的Core APIs提供了功能強大的,同時簡單和熟悉的開發平台。 資料結構(Data Structure)工具(Utilities)檔案訪問(File Access)網路訪問(Network Access)圖形(Graphics)...
4. 應用程式框架(Application Frameworks)
核心平台服務(Core Platform Services),具有如下特性: 對於Android平台來說,服務(Services)是必需的。在幕後 —— 應用不會直接存取它們。 主要有如下的服務: Activity ManagerPackage ManagerWindow ManagerResource ManagerContent ProviderView System
硬體服務(Hardware Services) 提供訪問底層的硬體APIs。典型地通過局部的Manager對象來訪問。例如:
LocationManager lm = (LocationManager)Context.getSystemService(Context.LOCATION_SERVICE);
主要有如下的硬體服務: Telephony ServiceLocation ServiceBluetooth ServiceWIFI ServiceUSB ServiceSensor Service 更多的關於應用程式框架的資訊參考: Google I/O :“Inside the Androoid Application Framework”Online :http://code.google.com/android
二、Android運行機制
1. 啟動流程 所有從init開始...
與大多數的基於Linux系統在啟動階段類似,bootLoader載入Linux核心,然後開始init進程。
init啟動Linux守護進程,包括: USB守護進程(usbd)來管理USB串連Android調試橋守護進程(adbd)來管理ADB串連調試器守護進程(debuggerd)來管理調試進程請求(dump memory等等)射頻介面層守護進程(rild)來管理與射頻的通訊
Init進程啟動zygote進程: 一個新生的進程初始化一個Dalvik VM執行個體載入類,並監聽socket連接埠用於請求建立VMs執行個體Forks請求建立VM執行個體用於管理進程寫時複製(Copy-on-write)來最大化重用和最小化覆蓋
init進程啟動runtime進程: 初始化Service Manager——上下文管理器用於binder來處理service註冊和查詢註冊Service Manager作為預設的上下文管理用於Binder
Runtime進程發送請求給Zygote來啟動System Service
接著Zygote進程fork一個新的VM執行個體用於System Service進程,然後啟動該service。
System Service啟動本地系統伺服器,包括: Surface FlingerAudio Flinger
本地system servers註冊Servicee Manager作為IPC service目標:
System Service啟動Android管理服務:
Android管理服務註冊到Service Manager中:
到此,整個Android系統的啟動後:
System Server載入完所有的services後, 系統準備...
2. 層間互動(Layer Interaction) 主要有如下三種類型的互動: App -> Runtime Service -> libApp -> Runtime Service -> Native Service -> libApp -> Runtime Service -> Native Daemon -> lib
Android Runtime Services:
舉例:Location Manager
Android Native Services:
舉例:
Daemon Connection:
舉例:RILD