Android HAL簡介
1、 HAL介紹
現有的HAL架構由patrick brady(Google)在2008 Google IO演講中提出的,如:
Android的HAL是為了保護一些硬體供應商的智慧財產權而提出的,是為了避開Linux的GPL束縛。思路是把控制硬體的動作放到了Android HAL中,而Linux driver僅僅完成一些簡單的資料互動動作,甚至把硬體寄存器空間直接映射到user space。而Android是基於Apache的License,因此硬體廠商可以只提供二進位檔案,所以說Android知識一個開放的平台,而不是一個開源的平台。也許也正是因為Android不遵循GPL,所以Greg KH在2.6.33核心將Android驅動從Linux中刪除。GPL和硬體廠商目前還是有著無法彌合的裂痕。Android想要把這個問題處理好也不容易。
總結下來,Android HAL存在的原因主要有:
1. 並不是所有的硬體裝置都有標準的Linux Kernel的介面;
2. Kernel driver涉及到GPL的著作權。某些裝置製造商並不願意公開硬體驅動,所以才用HAL方式繞過GPL;
3. 針對某些硬體,Android有一些特殊的需求。
2、 在Android源碼裡,HAL的代碼主要位於以下目錄
1. libhardware_legacy/ -舊架構、採取串連庫模組的觀念進行;
2. libhardware/ -新架構、調整為 HALstub的觀念;
3. ril/ - Radio Interface Layer,包括3G,GSM等電話功能;
4. msm7k、qcom、ti與平台相關的
主要包括一下一些模組:GPS,vibrator,wifi,copybit,audio,camera,lights,ril,overlay等。
3、新舊HAL對比
HAL架構慢慢完善,新架構與舊架構相比,抽象程度不斷提高,把Android Framework和Linux Kernel很好的隔離開。讓android 不至於過度的依賴Linux Kernel,在開發Android Framework時不必考慮底層的硬體的細節。
舊HAL架構
舊HAL架構的作法,是比較傳統的module模式,也就是將*.so檔案當做sharedlibrary來使用,在runtime(JNI部分)以direct function call使用HAL module。通過直接函數調用的方式來操作驅動程式。
當然,應用程式也可以不需要通過JNI的方式進行(黑色箭頭),直接以載入*.so庫(dlopen)的方式來調用*.so裡的符號(symbol)也是一種方式。
總之是沒有經過封裝,上層直接操作硬體。
新HAL架構
新HAL架構的作法,就有了stub的味道。HAL stub是一種代理人(proxy)的概念,stub雖然仍是以*.so庫存在,但HAL已經將*.so庫封裝起來了。Stub向HAL提供操作函數,而runtime則是向HAL取得特定模組(stub)的operations,在callback這些操作函數。這種以indirectfunction call的架構,讓HAL stub變成是一種內含項目關聯性,即HAL裡包含了許許多多的stub(代理人)。Runtime只要說明類型,即module ID,就可以取得操作函數。
HAL的未來發展
新的HAL作法,傾向全面採用JNI的方式進行。也就是,在Android的架構中,修改Androidruntime(即core library),在取得HAL模組的operations後再做callback操作。將HAL模組完全放在HAL裡面。
源地址:http://www.jollen.org/blog/2009/10/android-hal-status-report.html