1 Android 汽车操作系统概述
车载安卓系统又称为Android Automotive OS,是原有安卓系统的功能扩展版本。
和手机操作系统一样,Android Automotive OS源代码完全开放,第三方供应商和汽车厂商可以基于官方源代码进行自主开发和扩展,无论是编程语言还是界面都与Android系统一致。
与Android手机上的谷歌服务类似,谷歌也为汽车提供了谷歌汽车服务(GAS),包括谷歌地图、应用商店、谷歌汽车助手等。
谷歌的汽车服务同样不是开源的,而是以软件包的形式提供给厂商。
目前,国内汽车搭载的安卓系统均基于标准的Android Automotive OS,进行架构重新定制和应用程序本地化适配。
2 Android 汽车操作系统架构
Android Automotive OS架构如上图所示。
图中绿色部分为原生Android代码,蓝色部分为车厂需要修改或者增加功能的代码,紫色部分为集成的第三方应用程序。
但在国内实际发展中,我们会根据需要对绿色和蓝色部分进行修改和删减。
系统应用
系统应用程序是为了保证操作系统正常高效运行而配备的各种管理、监控和维护程序。例如:SystemUI、Luancher、系统设置。
OEM 应用程序
厂商应用程序是由主机或车厂开发并集成的应用程序,其基本功能都是与车辆相关的,例如用户手册、电源管理、车辆设置等。
第三方应用程序
第三方应用是将第三方软件公司开发的各种APP集成到车机上,一般以影音娱乐为主,比如哔哩哔哩、爱奇艺等。
一些厂商的车载系统还自带应用商店,用户可以选择下载自己需要的第三方应用。
Android 框架 API
用于实现上层应用程序与System Service通信的接口。
Android 系统服务
系统服务,不用多说,是Android系统的核心模块,支撑Android系统的正常运行。
汽车API
用于实现上层应用程序与CarService通信的接口。
汽车服务
CarService是车载Android系统新增加的核心服务,所有应用程序都需要使用CarService来查询、控制车辆的状态。
CarService包含很多车辆系统服务android离线导航软件,比如CarInputService、CarMediaService、CarPowerManagementService等。
传统 Android HAL
传统的Android硬件抽象层是对Linux内核驱动的封装,向上层提供了稳定的接口,屏蔽了底层的实现细节,同时也规避了Linux内核开源协议。
车载 HAL
车载硬件抽象层是车载 Android 系统中新增的硬件抽象层,其作用是定义标准接口,使得 CarService 可以忽略各个车厂的具体实现。也就是说 CarService 负责调用 VehicleHAL 定义的接口,而 Android Automotive OS 中并没有 VehicleHAL 的具体实现细节,因此 VehicleHAL 需要车厂或者芯片厂自己去实现。
3 常见的车载应用
从事车载应用开发的程序员还是需要对车载应用程序有更多的了解的,下面我们就一起来了解一下常见的车载Android应用程序。
3.1 系统应用
系統介面
系统UI。SystemUI 是标准的 Android 应用程序,为系统 UI 提供统一的管理方案。常见的后台弹窗如状态栏、导航栏、消息中心、音量调节弹窗、蓝牙连接弹窗等均由 SystemUI 模块进行管理。
开发难度:SystemUI作为Android系统启动的第一个带UI的应用程序,对启动性能和稳定性的要求非常高。
SystemUI需要管理很多模块,使得开发任务更加繁重,部分车载项目要求SystemUI兼容原有的应用层API,这会增加开发难度。
启动器
桌面启动器,桌面启动器是帮助用户查找和启动其他应用的软件,主要负责放置小部件以及显示其他应用的入口。
现代智能座舱的HMI设计开始赋予Launcher越来越多的功能,例如显示3D车辆模型、地图定位等。
开发难度:Launcher是与用户交互最多的应用程序之一,对启动性能和稳定性的要求也很高。
Launcher开发的难点主要集中在与3D汽车模型的交互上(如果有3D模型的话),另外可能需要支持小部件(WidgetHost)的显示,各类应用的拖拽、编辑等。
设置
系统设置是车载Android系统中非常重要的系统级应用,是整个车载IVI系统的控制中心,车辆的音效、无线通信、状态信息、安全信息等都需要通过系统设置进行查看和控制。
开发难度:系统设置的主要难点集中在对Android framework层API的理解上,例如蓝牙、Wi-Fi的设置就需要开发者对系统级API有一定的了解。
3.2 多媒体应用
收音机
目前的车载收音机有传统的模拟信号收音机和现代的数字信号收音机,根据销售国家不同,车载收音机支持的类型也不同。
调幅/调频
最常见的模拟广播制式是 AM(调幅广播)和 FM(调频广播)。不同国家和地区的频率范围有所不同。
远程数据传送系统
无线电数据系统(RDS)是一种在传统调频广播中嵌入少量数字信息的通信协议标准android离线导航软件,它在传输信号时可以利用副载波以数字形式发送电台名称、节目类型、节目内容等信息。
DAB 和 DAB+
数字音频广播(DAB)是继AM、FM传统模拟广播之后的第三代数字信号广播,提供接近CD的音质,具有抗噪声、抗干扰、抗波传播衰落、适合高速移动接收等优点,目前主要在欧美、香港等地区使用。
音频和视频播放
影音播放是车载驾驶体验中不可或缺的一部分,现代汽车的影音播放功能主要通过播放SD卡或者U盘中的离线影音文件来实现,而在线影音播放功能基本都与第三方应用集成在一起。
3.3 工具应用
地图
地图,车机系统核心功能之一,负责导航、语音提示等功能,不同主机厂商开发方式不同,大致有三种:
开发难度:主要集中在地图SDK的使用和理解,地图应用是性能要求较高的模块。
语音识别和语音控制
语音技术已经遍布于我们日常生活中的各个角落,而汽车可以说是语音技术应用的最佳例子之一。
驾驶员在开车时很难像使用手机一样操作车载系统,语音控制技术的引入可以帮助驾驶员在不分心的情况下完成各种车辆操作。
目前国内有很多语音供应商,包括科大讯飞、百度、腾讯、华为等。
3.4 车辆控制应用
空调(暖通空调)
汽车空调用于调节车内温度、湿度,为乘客提供舒适的环境。先进的空调系统除了基本的空调功能外,还包括空气净化、香薰系统等。
车辆设置
整车控制系统主要负责舒适性控制、车辆控制和智能驾驶。舒适性控制包括座椅通风、座椅姿势控制、车内灯光、门窗开关等。整车控制包括刹车辅助、车身姿势控制、方向盘助力等。
开发难度:主要难点在于复杂多变的UI,部分主机厂商会在HMI中引入3D交互模型,因此也需要考虑与3D模型的通讯。同时需要熟练使用CAN工具模拟汽车的CAN信号进行调试开发。
3.5 辅助驾驶应用
倒车影像
倒车影像是驾驶辅助系统中的一个重要配置项目,当车辆倒车时,安装在车辆后部的摄像头可以将车辆后方的情况实时显示在中控或者后视镜的显示屏上,方便驾驶员观察。
倒车影像需要覆盖倒车辅助线,倒车辅助线是驾驶员在行驶过程中判断车辆行驶轨迹和车与物体距离的辅助线,通常分为静态倒车辅助线和动态倒车辅助线,动态倒车辅助线的线条会随着方向盘的转动而转动,从而准确刻画倒车轨迹。
360°全景图像
360全景影像又称全景停车系统,是2005年后逐渐兴起的停车辅助技术。
早期的泊车辅助系统多采用雷达或单个摄像头,通过声音报警或显示车辆后置摄像头的视频图像,帮助车辆驾驶员判断车辆与盲角障碍物之间的距离。
雷达报警方式无法直观显示距离,后置摄像头方式又存在盲角、距离判断不准的问题,因此全景泊车技术逐渐兴起。
3.6 联网汽车
车载
CarPlay是苹果推出的一款车载服务应用,苹果手机连接支持CarPlay的车机后,车机系统界面上就会出现手机上的地图、音乐等应用,只要手机上的应用适配了CarPlay功能,就可以直接在车机屏幕上使用。
安卓汽车
Android Auto与Carplay类似,是谷歌推出的车辆连接解决方案,将手机应用程序界面投射到车载系统上,以取代车厂原生的车载系统执行Android应用程序和服务。
由于Android Auto依赖谷歌服务,因此在中国几乎无法使用,目前在中国销售的汽车中支持Android Auto的汽车很少。
车生活
CarLife是百度在2015年推出的车联网解决方案,相比CarPlay、Android Auto等产品,CarLife用户无需关心智能手机的操作系统,只需要通过数据线或者wifi将手机连接到车机系统即可使用。
除以上三种方案外,其他车联网解决方案还包括华为的HiCar、小米的CarWith等。
车载应用远不止以上这些,根据不同的需求,还有很多服务需要定制开发,这里只列出最常见的应用类型。
4 车载应用与移动应用的区别
移动应用开发与车载应用开发有很多相似之处,但也存在一些区别,总结起来大致有以下几点区别:
大部分车载应用都是系统级应用,可以调用Android SDK内的隐藏API,无需向用户动态申请权限。
移动应用程序属于常见应用程序,受到很多系统限制,必须符合Android应用程序开发规范。
由于车载应用是系统级应用,很多移动终端上常用的技术,比如热修复、插件等基本都没有采用,但进程保活、系统自动启动就变得非常简单。
移动应用只要用户手机连接WiFi就能进行在线升级,因此移动应用往往采用小步快进的形式进行快速迭代。
车载系统级应用程序的更新只能以全车OTA的形式进行,而OTA可能会消耗宝贵的车机流量,所以车载应用程序所有要求的开发必须在SOP(量产)之前完成,不能出现任何严重的bug。
在正式交付给用户之前,汽车制造商或4S店将进行几次OTA升级,以修复最终的错误。
正是因为车载应用对于稳定性的要求极高,所以在开发新技术时非常谨慎,例如目前只有少数主机厂商使用 Kotlin 开发车载应用,毕竟 Android framework 还没有换成 Kotlin,大部分厂商对 Kotlin 的热情并不高。
而且车载应用也并不是可以随意使用开源框架的,如果一定要使用的话一定要注意框架的开源协议,避免给汽车厂商带来不必要的麻烦。
车载应用的运行环境是高度定制的Android系统,定制就意味着bug。当手机应用出现bug时,我们的第一反应就是应用代码有缺陷。
当车载应用程序发现bug时,我们还要考虑系统本身是否存在bug。这是一项非常具有挑战性的任务。应用程序开发人员和系统开发人员之间经常会发生争执和互相指责。
车载应用所需的 5 项技能
一名优秀的汽车应用工程师除了具备一般Android开发所需的基础知识外,还需要掌握以下技能:
虽然已经有部分手机应用开始尝试 MVI 架构,但是如前所述,车载应用对于新技术往往持观望态度,目前主流的车载应用依然采用基于 Jetpack 组件的 MVVM 架构。
由于车载应用大多为系统级应用,因此必须了解如何构建系统级应用,更多这方面的知识请参考《Android深度探索:系统应用源码分析与ROM定制》一书。
应用性能优化是一个永恒的话题,掌握各种应用性能优化方法,也是一个Android程序员必备的生存技能,汽车驾驶舱的SOC性能比旗舰手机差很多,优化车载应用将是一个非常有挑战性的工作。
Android中最常用的跨进程通信方式就是Binder,由于有大量的Service需要与应用交互,因此基于Binder的AIDL在车载应用开发中被广泛使用,学会使用AIDL也是必备的技能之一。
CAN仿真测试工具包括软件和硬件,在开发车载应用程序的时候,我们需要使用这些工具模拟发送CAN性能到IVI来调试我们的应用程序,在实际的车辆调试阶段,我们还需要使用这些工具来抓取车辆的CAN信号来分析一些bug。
常用的工具有CAN alyzer、CANoe、TS-Master等,这些工具价格极其昂贵,单独购买不现实,在车辆应用开发中一定要抓住机会学习和使用它们。
很多车载应用层项目重复定制各种SystemUI、Launcher、Settings等,了解Android系统应用程序源码对于我们进行这些应用程序的定制开发有很大的益处。
以上就是我认为开发车载应用需要掌握的一些技能,其他的比如:adb调试指令,Linux操作系统的使用,AOSP源码编译等也需要额外学习,根据不同的需求,可能还会用到JNI,NDK等技术。
结尾
关联:
本文经51Testing授权转载,转载文章所含文字来自作者本人,如内容或版权有问题,请联系51Testing删除。