车载 Android之 核心服务 - CarPropertyService 的VehicleHAL

AndroidAutomotive模块介绍(四)VehicleHal介绍 本篇文档将对 Andorid Automotive 框架中 VehicleHal 层展开介绍。VehicleHal 即为车辆硬件抽象层的定义。可以理解为 Android Automotive OS 中的硬件抽象层接口,包括车辆属性和方法;各厂商制造商会根据定义的 Hal 接口,实现定制化的模块服务。 阅读详情
AI摘要

本文详细解读了AndroidAutomotiveOS中的VehicleHAL,这是一种硬件抽象层,用于连接CarService与制造商的车辆控制服务。文章介绍了VehicleHAL的定义、车辆属性的规则、自定义属性的添加以及服务进程的实现,强调了制造商在满足接口要求下的灵活性和多样性。

前言:

本文是车载Android之核心服务-CarPropertyService的第二篇,了解一下CarPropertyService的VehicleHAL, 第一篇在车载 Android之 核心服务 - CarPropertyService 解析-优快云博客,有兴趣的 朋友可以去看下。

本节介绍 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 O 前期预研之三:Android Vehicle HAL Android AutomotiveAndroid Automotive 是Android Oreo中的一个新的特色功能,从AOSP的代码上来看,Android O中已经包含有了从Application到Framework 到HAL的整体框架,这一章节,我们简单的过以下Android Vehicle 的框架,以及重点看下 Vehicle HAL的东西。总体结构大约是以下这个样子: 上图的结 阅读详情

相关推荐

Android车载——VehicleHal运行流程(Android 11)

本篇主要讲解VehicleHal的主要运行流程,包括设置属性、获取属性、订阅属性、取消订阅、持续上报属性订阅等。

一切皆是定数的博客 2840

VehicleHal.java - fwk层对应VehicleService

【代码】VehicleHal.java - fwk层对应VehicleService。

许浑的博客 2223

车载 Android 核心服务:深入解析 CarPropertyService 与 VehicleHAL 的通信机制

本文深入解析车载Android系统中CarPropertyService与VehicleHAL的核心通信机制。CarPropertyService作为应用层与硬件层的翻译官,通过统一的属性接口屏蔽硬件差异,而VehicleHAL则负责与车辆硬件直接交互。文章详细介绍了属性订阅、数据流传输和回调机制等关键技术,帮助开发者高效开发车载应用。

bb456的博客 1014

Android Automotive架构与流程:VehicleHAL,CarService

case DYSENSOR_SERVICE: manager = new CarDYSensorManager(binder, mContext, mEventHandler);break; case INFO_SERVICE: manager = new CarInfoManager(binder);break; case APP_FOCUS_SERVICE: manager = new CarAppFocusManager(binder, mEventHandler);break; case PACKA

m0_66144910的博客 4954

深入解析Android VehicleHAL与CarPropertyService的交互机制

本文深入解析了Android车载系统中VehicleHAL与CarPropertyService的交互机制,详细介绍了它们的角色定位、初始化流程、属性订阅机制以及属性更新流程。通过实战案例展示了如何新增自定义属性,并提供了调试技巧与常见问题解决方案,帮助开发者更好地理解和应用Android车载系统开发。

weixin_29200741的博客 600

CarPropertyService调试实战:属性订阅、权限控制与异常处理全解析

本文深入解析Android车载开发中CarPropertyService的核心调试技巧,涵盖属性订阅机制、权限控制模型与异常处理实战。通过分析VehicleHAL层实现细节和常见问题根源,提供属性订阅失败、权限校验异常等解决方案,帮助开发者提升车载系统的稳定性和可靠性。

assembly8low的博客 672

Android AutoMotive--CarPropertyService

有了propertyId和areaId之后,我们就可以定位到唯一的属性,接下来就是获取和设置对应的值。虽然我们可以直接操作基本数据类型,但是谷歌给我们封装了CarPropertyValue,它不仅包含值,还包含了值是否有效的状态,无效的值是不能使用的,更利于程序的稳健。CarPropertyService是AAOS中非常重要的一个服务,它与车辆各ECU的功能密切关联,如空调控制、座椅调节、车窗调节、充放电控制、车辆传感器数据等,都是通过CarPropertyService来获取值以及设置值。

天花板的随笔 1553

CarPropertyService深度优化指南:如何设计高可用的车辆属性订阅系统

