前言

依据中汽协数据显现,2022年8月中国轿车出口量达30.8万辆,同比增长65%,这也是历史上首次超过30万辆。从本年前八个月整体状况来看,我国轿车出口量现已逾越德国,仅次于日本轿车出口量。其间,新动力轿车1-8月出口量同比增长超九成,贡献了重要的增量。

众所周知,本年互联网职业开展的并不愉快,导致互联网职业工作局势不太理想,“开猿节省”的事情时有发生,所以不少Android开发萌生了转行做车载的主意,之前我其实写过一篇凑数用得 Android车载运用开发与分析(11)- 车载Android运用开发入门攻略,这篇文章的初衷其实是劝Android开发的同学慎重转行搞车载!

不过仍是有些和我一样是从手机运用转行做车载运用的同学读完后,希望我能再详细讲讲车载Android的学习,一些准备做车载的同学,也以为之前的博客写得太乱,所以决议从一个车载运用工程师的视点,从头来讲讲车载Android体系。

车载操作体系

轿车操作体系是从传统轿车电子不断演变而来的,传统轿车电子产品可分为两类:

一类是轿车电子操控装置,经过直接向履行机构(如电子阀门、继电器开关、履行马达)发送指令,以控 制车辆要害部件(如发动机、变速箱、动力电池)协同工作,这类体系一般统称为电子操控单元(ECU);

另一类是车载电子设备,如外表、文娱音响、导航体系、HUD等,这类体系不直接参与轿车行进的操控 决议计划,不会对车辆行进功能和安全产生影响,通常统称为车载信息文娱体系(IVI)。这也是Android程序员首要担任的范畴。

干流车载操作体系架构

从应用工程师的角度再谈车载 Android 系统

当前国内干流车载操作体系的架构如上所示,左侧是轿车的中控、副驾屏幕,操作体系一般是Android,右侧是轿车的外表屏幕,一般是QNX体系。

车载体系中还有一些Security、SOA、AutoSAR相关的模块,这些模块作为Android工程师归于知道了也插不上手,画出来也看不懂的东西,就悉数省掉了。

先来解释几个Android程序员或许不太熟悉的模块:

以太网

以太网(Ethernet),是一种核算机局域网技术,也是互联网从业者,天天打交道的东西。在轿车座舱中IVI硬件与其他硬件间通讯有时需求凭借以太网来完结,例如:MQTT、HTTP等。

CAN

操控器局域网 (Controller Area Network,简称CAN或许CAN bus) 是一种功用丰盛的车用总线标准。被规划用于在不需求主机(Host)的状况下,答应网络上的单片机和仪器彼此通讯。 它依据音讯传递协议,规划之初在车辆上选用复用通讯线缆,以降低铜线运用量,后来也被其他职业所运用。

CAN 是车载范畴很重要的一种通讯总线,咱们在中控屏上能够随时检查、设置车门、发动机、后备箱这些模块,其实便是凭借CAN bus完结的,即使是Android程序员也经常要和它打交道,以后会详细讲讲这个东西。

MCU

微操控器单元,它担任着轿车很大一部分的功用,例如经过车载操控器对各项数据进行分析处理,以做出最优决议计划;担任对车辆的信息文娱交互和运动操控等等。

总的来说,MCU能够运用于车辆的通讯、动力、存储、感知以及核算,对轿车职业有着重要的作用。

SOC

SoC的定义多种多样,因为其内在丰盛、运用范围广,很难给出精确定义。一般说来, SoC称为体系级芯片,也有称片上体系(System on Chip),意指它是一个产品,是一个有专用方针的集成电路,其间包含完整体系并有嵌入软件的悉数内容。

车载Soc和常见的手机Soc十分类似,内部集成了CPU和GPU。目前最干流的车载Soc是高通的8155,它便是高通在手机Soc骁龙855的根底上开展而来的。

QNX

QNX是商业类Unix实时操作体系,首要针对嵌入式体系商场。QNX采纳微中心架构,操作体系中的大都功用是以许多小型的task来履行,它们被称为server。这样的架构使得用户和开发者能够封闭不需求的功用,而不需求改动操作体系本身。

