车载 Android之 核心服务 - CarPropertyService 的VehicleHAL
前言:
本文是车载Android之核心服务-CarPropertyService的第二篇,了解一下CarPropertyService的VehicleHAL, 第一篇在车载 Android之 核心服务 - CarPropertyService 解析-CSDN博客,有兴趣的 朋友可以去看下。
本节介绍 AndroidAutomotiveOS中对于 VehicleHAL,即车辆硬件抽象层的定义。
前文中多次提到了 VehicleHAL,当提起 VehicleHAL的时候,它可能包含以下含义。
(1)由 AndroidAutomotiveOS定义的硬件抽象层接口,包括车辆属性和方法;
(2)由制造商根据硬件抽象层定义所实现的服务进程;
(3)在 CarService中,由Java实现的 VehicleHal辅助类。
而在本节中,VehicleHAL主要指代的是第一种含义。而制造商提供的 VehicleHal服务进程是业务逻辑主要的实现者,非常重要,但只要满足了硬件抽象层所定义的方法和 行为,各制造商的具体实现可能很不一样,没有统一的范式,因此在本节中不过多展开分析。
VehicleHAL是连通 CarService与制造商实现的车辆控制服务进程的桥梁,其中包括 种类繁多的车辆属性。那么,各种各样的车辆属性是如何被定义的? 有什么规则可循? 要 找到这些 问 题 的 答 案,就 需 要 更 深 入 地 了 解 VehicleHAL。本 节 通 过 源 码 进 一 步 分 析 VehicleHAL。
说到 VehicleHAL,就 需 要 先 简 单 解 释 HAL 层 的 概 念。HAL 层 即 硬 件 抽 象 层 (HardwareAbstractionLayer)的缩写。按照谷歌官方的说法①,HAL 可定义一个标准接 口以供硬件供应商实现,这可让 Android忽略较低级别的驱动程序实现。
根据上面的定义,就能知道 VehicleHAL 是车辆硬件抽象层。它的作用是定义了标准 的接口,让 CarService可以忽略各个汽车制造商的具体实现。换句话说,CarService调用 VehicleHAL定义的接口,而制造商们负责实现这些接口。
下面来看 VehicleHAL的具体内容。
VehicleHAL 的源码位于 hardware/interfaces/automotive/vehicle/2.0/路径下(截至 本书完成时,最新的 VehicleHAL版本为2.0)。主要的文件只有三个:
- IVehicle.hal。
- IVehicleCallback.hal。
- types.hal。
这三个文件的定义方式、语法都遵循了 Android8.0中提出的 HIDL的定义规范②,这 里不做展开,有兴趣的读者可以阅读谷歌官网上的相关资料。
其中,IVehicle.hal、IVehicleCallback.hal的定义都很简单,这两个文件中定义的是具 体的类和方法。例如,在IVehicle中定义了获取属性值的 get方法、订阅属性的subscribe 方法;IVehicleCallback中定义了属性变化时的回调方法onPropertyEvent,这些方法在之 前介 绍 CarPropertyService 的 内 容 时 有 所 提 及。 方 法 并 不 多,是 因 为 CarService 与 VehicleHAL的主要实现是基于“属性”的,因此用于定义具体数据结构和属性值的types. hal就显得格外重要了。
1.车辆属性
车辆相关属性值的定义都在types.hal文件中,具体来看types.hal中对各个属性的定 义格式。以 PERF_VEHICLE_SPEED属性为例,它代表了车速信号,具体定义如下:

其中,VehiclePropertyGroup、VehiclePropertyType、VehicleArea这几个枚举类型的定 义同样在该文件中可以找到。这里的 VehiclePropertyGroup:SYSTEM 等于0x10000000,VehiclePropertyType:FLOAT 等于0x00600000,VehicleArea:GLOBAL等于0x01000000。因 此该属性的值就是0x11600207。如果查看 CarSensorManager中车速属性的定义,会发现 该值和 CarSensorManager中的 SENSOR_TYPE_CAR_SPEED 属性的值一模一样,这就 是 CarSensorManager中的车速属性值的原始定义。
VehicleHAL定义了标准的属性名称和值(为了保持版本的兼容性,这些属性值的定义 基本不会发生变化)。制造商在实现汽车服务的时候会通过定义好的属性值区分具体的功 能,同时 CarService中也是通过这些属性来控制具体功能的。
仔细观察属性值的定义可以发现各个属性 的定义并不是随意为之的,而是有它的规则。 每个属性都是通过不同的掩码组合而来,因此 每个 属 性 的 不 同 位 有 各 自 的 含 义。 还 是 以 PERF_VEHICLE_SPEED 属 性 为 例,具 体 情 况如图5-3所示。

