以下分析,基于安卓13的AAOS。
代码构成
packages/services/Car CarService相关代码,主要是在这个目录下
frameworks/opt/car/services 主要是carservice启动相关。
其它目录:audio_policy_configuration.xml和car_audio_configuration.xml;property相关的types.hal。
相关产物
packages/services/Car/service-builtin的产物为/system/priv-app/CarService/CarService.apk
packages/services/Car/service的产物为/system/priv-app/CarServiceUpdatableNonModule/CarServiceUpdatableNonModule.apk
packages/services/Car/car-lib编译完成后,打印的日志显示产物为out/target/product/qssi/system/framework/android.car.jar。同事反馈,在其中修改代码后,编译并将android.car.jar文件push进系统即可。但我实测在CarPropertyManager.java中添加日志,编译并push后并未生效,甚至将out/target/product/qssi/system/framework/中所有产物push进去也无效。目前修改car-lib后,还是采用整体编译的方式进行验证。注意这个jar包是不能给APP使用的,其在Android Studio中看到内容如下图
修改接口文件后,一般要提供给APP的jar包/out/soong/.intermediates/packages/services/Car/car-lib/android.car/android_common/javac/android.car.jar
这个jar包可以用来import android.car.Car;在Android Studio中看到内容如下图
启动流程
SystemServer 会在启动系统服务的过程中依据 FEATURE_AUTOMOTIVE 的特性决定是否启动 AAOS 的系统服务 CarServiceHelperService。后续流程见下图。
上图中已经画出关键的调用链,就不再赘述。以下只说明其中个别重点步骤。
CarServiceHelperServiceUpdatableImpl的onStart中通过bindService() 绑定 action 为 “android.car.ICar”、package 为 “com.android.car” 的 Service,即 CarService 组件(可以在Car\service-builtin\AndroidManifest.xml中看到“.CarService”的intent-filter为android.car.ICar)。
CarService 的实现都在父类 ServiceProxy 中,比如首先被调用的 onCreate()。
ServiceProxy在Car/service-builtin目录。它通过java的反射,调用Car/service的CarServiceImpl。通过adb shell pm list packages -f命令可以看到,CarService.apk(com.android.car)和CarServiceUpdatableNonModule.apk(com.android.car.updatable)都被系统安装了。但ps -A可以看到,只有com.android.car的进程。
CarServiceImpl的init()中会启动所有服务。上图中只画出CarPropertyService举例,实际上此时启动的还有CarAudioService,CarInputService,CarPowerManagementService等所有服务。
附上上面CarService启动流程图的plantuml代码
@startuml 'https://plantuml.com/sequence-diagram autonumber SystemServer -> CarServiceHelperService: mSystemServiceManager.startService CarServiceHelperService -> CarServiceHelperServiceUpdatable: onStart CarServiceHelperServiceUpdatable -> CarServiceHelperServiceUpdatableImpl: onStart '绑定服务,进入carservice进程 CarServiceHelperServiceUpdatableImpl -> CarService : bindService CarService -> ServiceProxy : onCreate ServiceProxy -> ServiceProxy : init '通过java的反射,调用CarServiceImpl ServiceProxy -> CarServiceImpl : onCreate CarServiceImpl -> ICarImpl : init 'ICarImpl中启动所有子服务,例如CarPropertyService ICarImpl -> CarPropertyService : init @enduml