AndroidAutomotive模块介绍(三)CarService服务

打印 上一主题 下一主题

主题 713|帖子 713|积分 2143

前言

上一篇文档总结 Android Automotive 框架的 APP 和 API 部分内容,本篇文档将会继续根据 Android Automotive 框架结构,总结 Framework 层 CarService 服务的内容。
本文档对 Android Automotive Framework 层服务将会按照如下次序展开描述:
CarService 介绍
CarService 服务分类
CarService 代码路径编译路径
CarService 启动流程
CarService 提供服务流转示例,以 Property 为例
上一篇:AndroidAutomotive模块介绍(二)应用及接口介绍
下一篇:AndroidAutomotive模块介绍(四)VehicleHal介绍
正文

1、CarService 介绍

体系框架层提供了多个模块,来对 Android Automotive 进行支持,Google 以 CarService (com.android.car) 服务对外提供支持。CarService 并不是指一个服务,而是一系列服务的统称,在 CarService 中会创建许多子服务以支持车载体系功能。
2、CarService 服务分类

CarService 作为服务的入口,具体的业务逻辑会分布在内部的子服务中。
2.1 CarService 全部服务介绍

下面是 CarService 子服务的介绍:


  • CarUserService
汽车多用户服务。在启动时管理用户,包括:
创建用作驱动步伐的用户;
创建用作搭客的用户;
初次运行时创建辅助管理员用户;
切换驾驶员;


  • SystemActivityMonitoringService
监控AMS新Activity或Service启动的服务。


  • CarPowerManagementService
汽车电源管理服务。控制电源状态并与体系的其他部分交互以确保其自身状态。


  • CarUserNoticeService
向用户表现初始关照UI的服务。它仅在启用设置时启动它,并根据用户的请求关照UI自行关闭。


  • CarPropertyService
处置惩罚车辆属性的管理器。此类实现 ICarProperty 的 binder 接口。有助于更容易地创建处置惩罚车辆属性的多个 Manager。


  • CarDrivingStateService
推断车辆当前驾驶状态的服务。它通过侦听 CarPropertyService 的干系属性来计算驾驶状态。


  • CarUxRestrictionsManagerService
用户体验限制的服务。根据监听到的车辆当前驾驶状态,限制 HMI 表现。


  • CarPackageManagerService
汽车包管理服务。


  • PerUserCarServiceHelper
提供作为当前用户绑定/取消绑定到 PerUserCarService 的方法,为 UserSwitch 广播设置侦听器,并调用已注册回调的客户端。


  • CarInputService
CarInputService 通过车辆HAL监控和处置惩罚输入变乱。


  • CarProjectionService
汽车投屏服务。


  • GarageModeService
车库模式。车库模式启用车内空闲时间。


  • AppFocusService
应用步伐焦点服务确保一次只有一个应用步伐范例的实例处于活动状态。


  • CarAudioService
负责与汽车音响体系交互的服务。


  • CarNightService
用于处置惩罚用于将车辆设置为夜间模式的变乱。


  • InstrumentClusterService
负责与汽车仪表盘交互的服务。


  • SystemStateControllerService
体系状态控制服务。原生体系中是一个空服务,并没有实现。


  • VmsBrokerService
VMS 客户端实现,利用 HAL 特定消息编码将 VmsPublisher / VmsSubscriber API 调用署理到车辆 HAL。


  • VmsClientManager
用于管理车载消息服务(VMS)的客户端。VMS 是一种用于车辆间通讯的消息传递体系,允许车辆之间共享信息和关照。


  • VmsSubscriberService
用于订阅车辆消息服务(VMS)。VMS 是一种用于车辆间通讯的消息传递体系,允许车辆之间共享信息和关照。VmsSubscriberService 允许车载应用步伐注册并接收其他车辆发送的 VMS 消息。


  • VmsPublisherService
用于发布车辆消息服务(VMS)。


  • CarDiagnosticService
汽车诊断服务。工程模式会用到此服务。


  • CarStorageMonitoringService
提供存储监督数据(如 I/O 统计数据)的服务。为了接收此类数据,用户必要实现 IIoStatsListener 并根据此服务注册自己。


  • CarConfigurationService
该服务将查看体系上的默认 JSON 配置文件并解析其结果。该服务将查找映射到 R.raw.car_config 的 JSON 文件。如果此值不存在或格式不精确,则此服务不会失败;相反,它返回各种配置的默认值。


  • CarLocationService
此服务在车辆停放时存储 LocationManager 中最后一个已知位置,并在车辆通电时规复该位置。


  • CarTrustedDeviceService
汽车服务中启用受信任设备功能的部分。可信设备是一项功能,此中远程设备注册为可信设备,可以授权 Android 用户而不是用户输入暗码或 PIN。


  • CarMediaService
CarMediaService 管理汽车应用步伐的当前活动媒体源。这与 MediaSessionManager 的活动会话不同,因为同一时间内车内只能有一个活动源。
在车内,活动的媒体源不一定有活动的 MediaSession,例如,如果只是在欣赏它。但是,该源仍然被视为活动源,而且应该是任何媒体干系 UI(媒体中心、主屏幕等)中表现的源。


  • CarBugreportManagerService
