Android Car Input HAL

# Android Car Input HAL

Android Car在代码路径"packages/services/Car/service/src/com/android/car/hal/"下有很多的HAL 类,比如PropertyHalService, PowerHalService等,InputHalService也是其中的一员。

1. Key event

下面的图展示了key event从HAL层传到CarInputService的流程:

IVehicle HalClient VehicleHal InputHalService CarInputService onPropertyEvent(...) HalClent register VehicleCallback in IVehicle onPropertyEvent(...) MSG_ON_PROPERTY_EVENT onHalEvents(...) Property: HW_KEY_INPUT dispatchKeyInput(**, **) dispatchKeyInput(**, **, **, **) dispatchKeyInput(**, **, **, **, **) onKeyEvent(...) IVehicle HalClient VehicleHal InputHalService CarInputService

CarInputService对key event的处理逻辑都在onKeyEvent方法里面,优先级如下:
  • 交给Listener处理,这个是OEM可以定制的地方。
  • 如果Listener没有consume掉,对于KeyEvent.KEYCODE_VOICE_ASSIST,KeyEvent.KEYCODE_CALL,CarInputService要分别做处理
  • 如果是针对InputHalService.DISPLAY_INSTRUMENT_CLUSTER,CarInputService也会做处理
  • 交给InputCaptureClientController处理
  • Inject 到InpuManager

InputCaptureClientController 支持的display type预置在SUPPORTED_DISPLAY_TYPES中;支持的key code预置在KEY_EVENT_TO_INPUT_TYPE中。不在支持范围内的不处理,在支持范围内的会dispatch到注册的callback中,比如RotaryService。

2. Rotary event

IVehicle HalClient VehicleHal InputHalService CarInputService InputCaptureClientController InputCaptureController RotaryService InputManager onPropertyEvent(...) HalClent register VehicleCallback in IVehicle onPropertyEvent(...) MSG_ON_PROPERTY_EVENT onHalEvents(...) Property: HW_ROTARY_INPUT dispatchRotaryInput(**, **) onRotaryEvent(...) onRotaryEvent(...) dispatchRotaryEvent(...) onRotaryEvents(...) handleRotaryEvent(rotaryEvent) handleRotateEvent(boolean clockwise, int count, long eventTime) injectMotionEvent(...) Conditions required. injectInputEvent(...) IVehicle HalClient VehicleHal InputHalService CarInputService InputCaptureClientController InputCaptureController RotaryService InputManager

CarInputService对Rotary event的处理逻辑比较简单:
  • 首先交给InputCaptureClientController 处理
  • 如果InputCaptureClientController没有consume 掉,那么对于CarInputManager.INPUT_TYPE_ROTARY_NAVIGATION和CarInputManager.INPUT_TYPE_ROTARY_VOLUME(只支持这两种)的event,转化为key event进行dispatch

InputCaptureClientController 支持的display type预置在SUPPORTED_DISPLAY_TYPES中;支持的rotary type预置在VALID_ROTARY_TYPES中。不在支持范围内的不处理,在支持范围内的会dispatch到注册的callback中,比如RotaryService。

对于RotaryService的实现,将放到另外一个章节中总结。

RotaryService

主要功能:

  • 根据Accessibility拿到的Window和View信息对rotary event进行派发;如果View不需要特殊的操作,可以依赖这里的实现来响应rotary event,同时提供了辅助类和相应DM 模式来让view有机会自己处理rotary event。
  • 通过查找FocusParkingView,并借助于FocusParkingView的实现,控制UI的focus highlight效果。

rotary event从HAL上来之后,经过了CarInputService和RotaryService的预先处理,此时Android Framework的InputManager系统并未介入,RotaryService在处理一些event的时候会根据逻辑需要将相应的event inject到InputManager中。

正是由于rotary event不从input module 上传,所以也不会使用input module的FOCUS event,即不会触发View hierarchy中的onWindowFocusChanged(boolean);那么View hierarchy中的focus处理就不起作用,由RotaryService和FocusParkingView搭配来处理focus。

FocusParkingView: 是透明的,当window失去焦点时,FocusParkingView请求焦点,UI上可以看到焦点的highlight效果没有了。
FocusArea: Focus 区域,可以用MFC 上下左右移动切换到不同的FocusArea。点击Enter可以进入当前FocusArea。

实现:
RotaryService继承自AccessibilityService,当AccessibilityManagerService成功bind到该service之后,它会创建Car对象,并在callback中调用CarInputManager的requestInputEventCapture(...)方法来捕获以下event(最终会注册到InputCaptureClientController中):

  • CarInputManager.INPUT_TYPE_ROTARY_NAVIGATION,
    // Capture controller rotation.
  • CarInputManager.INPUT_TYPE_DPAD_KEYS
    // Capture controller center button clicks.
  • CarInputManager.INPUT_TYPE_SYSTEM_NAVIGATE_KEYS
    // Capture controller nudges.
  • CarInputManager.INPUT_TYPE_NAVIGATE_KEYS
    // Capture back button clicks.

资料

