Wi-Fi HIDL接口梳理

Android Wi-Fi架构概述

熟悉Android Wi-Fi Framework的同学都知道,Android Wi-Fi架构如下图所示:

简单来说Android Wi-Fi架构分三层:

Application层,即应用层,指系统应用或第三方应用
Wi-Fi Service层,属于Android framework层,是aosp中Wi-Fi相关功能的主要代码
Native层,包括wpa_supplicant、hostapd、driver
这篇文章聚焦在Wi-Fi Service层和Native层之间的HIDL接口,梳理下都有哪些HIDL接口以及这些接口的功能。为后续分析WiFi具体功能流程时打下基础。

从上面的架构图可以看到,HIDL接口主要分三类,Vendor HAL、Supplicant HAL和Hostapd HAL:

Vendor HAL: Android专用命令的HAL接口。HIDL 文件位于 hardware/interfaces/wifi/1.x 中
Supplicant HAL: wpa_supplicant的HAL接口。HIDL 文件位于 hardware/interfaces/supplicant/1.x 中
Hostapd HAL: hostapd的HAL接口。HIDL 文件位于 hardware/interfaces/hostapd/1.x 中

HIDL接口简介

分析具体Wi-Fi Service的HIDL接口之前,先简单了解下Android HIDL机制。

HIDL是HAL interface definition language的缩写,用来定义HAL和HAL使用者之间的接口。HIDL可以让通信的两端代码独立编译。HIDL旨在用于进程间通信,进程间通信采用Binder机制。 HIDL在一个接口文件中指定数据结构和方法签名,最终生成一个包。HIDL语法与C类似。

HIDL设计初衷

HIDL设计的目标是可以独立的替换android framework而不用重新编译HAL层。HAL层由vendor厂商编译,放到/vendor分区;framework在其它分区,OTA可以直接替换framework所在的分区,而不用重新编译HAL。

HIDL设计考虑以下方面的平衡:

互操作性:在可以使用各种架构、工具链和构建配置来编译的进程之间创建可互操作的可靠接口。HIDL 接口带有版本编号,发布后无法再进行更改。
效率: HIDL 会尝试尽可能减少复制操作的次数。HIDL 定义的数据以 C++ 标准布局数据结构传递至 C++ 代码,无需解包,可直接使用。此外,HIDL 还提供共享内存接口;由于 RPC 本身有点慢,因此 HIDL 支持两种无需使用 RPC 调用的数据传输方法:共享内存和快速消息队列 (FMQ)。
直观: 通过仅针对 RPC 使用 in 参数,HIDL 避开了内存所有权这一棘手问题。无论是将数据传递到 HIDL 中以进行传输,还是从 HIDL 接收数据,都不会改变数据的所有权。

HIDL语法关键字

generates: 表示将值返回客户端的接口方法。要返回一个非原始值或多个值,会生成同步回调函数。
oneway: 用来修饰HIDL方法,表示这个方法没有返回值并且非阻塞。

Wi-Fi HIDL接口梳理

下面开始梳理WiFi HIDL接口,主要梳理Vendor HAL和Supplicant HAL两部分,Hostapd HAL留到后面分析Soft AP代码时再补充。这里以列表的方式列出接口名和接口描述,为后续分析WiFi代码流程打基

https://www.jiansoft.net/2020/05/14/WiFi_HIDL_interfaces.html

posted @ 2022-07-05 14:28  鲸小鱼-  阅读(930)  评论(0编辑  收藏  举报