硬件抽象层 (HAL)

HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。HAL 实现会被封装成模块,并由 Android 系统适时地加载。

图 1. HAL 组件

您必须为您的产品所提供的特定硬件实现相应的 HAL(和驱动程序)。HAL 实现通常会内置在共享库模块(.so 文件)中,但 Android 并不要求 HAL 实现与设备驱动程序之间进行标准交互,因此您可以视情况采取适当的做法。不过,要使 Android 系统能够与您的硬件正确互动,您必须遵守各个特定于硬件的 HAL 接口中定义的合同。

为了保证 HAL 具有可预测的结构,每个特定于硬件的 HAL 接口都要具有 hardware/libhardware/include/hardware/hardware.h 中定义的属性。这类接口可让 Android 系统以一致的方式加载 HAL 模块的正确版本。HAL 接口包含两个组件:模块和设备。

HAL 模块

模块表示被封装且存储为共享库 (.so file) 的 HAL 实现。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 中,camera_module_t 结构体会包含一个 hw_module_t 结构体以及其他特定于相机的函数指针:

typedef struct camera_module {
    hw_module_t common;
    int (*get_number_of_cameras)(void);
    int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;

实现 HAL 并创建模块结构体时,您必须将其命名为 HAL_MODULE_INFO_SYM。以下是 Nexus 9 音频 HAL 的示例:

struct audio_module HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
        .hal_api_version = HARDWARE_HAL_API_VERSION,
        .id = AUDIO_HARDWARE_MODULE_ID,
        .name = "NVIDIA Tegra Audio HAL",
        .author = "The Android Open Source Project",
        .methods = &hal_module_methods,
    },
};

HAL 设备

设备是产品硬件的抽象表示。例如,一个音频模块可能包含主音频设备、USB 音频设备或蓝牙 A2DP 音频设备。

设备由 hw_device_t 结构体表示。与模块类似,每类设备都定义了一个通用 hw_device_t 的详细版本,其中包含指向硬件特定功能的函数指针。例如,audio_hw_device_t 结构体类型会包含指向音频设备操作的函数指针:

struct audio_hw_device {
    struct hw_device_t common;

/**
     * used by audio flinger to enumerate what devices are supported by
     * each audio_hw_device implementation.
     *
     * Return value is a bitmask of 1 or more values of audio_devices_t
     */
    uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
  ...
};
typedef struct audio_hw_device audio_hw_device_t;

除了这些标准属性之外,每个特定于硬件的 HAL 接口都可以定义更多的自有功能和要求。有关详情,请参阅 HAL 参考文档以及各 HAL 的单独说明。

编译 HAL 模块

HAL 实现会内置在模块 (.so) 文件中,并由 Android 适时地动态链接。您可以为每个 HAL 实现创建 Android.mk 文件并指向源文件,从而编译模块。一般来说,您的共享库必须以特定格式命名,以方便找到并正确加载。各模块的命名方案略有不同,但它们都遵循以下通用模式:<module_type>.<device_name>

HAL 类型

为了更好地实现模块化,Android 8.0 对 Android 操作系统底层进行了重新架构。作为此变化的一部分,运行 Android 8.0 的设备必须支持绑定式或直通式 HAL:

  • 绑定式 HAL。以 HAL 接口定义语言 (HIDL) 表示的 HAL。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和旧版 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。
  • 直通式 HAL。以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。

HAL 模式要求

设备 直通式 绑定式
搭载 Android 8.0 的设备 直通式 HAL 中列出的 HAL 必须为直通式。 所有其他 HAL 均为绑定式(包括作为供应商扩展程序的 HAL)。
升级到 Android 8.0 的设备 直通式 HAL 中列出的 HAL 必须为直通式。 绑定式 HAL 中列出的 HAL 必须为绑定式。
供应商映像提供的所有其他 HAL 既可以在直通模式下使用,也可以在绑定模式下使用。

绑定式 HAL

Android 要求所有 Android 设备(无论是搭载 Android O 的设备还是升级到 Android O 的设备)上的下列 HAL 均为绑定式:

  • android.hardware.biometrics.fingerprint@2.1。取代 Android 8.0 中已不存在的 fingerprintd
  • android.hardware.configstore@1.0。Android 8.0 中的新 HAL。
  • android.hardware.dumpstate@1.0。此 HAL 提供的原始接口可能无法继续使用,并且已更改。因此,dumpstate_board 必须在指定的设备上重新实现(这是一个可选的 HAL)。
  • android.hardware.graphics.allocator@2.0。在 Android 8.0 中,此 HAL 必须为绑定式,因此无需在可信进程和不可信进程之间分享文件描述符。
  • android.hardware.radio@1.0。取代由存活于自身进程中的 rild 提供的接口。
  • android.hardware.usb@1.0。Android 8.0 中的新 HAL。
  • android.hardware.wifi@1.0。Android 8.0 中的新 HAL,可取代此前加载到 system_server 的旧版 WLAN HAL 库。
  • android.hardware.wifi.supplicant@1.0。在现有 wpa_supplicant 进程之上的 HIDL 接口

注意:Android 提供的以下 HIDL 接口将一律在绑定模式下使用:android.frameworks.*android.system.* 和 android.hidl.*(不包括下文所述的 android.hidl.memory@1.0)。

直通式 HAL

Android 要求所有 Android 设备(无论是搭载 Android O 的设备还是升级到 Android O 的设备)上的下列 HAL 均在直通模式下使用:

  • android.hardware.graphics.mapper@1.0。将内存映射到其所属的进程中。
  • android.hardware.renderscript@1.0。在同一进程中传递项(等同于 openGL)。

