一起來學嵌入式Android系統 (第二章心得二)

在O’REILLY"嵌入式Android系統"這本書的第二章是Android內部機制入門。本次心得的大綱於下:

◎    硬體支援

◎    原生使用者空間

◎    Dalvik和Android的Java

硬體支援主要是Linux Kernel Driver與Android HAL兩部份,前者在書上是"Linux方式",後者則是"Android的通用方法"。而Android的硬體支援方式與"傳統"的Linux方式相異甚多;明確的來說,硬體支援的實作方式、建構在硬體支援上的抽象層,以及最終程式碼之授權與發佈心態全都不同。首先,先說明硬體支援的"Linux方式",其實這就是建立內建的驅動程式,或者建立於執行時期透過模組動態載入的驅動程式;之後對應的硬體就可以在使用者空間中透過/dev內的裝置節點進行存取。Linux驅動程式模型定義了三種基本裝置:字元、區塊與網路通訊,多年來也出現額外的裝置與子系統類型,但對應於特定類型之裝置的/dev內節點之互動API與方法已相當標準且穩定。另外一個課題在Linux驅動程式授權方式,基本上核心內的驅動程式大多以GPL方式發佈,非GPL的驅動程式也都會有一些爭議。關於Linux驅動程式開發的觀念,請見O’REILLY" Linux 驅動程式 第三版"及其它相關書籍(雖然核心已經到3.0,但目前市面上的書大多還是以2.6為主)。

2-2-1

再下來說明硬體支援的"Android通用方法";與"傳統"的Linux方式相比,最明顯的差異就是Android的子系統與程式庫不依賴標準的/dev項目,Android堆疊通常依賴製造商所提供的共用程式庫來與硬體互動;這些共用程式庫可視為HAL(硬體抽象層,Hardware Abstraction Layer)模組或是Legacy方式的程式庫,但這些元件的介面、行為和功能隨著類型的不同而有很大的差異,實際上各裝置支援的細節請參考書上的表2-1。但於裝置支援細節部份在書中並未能有完整描述,且其內容也非一個章節就能涵蓋;因此需要一本專門書籍來深入瞭解Android的硬體支援方法與介面,在此請參閱大陸作者所寫的書籍"Android BSP 與系統移植開發":

140427

最後對HAL部份做個資訊補充,若要在Android系統上支援新的裝置類別,請參考書中的附錄B的內容(這部份將在後面文章中說明);若想對HAL議題做進一步瞭解,請至mokoversity網站閱讀"Android HAL & Framework 軟硬整合入門"線上課程(網址:http://www.mokoversity.com/course/android/android-hal-framework)。

在原生使用者空間部份,這部份詳細的內容在書中的第四章;所謂的原生使用者空間就是指Linux User Space的Native Code部份,也是指執行在Dalvik虛擬機器以外的所有使用者空間元件。在這邊要注意的是,Android的使用者空間與"傳統"的Linux差異甚大,幾乎是從頭開始設計的成果。先從檔案系統配置來看,Android一樣使用Root filesystem儲存啟動程式以及其它應用程式、程式庫與資料;但其規劃方式並不遵循"傳統"的Linux的FHS(Filesystem Hierarchy Standard)標準,在Android上最主要運作在/system與/data兩個目錄上;/system是用來儲存建置時所生成不可變元件的主要Android目錄,通常從Root filesystem由獨立的映像以唯讀的方式進行掛載,而Root filesystem本身則是從RAM Disk Image中掛載;而/data是Android用來儲存隨時間改變的資料與之後安裝APP的主要目錄,通常也是從獨立映像中掛載的,但是以讀寫模式進行。為容易瞭解上述檔案系統配置說明,就請先翻閱至第六章,參考圖6-1。

在程式庫的部份只是列表Android依賴程式庫,有些是外部專案所產生的(如表2-2所示);總之,把表2-2 ~ 表2-5當成參考就好;沒必要一開始就對其深入瞭解。在Init的部份,Init是Kernel切換到User Space時第一個執行程式,Android是引進自定的init;而且有別於"傳統"Linux的組態語言,且包含全域特性與udev事件等功能,書會於第六章詳細說明。在工具箱的部份,Android不使用Busybox,而是以自行開發的Toolbox;當然主要原因還是在授權問題,但是其所提供於命令列的功能是遠遠不及Busybox,所以在開發上會把Busybox放到Android中;我們使用的Cubietruck開發板的Android Source Code就有把Busybox放進來,再開發上就無需進行移植工作。最後是談到Android背景處理程序與命令列實用程序,這在書中第六章與第七章都會有詳細說明;重要背景處理程序請參考書中的表2-6。

在Dalvik和Android Java中,主要說明Java基礎知識(JVM、垃圾收集…etc),並瞭解一下Java術語(虛擬機器、反射機制、匿名類別與.jar檔案);及JVM與Dalvik VM 的差異,在Dalvik VM在Android 2.2版以後提供JIT編譯器,讓執行過程中效率提昇。但有些關鍵的程式碼還是要由Java呼叫Native Code,書中在此也簡介了JNI(Java Native Interface),JNI在平台開發上是有其重要性,後面文章會介紹Android平台開發之書籍就有章節說明這個部份。至於Java程式語言的部份就請自行參閱市售相關圖書。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s