跳转至

Demo 调试应用

最后更新:

EVCC API Demo 是一款独立 Android 调试应用,用来从第三方应用的视角检查 EVCC 开放 API。 即使不了解 EVCC 内部结构,也可以按“连接与全局检查 → 请求与响应 → 实时监听”依次确认应用授权、 Binder 会话、属性解析和事件回调是否正常。

Demo 同时提供推荐的 SDK 模式和底层 Raw AIDL 模式。同一项请求在两种模式下表现不同,通常 说明问题位于客户端 SDK;两种模式都失败时,再检查 EVCC 授权、服务状态和车辆属性源。

获取方式

  • 下载页提供可独立编译的源码 ZIP;Demo 测试 APK 只有在使用独立于 EVCC 的证书签名并通过校验后才会上线。
  • 源码 ZIP 不包含 EVCC 主应用源码、生产签名、JKS、证书文件、签名配置、口令、本机配置和构建产物。
  • Demo 测试 APK 的包名为 com.kooo.evccapi.demo;本地 Debug 为 com.kooo.evccapi.demo.debug。二者使用不同签名和不同包名,可以并行安装,但必须分别在 EVCC 中授权。下载清单没有“Demo 测试 APK”条目时表示官网 APK 尚未发布。
  • 官网测试 APK 的普通测试证书私钥会在签名后销毁;安装不同版本或证书前,需要卸载旧包再安装并重新授权。

本地构建

解压后安装 JDK 17 与 Android SDK 36:

./gradlew :app:assembleDebug

源码工程没有 Release signingConfig。请勿把个人或 EVCC 生产密钥复制进示例工程。

首次测试

  1. 安装 EVCC 和 Demo。
  2. 打开 EVCC → 服务 → 实验功能 → EVCC 开放 API → 开放 API 控制台 → 开放权限的应用。
  3. 勾选当前 Demo,首次弹窗选择“只读”或“标准联动”。 当前源码 Demo 也可点击“打开 EVCC 开放 API”直接进入自身授权窗口,不支持该入口时回退到控制台。
  4. 回到 Demo,先选 SDK 模式并连接。
  5. 运行“一键只读自检”,确认协议、授权、能力、五源状态、普通目录、属性解析/读取和变量读取。
  6. 在“请求与响应”中填写真实属性并读取一次,再到“实时监听”应用同一选择器,确认收到初始快照。
  7. 需要写入、动作、Shell 或全量扫描时,在 EVCC 中单独增加相应权限,再逐项测试。

“全部权限”预设包含敏感权限,保存新增敏感权限时须确认风险;系统写入仍需逐次确认。跳转入口本身 不会选择预设或保存授权。调用方式见第三方应用跳转入口。

调试工作台

1. 连接与全局检查

这一部分先判断“链路整体是否可用”,不要求预先知道具体属性 ID:

  • 选择 SDK 或 Raw AIDL 后连接,查看当前 Binder 与会话状态。
  • “协议与权限”显示 EVCC 版本、协议版本、Demo 包名、UID、本应用证书 SHA-256、授权预设和权限集合。
  • “查询能力”读取当前会话真正可调用的能力;按钮存在不代表已获对应权限。
  • “查询六源状态”分别显示 VHAL、APVP、Vehicle AIDL、CAPI、AdaptAPI 和 SOA 的启用、连接与来源代次。
  • 普通目录支持首页、下一页和重置分页;目录分页期间不要改变查询条件。
  • “一键只读自检”按固定顺序检查会话、能力、来源、目录、一个可用属性及一个可用变量。它不会写入、 执行动作、启动全量扫描或执行 Shell,也不会留下新的属性监听。
  • “开发中心”打开与当前 API 配套的接口参考、权限说明、数据模型和错误码。

全量扫描不是普通健康检查:它可能重建 APVP 订阅,并受独立权限、限频和超时控制。只有确实需要 发现实时完整目录时才使用。

2. 请求与响应

属性选择器支持以下字段:

字段 填写方式 说明
属性 ID 十进制或 0x 十六进制 与精确名称二选一
精确名称 目录返回的完整名称 与属性 ID 二选一,不做模糊匹配
来源 AUTO、VHAL、APVP、VEHICLE_AIDL、CAPI、ADAPT_API 或 SOA 留空等同 AUTO;返回值会标明实际来源
区域 十进制区域 ID,可留空 多个区域都可能匹配时,服务会返回区域歧义而不是猜测

