本文根据Android 13对Automotive中的CarService发动进程进行剖析

最近在学习Android Automotive车机使用开发,其间CarService是Automotive中的核心Service,车机使用几乎每时每刻都在和CarService交互,因此剖析CarService的发动进程能够对车机使用开发有一些帮助,特别记录一下。

1. SystemServer

因为SystemServer是体系发动后最先发动的进程,因此从这儿开始下手。

首先是SystemServer的入口:

frameworks/base/services/java/com/android/server/SystemServer.java

Android Automotive中的CarService启动过程分析

经过这个main函数,创立了一个SystemServer的目标,并调用了它的run办法:

Android Automotive中的CarService启动过程分析

在run办法中,发动了体系的各种服务,而CarService是在startOtherServices()中发动的,所以接着看一下这个startOtherServices:

Android Automotive中的CarService启动过程分析

在startOtherServices中,经过SystemServiceManager的startService办法发动了一个CarServiceHelperService,也便是常量CAR_SERVICE_HELPER_SERVICE_CLASS对应的Service:

Android Automotive中的CarService启动过程分析

2. SystemServiceManager

在SystemServiceManager中的startService中,首先经过className去加载了CarServiceHelperService这个Class:

frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

Android Automotive中的CarService启动过程分析

紧接着反射创立了一个CarServiceHelperService的目标:

Android Automotive中的CarService启动过程分析

然后调用了该service目标的onStart()办法:

Android Automotive中的CarService启动过程分析

因此,下一步咱们转到CarServiceHelperService的onStart()办法中继续剖析。

3. CarServiceHelperService

frameworks/opt/car/services/builtInServices/src/com/android/internal/car/CarServiceHelperService.java

Android Automotive中的CarService启动过程分析

在CarServiceHelperService的onStart()中,直接调用了mCarServiceHelperServiceUpdatable.onStart(),那这个CarServiceHelperServiceUpdatable是啥呢?

Android Automotive中的CarService启动过程分析

Android Automotive中的CarService启动过程分析

从CarServiceHelperService结构办法中能够看到,mCarServiceHelperServiceUpdatable是经过反射创立的一个CarServiceHelperServiceUpdatableImpl目标。

接着来看一下CarServiceHelperServiceUpdatableImpl的onStart办法。

4. CarServiceHelperServiceUpdatableImpl

frameworks/opt/car/services/updatableServices/src/com/android/internal/car/updatable/CarServiceHelperServiceUpdatableImpl.java

Android Automotive中的CarService启动过程分析

Android Automotive中的CarService启动过程分析

packages/services/Car/service-builtin/AndroidManifest.xml

Android Automotive中的CarService启动过程分析

在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

Android Automotive中的CarService启动过程分析

Android Automotive中的CarService启动过程分析

能够看出,CarService仅仅简单继承了ServiceProxy,真实干活的是ServiceProxy,同时在CarService的结构函数中,把CarService的真实的完结类的名字传给了ServiceProxy。

下面来看一下ServiceProxy:

packages/services/Car/service-builtin/src/com/android/car/ServiceProxy.java

Android Automotive中的CarService启动过程分析

Android Automotive中的CarService启动过程分析

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

Android Automotive中的CarService启动过程分析

能够看到,在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

Android Automotive中的CarService启动过程分析

接下来看init()办法:

Android Automotive中的CarService启动过程分析

init办法就简单多了,循环刚刚保存的一切Service列表,然后分别调用它们的init办法,由此完结了一切车载Service的初始化。

8. 总结

综上所述,CarService的发动进程仍是很简单的,经过CarService的发动,从而使得CarServiceImpl被发动,随后在CarServiceImpl内部创立并持有ICarImpl目标,而在ICarImpl目标的内部很多车载的服务也就跟着创立并初始化,再之后便可经过car-lib提供的CarApi获取这些车载服务,从而完结车机使用与体系服务的交互。