1. 程式人生 > >ch8.1 Android HAL層簡介

ch8.1 Android HAL層簡介

8.1 Android HAL層簡介 HAL(Hardware abstract Layer)硬體抽象層是google開發的android系統裡上層應用對底層硬體操作的一個遮蔽的軟體層次,通俗來講,就是上層的應用不用關心底層硬體如何工作,只要向上層提供一個統一的介面即可,這種設計思想廣泛存在於當前的軟體架構設計裡。 學習目標: 1.瞭解android HAL 2.熟悉android HAL Module架構 3.熟悉android HAL stub 代理架構 4.掌握Android LED HAL程式碼編寫方法 嚴格來講,android系統完全可以沒有hal層,上層應用層可以直接通過api和jni技術訪問底層硬體,但是android自出現開始一直打著開源的旗號,而一些硬體廠商由於商業因數,不希望自己核心的程式碼開源出來,而只是提供二進位制程式碼。 另外android系統裡使用了一些硬體裝置介面可能支援linux kernel driver的統一介面,並且linux核心中使用的相當嚴格的GPL版本,所有核心程式碼必須開源,google為了讓自己的android系統泡在更多硬體裝置上並支援更多裝置型別,在android的架構裡提出了HAL概念。 HAl其實就是硬體裝置抽象的意思,android系統的功能不依賴於某一個具體的硬體驅動,而是依賴於HAL程式碼,相當於將linux裝置驅動分為兩部分 ,一部分在kernel中使用GPL協議開源一些非核心的介面訪問的程式碼,另外一部分在kernel上的應用層使用apache協議,主要是硬體廠商不希望開源的邏輯程式碼,僅提供二進位制程式碼。 android & framework | HAL :device operation logic | linux kernel: device interface driver 8.1.1 HAL存在原因 HAL有兩種架構 1.Module架構 2.stub代理架構 module架構是2008年以前使用的舊架構,HAL程式碼被編譯成動態模組庫,andorid應用程勳和框架層通過jni載入並呼叫HAL Module 庫程式碼,在HAL Module庫中在去訪問裝置驅動。 app & framework | Device Module HAL *.so | Linux Device Driver 舊的架構比較好理解 ,android使用者應用程式或者框架層程式碼有java實現,java執行在dalvik虛擬機器中,沒有辦法直接訪問底層硬體,只能通過呼叫so本地庫程式碼,在so本地庫程式碼裡面有對底層硬體的操作程式碼。 也就是說,應用層或框架層java程式碼,通過jni技術呼叫c或c++寫的so庫程式碼,在so庫程式碼中呼叫底層驅動,實現上層應用的提出的一個腳請求操作。實現硬體操作的so庫為module。 該方式對硬體訪問效率比起C程式碼低,只能夠達到c語言95%左右。 因此谷歌有提出了新的HAL架構。在這個設計架構雖然滿足了java應用訪問硬體的需求,但是使得程式碼上下層耦合度太高,使用者程式或framework程式碼必須去載入module庫,如果底層硬體有變化,module要重新編譯,上層也要做相應的變化。另外如果多個應用程式同時訪問硬體,都去載入Module,同一個Module被多個程序對映多次,會有程式碼重入問題。 8.1.3 新的HAL架構 新的架構使用的是Module stub方式。stub是存根或樁的意思,其實就是一個物件代表的意思。 由上面的架構可知,上層應用層或framework層載入so庫程式碼,so庫程式碼稱為module,在HAL層註冊了每個硬體物件的存根stub,當上層需要訪問硬體的時候,就從當前註冊應急物件stub裡查詢,找到之後stub會向上層module提供改硬體物件operations interface 操作介面,該操作介面就儲存在module中,上層應用或框架在通過這個Module中的操作介面來訪問硬體。