本文深入探讨了CarPropertyService的优化策略,帮助开发者构建高可用的车辆属性订阅系统。通过动态采样率调整、区域属性批量处理和DBus通信优化等技术,显著降低延迟并提升系统稳定性。特别针对VehicleHAL层的性能瓶颈,提供了工业级的解决方案和实战代码示例。

weixin_28452161的博客 384

【Android R】车载 Android 核心服务 - CarPropertyService 解析

对比开发车载Android和手机Android应用,最大的区别应该就是许多车载应用需要考虑汽车整体的运行状态,例如,控制车载空调或车速达到一定的阈值时,出于安全的...

linkwj的博客 5134

Android车载系统启动全解析:从SystemServer到CarService的完整链路

Android车载开发与移动端开发最大的不同,在于系统启动后还需要运行一套面向整车的服务架构,其中CarService充当了车载系统的中枢。了解从Boot ROM到SystemServer,再到CarServiceHelperService最终拉起CarService的启动链路,是定位车机黑屏、启动偶现异常、属性上报丢失等问题的基本功。整个链路中,Vehicle HAL作为CarService与整车硬件的分界线,承担着属性读写和事件订阅的关键使命。CarService采用聚合式Binder服务设计,将属性、

weixin_33785108的博客 166

从特斯拉到比亚迪:CarVendorExtensionManager如何实现车企专属功能开发?

本文深入解析了Android Automotive OS中CarVendorExtensionManager的核心机制。该管理器为车企提供了标准化的扩展通道,使其能在统一的车辆属性模型之外,安全、高效地开发并管理如屏幕旋转、宠物模式等品牌专属功能,是实现智能座舱差异化体验的关键技术。

weixin_29216353的博客 178

车载 Android之 核心服务 - CarPropertyService 解析

CarPropertyManager:是CarPropertyService在客户端的代理,通过 CarPropertyManager中 提供的 API,可以设置和获取车辆各个属性的状态。但在实际使用时,CarPropertyManager 却未必是开发者使用最频繁的对象。尤其是在 Android9平台上开发时,当开发者想控制 空调相关的功能的时候,也许会使用 CarHvacManager;当想获取车辆信息的时候,也许会 使用 CarInfoManager;

github_37217206的博客 4203

机理模型与数据模型融合的方式

风电场的发电量受到多种因素的影响,包括但不限于风速、温度、空气密度等。尽管这些环境变量可以直接测量并用作模型输入,但它们与发电量之间的关系往往是复杂的非线性关系。通过引入基于物理定律计算出的理论发电量作为额外特征,可以为数据驱动模型提供更丰富的信息,从而提高预测精度。在这个案例中,我们将使用贝茨理论(Betz Limit)来计算风电场的理论发电量,并将其作为一个新的特征添加到数据集中。然后,我们使用增强后的数据集训练一个简单的神经网络模型来进行发电量预测。

金石软件 4804

【Android R】车载 Android 核心服务 CarPropertyService

对比开发车载Android和手机Android应用,最大的区别应该就是许多车载应用需要考虑汽车整体的运行状态,例如,控制车载空调或车速达到一定的阈值时,出于安全的考虑多媒体应用要主动保持静音;汽车处于行驶状态下,OTA应用要保持静默等等。APP如何从Framework层获取车辆状态的数据,而Framework层又是从哪里获取到数据,它们的运行机制是怎样的,就是本篇要解释的问题了。1.【Android R】车载 Android 核心服务 - CarService 解析。

xiaokangss的博客 972

阿里平头哥与华为芯片的比较

阿里平头哥与华为芯片代表了中国AI芯片领域的两种典型发展路径:平头哥通过兼容CUDA生态快速切入市场,以较低成本提供接近国际水平的AI算力;华为则坚持全栈自研路线,构建从芯片到框架的完整技术体系,更注重供应链安全和自主可控。从短期来看,平头哥PPU在单卡性能参数上全面超越昇腾910B,接近英伟达H20水平,且成本优势明显,有望在云服务和互联网应用领域取得更大市场份额。而华为昇腾则凭借全栈自研和端边云协同优势,在政企市场和科研领域更具竞争力。

shao.bing的专栏 3971

如何利用 多 张 GPU 高效运行 Ollama

通过以上步骤,我们可以确保系统尽可能地利用所有 多张GPU 来运行 Ollama。如果在配置过程中遇到问题,建议查阅 Ollama 的官方文档,确认其是否支持多 GPU 并行计算,或者对系统性能进行进一步的优化。充分利用多 GPU 的并行计算能力,可以显著提升 Ollama 的运行效率,加快模型的推理和训练速度。希望本文能帮助你顺利实现 多张 GPU 的高效利用。

