當前位置:首頁 » 安卓系統 » android的hal層

android的hal層

發布時間: 2024-01-06 22:05:48

Ⅰ android的hal層用什麼語言實現

Android的硬體抽象層,簡單來說,就是對linux內核驅動程序的封裝,向上提供介面,屏蔽低層的實現細節。也就是說,把對硬體的支持分成了兩層,一層放在用戶空間(User Space),一層放在內核空間(Kernel Space),其中,硬體抽象層運行在用戶空間,而Linux內核驅動程序運行在內核空間。為什麼要這樣安排呢?把硬體抽象層和內核驅動整合在一起放在內核空間不可行嗎?從技術實現的角度來看,是可以的,然而從商業的角度來看,把對硬體的支持邏輯都放在內核空間,可能會損害廠家的利益。我們知道,Linux內核源代碼版權遵循GNU License,而Android源代碼版權遵循Apache License,前者在發布產品時,必須公布源代碼,而後者無須發布源代碼。如果把對硬體支持的所有代碼都放在Linux驅動層,那就意味著發布時要公開驅動程序的源代碼,而公開源代碼就意味著把硬體的相關參數和實現都公開了,在手機市場競爭激烈的今天,這對廠家來說,損害是非常大的。因此,Android才會想到把對硬體的支持分成硬體抽象層和內核驅動層,內核驅動層只提供簡單的訪問硬體邏輯,例如讀寫硬體寄存器的通道,至於從硬體中讀到了什麼值或者寫了什麼值到硬體中的邏輯,都放在硬體抽象層中去了,這樣就可以把商業秘密隱藏起來了。也正是由於這個分層的原因,Android被踢出了Linux內核主線代碼樹中。大家想想,Android放在內核空間的驅動程序對硬體的支持是不完整的,把Linux內核移植到別的機器上去時,由於缺乏硬體抽象層的支持,硬體就完全不能用了,這也是為什麼說Android是開放系統而不是開源系統的原因。
撇開這些爭論,學習Android硬體抽象層,對理解整個A

Ⅱ Android圖形系統系統篇之HWC

HWC (hwcomposer)是Android中進行窗口( Layer )合成和顯示的HAL層模塊,其實現是特定於設備的,而且通常由顯示設備製造商 (OEM)完成,為 SurfaceFlinger 服務提供硬體支持。

SurfaceFlinger 可以使用 OpenGL ES 合成 Layer ,這需要佔用並消耗GPU資源。大多數GPU都沒有針對圖層合成進行優化,當 SurfaceFlinger 通過GPU合成圖層時,應用程序無法使用GPU進行自己的渲染。而 HWC 通過硬體設備進行圖層合成,可以減輕GPU的合成壓力。

顯示設備的能力千差萬別,很難直接用API表示硬體設備支持合成的 Layer 數量, Layer 是否可以進行旋轉和混合模式操作,以及對圖層定位和硬體合成的限制等。因此HWC描述上述信息的流程是這樣的:

雖然每個顯示設備的能力不同,但是官方要求每個 HWC 硬體模塊都應該支持以下能力:

但是並非所有情況下 HWC 都比GPU更高效,例如:當屏幕上沒有任何變化時,尤其是疊加層有透明像素並且需要進行圖層透明像素混合時。在這種情況下, HWC 可以要求部分或者全部疊加層都進行GPU合成,然後 HWC 持有合成的結果Buffer,如果 SurfaceFlinger 要求合成相同的疊加圖層列表, HWC 可以直接顯示之前合成的結果Buffer,這有助於提高待機設備的電池壽命。

HWC 也提供了 VSync 事件,用於管理渲染和圖層合成時機,後續文章會進行介紹。

Android7.0提供了HWC和HWC2兩個版本,默認使用HWC,但是手機廠商也可以選擇HWC2,如下所示:

SurfaceFlinger 通過 HWComposer 使用 HWC 硬體能力, HWComposer 構造函數通過 loadHwcMole 方法載入HWC模塊,並封裝成 HWC2::Device 結構,如下所示:

上述通過 hw_get_mole 方法(hardware\libhardware\hardware.c)載入 hwcomposer 模塊,此模塊由硬體廠商提供實現,例如:hardware\libhardware\moles\hwcomposer\hwcomposer.cpp是 hwcomposer 模塊基於HWC1的default實現,對應的共享庫是 hwcomposer.default.so ;hardware\qcom\display\msm8994\libhwcomposer\hwc.cpp是高通MSM8994基於HWC1的實現,對應的共享庫是 hwcomposer.msm8994.so 。
如果是基於HWC2協議實現,則需要實現hwcomposer2.h中定義的 hwc2_device_t 介面,例如: class VendorComposer : public hwc2_device_t 。Android7.0的 hwcomposer 模塊默認都是基於HWC1協議實現的。
每個HAL層模塊實現都要定義一個 HAL_MODULE_INFO_SYM 數據結構,並且該結構的第一個欄位必須是 hw_mole_t ,下面是高通MSM8994 hwcomposer 模塊的定義:

frameworks\native\services\surfaceflinger\DisplayHardware\HWC2.h主要定義了以下三個結構體:

它們是對 HWC 硬體模塊的進一步封裝,方便進行調用。 HWC2::Device 持有一個 hwc2_device_t ,用於連接硬體設備,它包含了很多HWC2_PFN開頭的函數指針變數,這些函數指針定義在 hwcomposer2.h 。
在 HWC2::Device 的構造函數中,會通過 Device::loadFunctionPointers -> loadFunctionPointer(FunctionDescriptor desc, PFN& outPFN) -> hwc2_device_t::getFunction 的調用鏈從硬體設備中獲取具體的函數指針實現。關鍵模板函數如下所示:

