Android車載應用開發與分析(1) - Android Automotive概述與編譯
1. Android開發者的新賽道
在智慧手機行業初興起時,包括BAT在內許多傳統網際網路企業都曾佈局手機產業,但是隨著手機市場的基本定型,造車
似乎又成了各大資本下一個追逐的方向。百度、小米先後宣佈造車
,阿里巴巴則與上汽集團共同投資創立了,面向汽車全行業提供智慧汽車作業系統和智慧網聯汽車整體解決方案的斑馬網路
,一時間造車
儼然成了資本市場的下一個風口。
而作為移動端作業系統的霸主 - Android,也以一種新的姿態高調侵入造車領域,這就是 Android 車載資訊娛樂系統 - Android Automotive。
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 模組。
* 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
- 2.在建立模擬器的時候選擇一個你需要的 Android Automotive 映象
- 3.最後,我們就可以使用Android Automotive的模擬器了
模擬器到此為止就建立完畢了,可以隨便把玩一波,看看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以上。以下內容基於如下環境編寫。
1. 下載repo工具
mkdir ~/bin
PATH=~/bin:$PATH
curl http://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
2. 下載初始化包
從清華大學開源映象站下載初始化包。由於首次同步需要下載約 130GB 資料,過程中任何網路故障都可能造成同步失敗,強烈建議直接使用初始化包進行初始化。使用方法如下:
``` wget -c http://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的完整目錄
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
- 3.使用
make -jX
編譯原始碼。電腦的CPU核心數越多,X可以設定的值越大,編譯速度也就越快,一般可以直接設為cpu核心數,如果你的CPU支援超執行緒還可以再乘以2。
make -j8 # 開始編譯
編譯時間取決於你電腦的效能,在機械硬碟下首次編譯約耗時5-7個小時。控制檯中提示Successful,即表示編譯成功。
- 4.啟動模擬器
emulator -partition-size 1500
漫長的開機動畫之後,模擬器順利啟動。可以看出我們自行編譯的模擬器,launcher 介面以及預裝的APP與Android Studio中提供的 Android Automotive 還是有很大區別的。在之後的時間裡面,我們就來一一解析的這些系統應用的執行原理。
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
git reset --hard 5637afcc60fdbd38fc0790ea84d5dcb901ec5959
git pull ## 重新拉取
同步完畢後再執行repo sync.就可以了
5.參考資料
Automotive | Android 開源專案 | Android Open Source Project (google.cn)
- Android車載應用開發與分析(1) - Android Automotive概述與編譯
- 【Android R】車載 Android 核心服務 - CarService 解析
- 【Android R】車載 Android 核心服務 - CarPropertyService
- 車載Android程式設計師的2022年終總結與轉行建議
- 從應用工程師的角度再談車載 Android 系統
- Android 車載應用開發與分析(12) - SystemUI (一)
- RE: 從零開始的車載Android HMI(三) - SurfaceView
- RE: 從零開始的車載Android HMI(二) - Widget
- RE: 從零開始的車載Android HMI(一) - Lottie
- Android 車載應用開發與分析 (3)- 構建 MVVM 架構(Java版)
- Android 車載應用開發與分析 (4)- 編寫基於AIDL 的 SDK