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回调中执行,确保主线程零阻塞。