开博体育【Android R】车载 Android 核心服务 - CarService 解析

  新闻资讯     |      2023-12-12 23:46

  的运行原理与实现方式理解的不够深,那么本篇我们就来讲解Android Automotive R上

  本文提到的CarService主要是基于原生Android Automotive,实际量产的各种车载Android系统中由于业务、技术、人员配置等各方面原因会对CarService做进一步的拆分,所以功能上会与原生的CarService会存在差异。

  通过之前的文章我们了解到,Android系统主要应用于中控和副驾屏幕,原生的车载Android本质上可以看作是Android OS + Automotive Services + Automotive APPs组成的系统。用户会通过显示在中控屏幕上App,将对车辆的操作信息通过Car API 传递给Framework Service,Service再通过HIDL将信息处理后传递给HAL Service,HAL Service再将数据处理后传递给MCU,MCU通过CAN bus将信息传递给汽车上的各个ECU(中间忽略了一些不需要理解的步骤),然后由ECU控制汽车的机械零部件进行活动,这样就完成了一次从Android APP到车辆机械零部件间的通信。

  原生Android Automotive 系统里CarService实现的功能非常多,架构图里描述的只是其中的冰山一角,架构图描述的意义只是为了引出CarService。

  作为 Android Automotive 的核心进程,原生的CarService业务量非常庞大,包含了许多与汽车相关的服务,主要有以下几个:

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

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

  CarMediaService管理汽车应用程序的当前活动媒体源。这与MediaSessionManager的活动会话不同,因为同一时间内车内只能有一个活动源。

  在车内,活动的媒体源不一定有活动的MediaSession,例如,如果只是在浏览它。但是,该源仍然被视为活动源,并且应该是任何媒体相关UI(媒体中心、主屏幕等)中显示的源。

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

  监控显示器顶部的Activity,并确保在固定模式下的Activity在崩溃或因任何原因进入后台时重新启动。此组件还监视目标包的更新,并在更新完成后重新启动它。

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

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

  允许测试/模拟车辆HAL的服务。该服务直接使用车辆HAL API,因为车辆HAL模拟无论如何都需要直接访问该级别。

  一种服务,通过HAL边界监听占用者感知检测系统,并通过OccupantAwarenessManager将数据暴露给Android中的系统客户端。

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

  向用户显示初始通知UI的服务。它仅在启用设置时启动它,并根据用户的请求通知UI自行关闭。

  实现CarWatchdogManagerAPI的服务。CarWatchdogService作为汽车监控中介运行,它检查客户端的健康状况,并将结果报告给汽车监控服务器。

  加粗的各个Service属于CarService中比较重要的功能,以后都会单独开坑讲。

  往简单地说,车载Framework的功能性开发基本就是围绕着CarService中的这些服务做增改,如果能把所有这些服务和背后原理都理解透彻,车载Framework基本就算完事了。当然可能也有些过于理想化了,因为还有android自身的Framework需要修改,比如网络系统、蓝牙协议栈等等。

  以上就是Android Automotive中CarService支持的所有功能,虽然冠名了xxxService但这些服务其实并不是四大组件意义上的Service,它们没有继承自android.app.Service,相反它们都继承自ICarxxxx.Stub,本质上属于AIDL接口的实现类。到这一步也可以看出CarService本质上只是作为这些服务的容器而存在的,本身并没有实现业务逻辑上的功能。

  不同的公司或车机系统项目对于Car API的定位、实现并不相同,本文主要从原生Android Automotive的角度介绍。

  在上面的介绍中,我们提到CarService中各个服务本质上是AIDL接口的实现类,属于Server端,而对应的Client端就需要一个IBinder对象来访问Server端的方法,这些IBinder对象在Car API中被封装在一个个XXXManager类中。

  实际项目中我们不一定要按照Google建议的那样编写Car API,可以按实际情况实施。我个人也经历过某个把Car API源码整个移除,从头重写CarService的项目。

  在使用Car API之前,我们需要先将Car API编译成jar也就是CarLib,这样才能让其它的系统应用使用。

  编译出的CarLib库包含Car API中定义的所有方法以及实现细节。导入到android studio中打开后,如下所示:

  编译出的CarLib库包含CarAPI中定义的所有方法,但是不包含实现细节,一些与实现细节有关的变量也会被隐藏。实际项目中这种模式较为常用。导入到android studio中打开后,如下所示:

  编译出的CarLib库仅包含没有被@SystemApi修饰方法,而且方法同样不包含实现细节,是最严格的编译模式。此模式下编译出的CarLib甚至已经没有CarDiagnosticManager这个系统API了。

  connect()只能调用一次,如果当前已经处于连接状态,再次调用connect()会抛出异常,client如果没有捕获该异常,则会引起client端程序崩溃(血的教训!)。

  不知道你有没有注意到,connect()被标记为Deprecated过时的方法了。

  Android 10以后Car Api的调用方式由异步方法改为了同步方法,保留了disconnect(),但是不再需要调用connect(),这样使用起来更简单。

  这种调用方式是乐观的认为CarService不会发生异常,与CarService的连接也不会断开。但是如果CarService发生异常,连接被断开的话,client端调用方就会直接被杀死,使用下面这种调用方式可以避免这种情况。

  为什么上面的那种调用方式会导致client端的进程被杀死呢?这就需要我们继续深入的探究一下Car Api是如何实现的。

  设置的值大于0则为超时时间,当存在有限的超时时间时,返回的Car对象不能保证是可用的。

  第一步,计算出绑定CarService的最大重试次数。这个次数决定了后面,多久会显示连接异常的日志。

  第二步也是最关键的一步,构造出Car对象并返回给调用方,同时将状态通过statusChangeListener回调给调用方。正常流程下到createCar()方法执行到这里就已经结束了。

  1)连接成功:由于在createCar中已经创建好了mService,所以正常流程下,执行到return就结束了,后面流程基本都是出现异常触发了重连。

  正是由于finishClient()这种机制的存在,所以调用方应该要监听CarService的连接状态。

  以上就Car API的实现过和原理了。注意在createCar()中有这样一段代码。

  想要说清楚CarService实现方式,我们需要搞明白CarService是怎么启动的。

  通过以上的步骤CarService就完成了启动,CarService的启动时序如下所示:

  CarService进入启动时序后,会onCreate()方法中进行一系列的自身的初始化操作,步骤如下:

  2)创建ICarImpl对象,并调用init方法,它就是ICar.aidl接口的实现类,我们需要通过它才能拿到其他的Service的IBinder对象。

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

  2)把服务对象缓存到CarLocalServices中,这里主要是为了方便Service之间的相互访问。

  3)将服务对象放置一个list中。这样init方法中就可以以循环的形式直接调用服务对象的init,而不需要一个个调用。VechicleHAL的程序也会在这里完成初始化。

  本篇讲解了CarService的总体结构,以及Car API 的实现原理,CarService中实现的功能非常庞大,就像文章中反复在强调的那样开博体育,在CarService实现的功能几乎就是覆盖整个车载Framework的核心。

  然而现实中为了保证各个核心服务的稳定性,同时降低CarService协同开发的难度,一般会选择将一些重要的服务拆分单独作为一个独立的Service运行在独立的进程中,导致有的车机系统中CarService只实现了CarPropertyService的功能。

  文中提到的其他核心Service,会在以后的时间里逐个介绍,感谢你的阅读,希望对你有所帮助。

  一、女生最吃香的职业 女生最吃香的职业广泛而多样,包括但不限于:医生、护士、教师、市场营销人员、公关专员、人力资源...

  在当今社交网络发达的时代,交友应用层出不穷。其中,心遇邀请码【AXWGQB】以其独特的功能和用户体验,成为了备受瞩...

  《太太给我两个亿,要我给太子守寡》洛谦洛禹(完结篇)全文免费阅读【笔趣阁】

  《太太给我两个亿,要我给太子守寡》洛谦洛禹(完结篇)全文免费阅读【笔趣阁】 主角:洛谦洛禹 简介:太太给我两个亿,...

  2023年双十二购物节即将到来,如果您正在考虑购买手机,以下是一些网友推荐的手机型号: 氧惠APP(带货领导者)—...

  2024年货节的确切时间暂时还没有公布,但通常会在每年农历的腊月期间举行。根据往年的经验,年货节通常会从农历腊月初...

  近期有一则热门线后七天轻松赚取两万”,那么他是如何实现的呢? 整个事件的起因是,苹果推出了新款手...

  在这个问题中,我们首先需要理解“一比一积家高仿手表”的含义。这指的是一种高仿造的手表,其设计和外观与真正的积家手表...

  氧惠app怎么赚钱?想做氧惠但是不太了解,谁能把氧惠app佣金模式解析一下?最近在浏览网页时发现很多人都在聊氧惠,...

  本文为大家介绍阿里云账号注册、领取优惠券和代金券、试用云服务器的流程。通过本文的引导,用户将能够轻松上手阿里云,享...

  职场热书《绯色天骄》江海川全文TXT阅读完整章节 主角:江海川 简介: 风云官场,一场由红尘情网交织的美梦。江家私...

  Android车载应用开发与分析(11)- 车载Android应用开发入门指南

  1. 前言 - 移动互联网退潮下的汽车大战 将时间回退到2017年我大学刚毕业时,彼时移动互联网就已经开始退潮,各...

  1.Hvac Hvac:供暖通风与空气调节(Heating Ventilation and Air Conditi...

  --------本文摘自google官方关于automotive架构讲解内容。转载请注明出处。--------- ...

  Android Automotive平台 Android Automotive是通过Android的通用框架,语言...

  1 什么是Binder? 从IPC角度来说, Binder 是 Android 中特有的一种跨进程的通信方式 Bi...