IVICarService启动

Posted xhBruce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IVICarService启动相关的知识,希望对你有一定的参考价值。

【IVI】CarService启动

android12-release
Android Automotive OS知识体系
Android 知识体系


1、CarServiceHelperService中绑定CarService

【IVI】CarServiceHelperService启动
frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java

  • mContext.bindServiceAsUser(intent, mCarServiceConnection, ...) 绑定服务CarService,绑定流程可参考 bindService启动过程-Android12
  • 其中Intent中包名为"com.android.car"、action为"android.car.ICar"packages/services/Car/car-lib/src/com/android/car/internal/common/CommonConstants.java
  • 对应packages/services/Car/service/AndroidManifest.xml
public void onStart() 
    EventLog.writeEvent(EventLogTags.CAR_HELPER_START);

    IntentFilter filter = new IntentFilter(Intent.ACTION_REBOOT);
    filter.addAction(Intent.ACTION_SHUTDOWN);
    mContext.registerReceiverForAllUsers(mShutdownEventReceiver, filter, null, null);
    mCarWatchdogDaemonHelper.addOnConnectionChangeListener(mConnectionListener);
    mCarWatchdogDaemonHelper.connect();
    Intent intent = new Intent();
    intent.setPackage("com.android.car");
    intent.setAction(CAR_SERVICE_INTERFACE);
    if (!mContext.bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE,
            mHandler, UserHandle.SYSTEM)) 
        Slogf.wtf(TAG, "cannot start car service");
    
    loadNativeLibrary();

2、绑定CarService


packages/services/Car/service/src/com/android/car/CarService.java

  • mVehicle = getVehicle() 通过IVehicle.hal连接HAL层 VehicleHal
  • mICarImpl = new ICarImpl(this, mVehicle, ...) 关于Car车载各种服务实质实在这里初始化
  • ServiceManager.addService("car_service", mICarImpl) 添加car_service服务到/dev/binder
    public void onCreate() 
        LimitedTimingsTraceLog initTiming = new LimitedTimingsTraceLog(CAR_SERVICE_INIT_TIMING_TAG,
                Trace.TRACE_TAG_SYSTEM_SERVER, CAR_SERVICE_INIT_TIMING_MIN_DURATION_MS);
        initTiming.traceBegin("CarService.onCreate");

        initTiming.traceBegin("getVehicle");
        mVehicle = getVehicle();
        initTiming.traceEnd();

        EventLog.writeEvent(EventLogTags.CAR_SERVICE_CREATE, mVehicle == null ? 0 : 1);

        if (mVehicle == null) 
            throw new IllegalStateException("Vehicle HAL service is not available.");
        
        try 
            mVehicleInterfaceName = mVehicle.interfaceDescriptor();
         catch (RemoteException e) 
            throw new IllegalStateException("Unable to get Vehicle HAL interface descriptor", e);
        

        Slog.i(CarLog.TAG_SERVICE, "Connected to " + mVehicleInterfaceName);
        EventLog.writeEvent(EventLogTags.CAR_SERVICE_CONNECTED, mVehicleInterfaceName);

        mICarImpl = new ICarImpl(this,
                mVehicle,
                SystemInterface.Builder.defaultSystemInterface(this).build(),
                mVehicleInterfaceName);
        mICarImpl.init();

        linkToDeath(mVehicle, mVehicleDeathRecipient);

        ServiceManager.addService("car_service", mICarImpl);
        SystemProperties.set("boot.car_service_created", "1");

        super.onCreate();

        initTiming.traceEnd(); // "CarService.onCreate"
    

2.1 ICarImpl初始化各种服务