這些函數指針主要分為三類:

通過上述函數指針可以與 hwc2_device_t 表示的硬體合成模塊進行交互。三類指針分別選取了一個示例:

可以通過類圖,直觀感受下引用關系。

HWC2::Device 構造函數除了完成獲取函數指針實現以外,還會通過 Device::registerCallbacks 向硬體設備注冊三個 Display 的回調:熱插拔,刷新和VSync信號,如下所示:

總結一下, HWC2::Device 構造函數向硬體設備注冊三個 Display 回調:熱插拔,刷新和VSync信號。當 HWC2::Device 收到這些回調時,會通過監聽器向外回調到對應的HWComposer函數: HWComposer::hotplug / HWComposer::invalidate / HWComposer::vsync 。HWComposer再通過這些信息驅動對應工作,後續文章進行介紹。

上文提到 HWC2::Device 中的函數指針是hardware\libhardware\include\hardware\hwcomposer2.h中定義的,除此之外,該頭文件還定義了一些重要的結構體,這里介紹兩個比較重要的:

DisplayType 表示顯示屏類型,上面注釋已經介紹,重點看下Layer合成類型:

那麼一個 Layer 的合成方式是怎麼確定的那?大致流程如下所示:

本篇文章只是簡單介紹了HWC模塊的相關類: HWComposer 、 HWC2::Device 、 HWC2::Display 和 HWC2::Layer ,以及它們的關系。此外,還著重介紹了Layer的合成方式和合成流程。後續文章會更加全面的介紹 SurfaceFlinger 是如何通過HWC模塊完成Layer合成和上屏的(虛擬屏幕是到離屏緩沖區)。

Ⅲ 有沒有那本書介紹android hal層

書到沒見過,只有一些資料而已:
Android HAL層即硬體抽象層是Google響應廠家「希望不公開源碼」的要求推出的概念
1,源代碼和目標位置
源代碼: /hardware/libhardware目錄,該目錄的目錄結構如下:
/hardware/libhardware/hardware.c編譯成libhardware.so,目標位置為/system/lib目錄
Android.mk中lib文件默認使用LOCAL_MODULE_PATH是等於TARGET_OUT_SHARED_LIBRARIES的。
/hardware/libhardware/include/hardware目錄下包含如下頭文件:
hardware.h 通用硬體模塊頭文件hw_mole_t和hw_get_mole_by_class的定義
bit.h bit模塊頭文件
gralloc.h gralloc模塊頭文件
lights.h 背光模塊頭文件
overlay.h overlay模塊頭文件
qemud.h qemud模塊頭文件
sensors.h 感測器模塊頭文件
/hardware/libhardware/moles目錄下定義了很多硬體模塊
這些硬體模塊都編譯成xxx.xxx.so,目標位置為/system/lib/hw目錄

Ⅳ Android中HAL層與內核驅動之間的關系

hal通過linux的用戶空間介面去間接的使用內核驅動,內核驅動再去控制實際的硬體。

Ⅳ Android HIDL概述(一)

Android O(8.0) 版本之後,底層實現有了比較大的變化,最顯著的一個方面就是 HIDL 機制的全面實施。本文及接下來的幾篇博文將從 HIDL的基本概念 HIDL服務模擬 framework層aidl服務 應用層程序 這四個方面來全面的闡述 HIDL 工作全過程,這對於理解系統源碼中 Gnss Usb Camera 等正大殲模塊的工作原理有極大幫助。

Android O(8.0) 之前系統的升級牽扯多方協作,極為麻煩, HIDL 機制的推出就是將 framework hal 層分開,使得框架部分可以直接被覆蓋、更新,而不需要重新對 HAL 進行編譯,這樣在系統升級時, OEM 廠商 跳過 SoC 廠商,先對 framework 進行升級。

framework hal 緊緊耦合存在於 system.img 中,因此在版本升級時需要: OEM 廠商適配 framework SoC廠商 適配 hal , 之後將修改打包到 system.img ,生成仿灶 OTA 升舉沖級包,推送到手機進行 OTA 升級

framework hal 進行了解耦, framework 存在於 system.img hal 存在於 vendor.img ,進行版本升級時,分為兩次升級:

正如上述所言,舊版的系統架構中, Android Framework 層與 Hal 層是打包成一個 system.img 的,且 Framework 與 hal 層之間是緊密耦合的,通過鏈接的方式使用相應的硬體 so 庫。它們之間的架構一般有如下兩種方式:

為了解決兩者之間這種緊耦合所帶來的弊端,google 引入 HIDL 來定義 Framework 與 HAL 之間的介面,可以用下圖來描述:

事實上雖然 google 推出了這種機制,但是很多廠商沒有很快的跟上節奏,因此為了向前兼容, google 定義了三種類型:

上述可總結為

[ 1 ] hidl
[ 2 ] hidl trebl 演進

熱點內容
oc訪問成員變數嗎 發布:2024-11-29 00:14:59 瀏覽:517
七牛雲伺服器生成縮略圖 發布:2024-11-29 00:12:36 瀏覽:272
如何重設華為賬號密碼 發布:2024-11-29 00:03:33 瀏覽:813
安卓聽小說下載到哪個文件夾 發布:2024-11-29 00:03:01 瀏覽:932
閑魚掛腳本 發布:2024-11-29 00:01:27 瀏覽:630
ae加快緩存 發布:2024-11-28 23:50:34 瀏覽:342
java的版本號 發布:2024-11-28 23:48:18 瀏覽:100
sql存儲過程區別 發布:2024-11-28 23:35:37 瀏覽:919
ms計算機需要什麼配置 發布:2024-11-28 23:34:21 瀏覽:975
淘寶直接訪問的流量 發布:2024-11-28 23:33:11 瀏覽:50