Bug report服务。
2.2 CarService 常用服务介绍

下面对 CarService 中常用的服务进行扼要描述。
2.2.1 CarPowerManagementService

电源管理在 AndroidAutomotive 上是一个比较重要的功能,相对于手机来说,由于车辆的利用场景的特殊以及复杂性,同时必要和车辆其他 ECU(Electronic Control Unit)电子控制单元的配置,增长了车载体系中电源管理的难度。
和手机不同, 手机可以频繁充电, 哪怕长时间不用,手机电量耗尽, 利用时再充上电就 ok 了, 不会有什么题目. 可是车机不同, 行驶过程中车机必要始终保持工作, 用户是不能随意重启车机的, 否则大概会影响驾驶安全; 而在停车熄火后,车机就要只管降低其功耗, 否则如果将电瓶中电耗尽, 那可不是插上充电线这么简朴了,必要车辆救济搭电才能启动。
2.2.1.1 接口

与其他的 CarService 中的服务不同, 除了提供了 java 类的接口 CarPowerManager 以外, CarPowerManagementService 还有对应的 C++ 类的接口, 类名同样也叫 CarPowerManager。这两个的源码位置分别位于:
packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerManager.java
packages/services/Car/car-lib/native/CarPowerManager/CarPowerManager.cpp
增长 C++ 类的接口重要是为了向一些利用 C++ 编写的服务提供 CarPowerManager 干系的功能. 帮助其管理电源的状态. 在接口的定义和功能上面, 无论是 java 还是 C++ 的 CarPowerManager 都是一样的, 他们都对应于同一个CarPowerManagerService。
上层 APP 可以通过 Car-lib 中的接口通过 CarPowerManager 访问 CarPowerManagementService,底层 Native 服务可以通过 CarPowerManager C++ 类访问 CarPowerManagementService。如下图所示:

2.2.1.2 CarPowerManager 利用

CarPowerManager 提供了电源状态变革关照, 调治电源状态的功能。
CarPowerManager 对于电源状态的监听是通过注册回调实现的,CarPowerManager 中定义两个 interface 类 CarPowerStateListener 和 CarPowerStateListenerWithCompletion。通过定义的 onStateChanged() 监听来自 CarPowerManagementService 服务端电源状态的变革,当然这个数据来源于底层大概其他 ECU 状态。监听类注册到 CarPowerManagementService 服务端,由服务端管理回调。


  • setListener(CarPowerStateListener listener) 注册 CarPowerStateListener 监听;
  • setListenerWithCompletion(CarPowerStateListenerWithCompletion listener) 注册 CarPowerStateListenerWithCompletion 监听;
不同的地方是 setListenerWithCompletion 传递的 CarPowerStateListenerWithCompletion 接口的回调中包含
CompletableFuture 对象, 用于关照 CarPowerManagementService 该注册监听的应用已经完成了干系流程的处置惩罚。
下面列出 CarPowerManagementService 所支持的跨历程调用的接口:
方法说明void registerListener(in ICarPowerStateListener listener)注册 ICarPowerStateListener 监听类void unregisterListener(in ICarPowerStateListener listener)取消 ICarPowerStateListener 监听类void requestShutdownOnNextSuspend()请求电源管理器在下一个机会关闭而不是停息。void finished(in ICarPowerStateListener listener)结束 ICarPowerStateListener 监听void scheduleNextWakeupTime(int seconds)在 CarPowerManagementSystem 中安排下一次唤醒时间void registerListenerWithCompletion(in ICarPowerStateListener listener)注册 ICarPowerStateListener 监听类 2.2.1.3 CarPowerManagementService 处置惩罚流程

总体来说,电源状态的变革由车辆主控单元由下往上推送至 CarPowerManagementService。
举例来说,由于用户的熄火状态(具体的信号触发条件不同),车辆的电源状态开始变革,车辆主控单元将信号发送给车载娱乐体系 (In-Vehicle Infotainment , IVI) 单元。进而再由 VehicleHAL 硬件抽象层上报给 CarPowerManagementService,最后进入到Android体系的关机流程。
扼要流程如下所示:

VehicleHAL 接收到电源变革的信号后,通过PowerHalService在分发给 CarPowerManagementService,电源变乱在 VehicleHAL 定义了干系的属性 ID, 通过属性 ID 进行分发。
PowerHalService 对象是在 VehicleHAL (此处并非指车辆硬件抽象层, 而是 CarService 中的VehicleHal 类)的构造函数中创建的,最后再由 CarPowerManagementService 根据不同状态进行处置惩罚,并关照干系利用了 CarPowerManager 监听状态变革的应用。
2.2.2 CarInputService

CarInputService 是 AndroidAutomotive 中的服务,负责处置惩罚与车辆输入设备干系的操作,例如处置惩罚车辆上的按钮、方向盘控制、触摸屏输入等。该服务允许开发人员管理和相应来自车辆输入设备的变乱,并与车辆上运行的应用步伐进行交互。
原生定义的 ICarInputListener.aidl 文件中只定义了一个函数
  1. oneway interface ICarInputListener {
  2.         void onKeyEvent(in KeyEvent keyEvent, int targetDisplay) = 1;
  3. }
