android hardware 簡述(Android系統原始碼情景分析 筆記)
轉自 https://blog.csdn.net/u013377887/article/details/52965988
1.Android原始碼開發的C可執行原始檔一般存在external目錄下
2 Android的幾層框架.
application
---------------------------------------------
java framework
java natice interface
native framework
hardware
---------------------------------------------------
driver
kernel
-----------------------------------------------------
3.硬體抽象層以模組來管理各個硬體訪問介面
每個硬體模組都對應有一個動態連結庫檔案
每個硬體抽象層都使用 hw_module_t 來描述
硬體裝置 使用 hw_device_t 來描述
4.硬體抽象層檔案的命名規範
hardware/libhardware/hardware.c
hw_module_t 和hw_device_t 定義
hardware/libhardware/include/hardware/hardware.h 中
5.每一個硬體抽象層 在核心中都對應一個驅動程式
硬體抽象層就是通過這些驅動程式訪問硬體裝置的
通過讀寫裝置檔案來進行通訊的
6.目錄結構
hardware/libhardware
.
├── include
│ └── hardware //標頭檔案的存放目錄 存放的是xxx.h 檔案
├── modules
│ ├── audio //具體模組的存放 xxx.cpp Android.mk
│ ├── audio_remote_submix
│ ├── camera
│ ├── consumerir
│ ├── fingerprint
│ ├── gralloc
│ ├── hwcomposer
│ ├── local_time
│ ├── nfc
│ ├── nfc-nci
│ ├── power
│ ├── sensors
│ │ └── tests
│ ├── soundtrigger
│ ├── tv_input
│ ├── usbaudio
│ └── vibrator
└── tests
xxx.h xxx.cpp是原始碼檔案
Android.mk是模組的編譯腳步檔案
需要注意的是:
這裡的目錄是android自帶的目錄,除此之外,還有一些廠商的目錄,比如MTK,在vender目錄下,他同樣有一個 hardwar目錄,
7. 每一個 模組都需要自定義一個模組結構體
以高通的lights 為例
定義模組ID
#define LIGHTS_HARDWARE_MODULE_ID "lights"
struct light_device_t {
struct hw_device_t common; //第一項必須為hw_device_t 這個結構
/**
* Set the provided lights to the provided values.
*
* Returns: 0 on succes, error code on failure.
*/
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
};
原始檔
/hardware/qcom/display/liblight$
每一個硬體模組必須匯出一個名稱HAL_MODULE_INFO_SYM符號
他指向一個自定義的硬體抽象層模組結構體。
第一個型別為hw_module_t 的tag (必須為HARDWARE_MODULE_TAG )
8. 一個硬體抽象層可能包含多個硬體裝置
而這些硬體裝置的開啟操作是由xxx_device_open來完成的。
9.編譯指令碼
編譯完成後,存在 out/target/produce/gerneric/system/hw 下
名字xxx.default.so
10.mmm make snod
mmm 編譯 snod 打包
11.可能存在的問題
open的時候,沒有許可權
解決方案:
通過uevent 機制
system/core/rootdir
ueventd.rc的配置檔案
/dev/freg 0666 root root
更加簡單的方法:
2.3 節 (Android系統原始碼情景分析)
12.在硬體抽象層模組之後,需要在應用程式框架層中實現一個硬體訪問服務,
硬體訪問服務:通過硬體抽象層模組開為應用程式提供硬體讀寫操作。
硬體抽象層模組使用 C++
Java Native Interface
硬體訪問服務使用Java
13.硬體訪問服務執行在系統程序system中,
使用硬體訪問服務的應用程式執行在另外的程序中,
即應用程式通過程序間通訊機制來訪問這些硬體訪問服務
binder 程序間通訊機制
應用程式通過binder來訪問執行在系統程序System中的硬體服務
binder程序間通訊機制 要求提供服務的一方必須實現一個具有 跨程序訪問能力的服務介面,以便使用服務的一方可以通過這個服務介面來訪問它
binder 機制,在C。C++ java 都有相應的實現方法。對於java層,則可以使用下邊的方法。
14.硬體訪問服務介面
跨程序 訪問能力的服務介面
AIDL (frameworks/base/core/java/andriod/os/xxx.aidl)
同時需要修改 frameworks/base 目錄下的Android.mk
mmm ./frameworks/base 編譯這個介面
aidl 定義的服務藉口是用來進行程序間通訊的。其中提供服務的程序成為server程序,
而使用服務的程序成為client程序。
不僅僅需要定義aidl,還需要實現server的具體功能,即下邊的方法
15.硬體訪問服務
frameworks/base/services/java/com/android/server
實現介面的成員函式
16.硬體訪問服務的jni方法。 呼叫硬體抽象層模組
/frameworks/base/services/core/jni
命名com_android_server_xxx.cpp
實現java本地介面方法表
註冊java本地介面方法
在onload.cpp中新增xxx函式的宣告和呼叫
修改Android.mk
jni層
com_android_server_lights_LightsService.cpp (frameworks\frameworks\base\services\core\jni)
這是一個對於使用java編寫的jni,通用的寫法,除此之外還有C++的實現,典型程式碼Camera的框架,
17. 啟動硬體訪問服務
Android的硬體訪問服務通常在系統程序system中啟動,
系統程序system是由應用程式孵化器程序Zygote負責啟動的。
zygote 在系統啟動時啟動。
-->把硬體訪問服務執行在系統程序system 中就實現了開機時自動啟動
新增到哪裡?
frameworks/base/services/java/com/android/server/SystemServer.java
android5.1 和書有點不同
17.編寫應用程式
kernel hal jni system binder 應用程式的程序
核心驅動
硬體抽象層模組使用 C++ 通訊方法
Java Native Interface
硬體訪問服務使用Java
硬體訪問服務介面 訪問介面