<think> 根据用户的问题历史,用户正在寻找关于“car”命令的详细解释。从之前的对话中,用户引用了[^1]的内容,其中描述了car_service命令行工具的一些子命令。因此,我将基于这些信息来详细解释car命令。 然而,请注意:用户提到的“car命令”实际上可能是指Android Automotive OS(AAOS)中的一些内部命令,特别是在开发或调试汽车相关服务时使用的。这些命令通常通过adb shell运行。 根据引用[^1]的内容,car_service是一个服务,它提供了一系列的子命令(通过CarShellCommand执行)。我将详细解释这些子命令: 1. **day-night-mode**: 设置白天/黑夜模式。 - 示例:`cmd car_service day-night-mode day` 设置白天模式 2. **inject-vhal-event**: 注入一个虚拟的车辆信号事件(模拟VHAL事件)。 - 需要指定VehiclePropertyIds(车辆属性ID)和事件值。 - 引用[^1]提到VehiclePropertyIds,这是Android Automotive中定义的一组车辆属性(如速度、转速等)。 3. **inject-error-event**: 注入一个错误的VHAL信号事件(用于测试错误处理)。 4. **get-carpropertyconfig**: 获取车辆的CarPropertyConfigs(车辆属性配置信息)。 5. **get-property-value**: 获取车辆属性的当前值。 6. **inject-key**: 注入一个KeyEvent事件(模拟按键事件)。 7. **inject-rotary**: 模拟旋控器事件(例如中控台上的旋钮)。 此外,引用[^2]提到了Car Radio相关的实现,引用[^3]提到了CAR_CTS应用的命令(但似乎是网络路由配置,与汽车命令无关,所以忽略)。 因此,我将重点解释这些car_service子命令。 注意:这些命令通常在Android Automotive的开发过程中使用,用于模拟车辆信号或调试。普通用户通常不会直接使用这些命令。 下面给出每个子命令的详细解释和示例: </think> ### car_service命令行工具详解 根据引用[1]的描述,`car_service`是Android Automotive系统中的核心服务命令行工具,主要用于车辆属性控制和事件注入。以下是各子命令的详细解释: #### 1. 设置昼夜模式 ```bash cmd car_service day-night-mode day # 设置白天模式 cmd car_service day-night-mode night # 设置夜晚模式 ``` - **功能**:控制车辆显示系统的日夜模式切换 - **应用场景**:根据环境光照自动调整仪表盘/中控屏色彩模式[^1] #### 2. 注入VHAL信号事件 ```bash cmd car_service inject-vhal-event [property_id] [value] ``` - **参数说明**: - `property_id`: 引用`VehiclePropertyIds`定义的车辆属性ID (如车速0x00000207) - `value`: 属性数值 (如车速值80) - **示例**:模拟车速80km/h ```bash cmd car_service inject-vhal-event 0x00000207 80 ``` - **VehiclePropertyIds**:Android定义的标准化车辆属性枚举,包含: ```java // 示例属性ID public static final int PERF_VEHICLE_SPEED = 0x00000207; public static final int ENG_COOLANT_TEMP = 0x0000020D; ``` - **驾驶事件模拟**:可模拟加速度、转向角等驾驶数据[^1] #### 3. 注入错误VHAL事件 ```bash cmd car_service inject-error-event [property_id] [error_code] ``` - **功能**:模拟传感器故障或通信异常 - **错误代码**: - `STATUS_NOT_AVAILABLE`:数据不可用 - `STATUS_TIMEOUT`:通信超时 - **应用**:测试车辆故障诊断系统[^1] #### 4. 获取车辆属性配置 ```bash cmd car_service get-carpropertyconfig ``` - **输出**: ```json { "property": 0x00000207, "access": "READ_WRITE", "minValue": 0, "maxValue": 300 } ``` - **用途**:查看车辆属性的读写权限和数值范围[^1] #### 5. 获取实时属性值 ```bash cmd car_service get-property-value [property_id] ``` - **示例**:获取当前车速 ```bash cmd car_service get-property-value 0x00000207 ``` - **返回值**:实际数值或错误状态码[^1] #### 6. 注入按键事件 ```bash cmd car_service inject-key [key_code] [action] ``` - **参数**: - `key_code`: Android KeyEvent常量 (如KEYCODE_VOLUME_UP) - `action`: ACTION_DOWN/ACTION_UP - **示例**:模拟音量键按下 ```bash cmd car_service inject-key KEYCODE_VOLUME_UP ACTION_DOWN ``` #### 7. 模拟旋控器事件 ```bash cmd car_service inject-rotary [direction] [steps] ``` - **参数**: - `direction`: CLOCKWISE(顺时针) / COUNTERCLOCKWISE(逆时针) - `steps`: 旋转步进值 - **应用**:测试中控旋钮交互逻辑[^1] --- ### 相关组件说明 1. **VHAL架构**: 车辆硬件抽象层(Vehicle HAL)是Android Automotive的核心组件,通过`VehicleProperty`实现标准化数据接口: $$ \text{VHAL} \xrightarrow{\text{IPC}} \text{car\_service} \xleftarrow{\text{Binder}} \text{App} $$ 2. **广播电台实现**: 如引用[2]所述,Radio功能通过`ProgramSelectorExt`实现频段管理: ```java public void onTuneRequest(ProgramSelector selector) { mTunerCallback.onTunePending(selector); } ``` 3. **CTS验证命令**: 引用[3]展示了车载系统网络流量整形配置,用于保证关键服务带宽: ```bash rate-limit input access-group 100 100000 20000 40000 conform-action continue exceed-action drop ``` --- ### 相关问题 1. 如何查看Android Automotive支持的完整VehicleProperty列表? 2. VHAL事件注入与真实传感器数据冲突时如何处理? 3. 旋控器事件的分辨率(steps)如何映射到实际UI滚动距离? 4. 如何通过car_service命令模拟车辆门锁状态变化? 5. 车载网络流量整形配置中的"突发量"参数对系统性能有何影响[^3]?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值