packages/services/Car/service/src/com/android/car/ICarImpl.java

  • VehicleHal mHal 主要连接HAL层:PowerHalService、PropertyHalService、InputHalService、VmsHalService、UserHalService、DiagnosticHalService、ClusterHalService、EvsHalService、HalClient
  • 创建并初始化init()各种服务,如SystemActivityMonitoringServiceCarPowerManagementServiceCarPackageManagerServiceCarInputServiceCarPropertyService、``等
  • 通过constructWithTrace()将相关服务添加到CarLocalServices
ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
        String vehicleInterfaceName,
        @Nullable CarUserService carUserService,
        @Nullable CarWatchdogService carWatchdogService,
        @Nullable ICarPowerPolicySystemNotification powerPolicyDaemon) 
    LimitedTimingsTraceLog t = new LimitedTimingsTraceLog(
            CAR_SERVICE_INIT_TIMING_TAG, Trace.TRACE_TAG_SYSTEM_SERVER,
            CAR_SERVICE_INIT_TIMING_MIN_DURATION_MS);
    t.traceBegin("ICarImpl.constructor");

    mContext = serviceContext;
    mSystemInterface = systemInterface;
    CarLocalServices.addService(SystemInterface.class, mSystemInterface);
    mHal = constructWithTrace(t, VehicleHal.class,
            () -> new VehicleHal(serviceContext, vehicle));

    t.traceBegin("VHAL.earlyInit");
    // 。。。。。。
    mFeatureController = constructWithTrace(t, CarFeatureController.class,
            () -> new CarFeatureController(serviceContext, defaultEnabledFeatures,
                    disabledFromVhal, mSystemInterface.getSystemCarDir()));
    mVehicleInterfaceName = vehicleInterfaceName;
    mCarPropertyService = constructWithTrace(
            t, CarPropertyService.class,
            () -> new CarPropertyService(serviceContext, mHal.getPropertyHal()));
    // 。。。。。。
    if (mFeatureController.isFeatureEnabled(Car.CAR_EVS_SERVICE)) 
        mCarEvsService = constructWithTrace(t, CarEvsService.class,
                () -> new CarEvsService(serviceContext, mHal.getEvsHal(), mCarPropertyService));
     else 
        mCarEvsService = null;
    

    if (mFeatureController.isFeatureEnabled(Car.CAR_TELEMETRY_SERVICE)) 
        mCarTelemetryService = new CarTelemetryService(serviceContext);
     else 
        mCarTelemetryService = null;
    

    // Be careful with order. Service depending on other service should be inited later.
    List<CarServiceBase> allServices = new ArrayList<>();
    allServices.add(mFeatureController);
    // 。。。。。。
    mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);

    mICarSystemServerClientImpl = new ICarSystemServerClientImpl();

    t.traceEnd(); // "ICarImpl.constructor"


void init() 
    LimitedTimingsTraceLog t = new LimitedTimingsTraceLog(CAR_SERVICE_INIT_TIMING_TAG,
            Trace.TRACE_TAG_SYSTEM_SERVER, CAR_SERVICE_INIT_TIMING_MIN_DURATION_MS);

    t.traceBegin("ICarImpl.init");

    t.traceBegin("VHAL.init");
    mHal.init();
    t.traceEnd();

    t.traceBegin("CarService.initAllServices");
    for (CarServiceBase service : mAllServices) 
        t.traceBegin(service.getClass().getSimpleName());
        service.init();
        t.traceEnd();
    
    t.traceEnd(); // "CarService.initAllServices"

    t.traceEnd(); // "ICarImpl.init"

2.2 添加到CarLocalServices中服务列举

