1. HVAC 功能介绍
HVAC 全称:供暖通风与空气调节(Heating Ventilation and Air Conditioning)。用户可以通过他来控制整个汽车的空调系统,是汽车中非常重要的一个功能。

汽车的空调HMI虽然并不复杂,但是大多都是用符号来表示功能,对于还没有实际用过汽车空调系统的开发者来说,理解空调的各个符号表示的含义也是非常有必要。
下面就以Android 12中的HVAC来介绍空调系统中包含的最基础的功能。
1.1 双区温度调节

空调的温度调节功能,默认是华氏度,可以在系统设置修改温度单位。可调节范围是61 - 82华氏度,对应16 - 28 摄氏度。
左侧按钮用来调节主驾,右侧按钮用来调节副驾。在以往都是只有高配车型才有双区空调,现在的车上双区空调几乎已经是标配了。
1.2 空调开关

开启关闭空调的开关
1.3 内/外循环

内循环是汽车空气调节系统的一种状态。这种状态下,车内外的换气通道关闭,风机关闭时车内气流不循环,风机开启时,吸入的气流也仅来自车内,形成车辆内部的气流循环。
外循环则相反,风机开启时,吸入的气流也仅来自车外,可以更新车内的空气质量,代价是会更耗电。
1.4 风量调节

用于增大或减小空调的风量。
1.5 风向调节

从左到右分别是吹脸、吹脸+吹脚、吹脚、吹脚+吹挡风玻璃
1.6 A/C开关

A/C按键,它就是制冷开关,按下A/C按键,也就启动了压缩机,通俗地说就是开冷气。
1.7 主副驾座椅加热

左边的按钮用于调节主驾座椅加热,右边的按钮用于调节副驾座椅加热
1.8 除霜

左边的按钮是开启/关闭 前挡风玻璃加热,开启后用来除去前挡风玻璃上的雾气。右边的按钮是开启/关闭后挡风玻璃加热,开启后用来除去后挡风玻璃上的雾气。
1.9 自动模式

自动空调其实就是省略了风速、风向等调节功能,自动空调是全自动调节,只需要选择风向和设定温度。AUTO按键按下后,就会根据车内传感器来控制出风的温度,冬天热风,夏天冷风。会保持车内有较适宜的温度,如果温度过高或过低,空调也会自动改变出风口的温度及风速,调整车内温度。
以上就是车载空调系统中最基础的功能了,实际开发中我们还会遇到如座椅通风、座椅按摩、智能新风、负离子等等一些近几年才出现的空调新功能,在应用开发上无非就是多几个界面或按钮。
2. HVAC 源码结构
本文中的源码基于Android 12下HVAC APP,源码请见:https://github.com/linux-link/CarHvac
原生的Hvac App中不存在Activity、Fragment等传统意义上用来显示HMI的组件,取而代之是使用Service来显示一个Window。主要原因在于Hvac的界面层级比一般的HMI的层级要高,呼出Hvac时需要部分或全部覆盖其他的应用上(当然IVI中还是有应用比Hvac的层级要高的),这时候使用Activity就显不合适了。

需要注意的是,Havc在Android 12中虽然有一个独立的app,但是上图中Hvac其实并不是使用这个独立的app,它的HMI和相关其实都是写在SystemUI中的。
通过使用adb发送一个广播,可以调出真正的Hvac。
adb shell am broadcast -a android.car.intent.action.TOGGLE_HVAC_CONTROLS

以下是Hvac App的关键部分的源码结构图

3. HVAC 核心源码分析
3.1 AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.car.hvac">
<uses-sdk
android:minSdkVersion="22"
android:targetSdkVersion="29" />
<uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Required to use the TYPE_DISPLAY_OVERLAY layout param for the overlay hvac ui-->
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
<!-- Allow Hvac to go across all users-->
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<protected-broadcast android:name="android.car.intent.action.TOGGLE_HVAC_CONTROLS" />
<application
android:icon="@drawable/ic_launcher_hvac"
android:label="@string/hvac_label"
android:persistent="true">
<!--用于控制空调功能的Service-->
<service
android:name=".HvacController"
android:exported="false"
android:singleUser="true" />
<!-- 用于显示UI的Service-->
<service
android:name=".HvacUiService"
android:exported="false"
android:singleUser="true" />
<!-- 监听开机广播 -->
<receiver
android:name=".BootCompleteReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
3.2 BootCompleteReceiver
用于监听开机的广播

本文详细解读了Android12中HVAC在车载空调系统中的关键功能、源码结构,包括双区温度调节、空调开关、内外循环控制等,并深入解析了HVAC的核心组件和Car API的交互。
最低0.47元/天 解锁文章
1212





