Android Automotive 源码起步
版本变更
| 版本 | 日期 | 修改人 | 描述 |
|---|---|---|---|
| V1.0 | 2022.06.19 | 越过山风 | Android Automotive 源码起步 |
目录
车载OS前景
车载OS通常聚焦在特斯拉OS,苹果汽车OS,Android Automotive,黑莓QNX,Linux OS,微软WINCE(已经逐渐被淘汰)
国内的造车新势力有蔚来,小鹏,威马,还有比亚迪,吉利,无一不采用了基于Android做深度定制的车载OS。
在2020年六月,沃尔沃(VOLVO)新车Polestar2在欧美发布,其上面搭载的汽车操作系统就是Google推出的Android Automotive OS。
并且,美国三大车企通用(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.
安全是驾驶员的第一责任!
如上图,摄像头,地图,电话被设计在离驾驶员靠近的一侧,并且快捷图标也可以最大的限度的减少驾驶员的分心情况。这一套界面设计在欧洲市场是加分的,但是在国内市场确实没有太多的优势,除了遵循了驾驶的设计准则。
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 能够直接调用设备上的各种硬件组件的驱动程序。 |
| 车载 HAL | Vehicle 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 源码阅读
在线搜索和阅读源代码一般可以通过以下方式
- cs.android.com/ 官方提供的在线搜索阅读源码方式,但是在国内一般无法直接访问,需要通过VPN。
- github.com/aosp-mirror github源码托管aosp镜像仓库
- androidxref.com/ 国内基于OpenGrok服务器提供的Android源码在线搜索,但目前仅同步到Pie 9.0.0_r3版本
- 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
这里说明一下构建类型
| 构建类型 | 使用情况 |
|---|---|
| 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所在的目录下
运行后,就可以看到如下图的模拟器显示了
参考资料
以上所写内容包含个人的一些实践经验,其中有部分内容有参考如下资料