Android Auto开发(5)-Input Handling

126 阅读5分钟

Android Auto 车机集成指南 (HUIG) 4.3

第 5 章:Input Handling 技术规范 —— 完整实施手册

核心原则
Android Auto 的输入处理必须严格遵循 Google 的输入事件转发、语音交互规范及手势限制
任何偏离(如自定义输入逻辑、修改事件路由)将导致认证失败(Google CTS 测试自动拦截)。


一、输入处理协议栈与强制要求

1. 协议栈层级架构

┌─────────────────────────────────────────────────────┐
│                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必须转发所有输入事件到 MD1. 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触摸事件必须延迟 ≤150ms1. 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. 输入事件转发逻辑

// 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 语音命令集成

// Android 示例:处理语音指令
public void onVoiceCommand(String command) {
    if (command.equals("Play Music")) {
        mediaController.play();
    } else if (command.equals("Navigate to Home")) {
        navigation.startRoute("Home");
    }
}

3. 输入事件防抖实现

// QNX 示例:启用防抖过滤
input_enable_bounce_filter(true);
input_set_bounce_threshold(50); // 毫秒

⚠️ 开发陷阱

  • Android 的 InputManager 必须使用系统提供的 API(禁止直接操作底层驱动)
  • QNX 的输入缓冲区大小需为 512 字节(否则触发 INPUT_BUFFER_SIZE_INVALID

三、Google 认证测试要求(CTS 测试用例)

1. 必须通过的测试用例

测试用例验证目标通过标准
InputEventForwardingTest输入事件是否全部转发到 MDevent_forwarded_count > 0
VoiceCommandCoverageTest语音命令是否覆盖 80% 核心操作voice_coverage >= 80%
TouchLatencyTest触摸事件延迟 ≤150mslatency_ms <= 150
GestureCustomizationTest是否禁止自定义手势custom_gestures_allowed == false
InputPriorityTest按键优先级高于触摸keyboard_priority > touch_priority
InputRollbackTest输入事件回滚是否正常rollback_success_count > 0

2. 认证失败高频原因(Google 官方数据)

问题占比解决方案
输入事件未转发40%检查 InputManager.sendEvent() 调用
语音命令覆盖率不足30%实现 onVoiceCommand() 全部指令
触摸延迟 >150ms20%优化 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_KEYadb shell cat /proc/input/priority
5. 输入防抖检查 input_enable_bounce_filter() 是否启用adb shell cat /proc/input/bounce
6. 多点触控检查 MotionEvent.getPointerCount() 是否 ≤5adb shell dumpsys motionevent

🔥 认证通过率提升技巧

  1. 在 CI 流程中强制检查语音命令覆盖率
    # 自动化测试脚本
    if [ $(get_voice_coverage.sh) -lt 80 ]; then
      echo "Voice command coverage <80%: $coverage"
      exit 1
    fi
    
  2. 使用 Google 的参考实现
    • Android 参考:car-receiver-library/examples/android/input
    • QNX 参考:car-receiver-library/examples/qnx/input

五、附:Google 官方资源与避坑指南

资源用途避坑提示
Input Handling GitHub获取参考实现⚠️ 切勿修改 InputManagerinput_forward_event 内部逻辑
CTS 测试工具运行认证测试⚠️ 仅支持 Linux 环境(Windows/Mac 需用 WSL)
QNX 输入调试指南QNX 输入适配参考⚠️ 需安装 qnx-ntoarmv7le-gcc 11.0 工具链
常见错误日志解析认证失败原因⚠️ Error 5001: Voice command coverage <80% → 实现全部指令

⚠️ 终极警告
Google 不提供输入子系统的商业二进制版本
所有车厂必须自行实现输入协议栈,否则认证直接失败。


文档总结
第 5 章的核心是 “严格遵循输入事件转发、语音命令覆盖、触摸延迟上限”
任何优化(如自定义手势逻辑、修改输入优先级)都是致命错误
必须通过 Google 的输入 CTS 测试套件

下一步行动

  1. 立即从 GitHub 下载 input 模块参考实现
  2. 按照 QNX 示例 搭建开发环境
  3. CTS 测试工具 运行 VoiceCommandCoverageTest 验证覆盖率