QNX的运用十分广泛,被广泛运用于轿车、轨道交通、航空航天等对安全性、实时性要求较高的范畴,在轿车范畴的商场占有率极高。

该产品开发于20世纪80年代初,后来改名为QNX软件体系公司,公司已被黑莓公司并购。

Hypervisor

一种运转在根底物理服务器和操作体系之间的中心软件层,可答应多个操作体系和运用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。

目前国内干流的轿车座舱,都是在一个SOC上一起运转着两个不同特性的操作体系。对文娱、运用生态有需求的中控、副驾一般由Android体系操控,而对稳定性、安全性要求较高的外表盘,则由QNX体系直接操控,Android能够看做是一个运转在QNX上的虚拟体系,其底层技术原理便是Hypervisor。


其实以上说得这些都是从Android工程师视点看到的车载操作体系,实际上这只是车载操作体系的冰山一角,最底层的Other Hardware更能代表智能轿车操作体系的中心,它包含高级驾驭辅佐体系、泊车辅佐体系、自动驾驭体系、TCU、4G/5G网关、中央操控器等等。这些复杂的硬件与软件一起组成了一个智能轿车操作体系。

现代轿车的操作体系是如此的复杂,一些轿车的TCU、中央操控器甚至还额定运转着一套操作体系(例如linux),所以现在还没有哪一个轿车/主机厂商能够独立完结整套体系的开发,基本都需求依赖许多的第三方软、硬件供货商(笔者之前便是上任于一家轿车软件供货商,不过现在现已处于提桶状况了)。

好在作为Android程序员咱们只需求关心Android体系的那部分。

车载 Android 体系

车载Android体系,又称Android Automotive,是对原始Android体系的一个功用扩大版别,在编译AOSP源码时能够看到相应的编译选项。

从应用工程师的角度再谈车载 Android 系统

Android Automotive 编译后的原始界面如下所示,相信有过车载开发经验的同学对这个界面必定不陌生,咱们正是在这个界面上把车载Android体系一点点建立起来的。

从应用工程师的角度再谈车载 Android 系统

Android Automotive

Android Automotive 是一个依据 Android 渠道扩展后,适用于现代轿车的智能操作体系,能够直接运转为Android体系开发的运用。Android Automotive并非Android的分支或并行开发版别。它与手机和平板电脑等设备上搭载的Android运用相同的代码库,位于同一个存储区中。

Android Automotive与Android最大的差异在于,Android Automotive增加了对轿车特定要求、功用和技术的支撑。

Google的官方文档:source.android.google.cn/docs/device…

Android Auto

除了Android Automotive,Google还推出了一个Android Auto。两者的命名方法或许有点让人疑惑不解。下面介绍了它们之间的差异:

  • Android Auto 是一个依据用户手机运转的渠道,可经过 USB 衔接将 Android Auto 用户体会投射到兼容的车载信息文娱体系。Android Auto本质上便是一个运转在Android体系上的车载运用,与苹果的CarPlay,百度的CarLife类似。
  • Android Automotive 是一个可定制程度十分高的开源Android渠道,它是一个完整的操作体系。

需求说明的是,运用Android Auto需求用户的手机支撑Google服务结构,所以一般只在国内出售的轿车基本都不支撑Android Auto,一些沿用了国外车机体系的合资车型或许会支撑Android Auto。

车载 Android 运用

常见的车载运用

SystemUI

体系的UI。SystemUI是一个标准的android运用程序,它提供了体系UI的统一办理计划。 常见的状况栏、导航栏、音讯中心、音量调节弹窗、蓝牙衔接弹窗等一系列后台弹窗都是由SystemUI模块担任办理。

开发难度:SystemUI作为Android体系启动的榜首个带有UI的运用程序,对启动功能和稳定性都有很高的要求。SystemUI需求办理的模块十分多,导致开发使命比较深重,有的车载项目会要求SystemUI兼容原有的运用层API,那么开发难度还会上升。开发人员需求对Android原生的SystemUI源码有必定的了解。

Launcher

Android体系的桌面。

开发难度:Launcher是与用户交互最多的运用程序之一,相同对启动功能和稳定性都有很高的要求。Launcher开发难度首要会集在与3D车模的互动(假如有3D模型),或许需求支撑Widget的显现(WidgetHost),各种运用的拖动和编辑等。开发人员最好对Android原生的Launcher源码有必定的了解。

