文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android 应用层 到 HAL 层

2023-09-17 10:01

关注

Android 应用层 到 HAL 层

1、相关知识点

1.1 概要

如下 AOSP软件堆栈架构图 主要跨两个阶段 Android Apps ==> Android Framework ==> HAL,这种IPC跨进程通信Android中必须要了解的相关知识点:1》Binder IPC通信机制;2》JNI调用;3》AIDL、HIDL接口定义语言

1》Binder IPC通信机制

IPC 域说明
/dev/binder框架/应用进程之间的 IPC,使用 AIDL 接口
/dev/hwbinder框架/供应商进程之间的 IPC,使用 HIDL 接口
供应商进程之间的 IPC,使用 HIDL 接口
/dev/vndbinder供应商/供应商进程之间的 IPC,使用 AIDL 接口

2》JNI调用
就是Java与C/C++互相调用,这不是Android系统所独有的,而是Java所有。Android表现:frameworks/baseframeworks/Native,以及其他SO库调用。

3》AIDL、HIDL接口定义语言:是Android中binder机制的具体实现,相应的binder域/dev/binder/dev/hwbinder/dev/vndbinder;Android规范的接口定义语言,按照规范aidl/hidl文件自动生成相应代码文件。

Android 接口定义语言相关Blogclient端 / server端
AIDLAndroid 接口定义语言 (AIDL)客户端获取proxy:asInterface(android.os.IBinder obj)
服务端实现Stub:class Stub extends android.os.Binder
(C++中客户端对应Bp端,服务端对应Bn端)
HIDLAndroid 接口定义语言 (HIDL)在这里插入图片描述

AOSP软件堆栈架构图

1.2 参考

1》Binder IPC通信机制

序号文章名概述
0为什么 Android 要采用 Binder 作为 IPC 机制?【Android,在争议中逃离 Linux 内核的 GPL 约束】
0使用 Binder IPC多个 Binder 域:/dev/binder/dev/hwbinder/dev/vndbinder
1Binder系列1-Binder Driver/dev/binder运行在Linux kernel
2Binder系列2-ServiceManagerSM启动,添加/获取Service
3Binder系列3-framework层Zygote启动时AndroidRuntime::startReg中register_jni_procs(),JNI调用到Native
4Binder 域关注/dev/vndbinder与/dev/binder共用一套libbinder,defaultServiceManager()获取前需要切换
5Binder相关问题

2》JNI调用
Android JNI原理Java本地调用(JNI)

3》AIDL、HIDL接口定义语言

Android 接口定义语言相关Blog
AIDLAndroid 接口定义语言 (AIDL)
HIDLAndroid 接口定义语言 (HIDL)

Android 8.0 重新设计了 Android 操作系统框架(在一个名为“Treble”的项目中),以便让制造商能够以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。在这种新架构中,HAL 接口定义语言(HIDL,发音为“hide-l”)指定了 HAL 和其用户之间的接口,让用户无需重新构建 HAL,就能替换 Android 框架。在 Android 10 中,HIDL 功能已整合到 AIDL 中。此后,HIDL 就被废弃了,并且仅供尚未转换为 AIDL 的子系统使用。

在 Android 11 中,还支持使用 AIDL 编写的 HAL。所有 AIDL HAL 都是绑定的。
- 绑定的 HAL 。 HAL 以 HAL 接口定义语言 (HIDL) 或 Android 接口定义语言 (AIDL) 表示。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和遗留 HAL。在 Binderized HAL 中,Android 框架和 HAL 使用 Binder 进程间通信 (IPC) 调用相互通信。所有搭载 Android 8.0 或更高版本的设备必须仅支持绑定化 HAL。
-直通 HAL 。 HIDL 包装的传统 HAL 或旧版 HAL这些 HAL 包装现有的 HAL,并且可以在绑定和相同进程(直通)模式下为 HAL 提供服务。升级到 Android 8.0 的设备可以使用直通 HAL。

2、拿SensorService举例

2.1 Android Apps ==> Android Framework阶段

Android Apps ==> Android Framework阶段通过Android API调用,就是App编程调用的Android SDK


Activity中调用
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
获取加速度传感器Sensor.TYPE_ACCELEROMETER


更多查看APP获取Sensor对象-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内部阶段

2.2.1 frameworks/base

Android Framework内部阶段:通过JNI调用Native层,如Android JNI原理Java本地调用(JNI)javac -h ./ xxx.java (javah是1.8及以前版本)生成相应xxxNative.h文件,

SersorManager.java对应相关代码:(在SystemServer启动时System.loadLibrary("android_servers");加载so库
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

通过binder IPC跨进程通信机制defaultServiceManager()获取到对应服务调用。如调用到服务frameworks/native/services/sensorservice

SersorManager.cpp对应相关代码:(SensorService.cpp 继承BinderService、BnSensorServer、Thread,初始化时添加到defaultServiceManager()中,更多查看SensorService启动-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)手动撸代码,不是自动生成,所以这里关注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 , 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服务 通过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 阶段

通过HIDLAndroid 接口定义语言 (HIDL))文件hidl-gen 编译器自动生成,如继承实现#include

在这里插入图片描述在这里插入图片描述

2.3.1 旧版 HAL

hardware/libhardware/include/hardware/sensors.h
hardware/libhardware/modules/sensors/dynamic_sensor/sensors.cpp

旧版 HAL:HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。本页面介绍了自 Android 8.0 开始已不再支持的旧版架构。对于 Android 8.0 及更高版本,请参阅 HAL 概览

HAL 模块代表打包的 HAL 实现,这种实现存储为共享库 (.so file)。hardware/libhardware/include/hardware/hardware.h 头文件可定义一个代表模块的结构体 (hw_module_t),其中包含模块的版本、名称和作者等元数据。Android 会根据这些元数据来找到并正确加载 HAL 模块。

另外,hw_module_t 结构体还包含指向另一个结构体 hw_module_methods_t 的指针,后面这个结构体包含指向相应模块的 open 函数的指针。此 open 函数用于与相关硬件(此 HAL 是其抽象形式)建立通信。每个硬件专用 HAL 通常都会使用该特定硬件的附加信息来扩展通用的 hw_module_t 结构体。

实现 HAL 并创建模块结构体时,您必须将其命名为 HAL_MODULE_INFO_SYM

struct 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,};

在这里插入图片描述

来源地址:https://blog.csdn.net/qq_23452385/article/details/131486407

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