Android Auto开发(5)-Audio Integration

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

🔥 认证通过率提升技巧

  1. 在 CI 流程中强制检查语音命令覆盖率

    bash 复制代码
    # 自动化测试脚本
    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 验证覆盖率
相关推荐
冬奇Lab23 分钟前
【Kotlin系列03】控制流与函数:从if表达式到Lambda的进化之路
android·kotlin·编程语言
冬奇Lab28 分钟前
稳定性性能系列之十二——Android渲染性能深度优化:SurfaceFlinger与GPU
android·性能优化·debug
冬奇Lab2 小时前
稳定性性能系列之十一——Android内存优化与OOM问题深度解决
android·性能优化
用户74589002079543 小时前
线程池
android
专注前端30年3 小时前
【PHP开发与安全防护实战】性能调优手册
android·安全·php
王正南4 小时前
安卓逆向之LSposed开发(一)
android·xposed·lsposed
YIN_尹5 小时前
【MySQL】数据类型(上)
android·mysql·adb
robotx7 小时前
AOSP设备节点权限添加相关
android
顾林海7 小时前
Android文件系统安全与权限控制:给应用数据上把“安全锁”
android·面试·操作系统