ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 9.0 CarService 分析

2022-02-09 15:01:06  阅读:603  来源: 互联网

标签:SERVICE ICarImpl car private public new Android 9.0 CarService


一. CarService 启动流程:

1. 启动流程图

 2. SystemServer -> CarServiceHelperService -> CarService

 最终在 CarServiceHelperService 中通过 bindServiceAsUser 启动 CarService

frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
  private static final String CAR_SERVICE_HELPER_SERVICE_CLASS =
      "com.android.internal.car.CarServiceHelperService";
  private void run() {
    startBootstrapServices();
    startCoreServices();
    startOtherServices();
    SystemServerInitThreadPool.shutdown();
  }

  private void startOtherServices() {
    mActivityManagerService.systemReady(() -> {
      mSystemServiceManager.startBootPhase(
          SystemService.PHASE_ACTIVITY_MANAGER_READY);
      if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
        mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
      }
    }
  }
}

frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java
public class CarServiceHelperService extends SystemService {
  private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";
  @Override
  public void onStart() {
    Intent intent = new Intent();
    intent.setPackage("com.android.car");
    intent.setAction(CAR_SERVICE_INTERFACE);
    getContext().bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE,
                UserHandle.SYSTEM)
    System.loadLibrary("car-framework-service-jni");
  }
}

 3. CarService -> ICarImpl -> Car 相关的 services

 通过 ICarImpl 实现

ackages/services/Car/service/src/com/android/car/CarService.java
package com.android.car;
public class CarService extends Service {
  private ICarImpl mICarImpl;
  private IVehicle mVehicle;
 
  public void onCreate() {
    mVehicle = getVehicle();
    mICarImpl = new ICarImpl(this,
                mVehicle,
                SystemInterface.Builder.defaultSystemInterface(this).build(),
                mCanBusErrorNotifier,
                mVehicleInterfaceName);
    mICarImpl.init();
    ServiceManager.addService("car_service", mICarImpl);
    super.onCreate();
  }
  
  @Override
  public IBinder onBind(Intent intent) {
    return mICarImpl;
  }
}

4. ICarImpl 启动 特定的 CarXXXServices,如 CarPowerManagementService/CarPropertyService 等

 

packages/services/Car/service/src/com/android/car/ICarImpl.java
public class ICarImpl extends ICar.Stub {
  private final CarPowerManagementService mCarPowerManagementService;
  private final CarPropertyService mCarPropertyService;
  private final CarServiceBase[] mAllServices;
 
  public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
            CanBusErrorNotifier errorNotifier, String vehicleInterfaceName) {
    mHal = new VehicleHal(vehicle);
    mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),systemInterface);
    // mHal.getPropertyHal() -> PropertyHalService
    mCarPropertyService = new CarPropertyService(serviceContext, mHal.getPropertyHal());
    mCarAudioService = new CarAudioService(serviceContext, mCarPowerManagementService,
        mCarPropertyService);
    
    List<CarServiceBase> allServices = new ArrayList<>();
    allServices.add(mCarPowerManagementService);
    allServices.add(mCarPropertyService);
    allServices.add(mCarAudioService);
    mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);
  }
  
  @Override
  public IBinder getCarService(String serviceName) {
    switch (serviceName) {
      case Car.CABIN_SERVICE:
      case Car.HVAC_SERVICE:
        return mCarPropertyService;
    }
  }
}

标签:SERVICE,ICarImpl,car,private,public,new,Android,9.0,CarService
来源: https://blog.csdn.net/SHK242673/article/details/122841640

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有