Settings

体系设置,是车载Android体系中十分重要的一个体系级运用,是整个车载IVI体系的操控中心,整车的音效、无线通讯、状况信息、安全信息等等都是需求经过体系设置来检查和操控。

开发难度:体系设置首要难度都会集在对Android Framework层API的理解上,例如蓝牙、Wi-Fi设置就需求开发人员对体系级API有必定的了解,这些内容往往都需求阅览Android原生运用的源码才干了解,所以体系设置也是一个开发难度比较大的车载运用。

CarService

车载Android体系的中心服务之一,一切运用都需求经过CarService来查询、操控整车的状况。例如:车辆的速度、档位、点火状况等等。

VehicleSettings

车辆设置,更常用的叫法是『车控车设』。担任办理整个车辆表里设置项的运用,首要与CarService进行数据交互。可设置项十分多。驾驭模式、方向盘助力、后视镜折叠、气氛灯、座舱监测、无线充电等等。

开发难度:首要难度会集在复杂多变的UI,有的主机厂商会在HMI中引进3D化的交互模型,就还需求考虑与3D模型间的通讯,一起还需求熟练运用CAN东西来模仿轿车的CAN信号用于调试和开发。

HVAC

空调。担任办理整个车辆空调的运用,首要与CarService进行数据交互。

开发难度:和『车控车设』类似。

Map

地图,车载体系的中心功用之一,担任导航和语音提示等功用。不同的主机厂商有不同的开发方法。不外乎有三种:

1)选择运用百度、高德的地图SDK自行开发导航运用;

2)将导航模块外包给百度、高德,由地图供货商进行定制化开发;

3)直接集成地图供货商已有的车载版别的运用;

开发难度:首要会集在对地图SDK的运用和理解上,并且地图运用归于对功能要求较高的模块。

Multi-Media

多媒体运用。一般包含图片浏览、在线音视频播放器、USB音视频播放器、收音机等。


车载的运用远不止以上说得这些,依据不同的需求,还有十分多的Service需求做定制化开发,这儿只列举了最常见的运用类型。

轿车上还会有一些第三方的运用,常见的有QQ音乐、微信、QQ、抖音、讯飞输入法等等,这些运用主机厂商不会获得源码,一般只会拿到一个apk,直接集成到Android体系中即可。

车载运用与移动运用的差异

夸张一点说,移动端的运用开发和车载运用开发,彻底就不是一个技术思路。总结一下大致有以下几个差异:

1)运用等级不同

大都车载运用归于体系级运用,能够调用Android SDK内部躲藏的API,也不需求动态地向用户申请权限。移动运用是普通运用,体系对其限制许多,需求恪守Android运用的开发标准。

因为车载运用是体系级运用,所以移动端许多常用的技术比如热修复、插件化基本都不会选用,可是相对的进程保活、开机自启就变得十分简单了。

2)迭代方法不同

移动运用只要用户的手机接入了WiFi就能够进行在线晋级,所以移动运用多选用小步快跑的形式,进行快速迭代。

车载体系级运用的更新只能以整车OTA的形式进行,而OTA或许会消耗名贵的车机流量,所以车载运用在SOP(量产)前,就有必要完结悉数需求的开发,并且不能呈现严重的bug。在正式交给用户前,车厂内部或4S店还会进行几回OTA晋级用做最后的bug修复。(假如在交给用户后还有严重的bug或需求未完结,那么大概率项目经理、程序员都要祭天了)

3)技术道路不同

正是因为车载运用对稳定性的要求极高,所以车载运用在开发时,对待新型技术会十分的慎重,比如,目前只有少数主机厂商在运用Kotlin开发车载运用,毕竟Android Framework都还没有改成Kotlin,大部分厂商对Kotlin的积极性不高。并且车载运用也不答应随意运用开源结构,假如有必要运用,必须留意结构的开源协议,以免给轿车厂商带来不必要的麻烦。

4)运转环境不同

车载运用的运转环境是经过高度定制化的Android体系,定制化也就意味着bug。移动端的运用呈现bug时,咱们的榜首反应是运用的代码有缺陷。车载运用发现bug也要考虑到是不是体系本身呈现了bug,这是一件十分有挑战性的事,运用开发与体系开发彼此扯皮、泼脏水也归于粗茶淡饭。

