Android车载应用开发与分析(1) - Android Automotive概述与编译

简介:

1. Android开发者的新赛道

在智能手机行业初兴起时,包括BAT在内许多传统互联网企业都曾布局手机产业,但是随着手机市场的基本定型,造车似乎又成了各大资本下一个追逐的方向。百度、小米先后宣布造车,阿里巴巴则与上汽集团共同投资创立了,面向汽车全行业提供智能汽车操作系统和智能网联汽车整体解决方案的斑马网络,一时间造车俨然成了资本市场的下一个风口。

而作为移动端操作系统的霸主 - Android,也以一种新的姿态高调侵入造车领域,这就是 Android 车载信息娱乐系统 - Android Automotive。

image.png

2. 什么是Android Automotive?

Android Automotive 是一个基本 Android 平台车载信息娱乐系统,简称IVI(In-Vehicle Infotainment)。

Android Automotive系统赋予了车厂在IVI 系统中预装 Android 应用的能力,而大量的Android开发从业者,也降低的IVI系统以及应用的开发成本

2.1 Android Automotive 和 Android

  • Android Automotive 就是 Android 平台。Android Automotive 并非 Android 的分支或并行开发版本。它与手机和平板电脑等设备上搭载的 Android 使用相同的代码库,位于同一个存储区中。它基于开发时间逾 10 载的强大平台和功能集构建而成,因此能够利用现有的安全模型、兼容性计划、开发者工具和基础架构,同时继续保持较高的可定制性和可移植性,完全免费提供并且开源。

  • Android Automotive 扩展了 Android 平台。在将 Android 打造为功能完善的信息娱乐平台的过程中,我们增加了对汽车特定要求、功能和技术的支持。Android Automotive 将是一个一站式全栈车载信息娱乐平台,就像现在的 Android 系统之于移动设备一样。

2.2 Android Automotive 和 Android Auto

  • Android Auto 是一个基于用户的手机运行的平台,可通过 USB 连接将 Android Auto 用户体验投射到兼容的车载信息娱乐系统。Android Auto 支持专为车载用途而设计的应用。如需了解详情,请访问 developer.android.com/auto

  • Android Automotive 是直接基于车载硬件运行的操作系统和平台。它是一个可定制程度非常高的全栈开源平台,可为信息娱乐体验提供强大的技术支持。Android Automotive 支持专为 Android 打造的应用,以及专为 Android Auto 打造的应用。

2.3 Android Automotive 的架构设计概述

Android Automotive作为车载信息娱乐系统必须具备查看、控制整车其它子系统(如 空调)的能力,但是不同的制造商提供的总线类型和协议之间有很大差异,例如控制器局域网 (CAN) 总线、区域互连网路 (LIN) 总线、面向媒体的系统传输 (MOST) 总线以及汽车级以太网和 TCP/IP 网络(如 BroadR-Reach)。

Android Automotive 的硬件抽象层 (HAL) 为 Android 框架提供了一致的接口(无需考虑物理传输层),系统集成商可以将特定功能的平台 HAL 接口(如 空调)与特定于技术的网络接口(如 CAN 总线)连接,以实现车载 HAL 模块。

image.png

  • Car API:内有包含 CarSensorManager 在内的 API。如需详细了解受支持的 API,请参阅/platform/packages/services/Car/car-lib

  • CarService:位于 /platform/packages/services/Car/

  • 车载 HAL:用于定义 OEM 可以实现的车辆属性的接口。包含属性元数据(例如,车辆属性是否为 int 以及允许使用哪些更改模式)。位于 hardware/libhardware/include/hardware/vehicle.h。如需了解基本参考实现,请参阅 hardware/libhardware/modules/vehicle/

作为车载应用开发者,对于Android Automotive 的架构,有个基础认知即可并不影响我们后续对车载应用开发的学习。

3. 创建Android Automtive模拟器

为了让便于我们对Android Automotive有一个直观上的认知,我们可以先在Android Studio上创建一个模拟器。下面的Android Automtive模拟器创建步骤基于MAC OS版Android Studio Arctic Fox

  • 1.在Preferences(Windows下是Settings) -> Appearance&Behavior -> System Settings ->Updates 中将检查更新的channel改为Canary Channel

image.png

  • 2.在创建模拟器的时候选择一个你需要的 Android Automotive 镜像

image.png

  • 3.最后,我们就可以使用Android Automotive的模拟器了

image.png

模拟器到此为止就创建完毕了,可以随便把玩一波,看看google是如何理解车载娱乐系统的。