复制代码
onKeyEvent() 用于监听 Event 变乱,监听输入设备的输入变乱。
对于 CarInputService,这里在功能流转上简朴介绍,CarInputService 实现了 InputHalService.InputListener 接口,在初始化过程中,将自身注册到 InputHalService 中,InputHalService 监听来自底层 VehicleDisplay、VehicleHwKeyInputAction 干系的触摸信号,通过 InputListener 接口将 Event 变乱返回给 CarInputService,从而实现 Event 的转发。
2.2.3 CarAudioService

Android Automotive OS (AAOS) 是在焦点 Android 音频堆栈的底子之上打造而成,以支持用作车辆信息娱乐体系的用例。AAOS 负责实现信息娱乐声音(即媒体、导航和通讯声音),但不直接负责具有严格可用性和计时要求的铃声和警告。虽然 AAOS 提供了信号和机制来帮助车辆管理音频,但终极还是由车辆来决定应为驾驶员和搭客播放什么声音,从而确保对保障安全至关重要的声音和监管声音能被确切听到,而不会中断。
当 Android 管理车辆的媒体体验时,应通过应用来代表外部媒体来源(例如电台调谐器),这类应用可以处置惩罚该来源的音频焦点和媒体键变乱。
汽车音频体系可以处置惩罚以下声音和声音流:

Android 管理来自 Android 应用的声音,同时控制这些应用,并根据其声音范例将声音路由到 HAL 中的输出设备:


  • 逻辑声音流:在焦点音频定名法中称为“声源”,利用音频属性进行标记。
  • 物理声音流:在焦点音频定名法中称为“设备”,在混音后没有上下文信息。
为了确保可靠性,外部声音(来自独立声源,例如安全带警告铃声)在 Android 外部(HAL 下方,乃至是在单独的硬件中)进行管理。体系实现者必须提供一个混音器,用于接受来自 Android 的一个或多个声音输入流,然后以符合的方式将这些声音流与车辆所需的外部声源组合起来。
HAL 实现和外部混音器负责确保对保障安全至关重要的外部声音能够被用户听到,而且负责在 Android 提供的声音流中进行混音,并将混音结果路由到符合的音响设备。
CarAudio 类图如下所示:

CarAudio 流程图如下所示:

2.2.3.1 接口

下面对 CarAudioService 所提供的接口进行介绍:
方法说明boolean isDynamicRoutingEnabled()是否启用动态路由。void setGroupVolume(int zoneId, int groupId, int index, int flags)为主分区中的卷组设置卷索引。int getGroupMaxVolume(int zoneId, int groupId)返回主地区中卷组的最大卷索引。int getGroupMinVolume(int zoneId, int groupId)返回主地区中卷组的最小卷索引。int getGroupVolume(int zoneId, int groupId)返回主地区中卷组的当前卷索引。void setFadeTowardFront(float value)调解车辆座舱前后的相对音量。void setBalanceTowardRight(float value)调治车辆舱室左右两侧的相对音量。String[] getExternalSources()查询体系配置,以便陈诉可用的非麦克风音频输入设备。CarAudioPatchHandle createAudioPatch(in String sourceAddress, int usage, int gainInMillibels)给定一个由 getExternalSources() 标识的输入端口,请求它的音频信号在 HAL 下面路由到与给定用法干系的输出端口。例如,调谐器的输出大概直接路由到与 AudioAttributes 关联的输出总线。在调谐器播放时利用 USAGE_MEDIA。void releaseAudioPatch(in CarAudioPatchHandle patch)删除输入端口和提供句柄标识的输出端口之间的关联。int getVolumeGroupCount(int zoneId)获取主地区中可用卷组的计数。int getVolumeGroupIdForUsage(int zoneId, int usage)获取主地区中给定 AudioAttributes 利用情况的卷组 id。int[] getUsagesForVolumeGroupId(int zoneId, int groupId)获取主地区中卷组的 AudioAttributes 用法数组。int[] getAudioZoneIds()获取当前可用的音频地区。int getZoneIdForUid(int uid)获取当前映射到 uId 的音频地区 id,如果不存在映射,则默认为 PRIMARY_AUDIO_ZONE。boolean setZoneIdForUid(int zoneId, int uid)将音频区 id 映射为 uid。boolean clearZoneIdForUid(int uid)清除 uid 的当前 zone 映射。int getZoneIdForDisplayPortId(byte displayPortId)获取传入的表现端口 id 的地区 id。void registerVolumeCallback(in IBinder binder)注册 ICarVolumeCallback 回调。void unregisterVolumeCallback(in IBinder binder)取消注册 ICarVolumeCallback 回调。 2.2.4 CarPropertyService