这样通过属性的值,使用者就能知道属性 的组别、区域和类型了。其他的属性需要遵循 相同 的 规 则。CarPropertyManager中 涉 及 的 属性虽 然 众 多,但 都 是 根 据 这 样 的 规 则 来 定 义的。
下面对不同位的枚举类型做进一步分析。 VehiclePropertyGroup主要用于区分该属性是 AOSP 定义的还是制造商自定义的, SYSTEM 意味着该值是 AndroidAutomotiveOS的标准定义,任何使用 AndroidAutomotive OS的制造商都需要遵循一样的定义值;而 VENDOR 意味着是制造商自定义的车辆属性, 这些属性对应的功能应该不存在于当前标准的 VehicleHAL 属性列表中,如 VehicleHAL 中已有定义的功能属性,则不应该再重复定义。VehiclePropertyGroup的具体定义如下:

而 VehiclePropertyType则定义了该属性的类型,目前 VehiclePropertyType主要支持 的是一些基本类型,如整型、浮点型、字符串型等,虽然在定义中有 MIXED 这样的复合类型 定义,但是在 CarPropertyService中并不支持复合类型,其主要原因是为了确保数据的通用 性,CarPropertyService本身都是由不同属性、信号所驱动的,单个属性或者说信号的含义 是单一的,这样的好处是维持了不同属性间的颗粒度大致相同。当然,有时候就需要制造商 在增加定义时做比较细的划分了。除此之外,也可以考虑使用字节数组的方式传递一些复 杂类型,并进行序列化和反序列化。VehiclePropertyType的具体定义如下:

VehicleArea则定义了属性所对应的区域值,如车窗、座椅等。用以明确该属性在车辆 上具体的物理位置,具体定义如下:

以上就是车辆属性的具体定义方式,AndroidAutomotiveOS对于车辆硬件抽象层的 定义还是非常简练的。主要体现在:在接口方法上只定义了几个方法,而不同功能是通过 属性ID来进行区分的。这样就可以避免重复定义很多作用类似的set/get接口。当然,定 义虽简单,但是实现起来可就未必了,需要支持如此多的属性。那么就需要汽车制造商在硬 件抽象层好好实现相关的功能了。
2.自定义属性
在之前介绍 CarVendorExtensionManager时提到制造商可根据需要自定义特有的属 性。这部分内容就通过具体的例子说明该如何增加自定义属性。通过前面的介绍,相信读 者已经了解了车辆属性定义的具体规则。自定义属性并不复杂,只需按照规则增加新的属 性就可以了。
首先,根据 HIDL定义的规范,在自定义属性前需要创建新的types.hal文件。假设现 有一款支持“车辆隐身”功能的车型,该功能支持打开和关闭,打开时车就会隐身。这是某品 牌特有的功能,在标准的车辆属性中是没有现成的属性可以使用的,但开发者又期望可以通 65 第 5 章 CarPropertyService———车辆属性服务 过 CarAPI对该功能进行控制。制造商可以通过自定义属性实现这一需求,该属性可能的 定义如下:

