Android接口和框架学习
Android接口和框架學習
縮寫:
HAL:HardwareAbstraction Layer,硬件抽象層
CTS:CompatibilityTest Suite,兼容性測試套件
?
Android讓你能夠自由實現設備規格和驅動,HAL提供一套標準方法來在Android平臺棧(platform stack)和硬件之間創建軟件鉤子(hook),Android系統是開源的,你可以貢獻自己的接口和增加功能。
?
為保證設備保持高質量和提供一直的用戶體驗,每個設備必須通過CTS測試。CTS確保設備滿足質量標準,保證APP的可靠運行和好的用戶體驗。
?
在移植Android到你的硬件平臺上,花些時間從一定高度來理解Android系統框架。因為你的驅動和HAL要和android交互,了解Android工作機制可以幫助你有效控制Android源代碼樹的多層代碼。
圖1
1.?????應用框架層(Applicationframework)
應用框架層主要是應用程序開發人員經常使用,作為硬件開發者,你應該知道盡可能多的API,且要知道這些API和底層HAL接口的映射關系,這樣可以提供關于實現驅動的有用信息。
?
2.?????IPC進程間通訊機制Binder(Binder IPC)
Binder機制允許應用框架層款過進程界限并訪問Android系統服務代碼,這可使高層的框架API和Android系統服務交互,在應用框架層,這種通訊對開發者隱藏并表現為事情就好像是順其自然完成一樣。
?
3.?????系統服務(system services)
應用框架API提供的函數和系統服務通信以訪問底層硬件,服務是模塊化的,比如比較重要的Windows Manager窗口管理器、Serarch Service搜索服務或是Notification Manager通知管理器。Android包括兩組服務:系統(比如Windows Manager和Notification Manager)和多媒體服務(如錄制和播放媒體服務)
?
4.?????HAL硬件抽象層(Hardware Abstraction Layer)
HAL定義一組標準接口來讓設備廠商去實現,允許Android不必知道底層驅動的實現。HAL允許你在不影響或是修改上層系統的前提下實現功能,HAL的實現被打包成為模塊(.so文件)文件,并且在適當的時候被Android系統加載。
圖2
你必須為產品的硬件實現相應的HAL(和驅動), HAL的實現典型的被編譯成共享庫模塊(.so文件),Android沒有要求在HAL實現和設備驅動之間是標準的交互,所以你可以基于自己的情況做最適合的事情。但是,為了保證Android系統能夠和硬件正確交互,你必須遵守每個具有硬件特性的HAL接口協議。
?
5.?????標準HAL結構體(Standare HAL structure)
每個特定硬件HAL接口都有其特性,由hardware/libhardware/include/hardware/hardware.h的結構體hw_module_t定義,這樣可保證HAL有個可預見的結構。HAL接口允許Android系統一致性的加載你的HAL模塊的正確版本。HAL接口由兩個通用的組件組成:一個模塊(module)和一個設備(device)。
?
5.1???模塊(module)
模塊打包了HAL的實現,這些實現作為一個共享庫.so文件體現。它包含模塊的version、name、author,這些成員幫助Android找到和加載模塊,模塊對應的結構體為hw_module_t,在hardware/libhardware/include/hardware/hardware.h定義,此結構體描述一個模塊和包含比如模塊版本、作者和名字。
?
除此之外,hw_module_t結構體還包含指向hw_module_methods_t結構體的指針methods,hw_module_methods_t結構體包含一個打開模塊的函數指針open。這個open函數作為一個抽象服務發起和硬件的通信,每個具體的硬件HAL通常要擴展通用的hw_module_t結構體,增加附加信息來更好的描述具體的硬件。比如攝像頭HAL,
typedefstruct camera_module {hw_module_t common;int (*get_number_of_cameras)(void);//擴展部分int (*get_camera_info)(int camera_id,struct camera_info *info); //擴展部分 }camera_module_t;當你實現一個HAL和創建模塊結構體,你必須以HAL_MODULE_INFO_SYM來給name成員賦值,比如:
structaudio_module HAL_MODULE_INFO_SYM = {.common = {.tag = HARDWARE_MODULE_TAG,.module_api_version =AUDIO_MODULE_API_VERSION_0_1,.hal_api_version =HARDWARE_HAL_API_VERSION,.id = AUDIO_HARDWARE_MODULE_ID,.name ="NVIDIA Tegra Audio HAL",.author = "The Android Open SourceProject",.methods = &hal_module_methods,}, };5.2???設備(device)
設備抽象了產品實際的硬件,比如一個音頻模塊包含一個基本的音頻設備、一個USB音頻設備或一個藍牙A2DP音頻設備。一個設備由hw_device_t結構體描述,像模塊一樣,每種類型的設備可在hw_device_t結構體的基礎上定義更多細節信息,比如指向硬件特征的函數指針,audio_hw_device_t就包含指向音頻設備操作的函數指針get_supported_devices。
struct audio_hw_device {struct hw_device_t common;/*** used by audio flinger to enumerate what devices are supported by* each audio_hw_device implementation.** Return value is a bitmask of 1 or more values of audio_devices_t*/uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);... }; typedef struct audio_hw_deviceaudio_hw_device_t;除了這些標準的屬性,每個具體硬件HALC接口可以定義多個硬件特有屬性和需求
?
6.?????HAL模塊
HAL的實現被編譯成為模塊(.so)文件和在Android合適的時候會動態鏈接它。你可以為你每個HAL實現創建Android.mk文件來編譯你的模塊并指向你的源代碼文件。通常,你的共享庫必須以某種格式命名,這樣它們才可能被找到和加載。從模塊到模塊的命名方案略有不同,但是一般遵循下面的形式:<module_type>.<device_name>
非常重要,比如module_type可以是GPS,但如果采用不同的GPS外設,可以通過device_name來區分。
?
7.?????Linux內核
開發你的設備驅動類似于開發典型的linux設備驅動,Android使用一個版本的Linux內核,在此內核基礎上增加了一些Android特有的內容,比如喚醒鎖(wave lock,一個內存管理器系統更積極主動去保護內存)、Binder IPC驅動和其他針對移動嵌入式平臺的重要特征,這些特征是系統主要功能和不影響驅動開發。
?
你可以使用任何支持所需要特診的版本內核(比如binder驅動),但是,我們推薦采用最新的Android內核版本。
?
參考鏈接:
http://source.android.com/devices/index.html
?
?
總結
以上是生活随笔為你收集整理的Android接口和框架学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下将文件打包、压缩并分割成指定
- 下一篇: 搜星流程(1)-[Qualcomm][B