Android车载应用开发之出识Android Automotive

1,概述

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

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

image.png  

2,什么是Android Automotive

Android Automotive 是一个基于Android平台的车载信息娱乐系统,简称IVI(In-Vehicle Infotainment)。Android Automotive系统赋予了车厂在IVI 系统中预装 Android 应用的能力,而大量的Android开发从业者,也降低的IVI系统以及应用的开发成本。

为了方便理解Android Automotive,我们可以从以下几个方面进行理解:

1,Android Automotive 就是 Android 平台

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

2,Android Automotive 扩展了 Android 平台

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

3,Android Automotive 架构

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

Android Automotive 的硬件抽象层 (HAL) 为 Android 框架提供了一致的接口(无需考虑物理传输层),系统集成商可以将特定功能的平台HAL接口与特定于技术的网络接口连接,以实现车载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/

4,创建Android Automtive模拟器

为了让我们对Android Automotive有一个直观上的认知,我们可以先在Android Studio上创建一个模拟器。

首先,打开Android Studio,然后依次选择【Preferences】 -> 【Appearance&Behavior 】-> 【System Settings 】->【Updates】 中将检查更新的channel改为Canary Channel

image.png

然后,在创建模拟器的时候选择 Android Automotive 镜像。

image.png

接下来,我们直接启动Android Automotive模拟器,就可以看到效果。

image.png 需要说明的是,通过Android Studio创建的手机模拟器,无需任何操作就可以获取root权限。然后还可以通过控制台在Android/sdk/emulator目录下,运行下面的指令来开放remount权限

emulator -writable-system -netdelay none -netspeed full -avd 模拟器的名字
复制代码

5,下载&编译 Android Automotive

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

image.png

5.1 下载repo工具

首先,在控制台执行如下下载命令。

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

5.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分支
repo init -b android-11.0.0.0_r40 # 切换到Android 11
repo sync # 再同步一遍即可得到基于Android 11的完整目录
复制代码

5.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
复制代码

5.4 开始编译

首先,在aosp根目录的控制台中执行下列指令,初始化脚本。

source build/envsetup.sh
复制代码

然后,使用lunch选择编译的目标类型。因为我们是在电脑上调试编译出的版本,所以这里选择 aosp_car_x86_64-userdebug或aosp_car_x86-userdebug。

lunch #打开选择菜单
11   #选择 aosp_car_x86_64-userdebug
复制代码

image.png  

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

image.png  

如果 控制台中提示Successful,即表示编译成功,如果提示Faild,请根据提示解决问题。

接下来,就是启动模拟器,使用命令启动模拟器如下。

emulator -partition-size 1500 
复制代码

image.png  

5.5 常见错误

1,This user doesn't have permissions to use KVM

如果出现上面的错误,只需要在控制台执行以下指令即可解决:

sudo chown 用户名 -R /dev/kvm 
复制代码

2,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在不在这个文件下,如果不在,需要去别的文件下看一下。

猜你喜欢

转载自juejin.im/post/7095917252435771406