CarPropertyService 用于管理与车辆硬件功能干系联的属性,如空调, 车舱功能, 车辆传感器等。
在 packages/services/Car/service/src/com/android/car/ICarImpl.java 的 getCarService() 方法中:
  1. public IBinder getCarService(String serviceName) {
  2.         switch (serviceName) {
  3.         ...
  4.         case Car.CABIN_SERVICE:
  5.         case Car.HVAC_SERVICE:
  6.         case Car.INFO_SERVICE:
  7.         case Car.DIAG_SERVICE:
  8.         case Car.PROPERTY_SERVICE:
  9.         case Car.SENSOR_SERVICE:
  10.         case Car.VENDOR_EXTENSION_SERVICE:
  11.             return mCarPropertyService;
  12.        ...
  13.         }
  14. }
复制代码
可以看到 CarPropertyService 同时对应着 CarCabinManager,CarHvacManager,CarInfoManager,CarPropertyManager,CarSensorManager 和 CarVendorExtensionManager这六个对象, 可以说是一个服务分担多个脚色. 所以在 Android10 之后, 谷歌直接推荐利用 CarPropertyManager。


  • CarCabinManager:CarCabinManager 提供的是座舱内干系功能的 API,包括座椅、安全带、车窗等。属性列表如下:
属性范例功能ID_DOOR_POSint车门ID_DOOR_MOVEintID_DOOR_LOCKboolID_MIRROR_Z_POSint后视镜ID_MIRROR_Z_MOVEintID_MIRROR_Y_POSintID_MIRROR_Y_MOVEintID_MIRROR_LOCKboolID_MIRROR_FOLDboolID_SEAT_MEMORY_SELECTint座椅影象ID_SEAT_MEMORY_SETintID_SEAT_BELT_BUCKLEDbool安全带ID_SEAT_BELT_HEIGHT_POSintID_SEAT_BELT_HEIGHT_MOVEintID_SEAT_FORE_AFT_POSint座椅前后位置ID_SEAT_FORE_AFT_MOVEintID_SEAT_BACKREST_ANGLE_1_POSint座椅靠背ID_SEAT_BACKREST_ANGLE_1_MOVEintID_SEAT_BACKREST_ANGLE_2_POSintID_SEAT_BACKREST_ANGLE_2_MOVEintID_SEAT_HEIGHT_POSint座椅高度ID_SEAT_HEIGHT_MOVEintID_SEAT_DEPTH_POSint座椅深度ID_SEAT_DEPTH_MOVEint 属性范例功能ID_SEAT_TILT_POSint座椅倾角ID_SEAT_TILT_MOVEintID_SEAT_LUMBAR_FORE_AFT_POSint腰托ID_SEAT_LUMBAR_FORE_AFT_MOVEintID_SEAT_LUMBAR_SIDE_SUPPORT_POSintID_SEAT_LUMBAR_SIDE_SUPPORT_MOVEintID_SEAT_HEADREST_HEIGHT_POSint头枕ID_SEAT_HEADREST_HEIGHT_MOVEintID_SEAT_HEADREST_ANGLE_POSintID_SEAT_HEADREST_ANGLE_MOVEintID_SEAT_HEADREST_FORE_AFT_POSintID_SEAT_HEADREST_FORE_AFT_MOVEintID_WINDOW_POSint车窗ID_WINDOW_MOVEintID_WINDOW_LOCKbool

  • CarHvacManager:Hvac 全称供暖通风与氛围调治(Heating Ventilation and Air Conditioning),它是空调体系干系功能的服务,AAOS 定义了标准的 CarHvacManager API 来提供干系的功能,通过该服务可以实现对空调体系的监听和控制。注意 CarHvacManager 所涉及的属性都是必要有体系级别的权限,所以第三方应用目前是无法直接利用CarHvacManager的。属性列表如下:
属性范例功能ID_MIRROR_DEFROSTER_ONbool后视镜除霜ID_STEERING_WHEEL_HEATint方向盘加热ID_OUTSIDE_AIR_TEMPfloat车外温度ID_TEMPERATURE_DISPLAY_UNITSint温标(华氏度和摄氏度)ID_ZONED_TEMP_SETPOINTfloat温度ID_ZONED_TEMP_ACTUALfloat现实温度ID_ZONED_HVAC_POWER_ONbool空调体系开关ID_ZONED_FAN_SPEED_SETPOINTint风速ID_ZONED_FAN_SPEED_RPMint风扇转速ID_ZONED_FAN_DIRECTION_AVAILABLEvector可用风向ID_ZONED_FAN_DIRECTIONint风向ID_ZONED_SEAT_TEMPint座椅温度ID_ZONED_AC_ONboolAC开关ID_ZONED_AUTOMATIC_MODE_ONbool自动空调ID_ZONED_AIR_RECIRCULATION_ONbool空调循环ID_ZONED_MAX_AC_ONbool强力空调ID_ZONED_DUAL_ZONE_ONbool多地区空调ID_ZONED_MAX_DEFROST_ONbool强力除霜ID_ZONED_HVAC_AUTO_RECIRC_ONbool自动氛围循环ID_WINDOW_DEFROSTER_ONbool车窗除霜

  • CarInfoManager:车辆信息服务。例如获取车辆的型号、能源型号、电池容量等信息。
  • CarPropertyManager:车辆属性 API。管理车辆属性。
  • CarSensorManager :CarSensorManager 重要对应的就是和车辆传感器干系的一些功能,相比手机,车辆的传感器种类要更丰富多彩,特殊是随着汽车越来越智能化,自动驾驶等功能的加入,传感器的数量还会不停增长。车辆的智能控制功能都和传感器的数据有着密切的关系,如自动空调、自动控制灯光、驾驶座位自动调解等。在 CarSensorManager 中包含了汽车特有的传感器范例,如车速、发动机转速等,如下表中介绍:
属性范例权限体系权限SENSOR_TYPE_CAR_SPEED车速CAR_SPEED否SENSOR_TYPE_RPM转速CAR_ENGINE_DETAILED是SENSOR_TYPE_ODOMETER里程数CAR_MILEAGE是SENSOR_TYPE_FUEL_LEVEL油量CAR_ENERGY否SENSOR_TYPE_PARKING_BRAKE驻车制动CAR_POWERTRAIN否SENSOR_TYPE_GEAR档位CAR_POWERTRAIN否SENSOR_TYPE_NIGHT白入夜夜CAR_EXTERIOR_ENVIRONMENT否SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE车外环境温度CAR_EXTERIOR_ENVIRONMENT否SENSOR_TYPE_IGNITION_STATE点火状态CAR_POWERTRAIN否SENSOR_TYPE_WHEEL_TICK_DISTANCE轮距CAR_SPEED否SENSOR_TYPE_ABS_ACTIVEABS状态CAR_DYNAMICS_STATE是SENSOR_TYPE_TRACTION_CONTROL_ACTIVE牵引力控制CAR_DYNAMICS_STATE是SENSOR_TYPE_FUEL_DOOR_OPEN加油口状态CAR_ENERGY_PORTS否SENSOR_TYPE_EV_BATTERY_LEVEL电量值CAR_ENERGY否SENSOR_TYPE_EV_CHARGE_PORT_OPEN充电口状态CAR_ENERGY_PORTS否SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED充电连接状态CAR_ENERGY_PORTS否SENSOR_TYPE_EV_BATTERY_CHARGE_RATE充电速率CAR_ENERGY否SENSOR_TYPE_ENGINE_OIL_LEVEL机油量CAR_ENGINE_DETAILED是

  • CarVendorExtensionManager:制造商扩展服务。市场上的汽车品牌种类繁多,每款车型的功能又不相同。汽车制造商们也在不停推陈出新,推出一些属于品牌特有的功能来吸引消费者的眼光。要想将说有的功能都定义为标准的属性肯定非常困难。对此 AAOS的做法是,,除了定义目前市场上绝大多数车型都实用的属性外,同样允许制造商根据自己所拥有的其他功能进行扩展,这就是本节 CarVendorExtensionManager 的重要作用。它让制造商可以扩展 VehicleHAL 中已经定义的属性,加入额外的功能。
3、CarService

3.1 CarService 路径及编译

CarService 的代码路径为:/android/packages/services/Car/service。
CarService 是以体系 APK 的方式提供体系服务的,编译结果会在体系的 /system/priv-app/CarService 路径下。
3.2 启动流程

3.2.1 时序图

下面是 CarService 启动流程时序图

3.2.2 代码流程

3.2.2.1 SystemServer.startOtherServices()

Android 中的 SystemServer 会启动一系列体系服务,CarService 服务是在 startOtherServices() 阶段中启动的。通过启动 CarServiceHelperService 类来拉起 CarService 服务。
  1. private static final String CAR_SERVICE_HELPER_SERVICE_CLASS =
  2.             "com.android.internal.car.CarServiceHelperService";
  3. if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
  4.                 traceBeginAndSlog("StartCarServiceHelperService");
  5.                 mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
  6.                 traceEnd();
  7.             }
复制代码
3.2.2.2 SystemServiceManager.startService()

SystemServiceManager 在 Android 中管理体系服务的启动,对于 SystemService,体系服务会继续 SystemService 类,在 SystemServiceManager 中会通过反射创建服务类,然后调用其 onStart() 函数。
  1.     public SystemService startService(String className) {
  2.         final Class<SystemService> serviceClass;
  3.         ...
  4.             serviceClass = (Class<SystemService>)Class.forName(className);
  5.         ...
  6.         return startService(serviceClass);
  7.     }
  8.    
  9.     public <T extends SystemService> T startService(Class<T> serviceClass) {
  10.         try {
  11.             ...
  12.             final String name = serviceClass.getName();
  13.             // Create the service.
  14.             }
  15.             final T service;
  16.             ...
  17.                 Constructor<T> constructor = serviceClass.getConstructor(Context.class);
  18.                 service = constructor.newInstance(mContext);
  19.             ...
  20.             startService(service);
  21.             return service;
  22.         }
  23.         ...
  24.     }
  25.    
  26.     public void startService(@NonNull final SystemService service) {
  27.         // Register it.
  28.         mServices.add(service);
  29.         // Start it.
  30.         long time = SystemClock.elapsedRealtime();
  31.         ...
  32.             service.onStart();
  33.         ...
  34.     }
复制代码
3.2.2.3 CarServiceHelperService