服务说明
SystemInterface包含对CarService和Android OS API之间所有不同包装器接口的引用
VehicleHal车辆HAL抽象。此类处理与本机HAL的接口,并对接收的数据进行基本解析(类型检查)。然后将每个事件发送到相应的HalServiceBase实现。HalServiceBase负责将数据转换为相应的Car*ServiceCar*Manager API
CarFeatureController控制汽车feature。
CarPropertyService此类实现ICarProperty.aidl的绑定器接口。帮助更容易地创建多个管理者来处理Vehicle Properties。此类中的属性ID是管理器级别的ID。
CarDrivingStateService推断车辆当前驾驶状态的服务。它通过聆听CarPropertyService的相关属性来计算驾驶状态
CarUxRestrictionsManagerService侦听车辆当前驾驶状态并将其映射到该驾驶状态的相应UX限制的服务。
UX限制配置,尝试读取保存在R.xml.car_ux_restrictions_map中的配置。
Multi-Display,多显示器仅识别服务初始化时可用的物理显示,此服务不支持可插拔显示器。
CarUserService汽车用户服务。在引导时管理用户。
1、创建用作驱动程序的用户。
2、创建用作乘客的用户。
3、首次运行时创建辅助管理员用户。
4、切换驱动器。
CarOccupantZoneService用于实现CarOccupantZoneManager API的服务。
SystemActivityMonitoringService监控AMS以启动新Activity或Service。
CarPowerManagementService汽车电源管理服务等级。控制电源状态并与系统的其他部分交互,以确保其自身状态。
CarUserNoticeService向用户显示初始通知UI的服务。它仅在启用该设置时启动,并根据用户的请求自行关闭UI(=服务)。
显示通知界面的条件包括:
1. 冷启动
2. 轿厢电源状态变为ON(发生在从暂停到RAM的唤醒过程中)
OccupantAwarenessService跨HAL边界侦听乘员感知检测系统的服务,并通过Android.car.occupatantawareness.OccupantAwarenessManager将数据公开给Android中的系统客户端。
服务公开以下检测类型:
存在检测,检测每个座椅位置是否有人。
凝视检测,检测乘员正在查看的位置以及他们查看指定目标的时间。
驾驶员监控,检测驾驶员是否在路上或越野,以及他们在路上看了多久。
CarPackageManagerService车载PMS管理
PerUserCarServiceHelper帮助实现以下功能的Helper类:
1.提供将PerUserCarService绑定/取消绑定为当前用户的方法
2.设置UserSwitch Broadcasts侦听器,并调用已注册回调的客户端。
CarBluetoothService车载蓝牙服务-维护当前用户的蓝牙设备和配置文件连接。为每个用户创建:
1)一组BluetoothProfileDeviceManager对象,负责维护用户已知设备的列表。它们为给定配置文件的自动连接设备提供了一个接口。
2) BluetoothProfileInhibitManager对象,将为每个设备维护一组禁用的配置文件,防止设备连接到这些配置文件。这为请求和释放禁用提供了接口。
3) BluetoothDeviceConnectionPolicy对象,表示基于策略的方法的默认实现,该方法用于确定和请求自动连接设备的时间。如果选择实现自己的资源覆盖,则可以通过资源覆盖控制此默认值。为其他程序请求自动连接提供接口。
CarInputServiceCarInputService通过车辆HAL监控和处理输入事件。
CarProjectionService汽车投影服务允许绑定到投影应用程序以提高其优先级。它还支持计划应用程序处理语音操作请求。
GarageModeService汽车车库模式的主要服务容器。车库模式允许在车内空闲时间。
AppFocusService以App为中心的服务确保一次只有一个App类型的实例处于活动状态。
CarAudioservice负责与汽车音响系统交互的服务。
CarNightService用于处理用于将车辆设置为夜间模式的事件的类。
FixedActivityService监视显示的顶级活动,并确保在固定模式下的活动在崩溃或因任何原因进入后台时重新启动。
此组件还监视目标包的更新日期,并在更新完成后重新启动它。
ClusterNavigationService负责导航焦点管理和导航状态更改的服务。
InstrumentClusterService负责与汽车仪表盘交互的服务。
CarStatsService通过StatsManager使用statsd注册拉入原子。还以CSV格式实现原子的收集和转储系统报告。
VmsBrokerService用于在客户端之间路由车辆地图服务消息的消息代理服务。此服务还负责跟踪VMS客户端连接,并向客户端广播有关层提供或订阅状态更改的通知。
CarDiagnosticService车辆诊断服务
CarStorageMonitoringService提供存储监控数据(如I/O统计数据)的服务。为了接收此类数据,用户需要实现IIoStatsListener并根据此服务注册自己。
CarLocationService此服务在车辆停放时存储LocationManager中的最后一个已知位置,并在车辆通电时恢复位置。
CarMediaServiceCarMediaService管理汽车应用程序的当前活动媒体源。这与MediaSessionManager的活动会话不同,因为通过浏览和播放,车内只能有一个活动源。在车内,活动媒体源不一定有活动的MediaSession,例如仅在浏览时。但是,该源仍被视为活动源,应该是任何与媒体相关的UI(Media Center、主屏幕等)中显示的源。
CarBugreportManagerService车载的Bugreport
CarExperimentalFeatureServiceController控件绑定到ExperimentalCarService和实验功能的接口。
CarWatchdogService用于实现CarWatchdogManager API的服务。
CarDevicePolicyServiceDevice Policy相关功能的服务。
ClusterHomeService负责ClusterOS和ClusterHome之间交互的服务。
CarEvsService跨HAL边界侦听扩展视图系统并通过Android.car.evs.CarEvsManager向Android中的系统客户端公开数据的服务。由于快速消息队列的使用,android.hardware.automotive.evs@1.1接口不支持Java后端,因此,实际的API调用是在本机方法中完成的。CarEvsService由四种状态组成:不可用:CarEvsServices未连接到扩展视图系统服务。在此状态下,任何服务请求都将被拒绝。未激活:CarEvsService与Extended View System服务有有效的实时连接,可以随时接受任何服务请求。请求:CarEvsService收到来自特权客户端的服务请求,并请求系统UI启动摄像头查看活动。活动:CarEvsService正在将视频流式传输到客户端。请参阅CarEvsService。StateMachine类以了解更多详细信息。

3、简要时序图

以上是关于IVICarService启动的主要内容,如果未能解决你的问题,请参考以下文章

IVICarService启动

汽车总线特性简述

模块化 更效率# 安普全新城市主战车Primus

Matlab/simulink 车辆七自由度平顺性仿真

VIM(Video In Motion行车视频)激活

绍兴启动“掌上执法”严查超载车辆