车载运用需求掌握的技术

除了一般Android开发需求学习的根底内容外,一名优异的车载运用工程师还需求掌握以下的技术

1)MVVM架构

尽管现在一些移动端运用现已开始测验MVI架构,可是就像前面说得,车载运用对待新技术都会持张望情绪,目前干流的车载运用仍是选用依据Jetpack组件的MVVM架构。

2)构建体系级运用

因为大都车载运用都归于体系级运用,所以有必要了解怎么构建一个体系级运用,这方面的内容能够看我之前写得Android车载运用开发与分析(11)- 车载Android运用开发入门攻略,尽管写得比较乱凑活看吧。

还有一本比较老的书《Android深度探究:体系运用源代码分析与ROM定制》也能够看一看。

3)功能优化

运用的功能优化是个亘古不变的论题,掌握运用的各种功能优化方法,也是一个Android程序员必备的生计手法,轿车座舱的SOC功能比旗舰手机要差不少,假如优化好车载运用将是一个十分有挑战性的使命。

4)IPC通讯

Android中最常用的跨进程通讯手法是Binder,因为有许多的Service需求与运用进行交互,所以依据Binder的AIDL在车载运用开发中运用得十分广泛,学会运用AIDL也相同归于必备技术之一。

5)CAN仿真测验东西

CAN仿真测验东西包含了软件和硬件,在车载运用开发时咱们需求凭借这些东西来模仿发送CAN功能给到IVI来调试咱们的运用,在实车调试阶段,也需求凭借这些东西来捕获车辆的CAN信号来分析一些bug。常用的有CAN alyzer、CANoe、TS-Master等等,这些东西价格都极其贵重,独自购买不现实,在车载运用开发必须掌握学习和运用的机会。

6)体系运用源码

这一项是我以为最重要的,不少车载运用层项目都是重复定制各种SystemUI、Launcher、Settings等等,读懂Android体系运用源码对咱们定制化开发这些运用有十分大的优点。


以上是一些我以为车载运用开发时需求掌握的技术,其他的一些诸如:adb调试指令、Linux操作体系的运用、AOSP源码编译也都需求额定学习,依据不同的需求,JNI、NDK等技术也有或许会用上。

车载运用开发者的未来

这篇文章的开头提到了一则新闻,中国本年的轿车出口量现已逾越德国仅次于日本,这似乎是一个振奋人心的音讯。轿车工业的高速开展,对咱们这些车载程序员当然归于利好,可是最近的一则音讯又让我改动了看法。

9月29日,零跑轿车正式赴港上市。成为众人意料之外继“蔚小理”后的又一新秀。可是零跑轿车的成果似乎并没有得到资本商场的认可,在其上市首日,股价便遭遇大跌。依据数据显现,9月29日当日收盘,零跑轿车的股价为31.9港元/股票,相较发行价暴降33.54%。而随后的半个月以来,零跑轿车的股价更是跌落56%,市值蒸发343亿港元。

一边是轿车出口量大增,另一边是新势力造车第二梯队的零跑上市即破发,并且两个交易日股价即腰斩,尽管有叠加疫情的影响,但这也说明晰资本商场对造车企业的热情正在显著削弱,假如投资人赚不到丰盛的报答,那么以后的车企日后想要再从商场融资,恐怕不会是一件轻松的事。

以上说得都是大环境,可是作为技术人本职工作仍是磨炼自己的技术为主。

从应用工程师的角度再谈车载 Android 系统

回过头咱们还要再看一下这张架构图,图中标蓝的部分是运用开发能够发挥的当地。不知道你有没有发现,运用实际上在车载操作体系中占据的份额很小,并且技术门槛也不高,这基本决议了在车载这个范畴,单纯的Android运用开发远景并不宽广。

可是巨大的车载体系让运用开发者有了继续深入研究与实践的或许,那么是卷Framework仍是Native或是HAL就需求你自己决议了!

最后总结一句,移动端的运用开发和车载运用开发,本质上走得两套技术道路,所以要慎重转行!假如现已决议,请必须趁早!