CarServiceHelperService 是 CarService 的启动类,代码路径在:/android/frameworks/opt/car/services/src/com/android/internal/car。
  1.     private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";
  2.     public void onStart() {
  3.         Intent intent = new Intent();
  4.         intent.setPackage("com.android.car");
  5.         intent.setAction(CAR_SERVICE_INTERFACE);
  6.         if (!getContext().bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE,
  7.                 UserHandle.SYSTEM)) {
  8.             Slog.wtf(TAG, "cannot start car service");
  9.         }
  10.         System.loadLibrary("car-framework-service-jni");
  11.     }
复制代码
在 CarServiceHelperService.onStart() 函数中,通过 Intent 的方式开启 CarService 应用,这里
CAR_SERVICE_INTERFACE = “android.car.ICar” 对应 CarService 中 AndroidManifest.xml 中的定义:
  1.         <service android:name=".CarService"
  2.                 android:singleUser="true">
  3.             <intent-filter>
  4.                 <action android:name="android.car.ICar" />
  5.             </intent-filter>
  6.         </service>
  7.         <service android:name=".PerUserCarService" android:exported="false" />
复制代码
调用 bindServiceAsUser() 函数启动服务。
3.2.2.4 CarService

下面进入 CarService 流程,CarService 入口类为 CarService.java,路径:/android/packages/services/Car/service/src/com/android/car/CarService.java。启动 CarService,会进入到 onCreate() 函数。
  1. public void onCreate() {
  2.         Log.i(CarLog.TAG_SERVICE, "Service onCreate");
  3.         // 获取 CarService Hal 层,VehicleHal 服务端对象
  4.         mVehicle = getVehicle();
  5.         if (mVehicle == null) {
  6.             throw new IllegalStateException("Vehicle HAL service is not available.");
  7.         }
  8.         try {
  9.             mVehicleInterfaceName = mVehicle.interfaceDescriptor();
  10.         } catch (RemoteException e) {
  11.             throw new IllegalStateException("Unable to get Vehicle HAL interface descriptor", e);
  12.         }
  13.         Log.i(CarLog.TAG_SERVICE, "Connected to " + mVehicleInterfaceName);
  14.         // 创建 ICarImpl 对象
  15.         mICarImpl = new ICarImpl(this,
  16.                 mVehicle,
  17.                 SystemInterface.Builder.defaultSystemInterface(this).build(),
  18.                 mCanBusErrorNotifier,
  19.                 mVehicleInterfaceName);
  20.         // 初始化 ICarImpl 对象
  21.         mICarImpl.init();
  22.         linkToDeath(mVehicle, mVehicleDeathRecipient);
  23.         // 添加 car_service 服务端对象为 ICarImpl
  24.         ServiceManager.addService("car_service", mICarImpl);
  25.         SystemProperties.set("boot.car_service_created", "1");
  26.         super.onCreate();
  27.     }
  28. // 这里是通过 Binder 获得 hal 层的服务代理对象
  29. private static IVehicle getVehicle() {
  30.         try {
  31.             return android.hardware.automotive.vehicle.V2_0.IVehicle.getService();
  32.         } catch (RemoteException e) {
  33.             Log.e(CarLog.TAG_SERVICE, "Failed to get IVehicle service", e);
  34.         } catch (NoSuchElementException e) {
  35.             Log.e(CarLog.TAG_SERVICE, "IVehicle service not registered yet");
  36.         }
  37.         return null;
  38.     }
  39. // 返回 mICarImpl 对象
  40. public IBinder onBind(Intent intent) {
  41.         return mICarImpl;
  42.     }
复制代码
3.2.2.5 ICarImpl

