01概述CarService 是车载 Android 操作...
01概述CarService 是车载 Android 操作系统 Android Automotive OS(下文简介 AAOS)的核心服务之一,所有车载相关的应用都需要通过 CarService 来查询、控制整车的状态,不仅仅是车辆控制,实际上 CarService 几乎就是整个车载 Framework *核心的组件。02CarService 架构
2.1 简介
AAOS 并没有大刀阔斧的改变 Android 原有的整体架构,几乎所有的核心服务 (AMS、WMS、PMS) 与手机并无区别,采用的是同一套源代码,所以我们可以将 AAOS 理解为 Android OS + Automotive Services + Automotive APPs 。传统的手机系统加上相关的汽车服务,构成了现在的 AAOS,而其中 CarService 就是提供汽车相关功能的*主要的模块。AAOS 定义了标准的硬件抽象层 HAL(Hardware Abstraction Layer) 来规范各个子系统与 Framework 的调用接口,并且通过 CarService 以及相关的 Car API 对上层应用提供标准编程接口。
车载 HAL 与 AAOS 架构Car App: 包括 OEM 和第三方开发的 AppCar API:内有包含 CarSensorManager 在内的 API。位于 /packages/services/Car/car-libCarService:系统中与车相关的服务。位于 /packages/services/CarVehicle HAL:汽车的硬件抽象层描述。位于/hardware/interfaces/automotive/vehicle/2.0/default/impl/vhal_v2_0
2.2 CarService 组成
CarService 源码位置:/packages/services/Car其目录结构如下所示 . ├── Android.mk ├── apicheck.mk ├── apicheck_msg_current.txt ├── apicheck_msg_last.txt ├── car-cluster-logging-renderer //LoggingClusterRenderingService 继承 InstrumentClusterRenderingService ├── car-default-input-service //按键消息处理 ├── car-lib //提供给汽车 App 特有的接口,许多定制的模块都在这里实现,包括 Sensor,HVAC,Cabin,ActiveParkingAssiance,Diagnostic,Vendor 等 ├── car-maps-placeholder //地图软件相关 ├── car_product //系统编译相关 ├── car-support-lib //android.support.car ├── car-systemtest-lib //系统测试相关 ├── car-usb-handler //开机自启,用于管理车机 USB ├── CleanSpec.mk ├── evs ├── obd2-lib ├── PREUPLOAD.cfg ├── procfs-inspector ├── service //com.android.car 是一个后台运行的组件,可以长时间运行并且不需要和用户去交互的,这里即使应用被销毁,它也可以正常工作 ├── tests ├── tools //是一系列的工具,要提到的是里面的 emulator,测试需要用到的。python 写的,通过 adb 可以连接 vehicleHal 的工具,用于模拟测试 ├── TrustAgent └── vehicle-hal-support-libAndroid 通信模式通常基于 C/S 模式,即有客户端和服务端,每个服务有对应的代理对象(比如 ActivityManager 相对服务 AMS,就是客户端)。对于 CarService 也是采用了 C/S 模式,Car App 并不会直接通过 CarService 的实例调用相关功能,而是通过对应的 Car API 完成对服务的调用。这里的 CarService 就是服务端,Car API 就是客户端。Android 原生 CarService 包含了许多功能服务:Car ** Service(C/S 模式中的服务端)它们与 HAL 层的 VehicleHAL 通信,进而通过车载总线(例如 CAN 总线)与车身进行通讯,同时它们还通过 Car API:Car ** Manger(C/S 模式中的客户端)为应用层的 Car App 提供接口,从而让 App 能够实现对车身的控制与状态的显示。
Car***Manager:packages/services/Car/car-lib/src/android/car/Car***Service:packages/services/Car/service/src/com/android/car/以下列举CarService 中核心服务:Service 端功能Client 端AppFocusService管理同类应用焦点的服务CarAppFocusManagerCarAudioService汽车音频服务CarAudioManagerCarPackageManagerService汽车包管理服务CarPackageManagerCarDiagnosticService汽车诊断服务CarDiagnosticManagerCarPowerManagerService汽车电源管理服务CarPowerManagerIInstrumentClusterManagerServcie仪表服务IInstrumentClusterManagerCarProjecitonService投屏服务CarProjecitonManagerVmsSubscriberService车辆地图服务VmsSubscriberManagerCarBluetoothService汽车蓝牙服务CarBluetoothManagerCarStorageMonitoringService汽车存储监控服务CarStorageMonitoringManagerCarDrivingStateService汽车驾驶状态服务CarDrivingStateManagerCarUXRestrictionsService汽车用户体验限制服务CarUXRestrictionsManagerCarConfigurationService汽车配置服务CarConfigurationManagerCarTrustedDeviceService授信设备管理CarTrustAgentEnrollmentManagerCarMediaService媒体管理服务CarMediaManagerCarBugreportManagerService错误报告服务CarBugreportManager
2.3 使用 CarService
说明:本文源码分析基于版本:android-12.0.0_r3前文提到,CarService 需要通过 Car API 为应用层提供接口,所以应用开发者只需要知道如何使用 Car API。第一步:判断平台是否支持车载功能APP 层在调用 Car API 之前首先会调用 PMS 中的 hasSystemFeature() 方法判断设备是否支持车载功能 if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { ..... }源码路径:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java @GuardedBy("mAvailableFeatures") final ArrayMap<String, FeatureInfo> mAvailableFeatures; @Override public boolean hasSystemFeature(String name, int version) { // allow instant applications synchronized (mAvailableFeatures) { final FeatureInfo feat = mAvailableFeatures.get(name); if (feat == null) { return false; } else { return feat.version >= version; } } }mAvailableFeatures 里面的内容是通过读取/system/etc/permissions下面的 xml 文件(对应 SDK 的位置—frameworks/native/data/etc 下的 XML 文件中的 feature 字段)源码路径:frameworks/native/data/etc/car_core_hardware.xml <permissions> <!-- Feature to specify if the device is a car --> <feature name="android.hardware.type.automotive" /> ..... </permission>源码路径:frameworks/native/data/etc/android.hardware.type.automotive.xml <!-- These features determine that the device running android is a car. --> <permissions> <feature name="android.hardware.type.automotive" /> </permissions>第二步:创建Car 对象,获取 ManagerCar 作为汽车平台*高等级的 API(packages/services/Car/car-lib/src/android/car/Car.java),为外界提供汽车所有服务和数据的访问通过createCar()方法新建 Car 实例成功连接时可以通过getCarManager方法获取相关的 Manager 实例。比如 Hvac 通过 getCarManager 方法获取了一个 CarHvacManager,当获取到 manager 后就可以进行相关操作 // 创建 Car 实例 Car carApiClient = Car.createCar(context); // 获取 CarHvacManager CarHvacManager manager = (CarHvacManager) mCarApiClient.getCarManager(Car.HVAC_SERVICE); // 调用 disconnect() 断开连接 carApiClient.disconnect();未完待续,下篇我们将带领大家一起学习CarService 实现原理!? END ?链接:https://juejin.cn/post/7353827463632404517本文经授权转载,转载文章所包含的文字来源于作者。如因内容或版权等问题,请联系进行删除点击下方“阅读原文”,寻找职业新风向~
提供专业的课程咨询服务