weixin_44997264的博客 8030

从零构建VehicleHAL:揭秘Android车载属性系统的设计哲学与实现艺术

本文深入解析Android Automotive OS中VehicleHAL的设计哲学与实现艺术,重点探讨其基于属性驱动的核心架构。通过VehicleProperty的巧妙编码和CarPropertyService的协同设计,实现了车载系统的高效数据管理和扩展性,为开发者构建稳定可靠的车载系统提供实践指导。

q1w3e5r7t9y的博客 421

螺丝锁付系统软件设计 C# Winform

视觉螺丝锁付系统软件设计 C# Winform ,这是其中通信子模块设计

weixin_42522973的博客 340

VehicleHAL属性掩码解析:从二进制位到车载功能控制的工程艺术

本文深入解析Android Automotive中VehicleHAL属性掩码的设计原理与工程实践。通过剖析32位属性ID的分层结构,详细阐述了如何从二进制位中提取属性组、区域标识和数据类型信息,并提供了高效的位操作技巧、自定义属性开发指南以及性能优化策略,帮助开发者掌握与车辆硬件对话的核心技术。

root9的博客 481

显示模组Bonding IC气泡问题的诊断与优化策略

本文深入分析了显示模组Bonding IC气泡问题的成因与优化策略,涵盖IC两端剥离气泡、彩虹状水汽气泡、电极下方无规律气泡及IC输入端气泡等类型。通过工艺参数优化、材料存储处理、清洁环境控制及维修品特殊处理等多维度解决方案,有效降低气泡不良率。同时介绍了纳米改性ACF材料、激光辅助排泡技术等前沿解决方案,为触控显示行业提供实用参考。

weixin_26805597的博客 419

避免踩坑!杰理AC63蓝牙名修改常见问题及解决方案(含BLE后缀处理)

本文详细解析了杰理AC63蓝牙设备名称修改的全过程,包括基础操作、BLE后缀处理及高级调试技巧。针对蓝牙名修改中的常见问题,提供了实用的解决方案和代码示例,帮助开发者避免踩坑并实现高效定制。

q6r7s8t9的博客 410

从零构建VehicleHAL:揭秘Android车机属性系统的设计哲学与实现路径

本文深入探讨Android Automotive OS中VehicleHAL的设计哲学与实现路径,重点解析其通过VehicleProperty系统实现硬件抽象与标准化的核心机制。详细介绍了基于HIDL的高性能服务架构、线程模型优化策略以及厂商自定义属性的兼容性方案,为开发者构建稳定高效的车机属性系统提供实践指导。

sql99的博客 206

MT6816磁编码器在无人机电调中的实战应用:从选型到调试全记录

本文详细介绍了MT6816磁编码器在无人机电调系统中的实战应用,涵盖选型、硬件集成、软件配置到飞行测试的全流程。通过对比霍尔传感器和光电编码器,突出MT6816在角度分辨率、安装公差和抗振动能力等方面的优势,为无人机动力系统提供高精度控制解决方案。

pandas7gardener的博客 232

Android车载系统启动全链路解析:从Bootloader到CarService

在智能座舱快速普及的今天,Android Automotive OS(AAOS)已成为车载信息娱乐系统的核心平台。与手机Android不同,车载系统必须满足车辆场景对启动时间的严苛要求,例如冷启动到主界面可交互需控制在3至8秒内。这一过程涉及从Bootloader、内核到Zygote、SystemServer,再到关键服务CarService的复杂启动链路。CarService作为连接上层应用与底层车辆硬件的桥梁,通过VehicleHal获取车速、电源模式等车辆属性,并负责权限管理和事件分发。理解CarSe

weixin_34075268的博客 416

17、高通8155座舱平台--QNX开发基础

我个人习惯,拿到一个新板子,第一件事就是打开IDE,建一个空的QNX项目,然后跑一遍Hello World。比如,当触摸屏被按下时,驱动发一个脉冲给UI进程,告诉它“嘿,有人摸屏幕了”。我在8155上调试时,就遇到过因为脉冲优先级太低,导致触摸响应延迟的问题。IDE自带的编译器是qcc,它其实是gcc的封装。QNX的IPC机制,可以说是它最牛的地方。嗯,这套流程走下来,你对QNX开发的基本功就差不多了。QNX默认的消息缓冲区大小是64KB,如果你要传大块数据,比如音频流,那就得用共享内存了。

woailuojp的博客 47

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 车载 Android之 核心服务 - CarPropertyService 解析
zmybiealex
博客等级 码龄10年 48粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值