CarService 的实现实际是通过 ICarImpl 提供服务的,这里我们来看下 ICarImpl 的初始化。
  1. public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
  2.         CanBusErrorNotifier errorNotifier, String vehicleInterfaceName) {
  3.     mContext = serviceContext;
  4.     mSystemInterface = systemInterface;
  5.     // 创建 VehicleHal,此对象用于与 Hal 层交互
  6.     mHal = new VehicleHal(vehicle);
  7.     mVehicleInterfaceName = vehicleInterfaceName;
  8.     mUserManagerHelper = new CarUserManagerHelper(serviceContext);
  9.     final Resources res = mContext.getResources();
  10.     final int maxRunningUsers = res.getInteger(
  11.             com.android.internal.R.integer.config_multiuserMaxRunningUsers);
  12.     // 创建 CarService 子服务
  13.     mCarUserService = new CarUserService(serviceContext, mUserManagerHelper,
  14.             ActivityManager.getService(), maxRunningUsers);
  15.     mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
  16.     mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),
  17.             systemInterface, mUserManagerHelper);
  18.     mCarPropertyService = new CarPropertyService(serviceContext, mHal.getPropertyHal());
  19.     mCarDrivingStateService = new CarDrivingStateService(serviceContext, mCarPropertyService);
  20.     mCarUXRestrictionsService = new CarUxRestrictionsManagerService(serviceContext,
  21.             mCarDrivingStateService, mCarPropertyService);
  22.     mCarPackageManagerService = new CarPackageManagerService(serviceContext,
  23.             mCarUXRestrictionsService,
  24.             mSystemActivityMonitoringService,
  25.             mUserManagerHelper);
  26.     mPerUserCarServiceHelper = new PerUserCarServiceHelper(serviceContext);
  27.     mCarBluetoothService = new CarBluetoothService(serviceContext, mPerUserCarServiceHelper);
  28.     mCarInputService = new CarInputService(serviceContext, mHal.getInputHal());
  29.     mCarProjectionService = new CarProjectionService(
  30.             serviceContext, null /* handler */, mCarInputService, mCarBluetoothService);
  31.     mGarageModeService = new GarageModeService(mContext);
  32.     mAppFocusService = new AppFocusService(serviceContext, mSystemActivityMonitoringService);
  33.     mCarAudioService = new CarAudioService(serviceContext);
  34.     mCarNightService = new CarNightService(serviceContext, mCarPropertyService);
  35.     mInstrumentClusterService = new InstrumentClusterService(serviceContext,
  36.             mAppFocusService, mCarInputService);
  37.     mSystemStateControllerService = new SystemStateControllerService(
  38.             serviceContext, mCarAudioService, this);
  39.     mVmsBrokerService = new VmsBrokerService(mContext.getPackageManager());
  40.     mVmsClientManager = new VmsClientManager(
  41.             serviceContext, mCarUserService, mUserManagerHelper, mHal.getVmsHal());
  42.     mVmsSubscriberService = new VmsSubscriberService(
  43.             serviceContext, mVmsBrokerService, mHal.getVmsHal());
  44.     mVmsPublisherService = new VmsPublisherService(
  45.             serviceContext, mVmsBrokerService, mVmsClientManager);
  46.     mCarDiagnosticService = new CarDiagnosticService(serviceContext, mHal.getDiagnosticHal());
  47.     mCarStorageMonitoringService = new CarStorageMonitoringService(serviceContext,
  48.             systemInterface);
  49.     mCarConfigurationService =
  50.             new CarConfigurationService(serviceContext, new JsonReaderImpl());
  51.     mCarLocationService = new CarLocationService(mContext, mUserManagerHelper);
  52.     mCarTrustedDeviceService = new CarTrustedDeviceService(serviceContext);
  53.     mCarMediaService = new CarMediaService(serviceContext);
  54.     mCarBugreportManagerService = new CarBugreportManagerService(serviceContext);
  55.     // 将 CarPowerManagementService、CarUserService、CarTrustedDeviceService、SystemInterface、CarDrivingStateService、PerUserCarServiceHelper 服务添加到 CarLocalServices 集合中,便于获取
  56.     CarLocalServices.addService(CarPowerManagementService.class, mCarPowerManagementService);
  57.     CarLocalServices.addService(CarUserService.class, mCarUserService);
  58.     CarLocalServices.addService(CarTrustedDeviceService.class, mCarTrustedDeviceService);
  59.     CarLocalServices.addService(SystemInterface.class, mSystemInterface);
  60.     CarLocalServices.addService(CarDrivingStateService.class, mCarDrivingStateService);
  61.     CarLocalServices.addService(PerUserCarServiceHelper.class, mPerUserCarServiceHelper);
  62.     // 将创建的 CarService 服务添加到 allServices 集合中保存
  63.     // Be careful with order. Service depending on other service should be inited later.
  64.     List<CarServiceBase> allServices = new ArrayList<>();
  65.     allServices.add(mCarUserService);
  66.     allServices.add(mSystemActivityMonitoringService);
  67.     allServices.add(mCarPowerManagementService);
  68.     allServices.add(mCarPropertyService);
  69.     allServices.add(mCarDrivingStateService);
  70.     allServices.add(mCarUXRestrictionsService);
  71.     allServices.add(mCarPackageManagerService);
  72.     allServices.add(mCarInputService);
  73.     allServices.add(mGarageModeService);
  74.     allServices.add(mAppFocusService);
  75.     allServices.add(mCarAudioService);
  76.     allServices.add(mCarNightService);
  77.     allServices.add(mInstrumentClusterService);
  78.     allServices.add(mSystemStateControllerService);
  79.     allServices.add(mPerUserCarServiceHelper);
  80.     allServices.add(mCarBluetoothService);
  81.     allServices.add(mCarProjectionService);
  82.     allServices.add(mCarDiagnosticService);
  83.     allServices.add(mCarStorageMonitoringService);
  84.     allServices.add(mCarConfigurationService);
  85.     allServices.add(mVmsClientManager);
  86.     allServices.add(mVmsSubscriberService);
  87.     allServices.add(mVmsPublisherService);
  88.     allServices.add(mCarTrustedDeviceService);
  89.     allServices.add(mCarMediaService);
  90.     allServices.add(mCarLocationService);
  91.     allServices.add(mCarBugreportManagerService);
  92.     mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);
  93. }
  94. @MainThread
  95. void init() {
  96.     mBootTiming = new TimingsTraceLog(VHAL_TIMING_TAG, Trace.TRACE_TAG_HAL);
  97.     traceBegin("VehicleHal.init");
  98.     // 初始化 VehicleHal 对象,建立与 Hal 层的连接
  99.     mHal.init();
  100.     traceEnd();
  101.     traceBegin("CarService.initAllServices");
  102.     // 遍历 mAllServices 集合中所有的 CarService 子服务,调用 init() 初始化
  103.     for (CarServiceBase service : mAllServices) {
  104.         service.init();
  105.     }
  106.     traceEnd();
  107.     mSystemInterface.reconfigureSecondaryDisplays();
  108. }
