本文基于Android 13对Automotive中的CarService启动过程进行分析
最近在学习Android Automotive车机应用开发,其中CarService是Automotive中的核心Service,车机应用几乎每时每刻都在和CarService交互,因此分析CarService的启动过程能够对车机应用开发有一些帮助,特地记录一下。
1. SystemServer
由于SystemServer是系统启动后最先启动的进程,因此从这里开始入手。
首先是SystemServer的入口:
frameworks/base/services/java/com/android/server/SystemServer.java
通过这个main函数,创建了一个SystemServer的对象,并调用了它的run方法:
在run方法中,启动了系统的各种服务,而CarService是在startOtherServices()中启动的,所以接着看一下这个startOtherServices:
在startOtherServices中,通过SystemServiceManager的startService方法启动了一个CarServiceHelperService,也就是常量CAR_SERVICE_HELPER_SERVICE_CLASS对应的Service:
2. SystemServiceManager
在SystemServiceManager中的startService中,首先通过className去加载了CarServiceHelperService这个Class:
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
紧接着反射创建了一个CarServiceHelperService的对象:
然后调用了该service对象的onStart()方法:
因此,下一步我们转到CarServiceHelperService的onStart()方法中继续分析。
3. CarServiceHelperService
frameworks/opt/car/services/builtInServices/src/com/android/internal/car/CarServiceHelperService.java
在CarServiceHelperService的onStart()中,直接调用了mCarServiceHelperServiceUpdatable.onStart(),那这个CarServiceHelperServiceUpdatable是啥呢?
从CarServiceHelperService构造方法中可以看到,mCarServiceHelperServiceUpdatable是通过反射创建的一个CarServiceHelperServiceUpdatableImpl对象。
接着来看一下CarServiceHelperServiceUpdatableImpl的onStart方法。
4. CarServiceHelperServiceUpdatableImpl
frameworks/opt/car/services/updatableServices/src/com/android/internal/car/updatable/CarServiceHelperServiceUpdatableImpl.java
packages/services/Car/service-builtin/AndroidManifest.xml
在onStart中,通过bindService隐式启动了Intent为android.car.ICar的Service,而注册这个Intent的正是CarService。
5. CarService
通过前面的bindService,CarService就启动起来了。
通过bindService启动的Service,生命周期为:onCreate()->onBind(),下面来看看CarService的具体实现。
packages/services/Car/service-builtin/src/com/android/car/CarService.java
可以看出,CarService只是简单继承了ServiceProxy,真正干活的是ServiceProxy,同时在CarService的构造函数中,把CarService的真正的实现类的名字传给了ServiceProxy。
下面来看一下ServiceProxy:
packages/services/Car/service-builtin/src/com/android/car/ServiceProxy.java
ServiceProxy人如其名,是一个代理,真正干活的是咱们传进来的CarServiceImpl,在onCreate方法中调用了init()方法,随后在init方法中反射创建了CarServiceImpl的对象保存在mRealService中,然后在各个生命周期的方法中调用mRealService的生命周期方法,完成转发。
6. CarServiceImpl
CarServiceImpl作为CarService背后真正的大佬,在其内部创建并持有ICarImpl对象,而这个ICarImpl负责管理车载系统中的各种服务,如CarAudioService、CarPowerManagementService、CarPropertyService等。
packages/services/Car/service/src/com/android/car/CarServiceImpl.java
可以看到,在CarServiceImpl的onCreate()方法中,创建了一个VehicleStub对象,接着利用这个VehicleStub对象创建了一个ICarImpl对象,然后调用了ICarImpl的init方法进行初始化。
7. ICarImpl
接下来看看ICarImpl的构造方法,构造方法很长,在这里面依次创建了各种车载的Service服务对象,其中就有我们常用的CarPropertyService,然后把它们都保存在了allServices这个List里面。
从这里也能看出,车载的众多Service服务如CarPropertyService其实并不是系统的Service组件,只是名称里面带有Service,只是一些普通对象。
packages/services/Car/service/src/com/android/car/ICarImpl.java
接下来看init()方法:
init方法就简单多了,循环刚刚保存的所有Service列表,然后分别调用它们的init方法,由此完成了所有车载Service的初始化。
8. 总结
综上所述,CarService的启动过程还是很简单的,通过CarService的启动,从而使得CarServiceImpl被启动,随后在CarServiceImpl内部创建并持有ICarImpl对象,而在ICarImpl对象的内部众多车载的服务也就跟着创建并初始化,再之后便可通过car-lib提供的CarApi获取这些车载服务,从而完成车机应用与系统服务的交互。