1、相關(guān)知識(shí)點(diǎn)
1.1 概要
如下 AOSP軟件堆棧架構(gòu)圖 主要跨兩個(gè)階段 Android Apps
==> Android Framework
==> HAL
,這種IPC跨進(jìn)程通信
在Android
中必須要了解的相關(guān)知識(shí)點(diǎn):1》Binder IPC
通信機(jī)制;2》JNI
調(diào)用;3》AIDL、HIDL
接口定義語(yǔ)言
1》
Binder IPC
通信機(jī)制
IPC 域 說(shuō)明 /dev/binder
框架/應(yīng)用進(jìn)程之間的 IPC,使用 AIDL 接口 /dev/hwbinder
框架/供應(yīng)商進(jìn)程之間的 IPC,使用 HIDL 接口
供應(yīng)商進(jìn)程之間的 IPC,使用 HIDL 接口/dev/vndbinder
供應(yīng)商/供應(yīng)商進(jìn)程之間的 IPC,使用 AIDL 接口
2》
JNI
調(diào)用
就是Java與C/C++
互相調(diào)用,這不是Android系統(tǒng)所獨(dú)有的,而是Java所有。Android表現(xiàn):frameworks/base
和frameworks/Native
,以及其他SO庫(kù)
調(diào)用。
3》
AIDL、HIDL
接口定義語(yǔ)言:是Android中binder機(jī)制
的具體實(shí)現(xiàn),相應(yīng)的binder域/dev/binder
、/dev/hwbinder
、/dev/vndbinder
;Android規(guī)范的接口定義語(yǔ)言,按照規(guī)范aidl/hidl文件自動(dòng)生成相應(yīng)代碼文件。
Android 接口定義語(yǔ)言 相關(guān)Blog client端 / server端 AIDL
Android 接口定義語(yǔ)言 (AIDL) 客戶端獲取proxy: asInterface(android.os.IBinder obj)
服務(wù)端實(shí)現(xiàn)Stub:class Stub extends android.os.Binder
(C++中客戶端對(duì)應(yīng)Bp端
,服務(wù)端對(duì)應(yīng)Bn端
)HIDL
Android 接口定義語(yǔ)言 (HIDL)
1.2 參考
1》
Binder IPC
通信機(jī)制
序號(hào) 文章名 概述 0 為什么 Android 要采用 Binder 作為 IPC 機(jī)制? 【Android,在爭(zhēng)議中逃離 Linux 內(nèi)核的 GPL 約束】 0 使用 Binder IPC 多個(gè) Binder 域: /dev/binder
、/dev/hwbinder
、/dev/vndbinder
1 Binder系列1-Binder Driver /dev/binder
運(yùn)行在Linux kernel2 Binder系列2-ServiceManager SM啟動(dòng),添加/獲取Service 3 Binder系列3-framework層 Zygote啟動(dòng)時(shí)AndroidRuntime::startReg中 register_jni_procs()
,JNI調(diào)用到Native4 Binder 域 關(guān)注/dev/vndbinder與/dev/binder共用一套libbinder,defaultServiceManager()獲取前需要切換 5 Binder相關(guān)問(wèn)題
2》
JNI
調(diào)用
Android JNI原理、Java本地調(diào)用(JNI)
3》
AIDL、HIDL
接口定義語(yǔ)言
Android 接口定義語(yǔ)言 相關(guān)Blog AIDL
Android 接口定義語(yǔ)言 (AIDL) HIDL
Android 接口定義語(yǔ)言 (HIDL)
Android 8.0 重新設(shè)計(jì)了 Android 操作系統(tǒng)框架(在一個(gè)名為“Treble”的項(xiàng)目中),以便讓制造商能夠以更低的成本更輕松、更快速地將設(shè)備更新到新版 Android 系統(tǒng)。在這種新架構(gòu)中,HAL 接口定義語(yǔ)言(HIDL,發(fā)音為“hide-l”)指定了 HAL 和其用戶之間的接口,讓用戶無(wú)需重新構(gòu)建 HAL,就能替換 Android 框架。在 Android 10 中,HIDL 功能已整合到 AIDL 中。此后,HIDL 就被廢棄了,并且僅供尚未轉(zhuǎn)換為 AIDL 的子系統(tǒng)使用。
在 Android 11 中,還支持使用 AIDL 編寫(xiě)的 HAL。所有 AIDL HAL 都是綁定的。
- 綁定的 HAL 。 HAL 以 HAL 接口定義語(yǔ)言 (HIDL) 或 Android 接口定義語(yǔ)言 (AIDL) 表示。這些 HAL 取代了早期 Android 版本中使用的傳統(tǒng) HAL 和遺留 HAL。在 Binderized HAL 中,Android 框架和 HAL 使用 Binder 進(jìn)程間通信 (IPC) 調(diào)用相互通信。所有搭載 Android 8.0 或更高版本的設(shè)備必須僅支持綁定化 HAL。
-直通 HAL 。 HIDL 包裝的傳統(tǒng) HAL 或舊版 HAL這些 HAL 包裝現(xiàn)有的 HAL,并且可以在綁定和相同進(jìn)程(直通)模式下為 HAL 提供服務(wù)。升級(jí)到 Android 8.0 的設(shè)備可以使用直通 HAL。
2、拿SensorService舉例
2.1 Android Apps ==> Android Framework階段
Android Apps
==>Android Framework
階段通過(guò)Android API調(diào)用,就是App編程調(diào)用的Android SDK
。
Activity中調(diào)用mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
獲取加速度傳感器Sensor.TYPE_ACCELEROMETER
。
更多查看APP獲取Sensor對(duì)象-Android12;參考代碼如下
public class SensorActivity extends Activity implements SensorEventListener {
private final SensorManager mSensorManager;
private final Sensor mAccelerometer;
public SensorActivity() {
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
}
}
2.2 Android Framework內(nèi)部階段
2.2.1 frameworks/base
Android Framework內(nèi)部階段:通過(guò)JNI調(diào)用Native層,如Android JNI原理、Java本地調(diào)用(JNI)中
javac -h ./ xxx.java (javah是1.8及以前版本)
生成相應(yīng)xxxNative.h
文件,
SersorManager.java對(duì)應(yīng)相關(guān)代碼:(在SystemServer啟動(dòng)時(shí)System.loadLibrary("android_servers");
加載so庫(kù))frameworks/base/core/java/android/hardware/SensorManager.java
frameworks/base/core/java/android/hardware/SystemSensorManager.java
frameworks/base/core/jni/android_hardware_SensorManager.cpp
libnativehelper/include/nativehelper/JNIHelp.h
libnativehelper/include_jni/jni.h
frameworks/base/core/jni/core_jni_helpers.h
private static native boolean nativeGetSensorAtIndex(long nativeInstance,
Sensor sensor, int index);
ssize_t count = mgr->getSensorList(&sensorList);
2.2.2 frameworks/native
通過(guò)
binder IPC跨進(jìn)程通信
機(jī)制defaultServiceManager()
獲取到對(duì)應(yīng)服務(wù)調(diào)用。如調(diào)用到服務(wù)frameworks/native/services/sensorservice
SersorManager.cpp對(duì)應(yīng)相關(guān)代碼:(SensorService.cpp 繼承BinderService、BnSensorServer、Thread,初始化時(shí)添加到defaultServiceManager()
中,更多查看SensorService啟動(dòng)-Android12)frameworks/native/libs/sensor/SensorManager.cpp
frameworks/native/libs/binder/include/binder/IServiceManager.h
frameworks/native/libs/binder/IServiceManager.cpp
frameworks/native/services/sensorservice/SensorService.cpp
(
這里的Bp端Bn端(BpSensorServer/BnSensorServer)
手動(dòng)擼代碼,不是自動(dòng)生成,所以這里關(guān)注transact()/onTransact()
frameworks/native/libs/sensor/include/sensor/ISensorServer.h
frameworks/native/libs/sensor/ISensorServer.cpp
)
NativeSensorService::NativeSensorService(JNIEnv* env, jobject listener)
: mProximityActiveListenerDelegate(new ProximityActiveListenerDelegate(env, listener)) {
if (base::GetBoolProperty("system_init.startsensorservice", true)) {
sp<IServiceManager> sm(defaultServiceManager());
mService = new SensorService();
sm->addService(String16(SensorService::getServiceName()), mService,
false /* allowIsolated */, IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL);
}
}
Vector<Sensor> SensorService::getSensorList(const String16& opPackageName) {
char value[PROPERTY_VALUE_MAX];
property_get("debug.sensors", value, "0");
const Vector<Sensor>& initialSensorList = (atoi(value)) ?
mSensors.getUserDebugSensors() : mSensors.getUserSensors();
Vector<Sensor> accessibleSensorList;
bool isCapped = isRateCappedBasedOnPermission(opPackageName);
for (size_t i = 0; i < initialSensorList.size(); i++) {
Sensor sensor = initialSensorList[i];
if (isCapped && isSensorInCappedSet(sensor.getType())) {
sensor.capMinDelayMicros(SENSOR_SERVICE_CAPPED_SAMPLING_PERIOD_NS / 1000);
sensor.capHighestDirectReportRateLevel(SENSOR_SERVICE_CAPPED_SAMPLING_RATE_LEVEL);
}
accessibleSensorList.add(sensor);
}
makeUuidsIntoIdsForSensorList(accessibleSensorList);
return accessibleSensorList;
}
SensorService服務(wù) 通過(guò)
frameworks/native/services/sensorservice/SensorService.cpp
獲取SensorDevice& dev(SensorDevice::getInstance()); ssize_t count = dev.getSensorList(&list);
SensorDevice.cpp
連接HAL
層,如connectHidlServiceV2_1()
SensorDevice::HalConnectionStatus SensorDevice::connectHidlServiceV2_1() { HalConnectionStatus connectionStatus = HalConnectionStatus::UNKNOWN; sp<V2_1::ISensors> sensors = V2_1::ISensors::getService(); if (sensors == nullptr) { connectionStatus = HalConnectionStatus::DOES_NOT_EXIST; } else { mSensors = new ISensorsWrapperV2_1(sensors); connectionStatus = initializeHidlServiceV2_X(); } return connectionStatus; }
2.3 Android Framework ==> HAL 階段
通過(guò)
HIDL
(Android 接口定義語(yǔ)言 (HIDL))文件hidl-gen 編譯器
自動(dòng)生成,如繼承實(shí)現(xiàn)#include <android/hardware/sensors/2.1/ISensors.h>
了解實(shí)例參考 HAL服務(wù)整編錯(cuò)誤處理
2.3.1 舊版 HAL
hardware/libhardware/include/hardware/sensors.h
hardware/libhardware/modules/sensors/dynamic_sensor/sensors.cpp
舊版 HAL:HAL 可定義一個(gè)標(biāo)準(zhǔn)接口以供硬件供應(yīng)商實(shí)現(xiàn),這可讓 Android 忽略較低級(jí)別的驅(qū)動(dòng)程序?qū)崿F(xiàn)。借助 HAL,您可以順利實(shí)現(xiàn)相關(guān)功能,而不會(huì)影響或更改更高級(jí)別的系統(tǒng)。本頁(yè)面介紹了自 Android 8.0 開(kāi)始已不再支持的舊版架構(gòu)。對(duì)于 Android 8.0 及更高版本,請(qǐng)參閱 HAL 概覽。
HAL 模塊
代表打包的 HAL 實(shí)現(xiàn),這種實(shí)現(xiàn)存儲(chǔ)為共享庫(kù) (.so file)。hardware/libhardware/include/hardware/hardware.h
頭文件可定義一個(gè)代表模塊的結(jié)構(gòu)體 (hw_module_t
),其中包含模塊的版本、名稱和作者等元數(shù)據(jù)。Android 會(huì)根據(jù)這些元數(shù)據(jù)來(lái)找到并正確加載 HAL 模塊。
另外,hw_module_t
結(jié)構(gòu)體還包含指向另一個(gè)結(jié)構(gòu)體hw_module_methods_t
的指針,后面這個(gè)結(jié)構(gòu)體包含指向相應(yīng)模塊的open 函數(shù)的指針
。此open 函數(shù)
用于與相關(guān)硬件(此 HAL 是其抽象形式)建立通信。每個(gè)硬件專用 HAL 通常都會(huì)使用該特定硬件的附加信息來(lái)擴(kuò)展通用的hw_module_t
結(jié)構(gòu)體。
實(shí)現(xiàn) HAL 并創(chuàng)建模塊結(jié)構(gòu)體時(shí),您必須將其命名為HAL_MODULE_INFO_SYM
。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-695745.htmlstruct sensors_module_t HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .version_major = 1, .version_minor = 0, .id = SENSORS_HARDWARE_MODULE_ID, .name = "Google Dynamic Sensor Manager", .author = "Google", .methods = &sensors_module_methods, .dso = NULL, .reserved = {0}, }, .get_sensors_list = get_sensors_list, .set_operation_mode = set_operation_mode, };
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695745.html
到了這里,關(guān)于Android 應(yīng)用層 到 HAL 層的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!