1. 系統結構圖
借用一下HAL層的圖,
2. 系統結構分層
2.1 Linux Kernel內核
Android基於Linux2.6提供內核服務。Android對操作系統的使用包括核心和驅動程序兩部分。主要驅動有:Display, Frame Buffer, Flash, Camera, Video, Audio, Wifi, Keyboard,Bluetooth, Power…
2.2 HAL硬件抽象層
HAL層是指硬件抽象層(Hardware Abstraction Layer)。用於解決LINUX的GPL規則和Android遵循的APACHE規則衝突的問題。GPL要求開源而APACHE不要求開源,HAL層可以解決硬件生產廠商的知識產權問題,他們可以只提供二進制代碼。
所以,ANDROID是開放,而不開源。
我們寫一個自定義設備的HAL層。
/*定義模塊ID*/
#defineXXX_HARDWARE_MODULE_ID "XXX"
/*硬件模塊結構體*/
//見hardware.h中的hw_module_t定義的說明,xxx_module_t的第一個成員必須是hw_module_t類型,其次纔是模塊的一此相關信息,當然也可以不定義,
//這裏就沒有定義模塊相關信息
structxxx_module_t {
struct hw_module_t common;
};
/*硬件接口結構體*/
//見hardware.h中的hw_device_t的說明,要求自定義xxx_device_t的第一個成員必須是hw_device_t類型,其次纔是其它的一些接口信息.
structxxx_device_t {
struct hw_device_t common;
//以下成員是HAL對上層提供的接口或一些屬性
int fd;
int (*set_val)(struct xxx_device_t* dev,int val);
int (*get_val)(struct xxx_device_t* dev,int* val);
};
/*模塊實例變量*/
structxxx_module_t HAL_MODULE_INFO_SYM = { //變量名必須爲HAL_MODULE_INFO_SYM,這是強制要求的,你要寫Android的HAL就得遵循這個遊戲規則,
//見hardware.h中的hw_module_t的類型信息說明.
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: XXX_HARDWARE_MODULE_ID, //頭文件中有定義
name: MODULE_NAME,
author: MODULE_AUTHOR,
methods: &xxx_module_methods, //模塊方法列表,在本地定義
}
};
2.3 Android Runtime 運行環境
這是一個核心庫的集合,爲JAVA編程提供核心類庫。每一個應用程序都是Dalvik中的實例,運行在自己的進程中。
Dalvik虛擬機可執行程序格式是.dex,此格式專爲Dalvik設計。適合內存和處理器速度有限的嵌入式系統。
dx是一套工具,可將java.class轉換成爲.dex格式,一個dex文件包含多個class文件。dex文件爲了達到最佳化,會增大1~4倍,以ODEX結尾。
2.4 Libraries 本地庫
是一個C/C++庫的集合,這些功能通過Application Framework暴露給應用程序。主要有系統C庫,媒體庫,界面管理,3D,FreeType,SQLite,圖形庫等。
2.5 Application Framework 應用程序框架
在簡化組件的重用,所有的應用程序其實是一組服務和系統。包括Activity Manager等。
2.6 應用程序
如電子郵件客戶端,聯繫人等。所有應用程序都是使用JAVA語言編寫的。