首先,Android的HAL是爲了一些硬件提供商提出的「保護proprietary」的驅動程序而產生的東東,簡而言之,就是爲了避開linux kernel的GPL license的束縛。Android把控制硬件的動做都放到了user space中,而再kernel driver裏面只有最簡單的讀寫寄存器的操做,而徹底去掉了各類功能性的操做(好比控制邏輯等),這些可以體現硬件特性的操做都放到了Android的HAL層,而Android是基於Aparch的license,所以硬件廠商能夠只提供二進制代碼,因此說Android只是一個開放的平臺,並非一個開源的平臺。
從網上看到的這樣一段話,還存在的疑問是,1.既然「把控制硬件的動做都放到了user space中「,那kernel driver的做用是什麼,
2.HAL層與內核驅動層之間是怎麼交互的,他們之間的接口函數是什麼呢?java
====================linux
內核裏的設備驅動其實就是實現硬件的各類功能及調用接口, 至於怎麼使用這硬件功能由應用程序的調用來決定的。
應用程序調用內核驅動的接口基本是統一的標準接口, 也就是所謂的系統調用接口。Android裏的HAL層其實就是把調用內核驅動實現的功能封裝成一個個的類,供java來調用函數
====================編碼
針對寄存器和IO級別的操做只能在內核完成,由於這些操做須要讀寫一些應用層沒法看到的地址。而其餘的組合邏輯交給HAL層來完成,這樣的話必須GPL的內核驅動代碼只包含了最基礎的操做,而真正的業務交給不開源的HAL來操做。好比說基於I2C的加密芯片驅動,你在內核驅動層只實現I2C讀寫,關於加密的邏輯和命令所有在HAL實現,在HAL中組織數據包,調用I2C驅動給出的接口實現功能。加密
====================spa
HAL層最終仍是要進行Linux系統調用打開設備文件,Android作了Java到C/C++的接口,記得是叫JNI層吧,按照Google定好的規則進行編碼,就能夠實現Java到系統調用之間的連接接口