嵌入式 Linux 系統主要分成三個部份,包含 BootLoader ( 一般為 Uboot ) 、Kernel、RootFileSystem,Andoird 第一層即是修改過的 Linux Kernel,第二層以上就是一般所謂的 RootFileSystem。
圖1:Android階層圖 |
Andoird 實驗版 SDK 的 Android Source 資料夾如下:
圖2. android source |
- bionic:Google 自己開發的Libc.
- build:Android Building System.
- development:應用程式開發的模組及工具.
- hardware:建立HAL的函式庫.
- out:編譯android source得到的image產生在這裡.
- vendor:避免與原始的source code混雜,廠商開發的應用程式及framwwork擴充放這邊.
- dalvik:Google自己開發基於register的JVM,據說針對手持裝置優化過.
- external:opensource project.
- frameworks:android階層圖第二層與第三層code放這裡.
- packages:android標準的應用程式.
接下來利用 Jollen Mokoid 專案 Overview 一下如何由底層打通到上層。
Mokoid 專案是控制 dma6410l 實驗版上的 Led,資料夾裡配置了 Android.mk ( 給 compiler吃的資訊檔 ),apps ( 放自行開發的應用程式 ),dma6410xp ( 配置新的產品分支 ),frameworks ( 擴充框架透過 JNI 讓上下層溝通 ),hardware ( 硬體抽象層實作 ),driver是Led Linux Driver在 Android 架構裡是不需要的。
撰寫 Linux Driver 主要分成兩個部分,一部分是實際與硬體溝通的程式碼,另一部份是與 Linux Kernel 溝通的程式碼 ,編譯成 led.ko,所以第四層的 driver 就搞定了。
與硬體溝通的部份 |
與kernel溝通的部份 |
接著往上走一層第三層是 HAL 與 Library 的部份,透過 struct HAL_MODULE_INFO_SYM 與 hw_module_t 及 hw_device_t 建構 HAL,根據 Android.mk 知道這部分被編譯成 led.goldfish.so 放在 system/lib/hw 下面 。
再往上走一層,來到第二層 framework 層,這一層分層兩部份,其一為 JNI ( base/service/jni ) 的部份,被編譯成 libmokoid_runtime.so (此部份為第三層library層),另一為 Service ( base/service/java) 與 Manager ( base/core/java ) 的部份,被編譯成 mokoid.jar,Service 呼叫 JNI 的 function,而 Manager 透過 ILedService.aidl呼叫 Service 的 function,這部份會在之後解釋,在這裡先有個概念即可 。
最後,就是最上層第四層應用程式,利用 ServiceManager.addService 將 LedService 加進Android System,應用程式透過 ServiceManager.getService 抓出來使用,這部分檔案編譯成 LedTest.apk,這部份會在之後講解。
沒有留言:
張貼留言