Android車載應(yīng)用開發(fā)與分析(1) - Android Automotive概述與編譯

1. Android開發(fā)者的新賽道

在智能手機(jī)行業(yè)初興起時,包括BAT在內(nèi)許多傳統(tǒng)互聯(lián)網(wǎng)企業(yè)都曾布局手機(jī)產(chǎn)業(yè),但是隨著手機(jī)市場的基本定型,造車似乎又成了各大資本下一個追逐的方向。百度、小米先后宣布造車,阿里巴巴則與上汽集團(tuán)共同投資創(chuàng)立了,面向汽車全行業(yè)提供智能汽車操作系統(tǒng)和智能網(wǎng)聯(lián)汽車整體解決方案的斑馬網(wǎng)絡(luò),一時間造車儼然成了資本市場的下一個風(fēng)口。

而作為移動端操作系統(tǒng)的霸主 - Android,也以一種新的姿態(tài)高調(diào)侵入造車領(lǐng)域,這就是 Android 車載信息娛樂系統(tǒng) - Android Automotive。

2. 什么是Android Automotive?

Android Automotive 是一個基本 Android 平臺車載信息娛樂系統(tǒng),簡稱IVI(In-Vehicle Infotainment)。

Android Automotive系統(tǒng)賦予了車廠在IVI 系統(tǒng)中預(yù)裝 Android 應(yīng)用的能力,而大量的Android開發(fā)從業(yè)者,也降低的IVI系統(tǒng)以及應(yīng)用的開發(fā)成本

2.1 Android Automotive 和 Android

  • Android Automotive 就是 Android 平臺。Android Automotive 并非 Android 的分支或并行開發(fā)版本。它與手機(jī)和平板電腦等設(shè)備上搭載的 Android 使用相同的代碼庫,位于同一個存儲區(qū)中。它基于開發(fā)時間逾 10 載的強(qiáng)大平臺和功能集構(gòu)建而成,因此能夠利用現(xiàn)有的安全模型、兼容性計劃、開發(fā)者工具和基礎(chǔ)架構(gòu),同時繼續(xù)保持較高的可定制性和可移植性,完全免費(fèi)提供并且開源。

  • Android Automotive 擴(kuò)展了 Android 平臺。在將 Android 打造為功能完善的信息娛樂平臺的過程中,我們增加了對汽車特定要求、功能和技術(shù)的支持。Android Automotive 將是一個一站式全棧車載信息娛樂平臺,就像現(xiàn)在的 Android 系統(tǒng)之于移動設(shè)備一樣。

2.2 Android Automotive 和 Android Auto

  • Android Auto 是一個基于用戶的手機(jī)運(yùn)行的平臺,可通過 USB 連接將 Android Auto 用戶體驗(yàn)投射到兼容的車載信息娛樂系統(tǒng)。Android Auto 支持專為車載用途而設(shè)計的應(yīng)用。如需了解詳情,請訪問 developer.android.com/auto。

  • Android Automotive 是直接基于車載硬件運(yùn)行的操作系統(tǒng)和平臺。它是一個可定制程度非常高的全棧開源平臺,可為信息娛樂體驗(yàn)提供強(qiáng)大的技術(shù)支持。Android Automotive 支持專為 Android 打造的應(yīng)用,以及專為 Android Auto 打造的應(yīng)用。

2.3 Android Automotive 的架構(gòu)設(shè)計概述

Android Automotive作為車載信息娛樂系統(tǒng)必須具備查看、控制整車其它子系統(tǒng)(如 空調(diào))的能力,但是不同的制造商提供的總線類型和協(xié)議之間有很大差異,例如控制器局域網(wǎng) (CAN) 總線、區(qū)域互連網(wǎng)路 (LIN) 總線、面向媒體的系統(tǒng)傳輸 (MOST) 總線以及汽車級以太網(wǎng)和 TCP/IP 網(wǎng)絡(luò)(如 BroadR-Reach)。

Android Automotive 的硬件抽象層 (HAL) 為 Android 框架提供了一致的接口(無需考慮物理傳輸層),系統(tǒng)集成商可以將特定功能的平臺 HAL 接口(如 空調(diào))與特定于技術(shù)的網(wǎng)絡(luò)接口(如 CAN 總線)連接,以實(shí)現(xiàn)車載 HAL 模塊。

image
  • Car API:內(nèi)有包含 CarSensorManager 在內(nèi)的 API。如需詳細(xì)了解受支持的 API,請參閱/platform/packages/services/Car/car-lib

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

  • 車載 HAL:用于定義 OEM 可以實(shí)現(xiàn)的車輛屬性的接口。包含屬性元數(shù)據(jù)(例如,車輛屬性是否為 int 以及允許使用哪些更改模式)。位于 hardware/libhardware/include/hardware/vehicle.h。如需了解基本參考實(shí)現(xiàn),請參閱 hardware/libhardware/modules/vehicle/

作為車載應(yīng)用開發(fā)者,對于Android Automotive 的架構(gòu),有個基礎(chǔ)認(rèn)知即可并不影響我們后續(xù)對車載應(yīng)用開發(fā)的學(xué)習(xí)。

3. 創(chuàng)建Android Automtive模擬器

