CarService的构成和初始化分析

以下分析,基于安卓13的AAOS。

相关代码路径

packages/services/CarCarService相关代码,主要是在这个目录下
frameworks/opt/car/services主要是carservice启动相关
device/generic/cardevice/generic/car/emulator/audio目录下有原生的audio配置文件audio_policy_configuration.xml和car_audio_configuration.xml
hardware/interfaces/automotive/vehicle/2.0/property相关的types.hal在这个目录,编译packages/services/Car/service时是依赖这些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进system/framework/之后,重启即可生效。注意这个jar包是不能给APP使用的,其在Android Studio中看到内容如下图

修改VehiclePropertyIds.java等文件后,一般要提供给APP的jar包路径/out/soong/.intermediates/packages/services/Car/car-lib/android.car/android_common/javac/android.car.jar

也可以使用/out/target/common/obj/JAVA_LIBRARIES/android.car_intermediates/classes.jar

通过md5值比对后可以确定,上面2个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
  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值