Android 8.0学习 (2)---Android HAL
硬件抽象层 (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相关推荐
- Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决
Android 8.0 WebView 拍照.简易预览.二维码扫描 各种问题解决 项目用到了WebView包装HTML5做成app使用,其中有页面用到了二维码和拍照上传功能.本人从未做过android ...
- Android 8.0学习(5)---模块化内核
模块化内核要求 在 Android 8.0 中,设备内核分为系统芯片 (SoC).设备和板专属组件.基于这种分层结构的内核和 Android 使得原始设计制造商 (ODM) 和原始设备制造商 (OEM ...
- Android 8.0学习(32)---Android 8.0源码目录结构详解
Android 8.0源码目录结构详解 android的移植按如下流程: (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. (2)正确挂载文件系统 ...
- android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探
昨天(2011-11-15)发布了Android4.0的源码,今天download下来,开始挺进4.0时代.简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述. 一.代码模块位置 1 ...
- android AVB2.0学习总结
看了一阵子android AVB2.0相关的内容,准备梳理一下相关知识点.平时一般都用word整理,现在想想感觉还是用CSDN来整理看着直观些,方便自己查看的同时,也把自己学到的知识与其他人分享,共勉 ...
- Android 8.0学习(25)---系统的应用图标适配
Android 8.0系统的应用图标适配 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了.三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接 ...
- Android 8.0 学习(21)---Oreo的画中画模式学习
Android 8.0 Oreo的画中画模式学习 本文主要是对谷歌开发者官方微信公众号发布的Android 8.0 Oreo 画中画模式一文的学习记录. 画中画模式Picture-in-pictur ...
- Android 8.0 学习(23)---recovery 流程分析
Android 8.0 recovery 流程分析 这里主要分析non A/B模式下的recovery流程 A/B模式下的recovery在boot中 后续会不断补充,如果有疏漏或者错误的地方,请 ...
- Android 8.0 学习(12)---init.rc语法及解析过程总结
Android 8.0 init.rc语法及解析过程总结 Android O高通默认使用QMMI取代了fastmmi,但是由于QMMI是一个APK,属于Android应用层面,所以必须等到 ...
最新文章
- LeetCode刷题记录14——257. Binary Tree Paths(easy)
- 科大讯飞2位董事同日辞职,联合创始人胡郁发力造芯
- dnf超时空漩涡副本路线流程图_DNF超时空漩涡真的不难,掌握这些技巧和打法,自己开团当团长!...
- 使用SqlBulkCopy数据导入和复制
- python3 format函数_Python学习教程:Python3之字符串格式化format函数详解(上)
- Nmap参数--指纹识别探测
- 关于域名解析到服务器的问题
- python bottle框架 重定向_Python的web框架bottle静态文件的路径
- 机构借贷平台 Maple 将上线以太坊主网并开启流动性挖矿
- Windows Server 2012 DHCP故障转移
- [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程
- web.xml 配置
- 三菱plc pwm指令_西门子PLC常见的20个问题,你碰到过几个?
- 基于OpenCascade 与COIN3D的机械臂仿真测试
- Ubuntu中运行unity
- java mocked,JMockit 中被 Mocked 的对象属性及方法的默认值
- [1061]青蛙的约会
- *陶瓷电容、铝电解电容、钽电容、固体电容的讲解
- Admin-UI分布式微服务监控中心
- 拓扑学+计算机,拓扑学是什么
热门文章
- java excel相同的合并_java servlet导出EXCEL并合并EXCEL相同值的单元格(Apache POI技术)...
- mysql索引 实验_“索引”实验小例
- 【JAVA SE】第十五章 ArrayList、LinkedList、HashMap和HashSet
- MySQL中distinct和group by性能比较
- BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
- Tomcat是如何将请求一步步传递到我们编写的HttpServlet类中的
- [opencv] 图像线性混合
- artdialog4.1.7 中父页面给子页面传值
- iOS开发UI篇—实现一个私人通讯录小应用(一)
- php_imagick