由于 是 拓 展 属 性,在 声 明 了 新 定 义 的 属 性 枚 举 名 称 及 包 名 (此 处 取 名 为 vendor. hardware.vehiclevendorextension@1.0)的同时,可以在继承原来标准 VehicleProperty列 表的基础上进行,因此加上android.hardware.automotive.vehicle@2.0::VehicleProperty。 这里有几点是需要注意的。
(1)低四位用以区分不同属性,可以从1开始,随着属性的新增顺序增加。
(2)由于是制造商自定义的属性,因此类别必须是 VehiclePropertyGroup:VENDOR, 用以区别于 AOSP中的属性(VehiclePropertyGroup:SYSTEM)。
(3)VehiclePropertyType代表属性值的类型,包括string、boolean、int32等,可根据实 际属性的类型进行自定义。
(4)VehicleArea代表区域类型,包含 global(全局)、window(车窗)、mirror(反光镜)、 seat(座椅)、door(门)、wheel(车轮)。除了 global,其他区域有更加细分 的 区 域 定 义,如 VehicleAreaWindow、VehicleAreaMirror等。但在定义属性时,只需指定至 VehicleArea就 可以了。
3.VehicleHAL服务进程的实现
到此为止,读者已经了解了 AndroidAutomotiveOS中 VehicleHAL 的主要定义了。 尽管还有很多在types.hal中定义的数据类型没有被提及,但相信读者已经对最主要的车 辆属性及硬件抽象接口是如何定义的有了一个大致的了解。其他在 VehicleHAL中定义的 属性,如输入事件、电源状态等,在后文中还会进一步介绍。
有了车辆 硬 件 抽 象 层 的 定 义,那 么 对 于 制 造 商 而 言 最 重 要 的 工 作 就 是 实 现 一 个 VehicleHAL的服务,为 CarService提供支持。
在这一部分的实现上,各个制造商的实现各有不同。Android在 AOSP的源码中提供 了默 认 的 参 考 实 现。位 于 hardware/interfaces/automotive/vehicle/2.0/default路 径 下。 有兴趣的读者参考其实现。尽管其中并不包含与车辆总线交互这样实际的业务逻辑,但是默认实现中对于 VehicleProperty队列的管理、消息订阅的管理上都提供了一些值得参考的 实践。
制造商该如何具体实现 VehicleHal服务的具体细节在此就不再展开了,笔者在这里也 是抛砖引玉,希望有兴趣或从事相关开发工作的读者可以继续深入学习,结合制造商自身的 软件架构特点实现一个高性能且稳定的汽车服务。
相关文章:
车载 Android之 核心服务 - CarPropertyService 的VehicleHAL
前言: 本文是车载Android之核心服务-CarPropertyService的第二篇,了解一下CarPropertyService的VehicleHAL, 第一篇在车载 Android之 核心服务 - CarPropertyService 解析-CSDN博客,有兴趣的 朋友可以去看下。 本节介绍 AndroidAutomotiveOS中对于 Veh…...
年底了,准备跳槽的可以看看...
前两天跟朋友感慨,今年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经1月了,具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说,绝对要从现在开始做准备了。这时候,很多高薪技术岗、管理岗的缺口和市场需求也出…...
Bagging算法_随机森林Random_Forest
Bagging B a g g i n g Bagging Bagging是并行式集成学习方法最著名的代表,这个名字是由 B o o t s t r a p A G G r e g a t I N G Bootstrap AGGregatING BootstrapAGGregatING而来,顾名思义,该算法由 B o o s t s t r a p Booststrap Boos…...
物理与网络安全
物流环境安全 场地选择考虑抗震、承重、防火、防水、供电、空气调节、电磁防护、雷击及静电 场地因素: 自然灾害,社会因素(加油站、化工厂),配套条件(消防,交通,电力,…...
torch.meshgrid和np.meshgrid的区别
numpy中meshgrid: 把数组a当作一行,再根据数组b的长度扩充行。 把数组b当作一列,再根据数组a的长度扩充列。 torch中meshgrid: 把数组a当作一列,再根据数组b的长度扩充列。 把数组b当作一行,再根据数组a的…...
【PostgreSQL】约束-唯一约束
【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 唯一约束 唯一约束是数据库中的一种约束,用于确保某个列或字段的值在该列或字段中是唯一的。唯一约束可用于确保数据库表中的某个列中的值是唯一的,也可用于确保多个列的组合值是唯一的。 在创建表…...
学习使用js/jquery获取指定class名称的三种方式
学习使用js/jquery获取指定class名称的三种方式 简介一、获取元素的class名称1、通过原生JS获取元素的class名称2、通过Jquery获取元素的class名称 二、应用1、样式修改2、动画效果实现 简介 在开发网页时,我们经常需要通过JS获取元素的class名称进行一些操作&…...
latex数学公式
写于:2024年1月5日 晚 修改: 摘要:数学公式根据其位置可以分为行内公式和行间公式。行内公式更加紧凑,而行间公式富于变化,可以为其编号、引用、换行等操作。本文对数学公式的 LaTex 做简单记录和整理。 行内公式 行内…...
frp配置内网穿透访问家里的nas
frp配置内网穿透访问家里的nas 需求 家里局域网内有台nas,在去公司的路上想访问它 其内网地址为: http://192.168.50.8:6002 工具 1.frp版本v0.53.2 下载地址: https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_li…...
C语言-蓝桥杯2023年第十四届省赛真题-砍树
题目描述 给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对 (a1, b1), (a2, b2), . . . , (am, bm),其中 ai 互不相同,bi 互不相同,ai ≠ bj(1 ≤ i, j ≤ m)。 小明想知道是否能够选择一条树上的边砍断,使得对于每个 (a…...
python识别验证码+灰度图片base64转换图片
一、为后面识别验证码准备 1、base64转换为图片,保存本地、并且置灰 上文中的base64,后面的就是包含Base64编码的PNG图像的字符串复制下来 import base64 from PIL import Image import io# 这里是你的Base64编码的字符串 base64_data "iVBORw0KGgoAAAANSUhE…...
TF-IDF(Term Frequency-Inverse Document Frequency)算法 简介
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的常用算法。它用于评估一个词对于一个文档集合中某个文档的重要性。 这个算法的基本思想是:如果一个词在一个文档中频繁出现,并且在整个文档集合…...
企业怎么打造私域转化闭环?
一、私域矩阵构建 1、公众号 (1)流量来源:微信公众号既是私域流量的起点,亦为其源源不断的提供流量支持; (2)内容展示:公众号作为内容发布的主要渠道,可以通过公众号传…...
基于等保合规和滑动标尺模型的云安全建设方法
文章目录 前言一、云计算平台面临的安全挑战(一)新兴风险和传统风险的冲击(二) 云计算安全日益严峻,面临更大的安全挑战(三)提升对云计算平台的全面系统性安全建设的认知二、在云计算安全建设上的误区(一)缺乏整体视角构建云上安全,安全及运营存在割裂(二) 缺乏云内…...
MySQL数据库期末知识点总结(复习版)
一、数据库基本知识 数据库中的数据有什么特点 1、数据是按某种结构组织的 2、数据有整体性、共享性和较高的独立性 数据管理技术经历了哪三个阶段 1、手工管理 2、文件管理 3、数据库管理 数据库管理系统的主要功能有哪些 数据库管理系统的主要功能包括数据定义、数据…...
流行的Jmeter+Ant+Jenkins接口自动化测试框架在网络上走红
大致思路:Jmeter可以做接口测试,也能做压力测试,而且是开源软件;Ant是基于Java的构建工具,完成脚本执行并收集结果生成报告,可以跨平台,Jenkins是持续集成工具。将这三者结合起来可以搭建一套We…...
MySQL 数据页损坏处理思路
文章目录 前言1. 备份恢复2. 强制 InnoDB 恢复2.1 损坏数据页2.2 观察错误日志2.3 设置参数2.4 定位表信息2.5 分析处理2.6 恢复数据 总结 前言 研发自己搭建了一套 MySQL 没有设置双一参数,机房异常断电,导致数据页出现损坏,本篇文章介绍此…...
面试 Vue 框架八股文十问十答第二期
面试 Vue 框架八股文十问十答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)常见的事件修饰符及其作…...
【Python学习】2024PyCharm插件推荐
目录 【Python学习】2024PyCharm插件推荐 1. Key Promoter X2.Rainbow CSV3.Markdown4.Rainbow Brackets5.Indent Rainbow6.Regex Tester7.Regex Tester8.Background Image Plus9.Material Theme UI10. Chinese 汉化插件参考 文章所属专区 Python学习 1. Key Promoter X 方便…...
剑指offer题解合集——Week2day6
文章目录 剑指offerWeek2周六:表示数值的字符串AC代码思路: 周六:调整数组顺序使奇数位于偶数前面AC代码思路: 剑指offerWeek2 周六:表示数值的字符串 题目链接:表示数值的字符串 请实现一个函数用来判…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