上方未列出的所有 HAL 在搭载 Android O 的设备上都必须为绑定式。

Same-Process HAL

Same-Process HAL (SP-HAL) 一律在使用它们的进程中打开,其中包括未以 HIDL 表示的所有 HAL,以及那些非绑定式的 HAL。SP-HAL 集的成员只能由 Google 控制,这一点没有例外。

SP-HAL 包括以下 HAL:

  • openGL
  • Vulkan
  • android.hidl.memory@1.0(由 Android 系统提供,一律为直通式)
  • android.hardware.graphics.mapper@1.0
  • android.hardware.renderscript@1.0

传统 HAL 和旧版 HAL

传统 HAL(在 Android 8.0 中已弃用)是指与具有特定名称及版本号的应用二进制接口 (ABI) 标准相符的接口。大部分 Android 系统接口(相机、音频和传感器等)都采用传统 HAL 形式(已在 hardware/libhardware/include/hardware 下进行定义)。

旧版 HAL(也已在 Android 8.0 中弃用)是指早于传统 HAL 的接口。一些重要的子系统(WLAN、无线接口层和蓝牙)采用的就是旧版 HAL。虽然没有统一或标准化的方式来指明是否为旧版 HAL,但如果 HAL 早于 Android 8.0 而出现,那么这种 HAL 如果不是传统 HAL,就是旧版 HAL。有些旧版 HAL 的一部分包含在 libhardware_legacy 中,而其他部分则分散在整个代码库中。

Android 8.0学习 (2)---Android HAL相关推荐

  1. Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决

    Android 8.0 WebView 拍照.简易预览.二维码扫描 各种问题解决 项目用到了WebView包装HTML5做成app使用,其中有页面用到了二维码和拍照上传功能.本人从未做过android ...

  2. Android 8.0学习(5)---模块化内核

    模块化内核要求 在 Android 8.0 中,设备内核分为系统芯片 (SoC).设备和板专属组件.基于这种分层结构的内核和 Android 使得原始设计制造商 (ODM) 和原始设备制造商 (OEM ...

  3. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  4. android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探

    昨天(2011-11-15)发布了Android4.0的源码,今天download下来,开始挺进4.0时代.简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述. 一.代码模块位置 1 ...

  5. android AVB2.0学习总结

    看了一阵子android AVB2.0相关的内容,准备梳理一下相关知识点.平时一般都用word整理,现在想想感觉还是用CSDN来整理看着直观些,方便自己查看的同时,也把自己学到的知识与其他人分享,共勉 ...

  6. Android 8.0学习(25)---系统的应用图标适配

    Android 8.0系统的应用图标适配 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了.三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接 ...

  7. Android 8.0 学习(21)---Oreo的画中画模式学习

    Android 8.0 Oreo的画中画模式学习 本文主要是对谷歌开发者官方微信公众号发布的Android 8.0 Oreo 画中画模式一文的学习记录.  画中画模式Picture-in-pictur ...

  8. Android 8.0 学习(23)---recovery 流程分析

    Android 8.0 recovery 流程分析 这里主要分析non A/B模式下的recovery流程  A/B模式下的recovery在boot中  后续会不断补充,如果有疏漏或者错误的地方,请 ...

  9. Android 8.0 学习(12)---init.rc语法及解析过程总结

    Android 8.0 init.rc语法及解析过程总结       Android O高通默认使用QMMI取代了fastmmi,但是由于QMMI是一个APK,属于Android应用层面,所以必须等到 ...

最新文章

  1. LeetCode刷题记录14——257. Binary Tree Paths(easy)
  2. 科大讯飞2位董事同日辞职,联合创始人胡郁发力造芯
  3. dnf超时空漩涡副本路线流程图_DNF超时空漩涡真的不难,掌握这些技巧和打法,自己开团当团长!...
  4. 使用SqlBulkCopy数据导入和复制
  5. python3 format函数_Python学习教程:Python3之字符串格式化format函数详解(上)
  6. Nmap参数--指纹识别探测
  7. 关于域名解析到服务器的问题
  8. python bottle框架 重定向_Python的web框架bottle静态文件的路径
  9. 机构借贷平台 Maple 将上线以太坊主网并开启流动性挖矿
  10. Windows Server 2012 DHCP故障转移
  11. [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程
  12. web.xml 配置
  13. 三菱plc pwm指令_西门子PLC常见的20个问题,你碰到过几个?
  14. 基于OpenCascade 与COIN3D的机械臂仿真测试
  15. Ubuntu中运行unity
  16. java mocked,JMockit 中被 Mocked 的对象属性及方法的默认值
  17. [1061]青蛙的约会
  18. *陶瓷电容、铝电解电容、钽电容、固体电容的讲解
  19. Admin-UI分布式微服务监控中心
  20. 拓扑学+计算机,拓扑学是什么

热门文章

  1. java excel相同的合并_java servlet导出EXCEL并合并EXCEL相同值的单元格(Apache POI技术)...
  2. mysql索引 实验_“索引”实验小例
  3. 【JAVA SE】第十五章 ArrayList、LinkedList、HashMap和HashSet
  4. MySQL中distinct和group by性能比较
  5. BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
  6. Tomcat是如何将请求一步步传递到我们编写的HttpServlet类中的
  7. [opencv] 图像线性混合
  8. artdialog4.1.7 中父页面给子页面传值
  9. iOS开发UI篇—实现一个私人通讯录小应用(一)
  10. php_imagick