不得不说的是,在国内实际的车载应用开发中,我们很少会把应用直接跑在模拟器上,其中一个原因就是AS创建的Android Automotive模拟器是production版本,我们并不能获取root、remount权限,这非常不利于我们的调试。

这里额外提一句,通过Android Studio创建的手机模拟器,无需任何操作就可以获取root权限。然后还可以通过控制台在Android/sdk/emulator目录下,运行下面的指令来开放remount权限

emulator -writable-system -netdelay none -netspeed full -avd 模拟器的名字

为了在模拟器中获取root、remount权限,以及方便我们之后研究Android Automotive上原生应用的原理,这里我们接着来介绍一下如何下载 Android Automotive 源码,以及如何编译源码。

4. 下载&编译 Android Automotive

由于众所周知的原因国内下载AOSP速度非常缓慢,所以以下步骤使用清华大学的AOSP镜像。下载以及编译环境推荐使用Ubuntu系统,编译Android 9及以上的AOSP,硬盘需要预留500GB以上的空间,内存也至少需要8GB以上。以下内容基于如下环境编写。

image.png

1. 下载repo工具

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

2. 下载初始化包

从清华大学开源镜像站下载初始化包。由于首次同步需要下载约 130GB 数据,过程中任何网络故障都可能造成同步失败,强烈建议直接使用初始化包进行初始化。使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包,可以用下载工具代替
tar xf aosp-latest.tar #解压初始化包
cd aosp   # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录

此后,每次只需运行 repo sync 即可保持与主分支同步。当然我们也可以选择我们指定的Android版本,继续如下的操作

cd .repo/manifests
git branch -a # 查看Android分支

image.png

repo init -b android-11.0.0.0_r40 # 切换到Android 11
repo sync # 再同步一遍即可得到基于Android 11的完整目录

3. 准备编译环境

在Ubuntu的控制台中执行下列指令来安装编译AOSP所必需各类型工具

sudo apt-get update
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
sudo apt-get install -y lib32stdc++6 
sudo apt-get install git
sudo apt-get install libssl-dev
sudo apt-get install libncurses5

4. 开始编译

  • 1.在aosp根目录的控制台中执行下列指令,初始化脚本
source build/envsetup.sh
  • 2.使用lunch选择编译的目标类型。因为是在电脑上调试编译出的版本,所以这里我们选择 aosp_car_x86_64-userdebug或aosp_car_x86-userdebug。
lunch # 打开选择菜单
11 # 选择 aosp_car_x86_64-userdebug

image.png

  • 3.使用make -jX编译源码。电脑的CPU核心数越多,X可以设定的值越大,编译速度也就越快,一般可以直接设为cpu核心数,如果你的CPU支持超线程还可以再乘以2。
make -j8 # 开始编译

image.png

编译时间取决于你电脑的性能,在机械硬盘下首次编译约耗时5-7个小时。控制台中提示Successful,即表示编译成功。

  • 4.启动模拟器
emulator -partition-size 1500

漫长的开机动画之后,模拟器顺利启动。可以看出我们自行编译的模拟器,launcher 界面以及预装的APP与Android Studio中提供的 Android Automotive 还是有很大区别的。在之后的时间里面,我们就来一一解析的这些系统应用的运行原理。

image.png

image.png

5.常见错误

1.各类编译环境报错

一般环境报错,百度一下基本上都解决。在这里强烈建议在 Ubuntu 16 或以上的Linux环境下编译Android的源码!我个人尝试过在 Mac OS 和Windows OS下编译Android源码,各种错误层出不穷,而换到 Ubuntu 环境下这些错误几乎就都没有了。

2. This user doesn't have permissions to use KVM

解决方案,在控制台执行以下指令

sudo chown 用户名 -R /dev/kvm
3. warning: repo is not tracking a remote branch, so it will not receive updates. repo reset: error: Entry 'xxxxx.py' not uptodate. Cannot merge.fatal: Could not reset index file to revision 'v2.15.4^0'

解决方案:

cd .repo
cd repo
ls

在控制台确认一下报错的xxx.py在不在这个文件下,如果在不,需要去别文件下看一下。一般报错的xxx.py就是目录下的。

git log # 找到倒数第二个conmmit-id

image.png

image.png

git reset --hard 5637afcc60fdbd38fc0790ea84d5dcb901ec5959
git pull ## 重新拉取

同步完毕后再执行repo sync.就可以了

5.参考资料

Automotive | Android 开源项目 | Android Open Source Project (google.cn)

AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
235 4
|
2月前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
2月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
1月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
33 8
|
1月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
3月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
101 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
55 1
|
2月前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!
|
2月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。