目录
- 一、车载架构
- 二、基础知识
- 三、AutoMotive整体架构
-
- [3.1 Car Apps](#3.1 Car Apps)
- [3.2 Car API](#3.2 Car API)
- [3.3 Car Services](#3.3 Car Services)
- [3.4 Vehicle HAL:汽车的硬件抽象层描述](#3.4 Vehicle HAL:汽车的硬件抽象层描述)
- [3.5 HAL接口](#3.5 HAL接口)
- [3.6 CarService启动流程](#3.6 CarService启动流程)
- [3.7 应用层调用](#3.7 应用层调用)
- [3.8 整体调用框架](#3.8 整体调用框架)
- 四、Framework模块功能
一、车载架构
基础架构图:
二、基础知识
T-BOX
又称TCU(车联网控制单元),指安装在汽车上用于控制跟踪汽车的嵌入式系统,是车载信息交互系统核心部件,有了它汽车才能实现联网功能,所以也起到中央网关的作用。通常包括GPS单元、移动通讯外部接口电子处理单元、微控制器、移动通讯单元以及存储器等。
对车辆,T-Box可提供车辆故障监控、电源管理、远程升级、数据采集、智慧交通等功能,对车主,T-Box可为提供车辆远程控制、安防服务等功能。T-BOX属于外围硬件,与中控、仪表并不集成在一个主板上。
SOC
SoC的定义多种多样,由于其内涵丰富、应用范围广,很难给出准确定义。一般说来, SoC称为系统级芯片,也有称片上系统(System on Chip),意指它是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。
车载Soc和我们最常见的手机Soc非常类似,内部集成了CPU和GPU。目前最主流的车载Soc是高通的SA8155,它就是高通在手机Soc骁龙855的基础上发展而来的。
MCU
微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机。
一般汽车座舱内,集成SOC的主板上也会额外集成一个或多个MCU。
ECU
车载ECU(Electronic Control Unit)是指安装在汽车上用于控制和管理车辆各种系统的电子控制单元。它是汽车电子系统中的核心部件,负责监控、控制和优化车辆的各种功能。
AutoSAR
Adaptive AutoSAR 是一种适用于高级自动驾驶的软件架构平台,提要提供高性能的计算和通信,提供灵活的软件配置,支撑应用的更新。
Adaptive AutoSAR 的主要架构分为硬件层、ARA(AutoSAR Run-timeFor Adaptive实时运行环境)以及应用层。
应用层包含的应用程序模块(AA)运行在ARA之上,每个AA以独立的进程运行。ARA由功能集群提供的应用接口组成,他们属于自适应平台。自适应平台提供Adaptive AutoSAR 的基本功能和标准服务。
每个AA可以向其他AA发生服务。基于这种架构,整车的功能之间可以解耦。
Hypervisor
一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。
目前主流的汽车座舱,都是同时在一个Soc上运行着两个不同的操作系统,一个是显示汽车仪表盘的QNX系统,另一个用于车载信息娱乐的Android系统,其底层技术原理就是Hypervisor。
QNX
QNX是一种商用的、遵从POSIX规范的类Unix实时操作系统,目标市场主要是面向嵌入式系统,具备高运行效率、高可靠性特点,并在工控领域拥有近40年的使用经验,被广泛应用于汽车、轨道交通、航空航天等对安全性、实时性要求较高的领域。
QNX在车载操作系统市场的占有率超过75%,在更注重生态和内容的车载娱乐系统占有率也超过60%,而在强调安全性的仪表盘以及驾驶辅助领域,QNX的市占率更是达到了近100%。
2010年QNX被加拿大RIM公司收购,而这家公司就是黑莓BlackBerry的母公司。
SOA
SOA(Service-OrientedArchitecture)是一种基于业务实现的粗粒度松耦合的面向服务的分布式架构,即实现业务和技术的分离,又实现业务和技术的自由组合。
以位置服务为例,很多车内应用会用到位置信息,像天气、拍照、导航,这些应用根据自身服务有不同的需求,对位置信息的处理各不相同,SOA就可以很好地解决这个问题。
SOA原本是服务器开发中用到的技术,现如今也被用在车载操作系统领域,但是目前关于SOA的技术规范比较混乱,国内主机厂商外对于SOA的实现方式也有区别。
SOA并不车载操作系统必须的,其实目前为止已经上市的车型中,很少采用了SOA架构,所以它还只是车载操作系统未来的一个发展方向。
车载以太网
车载以太网是一种用以太网连接车内电子单元的新型局域网技术,与传统以太网使用4对非屏蔽双绞线电缆不同,车载以太网在单对非屏蔽双绞线上可实现100 Mbit /s,甚至1Gbit/s的传输速率,同时还满足汽车行业对高可靠性、低电磁辐射、低功耗、带宽分配、低延迟以及同步实时性等方面的要求。车载以太网的设计是为了满足车载环境中的一些特殊需求。例如:满足车载设备对于电气特性的要求(EMI/RF);满足车载设备对高带宽、低延迟以及音视频同步等应用的要求;满足车载系统对网络管理的需求等。因此可以理解为,车载以太网在民用以太网协议的基础上,改变了物理接口的电气特性,并结合车载网络需求专门定制了一些新标准。针对车载以太网标准,IEEE组织也对IEEE 802.1和IEEE 802.3标准进行了相应的补充和修订。
CAN
CAN是控制器域网 (Controller Area Network, CAN) 的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。
CAN在车载操作系统&应用开发中使用非常广泛,车载Android的核心服务之一 - CarService本质上就是将外部硬件通信报文解析成上层应用可以识别的数据,这里的通信报文目前普遍都是CAN报文。
3D HMI设计工具 & 嵌入式图形引擎
随着车载Soc算力的提高,现代座舱越来越喜欢引入3D化的图形界面,3D化的界面可以实时生成动画反馈,大大提升了界面的美观性和易用性。目前车载开发中主流的3D HMI设计工具&图形引擎有老牌的游戏开发工具如Unity 3d、Unreal(虚幻),也有专用于汽车HMI设计&图形显示的 --- Kanzi 。
三、AutoMotive整体架构
Android AutoMotive是在原先Android的系统架构上增加了一些与车相关的(图中虚线框中的)模块。
3.1 Car Apps
packages/apps/Car/
:
├─Dialer 拨号盘
├─Hvac 空调
├─LatinIME 输入法键盘
├─Launcher 主界面
├─LensPicker
├─libs car apps通用lib库
│ ├─car-apps-common
│ ├─car-broadcastradio-support
│ ├─car-media-common
│ ├─car-settings-lib
│ ├─car-stream-ui-lib
│ └─specs
├─LocalMediaPlayer
├─Media
├─Messenger
├─Overview (空文件夹)
├─Radio 收音机
├─Settings 设置
├─Stream (空文件夹)
├─SystemUpdater 系统更新
└─UserManagement (空文件夹)
3.2 Car API
汽车App特有的接口(/packages/services/Car/car-lib
)
先整体看下/packages/services/Car
下的目录:
├─car-cluster-logging-renderer 仪表盘渲染服务(APK)
├─car-default-input-service 输入服务(APK)
├─car-lib Car API(jar包)供APP调用
├─car-maps-placeholder 地图安装检测(APK)
├─car-support-lib Car support lib兼容包
├─car-systemtest-lib test包
├─car-usb-handler USB检测枚举(APK)
├─car_product
├─evs 外部视景系统,支持后视摄像头和环绕视图显示(c++应用)
├─obd2-lib 监控车辆运行状态和回报异常,产生故障代码和提醒讯号(jar包)
├─procfs-inspector
├─service
├─tests 测试包
├─tools
├─TrustAgent 信任凭证(APK)
└─vehicle-hal-support-lib
/packages/services/Car/car-lib
目录:
├─annotation 自定义注解
├─app
│ └─menu Car应用菜单UI VIEW相关
├─cluster 仪表盘相关
│ └─renderer 渲染相关
├─content
│ └─pm 提供与包管理相关的car特定API
├─diagnostic 汽车诊断
├─drivingstate 驾驶状态信息
├─hardware 车辆硬件相关
│ ├─cabin 座舱
│ ├─hvac 通风空调(hvac是Heating,ventilation,air conditioning的缩写)
│ ├─power 电源相关
│ └─property 传感器属性设置与监听
├─input 输入事件
├─media 汽车特定音频API
├─navigation 为仪表集群提供导航状态的API
├─settings 存储汽车配置值的管理器
├─storagemonitoring 存储监测
├─test 只用于测试
├─trust ble认证
├─user 用户管理
├─vms 监测其他进程(Vehicle Monitor Service)
└─*.java/*.aidl Car应用直接调用的基本API和常量定义
3.3 Car Services
系统中与车相关的服务(/packages/services/Car/service
)
AutoMotive中的Car Service集中在一个App中。Car Service并非一个服务,而是一系列的服务。这些服务都在ICarImpl.java构造函数中列了出来。
├─cluster 仪表盘
│ ├─InstrumentClusterService.java 负责与car的仪表组进行交互
├─garagemode
│ ├─GarageModeService.java 控制车库模式
├─hal 与hal通信
│ ├─DiagnosticHalService.java 与VehicleHal调用和回调
│ ├─InputHalService.java 与VehicleHal调用和回调
│ ├─PowerHalService.java 与VehicleHal调用和回调
│ ├─PropertyHalService.java 与VehicleHal调用和回调
│ ├─VmsHalService.java 与VehicleHal调用和回调
│ ├─VehicleHal.java 与HalClient调用和回调
│ ├─HalClient.java 与hal调用和回调
├─monitoring 监视器
│ ├─CarMonitoringService.java 监视应用程序资源使用
├─pm 包管理
│ ├─CarPackageManagerService.java car包管理
├─storagemonitoring 存储监测
├─systeminterface
├─user
│ ├─CarUserService.java 管理汽车用户
├─AppFocusService.java 应用焦点管理
├─CarAudioService.java 音频
├─CarBluetoothService.java 蓝牙
├─CarConfigurationService.java 解析JSON配置文件(car_config)
├─CarDiagnosticService.java 汽车诊断
├─CarDrivingStateService.java 推断车辆当前行驶状态
├─CarInputService.java 键入输入
├─CarLocationService.java 存储/获取位置
├─CarNightService.java 日/夜模式
├─CarPowerManagementService.java 电源管理
├─CarProjectionService.java 投影与语音操作
├─CarPropertyService.java 属性配置
├─CarStorageMonitoringService.java storage监控
├─CarTestService.java 测试/模拟车辆HAL的服务
├─CarUxRestrictionsManagerService.java 监听当前驾驶状态
├─PerUserCarServiceHelper.java PerUserCarService当前用户可操作的服务
├─SystemActivityMonitoringService.java 监视AMS
├─SystemStateControllerService.java //TODO
├─VmsPublisherService.java publish vms
├─VmsSubscriberService.java subscrib vms
└─*.java 其它java bean/帮助类/工具类
3.4 Vehicle HAL:汽车的硬件抽象层描述
(/hardware/interfaces/automotive
)
│ └─1.0
│ │ Android.bp
│ │ IAudioControl.hal 定义跨进程调用方法
│ │ types.hal 定义跨进程传递数据类型
│ │
│ ├─default
│ │ Android.bp
│ │ android.hardware.automotive.audiocontrol@1.0-service.rc
│ │ AudioControl.cpp IAudioControl实现
│ │ AudioControl.h
│ │ service.cpp 注册AudioControl服务
│ │
│ └─vts vts测试
│
├─evs
│ └─1.0
│ │ Android.bp
│ │ IEvsCamera.hal 定义跨进程调用evs camera方法
│ │ IEvsCameraStream.hal 定义跨进程回调evs camera数据流方法
│ │ IEvsDisplay.hal 定义跨进程调用evs display方法
│ │ IEvsEnumerator.hal 定义跨进程调用枚举evs camera/evs display方法
│ │ types.hal 定义跨进程传递数据类型
│ │
│ ├─default
│ │ Android.bp
│ │ android.hardware.automotive.evs@1.0-service.rc
│ │ EvsCamera.cpp IEvsCamera实现
│ │ EvsCamera.h
│ │ EvsDisplay.cpp IEvsDisplay实现
│ │ EvsDisplay.h
│ │ EvsEnumerator.cpp IEvsEnumerator实现
│ │ EvsEnumerator.h
│ │ service.cpp 注册EvsEnumerator服务
│ │ ServiceNames.h
│ │
│ └─vts vts测试
│
└─vehicle
└─2.0
│ Android.bp
│ IVehicle.hal 定义跨进程调用方法
│ IVehicleCallback.hal 定义跨进程回调方法
│ types.hal 定义跨进程传递数据类型
│
└─default
│ Android.bp
│ android.hardware.automotive.vehicle@2.0-service.rc
│ VehicleService.cpp 注册VehicleHalManager服务
│
├─common 公共类
│ ├─include
│ │ └─vhal_v2_0
│ │ ConcurrentQueue.h
│ │ Obd2SensorStore.h
│ │ RecurrentTimer.h
│ │ SubscriptionManager.h
│ │ VehicleHal.h
│ │ VehicleHalManager.h
│ │ VehicleObjectPool.h
│ │ VehiclePropConfigIndex.h
│ │ VehiclePropertyStore.h
│ │ VehicleUtils.h
│ │ VmsUtils.h
│ │
│ └─src
│ Obd2SensorStore.cpp
│ SubscriptionManager.cpp
│ VehicleHalManager.cpp
│ VehicleObjectPool.cpp
│ VehiclePropertyStore.cpp
│ VehicleUtils.cpp
│ VmsUtils.cpp
│
├─impl 具体实现类
│ └─vhal_v2_0
│ │ CommBase.h
│ │ DefaultConfig.h
│ │ EmulatedVehicleHal.cpp
│ │ EmulatedVehicleHal.h
│ │ FakeValueGenerator.h
│ │ JsonFakeValueGenerator.cpp
│ │ JsonFakeValueGenerator.h
│ │ LinearFakeValueGenerator.cpp
│ │ LinearFakeValueGenerator.h
│ │ PipeComm.cpp
│ │ PipeComm.h
│ │ SocketComm.cpp
│ │ SocketComm.h
│ │ VehicleEmulator.cpp
│ │ VehicleEmulator.h
│ │
│ └─proto
│ Android.bp
│ VehicleHalProto.proto
└─tests
3.5 HAL接口
IVehicle.hal:
getAllPropConfigs() generates (vec propConfigs);
列出车载 HAL 所支持的所有属性的配置
getPropConfigs(vec<int32_t> props)
generates (StatusCode status, vec propConfigs);
根据给定的属性id返回指定的属性配置列表
get(VehiclePropValue requestedPropValue)
generates (StatusCode status, VehiclePropValue propValue);
获取车辆属性值
set(VehiclePropValue propValue) generates (StatusCode status);
设置车辆属性值
subscribe(IVehicleCallback callback, vec options) generates (StatusCode status);
监视属性值的变化
unsubscribe(IVehicleCallback callback, int32_t propId) generates (StatusCode status);
取消监视属性值的变化
IVehicleCallback.hal:
oneway onPropertyEvent(vec propValues);
当属性值变化时
oneway onPropertySet(VehiclePropValue propValue);
当属性值被设置时
oneway onPropertySetError(StatusCode errorCode, int32_t propId, int32_t areaId);
当属性值设置错误时
3.6 CarService启动流程
3.7 应用层调用
编译/packages/services/Car/car-lib生成jar包,导入应用中可以使用相关api。
例:
java
Car car = Car.createCar(context, handler);
CarAudioManager carAudioManager = car.getCarManager(Car.AUDIO_SERVICE);
获取CarService中各个对应service的CarXXXManager类调用方法或者监听回调。
3.8 整体调用框架
四、Framework模块功能
Android车载程序员主要负责的部分:
Audio:收音机、音频模块,Path:frameworks/av/services/audioflinger/,Android管理来自Android应用的声音,同时控制这些应用,并根据其声音类型将声音路由到HAL中的输出设备
Carservice:car service,Path:packages/services/Car/
BT&Telecom:蓝牙电话模块,CarBluetoothService维护当前用户的蓝牙设备以及连接到IVI的每个配置文件的优先级列表。设备按指定的优先级顺序连接到配置文件,Path:packages/services/Car/service/src/com/android/car/CarBluetoothService.java;CarBluetoothManager会提供connectDevices() API调用,根据为每个蓝牙配置文件定义的优先级列表继续连接设备,Path:packages/services/Car/car-lib/src/android/car/CarBluetoothManager.java
Media:视频媒体模块,在frameworks/av/services/目录下
CameraService:camera模块,倒车(有IVC和360两种方式)
EOLManager:EOL下线配置
TunerManager
TBoxManager:Tbox,上网定位
UpdateService:升级(包含很多方面,SOC、MCU、屏幕等)
参考链接:Thanks,Sincerely