Android车载 CarFrameWork——carservice启动流程
创始人
2025-05-28 11:03:03
0

carservice启动流程

大致流程:

  1. SystemServer启动CarServiceHelperService服务
  2. 在调用startService后,CarServiceHelperService的onStart方法通过bindService的方式启动CarService(一个系统级别的APK,位于system/priv-app)
  3. 启动CarService后首先调用onCreate,创建ICarImpl对象并初始化,在此时创建了一系列car相关的核心服务,并遍历init初始化
  4. 然后调用onBind将该ICarImpl对象返回给CarServiceHelperService,CarServiceHelperService在内部的一个Binder对象ICarServiceHelperImpl传递给CarService,建立双向跨进程

序列图

启动CarServiceHelperService服务

frameworks/base/services/java/com/android/server/SystemServer.java - run() —-> startOtherServices()

    private static final String CAR_SERVICE_HELPER_SERVICE_CLASS ="com.android.internal.car.CarServiceHelperService";......if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {traceBeginAndSlog("StartCarServiceHelperService");mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);traceEnd();}

—–> frameworks/base/services/core/java/com/android/server/SystemServiceManager.java - startService

    @SuppressWarnings("unchecked")public SystemService startService(String className) {....return startService(serviceClass);}
​public  T startService(Class serviceClass) {...startService(service);...}
​public void startService(@NonNull final SystemService service) {......try {service.onStart();...}

绑定carservice服务

—–> frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java - onStart()

    //这就是系统中和汽车相关的核心服务CarService,相关源代码在packages/services/Car/service目录下private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";
​@Overridepublic void onStart() {Intent intent = new Intent();intent.setPackage("com.android.car");  //绑定包名,设置广播仅对该包有效//绑定action,表明想要启动能够响应设置的这个action的活动,并在清单文件AndroidManifest.xml中设置action属性intent.setAction(CAR_SERVICE_INTERFACE);//绑定后回调if (!getContext().bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE,UserHandle.SYSTEM)) {Slog.wtf(TAG, "cannot start car service");}System.loadLibrary("car-framework-service-jni");}
  • service源码路径:packages/services/Car/service/AndroidManifest.xml

sharedUserId是系统级别的,类似SystemUI,它编译出来同样是一个APK文件

设备文件路径在: /system/priv-app/CarService/CarService.apk

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

bindService启动流程

context.bindService()  ——> onCreate()  ——> onBind()  ——> Service running  ——> onUnbind()  ——> onDestroy()  ——> Service stop

onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestroy

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestroy在一个生命周期中只能被调用一次

Car Service启动

onCreate

——–> packages/services/Car/service/src/com/android/car/CarService.java - onCreate()

创建ICarImpl实例

    @Nullableprivate static IVehicle getVehicle() {try {//该service启动文件hardware/interfaces/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-service.rcreturn android.hardware.automotive.vehicle.V2_0.IVehicle.getService();} ....return null;}
​@Overridepublic void onCreate() {Log.i(CarLog.TAG_SERVICE, "Service onCreate");//获取hal层的Vehicle servicemVehicle = getVehicle();
​//创建ICarImpl实例mICarImpl = new ICarImpl(this,mVehicle,SystemInterface.Builder.defaultSystemInterface(this).build(),mCanBusErrorNotifier,mVehicleInterfaceName);//然后调用ICarImpl的init初始化方法mICarImpl.init();//设置boot.car_service_created属性SystemProperties.set("boot.car_service_created", "1");
​linkToDeath(mVehicle, mVehicleDeathRecipient);//最后将该service注册到ServiceManagerServiceManager.addService("car_service", mICarImpl);super.onCreate();}
//packages/services/Car/service/src/com/android/car/ICarImpl.javaprivate final VehicleHal mHal;//构造函数启动一大堆服务public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,CanBusErrorNotifier errorNotifier, String vehicleInterfaceName) {mContext = serviceContext;mSystemInterface = systemInterface;//创建VehicleHal对象mHal = new VehicleHal(vehicle);mVehicleInterfaceName = vehicleInterfaceName;mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),systemInterface);mCarPropertyService = new CarPropertyService(serviceContext, mHal.getPropertyHal());.....//InstrumentClusterService service启动mInstrumentClusterService = new InstrumentClusterService(serviceContext,mAppFocusService, mCarInputService);mSystemStateControllerService = new SystemStateControllerService(serviceContext,mCarPowerManagementService, mCarAudioService, this);mPerUserCarServiceHelper = new PerUserCarServiceHelper(serviceContext);// mCarBluetoothService = new CarBluetoothService(serviceContext, mCarPropertyService,//        mPerUserCarServiceHelper, mCarUXRestrictionsService);mVmsSubscriberService = new VmsSubscriberService(serviceContext, mHal.getVmsHal());mVmsPublisherService = new VmsPublisherService(serviceContext, mHal.getVmsHal());mCarDiagnosticService = new CarDiagnosticService(serviceContext, mHal.getDiagnosticHal());mCarStorageMonitoringService = new CarStorageMonitoringService(serviceContext,systemInterface);mCarConfigurationService =new CarConfigurationService(serviceContext, new JsonReaderImpl());mUserManagerHelper = new CarUserManagerHelper(serviceContext);
​//注意排序,service存在依赖List allServices = new ArrayList<>();allServices.add(mSystemActivityMonitoringService);allServices.add(mCarPowerManagementService);allServices.add(mCarPropertyService);allServices.add(mCarDrivingStateService);allServices.add(mCarUXRestrictionsService);allServices.add(mCarPackageManagerService);allServices.add(mCarInputService);allServices.add(mCarLocationService);allServices.add(mGarageModeService);allServices.add(mAppFocusService);allServices.add(mCarAudioService);allServices.add(mCarNightService);allServices.add(mInstrumentClusterService);allServices.add(mCarProjectionService);allServices.add(mSystemStateControllerService);// allServices.add(mCarBluetoothService);allServices.add(mCarDiagnosticService);allServices.add(mPerUserCarServiceHelper);allServices.add(mCarStorageMonitoringService);allServices.add(mCarConfigurationService);allServices.add(mVmsSubscriberService);allServices.add(mVmsPublisherService);
​if (mUserManagerHelper.isHeadlessSystemUser()) {mCarUserService = new CarUserService(serviceContext, mUserManagerHelper);allServices.add(mCarUserService);}
​mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);}
​@MainThreadvoid init() {traceBegin("VehicleHal.init");mHal.init();traceEnd();traceBegin("CarService.initAllServices");//启动的所有服务遍历调用init初始化(各个都继承了CarServiceBase)for (CarServiceBase service : mAllServices) {service.init();}traceEnd();}

onBind

将上面onCreate创建的mICarImpl对象返回:

  1. onBind()回调方法会继续传递通过bindService()传递来的intent对象(即上面的bindServiceAsUser方法)
  2. onUnbind()会处理传递给unbindService()的intent对象。如果service允许绑定,onBind()会返回客户端与服务互相联系的通信句柄
//packages/services/Car/service/src/com/android/car/CarService.java@Overridepublic IBinder onBind(Intent intent) {return mICarImpl;}

所以此处的mICarImpl会作为IBinder返回给CarServiceHelperService.java - bindServiceAsUser方法中的参数mCarServiceConnection(回调)

onDestroy

释放mICarImpl创建的资源,包含一系列的服务:

    @Overridepublic void onDestroy() {Log.i(CarLog.TAG_SERVICE, "Service onDestroy");mICarImpl.release();mCanBusErrorNotifier.removeFailureReport(this);
​if (mVehicle != null) {try {mVehicle.unlinkToDeath(mVehicleDeathRecipient);mVehicle = null;} catch (RemoteException e) {// Ignore errors on shutdown path.}}
​super.onDestroy();}

回调ServiceConnection

ICarImpl初始化完毕,会作为IBinder返回给CarServiceHelperService.java - bindServiceAsUser方法中绑定此服务的mCarServiceConnection(回调)

mCarServiceConnection初始化如下:

  1. 其中返回的ICarImpl被保存在了CarServiceHelperService的mCarService
  2. mCarService.transact跨进程通信,调用ICar.aidl中定义的第一个方法setCarServiceHelper
//frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java
private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";
private IBinder mCarService;
private final ICarServiceHelperImpl mHelper = new ICarServiceHelperImpl();
​
private final ServiceConnection mCarServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {Slog.i(TAG, "**CarService connected**");//1. 返回的ICarImpl被保存在了CarServiceHelperService的mCarServicemCarService = iBinder;// Cannot depend on ICar which is defined in CarService, so handle binder call directly// instead. // void setCarServiceHelper(in IBinder helper)Parcel data = Parcel.obtain();data.writeInterfaceToken(CAR_SERVICE_INTERFACE);//将ICarServiceHelperImpl类型的对象作为数据跨进程传递data.writeStrongBinder(mHelper.asBinder());try {//2.跨进程传输//对端是mCarService即ICarImpl,调用binder的transact进行跨进程通信//其code代表需要调用的对端方法,data为携带的传输数据//FIRST_CALL_TRANSACTION  = 0x00000001,即调用对端ICar.aidl中定义的第一个方法setCarServiceHelpermCarService.transact(IBinder.FIRST_CALL_TRANSACTION, // setCarServiceHelperdata, null, Binder.FLAG_ONEWAY);} catch (RemoteException e) {Slog.w(TAG, "RemoteException from car service", e);handleCarServiceCrash();}}
​@Override public void onServiceDisconnected(ComponentName componentName) {handleCarServiceCrash();}};

跨进程setCarServiceHelper

    @Overridepublic void setCarServiceHelper(IBinder helper) {int uid = Binder.getCallingUid();if (uid != Process.SYSTEM_UID) {throw new SecurityException("Only allowed from system");}synchronized (this) {//将ICarServiceHelper的代理端保存在ICarImpl内部mICarServiceHelpermICarServiceHelper = ICarServiceHelper.Stub.asInterface(helper);//同时也传给了SystemInterface//此时他们有能力跨进程访问CarServiceHelperServicemSystemInterface.setCarServiceHelper(mICarServiceHelper);}}

相关内容

热门资讯

吕文君社媒庆祝夺冠:不只是海港... 2025赛季中超联赛于昨日正式落幕,上海海港队凭借出色的表现,成功捧起了冠军奖杯,成为了中超历史上又...
日本政府顾问:无需等到160关... 日本政府顾问表示,高市早苗政府对日元干预将采取更积极姿态,以抑制日元疲软带来的通胀压力,干预门槛可能...
被摄影师起诉侵权 视觉中国公开... 来源:每日经济新闻 持续两年多的摄影师起诉视觉中国(000681.SZ)侵权一案近日迎来进展。 法...
《哪吒2》被质疑过多使用动捕技... 搜狐娱乐讯 22日,奥斯卡公开的最佳动画长片奖“符合参评资格”大名单中没有《哪吒之魔童闹海》,引发热...
为了少付合同款,湖南一公司诉讼... 华声在线11月23日讯(文/视频 全媒体记者 杨昱 通讯员 胡云淞)为了少支付40万元合同款及利息,...
原创 退... 在机关事业单位养老保险制度从2014年10月1日开始实施之后,标志着我国退休的制度的并轨。之所以会称...
从“纸上政策”到“落地实效” ... 在建湖县高新技术园区,文辰精密科技有限公司的生产车间内机器轰鸣,工人们正忙着赶制新一批订单。这家专注...
跨省办公更便捷!京津冀律师驿站... 11月22日至23日,京津冀律师驿站在北京启动“百千万行动计划”,计划通过建立百家律所联系点,推动千...
梅花生物:因侵害专利权被味之素... 北京商报讯(记者 郭秀娟 王悦彤) 11月23日,北京商报记者获悉,近日梅花生物发布公告称,公司及全...
吉林益豆食品有限公司:依托互市... 珲春地处中、俄、朝三国交界,得天独厚的地理位置,使其成为连接东北亚的“黄金通道”。在这里,吉林益豆食...