Create Car ANR 警告

背景

android.car.Car 的几个 createCar 方法,有可能 block 当前现场,从而造成 ANR 问题的可能。

主要注意点

android.car.Car#createCar(android.content.Context, android.os.Handler)

假如 CarService 没有及时 init 完成,App 调用该方法最多可能被 block 5000ms,导致 ANR。

android.car.Car#createCar(android.content.Context, android.os.Handler, long, android.car.Car.CarServiceLifecycleListener)

参数 waitTimeoutMs (long) 的使用
  • 使用 Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER (-1) 做 createCar 的同步调用,虽然这样写代码会比较方便,但是会导致不可预知的等待时间。
  • 建议使用 Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT (0) 做异步调用,在 CarServiceLifecycleListener 中来做 CarXxxxManager 的初始化。

部分 APP 可能为了方便写同步调用,会将 waitTimeoutMs 传递为一个较大的固定值(如 5000ms 或更长)以避免 CarNotConnectedException。这种做法在生产环境中极其危险:一旦 CarService 启动变慢(例如系统冷启动、车机重启后首次初始化、CarService 自身异常重连),主线程被长时间 block 即触发 ANR。

⚠️ 最佳实践:始终使用 CAR_WAIT_TIMEOUT_DO_NOT_WAIT 异步模式,将所有 CarXxxxManager 的获取与初始化逻辑放到 CarServiceLifecycleListener.onLifecycleChanged 回调中执行,确保主线程零阻塞。