Android Automotive 源码起步

3,053 阅读8分钟

Android Automotive 源码起步

版本变更

版本日期修改人描述
V1.02022.06.19越过山风Android Automotive 源码起步

目录

车载OS前景


车载OS通常聚焦在特斯拉OS,苹果汽车OS,Android Automotive,黑莓QNX,Linux OS,微软WINCE(已经逐渐被淘汰)

国内的造车新势力有蔚来,小鹏,威马,还有比亚迪,吉利,无一不采用了基于Android做深度定制的车载OS。

在2020年六月,沃尔沃(VOLVO)新车Polestar2在欧美发布,其上面搭载的汽车操作系统就是Google推出的Android Automotive OS

polestar2.png

并且,美国三大车企通用(GM),福特(Ford),菲亚特(FCA)开始拥抱Android Automotive OS

从市场这一侧看,未来欧洲和美国市场将会是Android Automotive OS的主要推动力。其市场占比也将逐渐增加,到2025年预计将会达到3390万辆车使用Android OS。

无论我们是否使用Android Automotive OS,只要我们是基于Android进行深度定制的车载操作系统,那么我们是很有必要去了解一下Google是怎么基于Android平台打造出Android Automotive OS的。

站在巨人的肩旁上,创造属于我们的更美好的车载OS的未来。

Android Automotive 设计原则


“Design for driving”: Safety is the driver’s first responsibility.

安全是驾驶员的第一责任!

design.jpeg

如上图,摄像头,地图,电话被设计在离驾驶员靠近的一侧,并且快捷图标也可以最大的限度的减少驾驶员的分心情况。这一套界面设计在欧洲市场是加分的,但是在国内市场确实没有太多的优势,除了遵循了驾驶的设计准则。

Android Automotive 术语


为了方便我们更好的阅读和学习Android Automotive,我们需要了解以下一些常用的术语和缩略语

术语中文术语英文定义
Android车载操作系统Android Automotive OS(AAOS)开发汽车应用时所用的嵌入式操作系统和平台。
Android 开源项目AOSP适用于 Android 软件堆栈的代码库。AOSP 代码库由 Google 主导,可提供所需信息和源代码,以便您创建定制的 Android 堆栈版本,将设备和配件移植到 Android 平台上,还可确保 Android 设备符合兼容性要求。
应用编程接口API一组协议,用户可借其以编程的方式访问各种工具和服务以及开发软件应用。
AA互联Android Auto(AA)Google 开发的智能手机投影功能,搭载 Android 5.0 或更高版本的移动设备可将其应用投影到车载设备上。
车机HeadUnit(HU)为车载中控台中的主显示屏提供支持的计算单元。
硬件抽象层HAL一种软件层,所有其他更高级别模块必须与之交互才能使用硬件功能。只有 HAL 能够直接调用设备上的各种硬件组件的驱动程序。
车载 HALVehicle HAL该接口会定义原始设备制造商 (OEM) 可以实现的属性,并会包含属性元数据(例如,属性是否为 int 以及允许使用哪些更改模式)。
驱动Board Support Package(BSP)设备的 SoC 专用固件。
数字音频广播和地面数字音频广播Digital Audio Broadcasting (DAB) and Terrestrial-DAB (T-DAB)一种音频广播,其中的模拟音频会被转换为数字信号,并通过 AM 或 FM 频率范围(更常用)在指定信道上传输。
暖通空调HVAC旨在保持特定的操作环境的一套机械设施功能。HVAC 系统可执行多种操作,例如为房屋供暖、为数据中心散热以及控制车载风扇速度。
车载信息娱乐系统In-Vehicle Infotainment(IVI)一组可提供音频和/或视频娱乐的车载硬件和软件功能。在描述面向用户的 Android Automotive 设备功能时,通常将该术语作为车机 (HU) 的同义词。
Google 汽车服务Google Automotive Service(GAS)用于 Automotive 实现的 Google 移动服务 (GMS),包含可集成到 Android Automotive 设备的 Google 服务和应用。
控制器局域网Controller Area Network(CAN)一种车载总线标准,允许微控制器与设备相互通信。
局域互联网络Local Interconnect Network(LIN)汽车分布式电子系统而定义的一种低成本的串行通讯网络。
原始设备制造商OEM开发集成式车载 IVI 软件的汽车制造商(或供应商)。
实时操作系统RTOS适用于实时应用的操作系统,可在最短缓冲延迟时间内或无缓冲延迟的前提下处理所接收的数据。处理时间要求(包括操作系统延迟时间)以十分之一秒或更短的时间增量进行衡量。
系统芯片SoC可将计算机或其他电子系统的所有组件集成到单个芯片的集成电路。

Android Automotive 源码阅读


在线搜索和阅读源代码一般可以通过以下方式

  1. cs.android.com/ 官方提供的在线搜索阅读源码方式,但是在国内一般无法直接访问,需要通过VPN。
  2. github.com/aosp-mirror github源码托管aosp镜像仓库
  3. androidxref.com/ 国内基于OpenGrok服务器提供的Android源码在线搜索,但目前仅同步到Pie 9.0.0_r3版本
  4. www.androidos.net.cn/sourcecode 更新到10.0.0_r6版本

Android Automotive 源码下载


最后一种看源码的方法就是把源码同步到本地阅读了,这里采用清华大学的AOSP镜像进行同步源代码。

参考 Google 教程 source.android.google.cn/source/down…, 将 https://android.googlesource.com/ 全部使用 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/ 代替即可

