Android Automotive Vehicle HAL硬按键属性及CarInputService使用调研

背景

汽车方向盘上的按键能够控制Android车机中的软件行为。
之所以调研CarInputService,是在一些项目实践中,硬按键被从底层BSP直接以设备驱动的形式对接到Android系统中,绕过了VehicleHAL,虽然使得Android中的应用,可以通过简单的在Activity中重载dispatchKeyEvent,onKeyDown,onKeyUp等方法处理车上(比如方向盘)的硬按键输入,但哪些显式依赖VehicleHAL硬按键属性的上层服务,比如CarInputService,CarAudioService,CarProjectionService等,可能无法收到硬按键事件。为评估影响,特调研Android14中,使用VehicleHAL硬按键属性及CarInputService的使用情况,以下结果基于2024年12月2日AOSP代码。

VehicleHAL硬按键属性

hardware/interfaces/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl文件中定义了5个硬按键相关属性:
HW_KEY_INPUT
HW_KEY_INPUT_V2
HW_MOTION_INPUT
HW_ROTARY_INPUT
HW_CUSTOM_INPUT

引用上述属性的上层服务或者类有:
InputHalService (引用HW_KEY_INPUT, HW_KEY_INPUT_V2, HW_MOTION_INPUT, HW_ROTARY_INPUT, HW_CUSTOM_INPUT)
ExtraCanClient (引用HW_KEY_INPUT)

InputHalService

负责处理由VehicleHal分发过来的硬按键属性事件,并从属性值中提取硬按键相关信息,再分发出去给上层使用。
引用InputHalService的上层服务有:
CarInputService
CarShellCommand

ExtraCanClient

用于模拟器中模拟按键,项目中是否适配硬按键不影响模拟器功能。

CarInputService

对输入事件做如下处理:
接电话:acceptCallIfRinging
挂电话:endCall
拨打上一个电话:handleCallLongPress->dialLastCallHandler
Home键回到主屏:handleHomeKey
仪表响应事件分发:handleInstrumentClusterKey
电源键处理,打开或关闭指定位置的屏幕: handlePowerKey
语音助理键处理:handleVoiceAssistKey,handleVoiceAssistLongPress
旋控事件处理,根据事件参数翻译为功能按键:onRotaryEvent->rotaryEventToKeyEvents

引用CarInputService的上层服务有:
CarProjectionService
CarAudioService
InstrumentClusterService
CarMediaService
CarShellCommand

CarShellCommand

adb环境可用的carservice命令行工具,通过同CarInputService交互,实现硬按键模拟。如果不在VehicleHAL中适配硬按键属性,并不影响该功能可用性。

CarProjectionService

将硬按键事件发送给手机投屏应用。

CarAudioService

处理音量控制按键事件:
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_MUTE

InstrumentClusterService

处理/分发目标为仪表屏的硬按键事件。

CarMediaService

处理如下媒体播放硬按键事件:
KEYCODE_MEDIA_PLAY
KEYCODE_MEDIA_PAUSE
KEYCODE_MEDIA_PLAY_PAUSE
KEYCODE_HEADSETHOOK
KEYCODE_MEDIA_STOP
KEYCODE_MEDIA_NEXT
KEYCODE_MEDIA_PREVIOUS
KEYCODE_MEDIA_REWIND
KEYCODE_MEDIA_RECORD
KEYCODE_MEDIA_FAST_FORWARD

总结

从VehicleHAL接入的硬按键事件,在CarService中被 CarProjectionService, CarAudioService,InstrumentClusterService, CarMediaService等业务服务订阅并处理,共同完成了Android Automotive OS层车载功能。如果通过设备驱动直接接入,不经过VHAL,则,Android Automotive 系统层功能将会缺失,这些功能包括:

  1. 硬按键接打电话
  2. 语音助理唤醒
  3. 开关屏幕
  4. 仪表硬按键响应
  5. 旋控按钮事件响应
  6. 投屏应用硬按键交互
  7. 硬按键音量控制
  8. 硬按键媒体播放控制

在Q/L+A方案中,上述硬按键及其对应功能可能是在Q/L中处理和实现,不涉及到Android,因此不在VehicleHAL中接入硬按键,不会有明显的功能缺失。但如果不是在Q/L+A方案中,或者Q/L不提功上述硬按键对应的功能,不在VehicleHAL中接入硬按键,会导致上述功能缺失,需要进行产品和技术方案的评估。