先用“解析”查看候选项和最终选源,再执行缓存读取或强制读取。强制读取会访问上游,不适合高频轮询。 批量缓存读取每行使用一个与监听区相同的 selector,最多 100 项;它不会强制刷新上游,适合验证 readProperties() 的逐项返回和 Binder 序列化。写入前先预检查;批量写入格式为每行 属性ID=字符串值,结果逐项返回且不是事务,前面成功的项目不会因为后续失败而回滚。

“最近一次请求 / 响应”独立显示连接方式、操作、实际请求和结构化返回,便于复制对照接口文档;实时 回调和连续审计信息仍写入事件日志,不会把单次响应淹没。

3. 实时监听

多属性监听框每行填写一个选择器,提交时会整批替换当前属性监听集合。紧凑格式为:

ID_OR_EXACT_NAME[,SOURCE][,AREA]

示例:

0x11600207,VHAL,0
VehicleSpeed,AUTO

数字形式的属性名可能被当成 ID。需要消除歧义或提高可读性时,推荐键值格式:

name=VehicleSpeed,source=AUTO,area=0
id=0x11600207,source=VHAL

可以使用 # 开头的注释行。“应用属性监听”提交完整集合,“清空属性监听”取消全部属性监听。监听状态 会显示已请求/接受/失败数量和最后事件;初始可用值以 INITIAL_SNAPSHOT 到达,后续变化持续写入事件 日志。SDK 重连会恢复最后一次成功的完整集合;Raw AIDL 断连后需要重新连接并再次提交。

“当前属性快捷监听”用于只测试上方请求区的单个选择器;它与多行监听使用同一个会话集合,后一次提交 会覆盖前一次,而不是追加。

SDK 模式

用于验证推荐接入:

  • 自动退避重连。
  • 会话恢复。
  • 属性和变量订阅整批恢复。
  • 序号缺口检测与 onResyncRequired。

如果 EVCC 重启,SDK 模式应显示断开、等待重试、重新建立会话并恢复监听。 打开开发中心、EVCC 授权页或系统文件选择器后,Demo 会在返回前台时恢复此前由用户发起的 SDK 连接。

Raw AIDL 模式

直接调用 IEvccApi、IEvccApiSession 和 IEvccApiCallback:

  • 不自动重连。
  • 清楚显示 Binder 建立、会话、Parcelable 和回调步骤。
  • 适合确认问题位于客户端 SDK 还是底层服务。

Raw 模式断连后需要手动重绑,这是故意设计的调试行为,不是正式应用的推荐体验。 Demo 会保留最后一次监听请求并标记 needsReapply,方便重新连接后按原集合再次提交。

手机与车机布局

  • 手机竖屏按三个调试区依次纵向排列,页面和日志均可滚动,底部控制台不会被屏幕高度裁掉。
  • 车机或大屏横屏使用工作台与事件日志分栏,按钮、文字和点击区域会随屏幕密度与可用宽度调整。
  • 布局变化不改变会话和测试含义;对比两台设备时应以日志中的包名、UID、证书和授权集合区分客户端。

日志与安全

  • Demo 不申请网络、存储、Root、Car API 或 QUERY_ALL_PACKAGES。
  • Activity停止后解绑,不注册开机广播或后台常驻服务。
  • “最近一次请求 / 响应”和导出日志默认隐藏属性值与 Shell 输入输出;只有显式选择包含原始内容时才保留。
  • 写入、动作、全量扫描和 Shell 不进入默认自检,必须用户二次确认。
  • Demo 不预置危险命令或一键车辆控制。

独立编译成功只证明示例工程完整;跨 UID授权、撤权、订阅恢复、车辆属性和 APVP 行为仍须在真机验证。

API 1.1 音乐能力

Demo 1.1.0 增加“音乐与歌词”入口,支持 state/listen/stop/lyrics/artwork 和播放命令,validate 前缀进行预检查。SDK 与 Raw AIDL 两种模式均使用真实 Binder;资源预览最多显示 65536 字符。

API 1.2 音量组

SDK 和 Demo 1.2.0 提供查询、读取、设置和增减,包含 Java/Kotlin 示例。先确认协议与独立音量权限;旧服务返回 UNSUPPORTED,重连不重放写入。见音量组接入说明。