下载 repo 工具

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

或者使用tuna的git-repo镜像

使用初始化包同步源码

由于首次同步需要下载约 95GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。

下载 mirrors.tuna.tsinghua.edu.cn/aosp-monthl…,下载完成后记得根据 checksum.txt 的内容校验一下。

由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xvf aosp-latest.tar #解压,并显示解压过程
cd aosp   # 解压得到的 aosp 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码
cd .repo/manifests.git # 进到git仓库描述目录
git branch -a | cut -d / -f 3 | grep android-12 

#列举android-12细分版本如下
android-12.0.0_r1
android-12.0.0_r10
android-12.0.0_r11
android-12.0.0_r12
android-12.0.0_r13
android-12.0.0_r14
android-12.0.0_r15
android-12.0.0_r16
android-12.0.0_r18
android-12.0.0_r19
android-12.0.0_r2
android-12.0.0_r20
android-12.0.0_r21
android-12.0.0_r25
android-12.0.0_r26
android-12.0.0_r27
android-12.0.0_r28
android-12.0.0_r29
android-12.0.0_r3
android-12.0.0_r30
android-12.0.0_r31
...

cd aosp
#所有仓库切换到android-12.0.0_r31细分版本
repo start android-12.0.0_r31 --all

此后,每次只需运行 repo sync 即可保持同步。 

注意事项: 我们强烈建议您保持每天同步,并尽量选择凌晨等低峰时间. 我使用的是Ubuntu14.04,wget一直提示证书不正确,添加--no-check-certificate也不管用,最后是通过curl -l http://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar > aosp-latest.tar 下载的

使用常规方法同步源码

建立工作目录:

mkdir aosp
cd aosp

初始化仓库:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

注意事项: 如果提示无法连接到 gerrit.googlesource.com,请参照git-repo的帮助页面的更新一节。

如果需要某个特定的 Android 版本(列表):

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r31

同步源码树(以后只需执行这条命令来同步):

repo sync -j4

注意事项:当我在ubuntu14.04上执行上述命令同步源码树时,报了以下错误:curl: (60) SSL certificate problem: certificate has expired,我这边的原因是因为"DST Root CA X3"证书过期了。 解决方法是: 运行 sudo dpkg-reconfigure ca-certificates, 选择yes,在下一个显示界面找到 mozilla/DST_Root_CA_X3.crt, 按键盘空格键取消选择 ([*] 应该变为 [ ]) 然后按回车键。最后运行sudo update-ca-certificates更新证书即可

上面的事情都准备好了,就进入了漫长的源码下载了,你只需要耐心等待源码下载完成即可

由于最近工作的需要,我使用以下命令同步了android-13.0.0_r1的源码

cd aosp
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r1
repo sync -j8
cd ..

jason@jason-VirtualBox:~/Android$ du -sh aosp
139G aosp

正所谓“路漫漫,其修远兮,吾当上下而求索”,下载完源码便有一种“管中窥豹”的求知欲,希望以上的实践也可以给在前行路上的你带来一些帮助。

Android Automotive 编译运行


搭建编译环境

首先,参考官方文章配置好编译环境,建议使用Ubuntu 18.04 64位的系统,基本配置是i7处理器 16G内存,至少512G磁盘,SWAP交换分区设置为16G。

由于我们后面需要编译模拟器版本运行,这里推荐你尽可能的选择安装Ubuntu 18.04,避免在运行模拟器时,遇到一些麻烦的事情。

安装编译所需要的软件包Ubuntu 18.04

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

如果你现有的操作系统是Windows,也可以基于VirtualBox VM + Ubuntu 20.04.6 LTS的方式安装虚拟机,配置如下:16G内存+350G动态磁盘。

使用虚拟机安装好Ubuntu 20.04.6 LTS后可以与本机建立共享磁盘, 以后可以方便与Windows共享文件

sudo apt-get install virtualbox-ose-guest-utils
sudo usermod -aG vboxsf $(whoami)

更详细的大家可以参考 官方搭建构建环境

编译Android Automotive

首先,进入源码根目录,初始化环境

cd aosp
source build/envsetup.sh
或者 
. build/envsetup.sh

然后,选择编译目标

lunch

我们即将编译的是Android Automotive的模拟器版本,因此我们选择如下目标进行编译

sdk_car_x86_64-userdebug

aosp_001.png

这里说明一下构建类型

构建类型使用情况
user权限受限;适用于生产环境
userdebug与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng具有额外调试工具的开发配置

选择了构建目标后,我们接下来就开始构建代码了

m -j8

如上构建命令就开启了8个并行处理任务进行代码构建了,这里你可以根据自己电脑的CPU信息进行配置,通常一个8核的CPU可以配置开启8个并行处理任务进行构建。

运行模拟器

编译流程会自动将模拟器添加到你的终端环境中,编译完成后,如需要运行模拟器,则可以运行如下命令

emulator -verbose -gpu swiftshader_indirect -memory 4096 -accel on -partition-size 1024 -cores 4 -skin polestar_2 -skindir xxx

这里的skindir是指你的模拟器皮肤所在的目录,如果你安装了Android Studio,并使用它创建过模拟器,那么模拟器的皮肤一般位于Android SDK所在的目录下

运行后,就可以看到如下图的模拟器显示了

Android Automotive模拟器

参考资料


以上所写内容包含个人的一些实践经验,其中有部分内容有参考如下资料