车载核心服务CarService

2024-01-12 15:28

本文主要是介绍车载核心服务CarService,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:CarService简介

Google考虑更多是车载的独立性,需要与androidOS分开,有自己的独立性,才好针对车载拓展,还有就是复用性,他自己在一个单独的进程,区别于ams等。AAOS作为车载操作系统, 需要与车辆上其他的子系统互联互通

AAOS定义了,标准的硬件抽象层HAL(Hardware Abstraction Layer)来规范各个子系统与Framework的调用接口,并且通过CarService以及相关的Car API,对上层应用提供标准编程接口

AAOS并没有大刀阔斧的改变Android原有的整体架构, 几乎所有的核心服务(AMS, WMS, PKMS)与手机并无区别,采用的是同一套代源码, 所以我们可以将AAOS 理解为Android OS + Android Automotive Services更为贴切.传统的手机系统加上相关的汽车服务,构成了现在的AAOS, 而其中CarService就是提供汽车相关功能的最主要的模块

车载分层架构

说明

     应用层: app发出控制消息

carservice: carservice通过HIDL(类似aidl实现进层通信)将信息给到HAL Service,HAL Service将消息处理后传递给mcu

         mcu: 行车总大脑

   can总线: 实时消息传递

          ecu: 电子控制单元,具体的执行控件

二:CarService的启动流程

看看CarService源码位置

aosp12\packages\services\Car\service

CarService作为Android Automotive的核心服务,他是在SystemServer中启动的。SystemServer会在StartOtherServices()方法中让SystemServiceManager先通过反射的形式,创建出StartCarServiceHelperService这个对象,并调用其onStart方法, 进入到CarServiceHelperService.java文件中

最终在onStart()方法中启动CarService,并加载jni库为CarService提供必要的API

CarService的onCreate()

主要逻辑:

1:持有mVehicle对象我们才可以与Vehicle HAL层进行通信

Car AIP (客户端) ------> CarService ------> ICarImpl ------> VehicleHal ------> obd can .... 硬件

2:创建ICarImpl对象,并调用init方法,需要通过它才能拿到很多的Service,的IBinder客户端

创建各个核心服务对象,将创建的服务对象依次添加到一个list中保存起来,这里主要是为了方便Service之 间的相互访问。

3:很多的Service添加到ServiceManager中,所以Car API中才可能顺利得到 很多的Service 来使用

4:设定SystemProperty,将CarService设定为创建完成状态,只有包含CarService在内的所有的核心Service都完成初始化,才能结束开机动画并发送开机广播

三:如何使用CarService

使用方法:

步骤1: 通过Car.createCar()方法可以创建出Car的对象。

步骤2:Car.createCar()需要传入ServiceConnection,并在service连接成功后,获取想要的Manager 实例(binder的客户端)

步骤3:构建出Car对象后还需要调用connect()才会连接到CarService上。

步骤1说明

通过getPackageManager().hasSystemFeature(String string)判断系统是否支持特定的模块功能

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {

Car carApiClient = Car.createCar(context, mCarServiceConnection);

}

步骤2说明

Car.createCar()需要传入ServiceConnection,并在service连接成功后,获取想要的Manager 实例,实现方式如下:

步骤3说明:

carApiClient.connect();

注意:connect()只能调用一次,如果当前已经处于连接状态,再次调用connect()会抛出异常,

client如果没有捕获该异常,则会引起client端程序崩溃(血的教训!)。

Car.java中通过绑定服务CarService成功后onBind方法返回ICarImpl实例,在启动流程中我们知道ICarImpl中已经拥有所有service的binder(stub)

Car.getCarManager()方法,最终调用到stub.asInterface()方法获取到客户端的Binder对象(proxy),缓存到容器方便以后使用。

如下图调用:

这三步是Android9之前的使用方法

Android10后直接使用

Car carClient = Car.createCar(context);

CarHvacManager manager = (CarHvacManager) carClient.getCarManager(Car.HVAC_SERVICE);

四:CarService系列服务介绍

谷歌在CarService中实现了许多与汽车密切相关的服务, 每个汽车服务, 也会有自己对应的客户端。

CarService对象只是获取各个Manager的媒介,它本身并不承担管理传感器.空调等具体的任务,

具体实现需要获取对应的Manager中API和对应服务来实现。

五:汽车服务运用

汽车服务 --- CarPropertyService 介绍

绝大部分与车辆硬件功能相关联的属性,如空调, 车舱功能, 车辆传感器等,都是通过CarPropertyService来读取或者设置的,CarPropertyManager 是CarPropertyService在客户端的代理, 通过CarPropertyManager提供的API,可以设置和获取车辆各个属性的状态;

CarPropertyService同时对应着 CarCabinManager, CarHvacManager,CarInfoManager,CarPropertyManager, CarSensorManager和 CarVendorExtensionManager这六个对象,可以说是一个服务分担多个角色. 所以在Android11时, 谷歌直接推荐使用CarPropertyManager 来对应CarPropertyService

六:编译car api

编译后可以供其他app使用

编译方式1:

1:source build/envsetup.sh

2:lunch sdk_car_x86_64-userdebug

3:make -j16

4:make android.car

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car

lib/android.car/android_common/javac/目录里哦

编译方式2:

make android.car-system-stubs

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car

system-stubs/android_common/javac/目录里

实际项目中这种模式较为常用

编译方式3:

make android.car-stubs

三合一的方式:derry@ubuntu:~/AOSP12$ make android.car android.car-system-stubs android

car-stubs -j32a

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car

stubs/android_common/javac/目录里。

编译出的CarLib库仅包含没有被@SystemApi修饰方法,而且方法同样不包含实现细节,是最严格的编

译模式。

此模式下编译出的CarLib甚至已经没有CarDiagnosticManager这个系统API了。

如何引入编译后的库?

参考:Android.bp - OpenGrok cross reference for /packages/apps/Car/Settings/Android.bp

在android.bp文件中加入引用

这篇关于车载核心服务CarService的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598300

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

关于DNS域名解析服务

《关于DNS域名解析服务》:本文主要介绍关于DNS域名解析服务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录DNS系统的作用及类型DNS使用的协议及端口号DNS系统的分布式数据结构DNS的分布式互联网解析库域名体系结构两种查询方式DNS服务器类型统计构建DNS域

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实