复制代码
ICarImpl 的初始化函数中初始化了 Android Automotive 各个子服务,创建了各子服务对象。通过 VehicleHal 对象创建了各子服务与 Hal 层的连接。
将 CarPowerManagementService、CarUserService、CarTrustedDeviceService、SystemInterface、CarDrivingStateService、PerUserCarServiceHelper 服务添加到 CarLocalServices 聚集中,便于获取。
将 Android Automotive 全部子服务生存在 List allServices 聚集中。
ICarImpl 的 init() 函数中调用了 VehicleHal.init() 函数初始化 VehicleHal,并遍历 allServices 聚集,调用全部子服务的 init() 函数以完成初始化。
3.2.2.6 VehicleHal

VehicleHal 是车辆 HAL 的抽象。这个类处置惩罚本地 HAL 接口,并对接收到的数据进行基本解析(范例检查)。然后将每个变乱发送到相应的 HalServiceBase 实现。HalServiceBase 负责为 CarManager API 转换数据到相应的服务类中。
VehicleHal 的初始化中参数包含 IVehicle,IVehicle 是在 CarService.java 的 onCreate() 函数中通过 getVehicle() 得到的 Hal 层服务端署理对象。
  1. public VehicleHal(Context context, IVehicle vehicle) {
  2.         // 创建 VehicleHal 的 Handler 线程
  3.         mHandlerThread = new HandlerThread("VEHICLE-HAL");
  4.         mHandlerThread.start();
  5.         // passing this should be safe as long as it is just kept and not used in constructor
  6.         // 初始化 PowerHalService Power Hal 对象
  7.         mPowerHal = new PowerHalService(this);
  8.         // 初始化 PropertyHalService Property Hal 对象
  9.         mPropertyHal = new PropertyHalService(this);
  10.         // 初始化 InputHalService Input Hal 对象
  11.         mInputHal = new InputHalService(this);
  12.         // 初始化 VmsHalService Vms Hal 对象
  13.         mVmsHal = new VmsHalService(context, this);
  14.         // 初始化 DiagnosticHalService Diagnostic Hal 对象
  15.         mDiagnosticHal = new DiagnosticHalService(this);
  16.         // 将 Hal 服务对象添加到 ArrayList<HalServiceBase> mAllServices 中保存
  17.         mAllServices.addAll(Arrays.asList(mPowerHal,
  18.                 mInputHal,
  19.                 mPropertyHal,
  20.                 mDiagnosticHal,
  21.                 mVmsHal));
  22.         // 创建 HalClient 对象
  23.         mHalClient = new HalClient(vehicle, mHandlerThread.getLooper(), this /*IVehicleCallback*/);
  24.     }
  25. public void init() {
  26.         Set<VehiclePropConfig> properties;
  27.         try {
  28.             properties = new HashSet<>(mHalClient.getAllPropConfigs());
  29.         } catch (RemoteException e) {
  30.             throw new RuntimeException("Unable to retrieve vehicle property configuration", e);
  31.         }
  32.         synchronized (this) {
  33.             // Create map of all properties
  34.             for (VehiclePropConfig p : properties) {
  35.                 mAllProperties.put(p.prop, p);
  36.             }
  37.         }
  38.         // 遍历 mAllServices 集合,调用 Hal 服务的 init() 初始化函数
  39.         for (HalServiceBase service: mAllServices) {
  40.             Collection<VehiclePropConfig> taken = service.takeSupportedProperties(properties);
  41.             if (taken == null) {
  42.                 continue;
  43.             }
  44.             if (DBG) {
  45.                 Log.i(CarLog.TAG_HAL, "HalService " + service + " take properties " + taken.size());
  46.             }
  47.             synchronized (this) {
  48.                 for (VehiclePropConfig p: taken) {
  49.                     mPropertyHandlers.append(p.prop, service);
  50.                 }
  51.             }
  52.             properties.removeAll(taken);
  53.             service.init();
  54.         }
  55.     }
复制代码
4、CarPropertyService 示例

下面是 CarPropertyService 的调用流程时序图,从应用调用 CarPropertyManager 接口到 CarPropertyService 处置惩罚,调用到 Hal 层的逻辑。
下面的时序图中包括 setProperty() 方法、registerCallback() 方法和信号回调的流程:

5、总结

本篇文章分析了 Android Automotive 框架中 Framework 层服务的功能逻辑,从 CarService 服务介绍,启动流程以及服务功能流程等。
上一篇:AndroidAutomotive模块介绍(二)应用及接口介绍
下一篇:AndroidAutomotive模块介绍(四)VehicleHal介绍

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表