為了讓便于我們對Android Automotive有一個直觀上的認(rèn)知,我們可以先在Android Studio上創(chuàng)建一個模擬器。下面的Android Automtive模擬器創(chuàng)建步驟基于MAC OS版Android Studio Arctic Fox

  • 1.在Preferences(Windows下是Settings) -> Appearance&Behavior -> System Settings ->Updates 中將檢查更新的channel改為Canary Channel
image
  • 2.在創(chuàng)建模擬器的時候選擇一個你需要的 Android Automotive 鏡像
image
  • 3.最后,我們就可以使用Android Automotive的模擬器了
image

模擬器到此為止就創(chuàng)建完畢了,可以隨便把玩一波,看看google是如何理解車載娛樂系統(tǒng)的。

不得不說的是,在國內(nèi)實(shí)際的車載應(yīng)用開發(fā)中,我們很少會把應(yīng)用直接跑在模擬器上,其中一個原因就是AS創(chuàng)建的Android Automotive模擬器是production版本,我們并不能獲取root、remount權(quán)限,這非常不利于我們的調(diào)試。

這里額外提一句,通過Android Studio創(chuàng)建的手機(jī)模擬器,無需任何操作就可以獲取root權(quán)限。然后還可以通過控制臺在Android/sdk/emulator目錄下,運(yùn)行下面的指令來開放remount權(quán)限

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

為了在模擬器中獲取root、remount權(quán)限,以及方便我們之后研究Android Automotive上原生應(yīng)用的原理,這里我們接著來介紹一下如何下載 Android Automotive 源碼,以及如何編譯源碼。

4. 下載&編譯 Android Automotive

由于眾所周知的原因國內(nèi)下載AOSP速度非常緩慢,所以以下步驟使用清華大學(xué)的AOSP鏡像。下載以及編譯環(huán)境推薦使用Ubuntu系統(tǒng),編譯Android 9及以上的AOSP,硬盤需要預(yù)留500GB以上的空間,內(nèi)存也至少需要8GB以上。以下內(nèi)容基于如下環(huán)境編寫。

image

1. 下載repo工具

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

2. 下載初始化包

從清華大學(xué)開源鏡像站下載初始化包。由于首次同步需要下載約 130GB 數(shù)據(jù),過程中任何網(wǎng)絡(luò)故障都可能造成同步失敗,強(qiáng)烈建議直接使用初始化包進(jìn)行初始化。使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包,可以用下載工具代替
tar xf aosp-latest.tar #解壓初始化包
cd aosp   # 解壓得到的 AOSP 工程目錄
# 這時 ls 的話什么也看不到,因?yàn)橹挥幸粋€隱藏的 .repo 目錄

此后,每次只需運(yùn)行 repo sync 即可保持與主分支同步。當(dāng)然我們也可以選擇我們指定的Android版本,繼續(xù)如下的操作

cd .repo/manifests
git branch -a # 查看Android分支
repo init -b android-11.0.0.0_r40 # 切換到Android 11
repo sync # 再同步一遍即可得到基于Android 11的完整目錄

3. 準(zhǔn)備編譯環(huán)境

在Ubuntu的控制臺中執(zhí)行下列指令來安裝編譯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根目錄的控制臺中執(zhí)行下列指令,初始化腳本
source build/envsetup.sh
  • 2.使用lunch選擇編譯的目標(biāo)類型。因?yàn)槭窃陔娔X上調(diào)試編譯出的版本,所以這里我們選擇 aosp_car_x86_64-userdebug或aosp_car_x86-userdebug。
lunch # 打開選擇菜單
11 # 選擇 aosp_car_x86_64-userdebug
  • 3.使用make -jX編譯源碼。電腦的CPU核心數(shù)越多,X可以設(shè)定的值越大,編譯速度也就越快,一般可以直接設(shè)為cpu核心數(shù),如果你的CPU支持超線程還可以再乘以2。
make -j8 # 開始編譯
image

編譯時間取決于你電腦的性能,在機(jī)械硬盤下首次編譯約耗時5-7個小時。控制臺中提示Successful,即表示編譯成功。

  • 4.啟動模擬器
emulator -partition-size 1500 

漫長的開機(jī)動畫之后,模擬器順利啟動??梢钥闯鑫覀冏孕芯幾g的模擬器,launcher 界面以及預(yù)裝的APP與Android Studio中提供的 Android Automotive 還是有很大區(qū)別的。在之后的時間里面,我們就來一一解析的這些系統(tǒng)應(yīng)用的運(yùn)行原理。


5.常見錯誤

1.各類編譯環(huán)境報錯

一般環(huán)境報錯,百度一下基本上都解決。在這里強(qiáng)烈建議在 Ubuntu 16 或以上的Linux環(huán)境下編譯Android的源碼!我個人嘗試過在 Mac OS 和Windows OS下編譯Android源碼,各種錯誤層出不窮,而換到 Ubuntu 環(huán)境下這些錯誤幾乎就都沒有了。

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

解決方案,在控制臺執(zhí)行以下指令

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 

在控制臺確認(rèn)一下報錯的xxx.py在不在這個文件下,如果在不,需要去別文件下看一下。一般報錯的xxx.py就是目錄下的。

git log # 找到倒數(shù)第二個conmmit-id 

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

同步完畢后再執(zhí)行repo sync.就可以了

5.參考資料

Automotive | Android 開源項目 | Android Open Source Project (google.cn)

AOSP | 鏡像站使用幫助 | 清華大學(xué)開源軟件鏡像站 | Tsinghua Open Source Mirror

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容