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 接口定义语言 相关Blog client端 / server端
AIDL Android 接口定义语言 (AIDL) 客户端获取proxy:asInterface(android.os.IBinder obj)
服务端实现Stub:class Stub extends android.os.Binder
(C++中客户端对应Bp端,服务端对应Bn端)
HIDL Android 接口定义语言 (HIDL) hal 安卓,Android,android,HAL,Binder,JNI

hal 安卓,Android,android,HAL,Binder,JNI

1.2 参考

1》Binder IPC通信机制

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

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

3》AIDL、HIDL接口定义语言

Android 接口定义语言 相关Blog
AIDL Android 接口定义语言 (AIDL)
HIDL Android 接口定义语言 (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);

hal 安卓,Android,android,HAL,Binder,JNI

ssize_t count = mgr->getSensorList(&sensorList);

hal 安卓,Android,android,HAL,Binder,JNI

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 /* 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服务 通过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 阶段

通过HIDL (Android 接口定义语言 (HIDL))文件hidl-gen 编译器自动生成,如继承实现#include <android/hardware/sensors/2.1/ISensors.h>
了解实例参考 HAL服务整编错误处理

hal 安卓,Android,android,HAL,Binder,JNIhal 安卓,Android,android,HAL,Binder,JNI

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

hal 安卓,Android,android,HAL,Binder,JNI文章来源地址https://www.toymoban.com/news/detail-695745.html

到了这里,关于Android 应用层 到 HAL 层的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓应用层抓包通杀脚本r0capture

    安卓应用层抓包通杀脚本r0capture r0ysue: https://github.com/r0ysue/r0capture Spawn 模式: python r0capture.py -U -f 包名 仅限安卓平台,测试安卓7、8、9、10、11 可用 ; 无视所有证书校验或绑定,不用考虑任何证书的事情; 通杀TCP/IP四层模型中的应用层中的全部协议; 通杀协议包括:Http,

    2024年02月12日
    浏览(32)
  • Android相机-HAL-Rockchip-hal3

    对于Android相机的 HAL层而言 对上实现一套Framework的API接口,对下通过V4L2框架实现与kernel的交互。 不同的平台会有不同的实现方案。主要是对Android HAL3的接口的实现。看看rockchip是怎么支持hal3的? hardware/rockchip/camera/ hardware/rockchip/camera_engine_rkisp/   3A控制则是通过control loop接

    2024年02月11日
    浏览(26)
  • Android10.0 hal层添加自定义hal模块功能实现

    在10.0的系统rom定制化开发中,在 对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些 功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考 HAL是硬件抽象层,它向下屏蔽了硬件的实现细节,向上提供了抽象接口, HAL是底层硬件和上层框架直

    2024年02月15日
    浏览(30)
  • Android HAL层浅析

    1)、HAL层是上层应用对底层硬件操作屏蔽的一个软件层次,就是上层应用不必关心底层硬件具体是如何工作的,只需要调用底层提供的统一接口即可。HAL层对接具体的硬件bsp接口,比如视频接口、收音机接口、网络接口、spi接口等。 HAL层就是为了把操作系统和硬件解耦。 Li

    2023年04月18日
    浏览(28)
  • Android HAL深入探索(5): 调试HAL报错与解决方案

    在我们学习Android HAL开发时,可能会遇到一些编译或运行时的错误,这些错误可能会影响探索脚本。为了有效地定位和解决这些错误,需要了解Android HAL的架构、工具和方法。本文将介绍一些我自己在学习Android HAL的调试技巧和常见错误的解决方案,希望能帮助到大家。 网上其

    2024年01月24日
    浏览(24)
  • Android Audio HAL 服务

    在 Android 系统中,Audio HAL 服务用于管理对音频硬件的访问,AudioFlinger 通过 Audio HAL 服务访问音频硬件。这里以 Android Automotive (AAOS) 版模拟器为例,来看 Audio HAL 服务的设计、实现和访问,代码分析基于 android-12.1.0_r27 进行。 AAOS 版模拟器的 Audio HAL 服务的实现位于 device/generi

    2024年02月15日
    浏览(29)
  • Android相机-HAL子系统

    应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求, 一个请求对应一组结果 一次可发起多个请求,并且提交请求是非阻塞的,始终按照接收的顺序以队列的形式先进先出地进行顺序处理 一个请求包含了拍摄和拍照配置的所有信息,以及处理这些的

    2024年02月11日
    浏览(28)
  • Android图形-Hardware Composer HAL

    目录 一、引言 二、概览 三、实现HWC 3.1 为什么是HWC? 3.2 HWC的支持需求 3.3 HWC的实现思路 3.4 HWC的基元 3.5 HIDL接口 3.6 函数指针 3.7 图层和屏幕句柄 3.8 屏幕合成操作 3.9 多个屏幕 3.10 虚拟屏幕合成 3.10.1 模式 3.10.2 输出格式 3.11 同步fence 3.12 热插拔处理 3.12.1 概念理解 3.12.2 更新

    2024年02月09日
    浏览(29)
  • Android HAL - hidl-gen

            hidl-gen 编译器会将 .hal 文件编译成一组 .h 和 .cpp 文件,这些 自动生成的文件用于编译客户端 / 服务端实现链接到的共享库,同 时也可以生成 Android.bp 编译文件。         HIDL 软件包中自动生成的文件会关联到与该软件包同名的单个 共享库(例如 android.hardwa

    2024年02月09日
    浏览(21)
  • 【计算机网络概述】第二章:应用层:2.1 应用层原理

    客户端/服务器模式 peer to peer 模式(对等模式)        在第一章的内容中,我们学习了计算机网络的大体轮廓,因为在计算机网络中,我们需要记住非常多的专有名词,所以在第一章中,我们需要进行非常多的记忆。第一章还是非常重要的。        比如,我们所使用

    2024年01月18日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包