標籤:
硬體抽象層:HAL
Google為Android加入HAL主要有如下的目的:
1.統一硬體的調用介面。由於HAL有標準的調用介面,所以可以利用 HAL屏蔽Linux驅動複雜、不統一的介面;
2.解決了GPL著作權問題。由於Linux核心基於GPL協議,而Android基於Apache Licence 2.0協議。因此Google玩了個“穿越”,將原本位於Linux驅動中的敏感代碼向上移了一個層次。這樣這些敏感代碼就擺脫GPL協議的束縛,那些不想開源的Linux驅動作者也就沒必要開源了。
3.針對一些特殊的要求。對於有些硬體,可能需要訪問一些使用者空間的資源,或在核心空間不方便完成的工作以及特殊需求。在這種情況下,可以利用位於使用者空間HAL代碼來輔助Linux驅動完成一些工作。
編寫一款支援HAL的Linux驅動程式要比編寫普通的 Linux 驅動程式複雜一些,但這些付出 是值得。因為加入HAL會使組成 Linux 驅動的一整套Library的各部分更獨立,更容易維護。步驟1.編寫Linux驅動
“編寫Linux驅動”,從表明上看是廢話,但如果要為Linux驅動添加HAL,而且想盡量保護敏 感資料。Linux驅動的代碼就要盡量簡潔,儘可能將商務邏輯放HAL Library中。
步驟2.編寫HAL Library
HAL Library就是普通的Linux Library(*.so )檔案。但這類庫檔案有一個介面。通過HAL_MODULE_INFO_SYM變數實現。Service Library通過在這個介面中定義的ID定位HAL Library的。
步驟3.編寫 Service Library
儘管這步並不是必需的,但新的HAL架構要求我們這樣做。Service Library 也是Linux Library。這一步比較靈活。Service Library可以是一般的Linux Library,也可以是JNI Library。實際上這一步除了用C/C++件實現的*.so庫檔案外,還應該包含Java編寫的服務管理類 (ServiceManager)。ServiceManager會調用Service Library。而APK程式會調用ServiceManager類來訪問Service Library。
Android深度探索(卷1)HAL與驅動開發閱讀心得9