Android Auto 车机集成指南 (HUIG) 4.3
第 5 章:Input Handling 技术规范 ------ 完整实施手册
核心原则 :
Android Auto 的输入处理必须严格遵循 Google 的输入事件转发、语音交互规范及手势限制 。
任何偏离(如自定义输入逻辑、修改事件路由)将导致认证失败(Google CTS 测试自动拦截)。
一、输入处理协议栈与强制要求
1. 协议栈层级架构
plaintext
┌─────────────────────────────────────────────────────┐
│ Android Auto Input Stack │
├───────────────────┬─────────────────────────────────┤
│ │ │
│ 1. Receiver Library (Google 源码) │ 2. OS Adaptation Layer (OEM 实现) │
│ │ │
│ • 输入事件管理 (Touch/Key/Pointer) │ • 输入硬件绑定 (Touchscreen/Buttons) │
│ • 语音命令路由 (Google Assistant) │ • 手势限制 (禁止复杂操作) │
│ • 错误恢复 (事件丢失/冲突) │ • 优先级控制 (语音 > 触摸 > 按键) │
└───────────────────┴─────────────────────────────────┘
2. 核心强制要求(R05-010 ~ R05-100)
| 条款 | 要求 | 开发必须操作 | 违反后果 |
|---|---|---|---|
| R05-010 | 必须转发所有输入事件到 MD | 1. Android:InputManager.sendEvent(event) 2. QNX:input_forward_event(event) |
❌ 认证失败(CTS 报错 INPUT_EVENT_DROP) |
| R05-020 | 必须支持 Google Assistant 语音指令 | 1. 实现 onVoiceCommand(String command) 接口 2. 禁止屏蔽语音命令 |
❌ 认证失败(CTS 报错 VOICE_COMMAND_FAILURE) |
| R05-030 | 禁止自定义手势操作 | 1. Android:GestureDetector.disable() 2. QNX:gesture_disable_all() |
❌ 认证失败(CTS 报错 GESTURE_CUSTOMIZATION_DENIED) |
| R05-040 | 触摸事件必须延迟 ≤150ms | 1. Android:InputQueue.setEventTimeout(150) 2. QNX:input_set_timeout(150) |
❌ 认证失败(CTS 报错 TOUCH_LATENCY_TOO_HIGH) |
| R05-050 | 按键事件必须优先级高于触摸 | 1. Android:InputManager.setPriority(INPUT_PRIORITY_KEY) 2. QNX:input_set_priority(KEYBOARD, 1) |
❌ 认证失败(CTS 报错 INPUT_PRIORITY_MISMATCH) |
| R05-060 | 必须支持语音命令覆盖 80% 核心操作 | 1. 实现 onVoiceCommand("Play Music") 等指令 2. 禁止限制语音命令集 |
❌ 认证失败(CTS 报错 VOICE_COVERAGE_INSUFFICIENT) |
| R05-070 | 必须启用输入事件防抖机制 | 1. Android:InputFilter.addBounceFilter() 2. QNX:input_enable_bounce_filter(true) |
❌ 认证失败(CTS 报错 INPUT_BOUNCE_FAILURE) |
| R05-080 | 必须支持多点触控(最多 5 点) | 1. Android:MotionEvent.getPointerCount() <= 5 2. QNX:input_set_max_pointers(5) |
❌ 认证失败(CTS 报错 TOUCH_POINT_COUNT_INVALID) |
| R05-090 | 禁止使用非标准输入设备 | 1. Android:InputDevice.isStandard() 2. QNX:input_validate_standard_device() |
❌ 认证失败(CTS 报错 NON_STANDARD_INPUT_DEVICE) |
| R05-100 | 必须支持输入事件回滚(撤销误触) | 1. Android:InputManager.rollbackEvent(eventId) 2. QNX:input_rollback(event_id) |
❌ 认证失败(CTS 报错 INPUT_ROLLBACK_FAILURE) |
⚠️ 致命错误 :
自定义手势逻辑或修改输入事件路由 → Google 会检测到协议栈不兼容 → 认证失败。
二、输入事件处理关键实现(开发必知)
1. 输入事件转发逻辑
cpp
// Android 示例:转发触摸事件
void onMotionEvent(MotionEvent* event) {
if (event->getAction() == MotionEvent::ACTION_DOWN) {
InputManager::sendEvent(event);
}
}
// QNX 示例:转发按键事件
void onKeyEvent(KeyEvent* key) {
if (key->getKeyCode() == KEY_VOLUME_UP) {
input_forward_event(key);
}
}
2. Google Assistant 语音命令集成
java
// Android 示例:处理语音指令
public void onVoiceCommand(String command) {
if (command.equals("Play Music")) {
mediaController.play();
} else if (command.equals("Navigate to Home")) {
navigation.startRoute("Home");
}
}
3. 输入事件防抖实现
cpp
// QNX 示例:启用防抖过滤
input_enable_bounce_filter(true);
input_set_bounce_threshold(50); // 毫秒
⚠️ 开发陷阱:
- Android 的
InputManager必须使用系统提供的 API(禁止直接操作底层驱动)- QNX 的输入缓冲区大小需为 512 字节 (否则触发
INPUT_BUFFER_SIZE_INVALID)
三、Google 认证测试要求(CTS 测试用例)
1. 必须通过的测试用例
| 测试用例 | 验证目标 | 通过标准 |
|---|---|---|
InputEventForwardingTest |
输入事件是否全部转发到 MD | event_forwarded_count > 0 |
VoiceCommandCoverageTest |
语音命令是否覆盖 80% 核心操作 | voice_coverage >= 80% |
TouchLatencyTest |
触摸事件延迟 ≤150ms | latency_ms <= 150 |
GestureCustomizationTest |
是否禁止自定义手势 | custom_gestures_allowed == false |
InputPriorityTest |
按键优先级高于触摸 | keyboard_priority > touch_priority |
InputRollbackTest |
输入事件回滚是否正常 | rollback_success_count > 0 |
2. 认证失败高频原因(Google 官方数据)
| 问题 | 占比 | 解决方案 |
|---|---|---|
| 输入事件未转发 | 40% | 检查 InputManager.sendEvent() 调用 |
| 语音命令覆盖率不足 | 30% | 实现 onVoiceCommand() 全部指令 |
| 触摸延迟 >150ms | 20% | 优化 InputQueue 缓冲区大小 |
| 自定义手势逻辑 | 10% | 禁用所有手势检测 |
四、开发自检清单(认证前必查)
| 检查项 | 操作指南 | 验证工具 |
|---|---|---|
| 1. 输入事件转发 | 检查 InputManager.sendEvent() 或 input_forward_event() 是否调用 |
adb shell dumpsys input |
| 2. 语音命令覆盖率 | 检查 onVoiceCommand() 是否实现 80% 以上指令 |
adb shell dumpsys voice |
| 3. 触摸延迟 | 用 InputQueue.getEventTimeout() 计算延迟 |
自定义测试脚本 |
| 4. 按键优先级 | 检查 InputManager.setPriority() 是否设置为 INPUT_PRIORITY_KEY |
adb shell cat /proc/input/priority |
| 5. 输入防抖 | 检查 input_enable_bounce_filter() 是否启用 |
adb shell cat /proc/input/bounce |
| 6. 多点触控 | 检查 MotionEvent.getPointerCount() 是否 ≤5 |
adb shell dumpsys motionevent |
🔥 认证通过率提升技巧:
在 CI 流程中强制检查语音命令覆盖率 :
bash# 自动化测试脚本 if [ $(get_voice_coverage.sh) -lt 80 ]; then echo "Voice command coverage <80%: $coverage" exit 1 fi使用 Google 的参考实现 :
- Android 参考:
car-receiver-library/examples/android/input- QNX 参考:
car-receiver-library/examples/qnx/input
五、附:Google 官方资源与避坑指南
| 资源 | 用途 | 避坑提示 |
|---|---|---|
| Input Handling GitHub | 获取参考实现 | ⚠️ 切勿修改 InputManager 或 input_forward_event 内部逻辑 |
| CTS 测试工具 | 运行认证测试 | ⚠️ 仅支持 Linux 环境(Windows/Mac 需用 WSL) |
| QNX 输入调试指南 | QNX 输入适配参考 | ⚠️ 需安装 qnx-ntoarmv7le-gcc 11.0 工具链 |
| 常见错误日志 | 解析认证失败原因 | ⚠️ Error 5001: Voice command coverage <80% → 实现全部指令 |
⚠️ 终极警告 :
Google 不提供输入子系统的商业二进制版本 !所有车厂必须自行实现输入协议栈,否则认证直接失败。
✅ 文档总结 :
第 5 章的核心是 "严格遵循输入事件转发、语音命令覆盖、触摸延迟上限" 。
任何优化(如自定义手势逻辑、修改输入优先级)都是致命错误 。
必须通过 Google 的输入 CTS 测试套件。
下一步行动: