我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 应用层 到 HAL 层

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 应用层 到 HAL 层

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

Android 应用层 到 HAL 层

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Ubuntu中为Android简单介绍硬件抽象层(HAL)

Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。 对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Ker
2022-06-06

Android应用链接 与深层链接

一个Activity除了可以通过startActivity的方法启动之外,还可以通过scheme协议来启动 说明 一个activity通过scheme协议 方法拉起,也就是深层链接。 当点击的链接或程序化请求调用网页 URI intent
2022-06-06

Android百度地图应用之图层展示

一、简介 1、地图类型 百度地图Android SDK 3.7.1提供了两种类型的地图资源(普通矢量地图和卫星图),开发者可以利用BaiduMap中的MapType属性(C#)来设置地图类型。C#核心代码如下: mMapView = F
2022-06-06

【网络原理】应用层协议 与 传输层协议

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录 🏉一. 应用层协议⚾️二. 传输层协议👒1. UDP 协议
2023-08-18

Ubuntu中为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

在Ubuntu Android简单介绍硬件抽象层(HAL)一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法。简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中。接着Ub
2022-06-06

MVP实现Android应用层开发原理及过程

背景之所以要谈这个话题是因为你在开发App时可能会发现,Activity担负的责任非常之重,如果站在MVC框架角度看自己开发的App,一般xml布局文件科Activity的setContentView等充当了View角色,Activity其
2022-06-06

应用层网关(ALG)简介

  在应用层协议中,有很多协议都包含多通道的信息,比如多媒体协议(H.323、SIP等)、FTP、SQLNET等。这种多通道的应用需要首先在控制通道中对后续数据通道的地址和端口进行协商,然后根据协商结果创建多个数据通道连接。在NAT的实际应用过程中,NAT仅对网络层报文的报文头进行IP地址的识别和转换。对于应用层协议协
应用层网关(ALG)简介
2024-04-18

怎么理解.NET三层架构应用中的十层框架

这篇文章给大家介绍怎么理解.NET三层架构应用中的十层框架,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。凡是接触.net开发的,***要理解的就是三层架构的重要思想。关于三层架构的概述 我就不多说了,相信大家都早已明白
2023-06-17

Python层次聚类怎么应用

本文小编为大家详细介绍“Python层次聚类怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python层次聚类怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。层次聚类和K-means有什么不同?K
2023-07-06

应用层的功能有哪些

这篇文章将为大家详细讲解有关应用层的功能有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。OSI应用层是开放系统互连(OSI)七层网络协议模型及TCP/IP协议中的第七层,也是唯一一个与终
2023-06-14

Android开发如何实现应用层面屏蔽状态栏

这篇文章主要为大家展示了“Android开发如何实现应用层面屏蔽状态栏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发如何实现应用层面屏蔽状态栏”这篇文章吧。具体如下:一、由于S
2023-05-30

NativeActivity通过jni调用java层的Android API

1. 继承Nativity,打通native和java层public class MyNativeActivity extends NativeActivity {@Overridepublic void onCreate(Bundle s
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录