android系統開發 HAL層開發基礎

2021-08-26 18:33:04 字數 4376 閱讀 1186

android系統開發--hal層開發基礎

android hal層,即硬體抽象層,是google響應廠家「希望不公開原始碼」的要求推出的新概念

1,源**和目標位置

源**: /hardware/libhardware目錄,該目錄的目錄結構如下:

/hardware/libhardware/hardware.c編譯成libhardware.so,目標位置為/system/lib目錄

/hardware/libhardware/include/hardware目錄下包含如下標頭檔案:

hardware.h 通用硬體模組標頭檔案

copybit.h copybit模組標頭檔案

gralloc.h gralloc模組標頭檔案

lights.h 背光模組標頭檔案

overlay.h overlay模組標頭檔案

qemud.h qemud模組標頭檔案

sensors.h 感測器模組標頭檔案

/hardware/libhardware/modules目錄下定義了很多硬體模組

這些硬體模組都編譯成***.***.so,目標位置為/system/lib/hw目錄

2,hal層的實現方式

jni->通用硬體模組->硬體模組->核心驅動介面

具體一點:jni->libhardware.so->***.***.so->kernel

具體來說:android frameworks中jni呼叫/hardware/libhardware/hardware.c中定義的hw_get_module函式來獲取硬體模組,

然後呼叫硬體模組中的方法,硬體模組中的方法直接呼叫核心介面完成相關功能

3,通用硬體模組(libhardware.so)

(1)標頭檔案為:/hardware/libhardware/include/hardware/hardware.h

標頭檔案中主要定義了通用硬體模組結構體hw_module_t,宣告了jni呼叫的介面函式hw_get_module

hw_module_t定義如下:

typedef struct hw_module_t hw_module_t;

硬體模組方法結構體hw_module_methods_t定義如下:

typedef struct hw_module_methods_t hw_module_methods_t;

只定義了乙個open方法,其中呼叫的裝置結構體引數hw_device_t定義如下:

typedef struct hw_device_t hw_device_t;

hw_get_module函式宣告如下:

int hw_get_module(const char *id, const struct hw_module_t **module);

引數id為模組標識,定義在/hardware/libhardware/include/hardware目錄下的硬體模組標頭檔案中,

引數module是硬體模組位址,定義了/hardware/libhardware/include/hardware/hardware.h中

(2)hardware.c中主要是定義了hw_get_module函式如下:

#define hal_library_path "/system/lib/hw"

static const char *variant_keys = {

"ro.hardware",

"ro.product.board",

"ro.board.platform",

"ro.arch"

static const int hal_variant_keys_count =

(sizeof(variant_keys)/sizeof(variant_keys[0]));

int hw_get_module(const char *id, const struct hw_module_t **module)

int status;

int i;

const struct hw_module_t *hmi = null;

char prop[path_max];

char path[path_max];

for (i=0 ; iif (i < hal_variant_keys_count)

if (property_get(variant_keys[i], prop, null) == 0)

continue;

snprintf(path, sizeof(path), "%s/%s.%s.so",

hal_library_path, id, prop);

else

snprintf(path, sizeof(path), "%s/%s.default.so",

hal_library_path, id);

if (access(path, r_ok))

continue;

/* we found a library matching this id/variant */

break;

status = -enoent;

if (i < hal_variant_keys_count+1) {

/* load the module, if this fails, we're doomed, and we should not try

* to load a different variant. */

status = load(id, path, module);

return status;

從源**我們可以看出,hw_get_module完成的主要工作是根據模組id尋找硬體模組動態連線庫位址,然後呼叫load函式去開啟動態連線庫

hal_library_path/id.prop.so

hal_library_path定義為/system/lib/hw

id是hw_get_module函式的第乙個引數所傳入,prop部分首先按照variant_keys陣列中的名稱逐一呼叫property_get獲取對應的系統屬性,

然後訪問hal_library_path/id.prop.so,如果找到能訪問的就結束,否則就訪問hal_library_path/id.default.so

舉例如下:

假定訪問的是背光模組,id定義為"lights"則系統會按照如下的順序去訪問檔案:

/system/lib/hw/lights.[ro.hardware屬性值].so

/system/lib/hw/lights.[ro.product.board屬性值].so

/system/lib/hw/lights.[ro.board.platform屬性值].so

/system/lib/hw/lights.[ro.arch屬性值].so

/system/lib/hw/lights.default.so

所以開發硬體模組的時候makefile檔案(android.mk)中模組的命名local_module要參考上面的內容,否則就會訪問不到沒作用了。

load函式的關鍵部分**如下:

handle = dlopen(path, rtld_now); //開啟動態鏈結庫

if (handle == null) {

char const *err_str = dlerror();

loge("load: module=%s\n%s", path, err_str?err_str:"unknown");

status = -einval;

goto done;

const char *sym = hal_module_info_sym_as_str;

hmi = (struct hw_module_t *)dlsym(handle, sym); //從動態鏈結庫中獲取硬體模組結構體的指標

if (hmi == null) {

loge("load: couldn't find symbol %s", sym);

status = -einval;

goto done;

#define hal_module_info_sym hmi

#define hal_module_info_sym_as_str "hmi"

4,硬體模組

硬體模組的開發主要是完成/hardware/libhardware/include/hardware目錄下對應的標頭檔案中的內容,主要是硬體模組標頭檔案和hardware.h中

的結構體中定義了一些函式指標,呼叫核心提供的介面將具體的函式實現,然後編譯成指定名稱的動態鏈結庫放到/system/lib/hw目錄下即可。

用一句話來概括:硬體模組的開發就是定義乙個hardware.h中定義的hw_module_t結構體,結構體名稱為巨集hal_module_info_sym,然後實現結構體

5,核心驅動

主要是要向使用者層開放介面,讓硬體模組和核心可以互動。

Android 硬體抽象層(HAL)

出發點 保護廠商利益 android的硬體抽象層,簡單來說,就是 對linux核心驅動程式的封裝,向上提供介面,遮蔽低層的實現細節。也就是說,把對硬體的支援分成了兩層,一層放在使用者空間 user space 一層放在核心空間 kernel space 其中,硬體抽象層執行在使用者空間,而linux...

回顧備忘 Android系統hal層相關系統粗概

適用於高通平台 未完待續 背光和指示燈系統 使用非標準的驅動程式,對應的硬體抽象層是light硬體模組 3d加速系統 使用非標準的驅動程式,對應的硬體抽象層是opengl 注 adreno 音訊系統 使用非標準的驅動程式,對應的是c 繼承的硬體抽象層 攝像頭系統 使用非標準的驅動程式,對應的是c 繼...

Android系統開發與優化

android卡頓優化 卡頓分析方法 cpu 時間分為兩種 使用者時間和系統時間。使用者時間就是執行使用者態應用程式 所消耗的時間 系統時間就是執行核心態系統呼叫所消耗的時間,包括 i o 鎖 中斷以及其他系統呼叫的時間。cpu 效能 卡頓問題分析指標 另外乙個會影響 cpu 飽和度的是執行緒優先順...