本教學課程可讓您首次嘗試開發 Android 作業系統。
設定 Android 開發環境
下載及建構 Android 來源的 android-latest-release 資訊清單分支版本前,請先確認硬體符合必要需求,並正確安裝必要軟體。您也應熟悉下列詞彙:
- Git
- Git 是免費的開放原始碼分散式版本控制系統。Android 會使用 Git 進行分支、提交、差異和編輯等本機作業。如需 Git 學習資源,請參閱 Git 說明文件。
- Repo
- Repo 是 Git 的 Python 包裝函式,可簡化跨多個 Git 存放區的複雜作業。Repo 並不會取代所有版本控制作業的 Git,只會簡化複雜的 Git 作業。Repo 會使用資訊清單檔案,將 Git 專案匯總到 Android 超級專案中。
- 資訊清單檔案
- 資訊清單檔案是 XML 檔案,用於指定 Android 來源中的各種 Git 專案在 AOSP 來源樹狀結構中的位置。
Meet 設備需求
開發工作站應符合或超過下列硬體需求:
- 64 位元 x86 系統。 
- 至少 400 GB 的可用磁碟空間,用於簽出及建構程式碼 (簽出需要 250 GB,建構需要 150 GB)。 
- 至少 64 GB 的 RAM。Google 使用 72 核心的機器 (64 GB RAM) 建構 Android。使用這項硬體設定,完整建構 Android 大約需要 40 分鐘,累加建構 Android 則只需要幾分鐘。相較之下,使用 6 核心電腦和 64 GB RAM 進行完整建構,大約需要 6 小時。 
符合作業系統需求
開發工作站必須執行任何 64 位元 Linux 發行版,並搭載 GNU C 程式庫 (glibc) 2.17 以上版本。
安裝必要套件
如要安裝 Ubuntu 18.04 以上版本所需的套件,請執行下列指令:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig安裝必要軟體
您必須先安裝 OpenJDK、Make、Python 3 和 Repo,才能使用 AOSP。Android 最新發布分支版本隨附預先建構的 OpenJDK、Make 和 Python 3 版本,因此不需要額外的安裝步驟。下一節說明如何安裝 Repo。
安裝 Repo
請按照下列步驟安裝 Repo:
- 下載目前的套件資訊: - sudo apt-get update
- 執行下列指令來安裝 Repo 啟動器: - sudo apt-get install repo- Repo 啟動器提供 Python 指令碼,可初始化結帳程序並下載完整的 Repo 工具。 - 如果成功,請跳到步驟 4。 
- (選用) 使用下列一連串指令手動安裝 Repo: - export REPO=$(mktemp /tmp/repo.XXXXXXXXX) curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65 curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo- 前三個指令會設定臨時檔案、將 Repo 下載至檔案,並確認提供的金鑰符合必要金鑰。如果這些指令成功執行,最後一個指令就會安裝 Repo 啟動器。 
- 確認 Repo 啟動器版本: - repo version- 輸出內容應指出 2.4 以上版本,例如: - repo launcher version 2.45
下載 Android 來源
Android 原始碼位於 Google 代管的 Git 存放區集合中。每個 Git 存放區都包含 Android 來源的完整記錄,包括來源的變更內容和變更時間。如要下載 Android 原始碼,請按照下列步驟操作:
- 前往主目錄: - cd ~
- 在其中建立本機工作子目錄: - mkdir aosp
- 前往目錄: - cd aosp
- 初始化 Android 開放原始碼計畫存放區原始碼的最新發布分支版本 ( - android-latest-release):- repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest
- 輸入或接受 Git 憑證 (名稱、電子郵件地址)。 
- 同步處理原始碼: - repo sync -c -j8- 如果在下載期間遇到任何問題,請參閱「排解及修正同步問題」。 
建構程式碼
如要建構程式碼:
- 在工作目錄中,找出 - envsetup.sh指令碼,設定建構環境:- source build/envsetup.sh
- 使用 - lunch指令指定要建構的目標裝置類型。目標是裝置排列方式,例如特定型號或外型規格。指定這個目標:- lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug- 您應該會看到目標和建構環境的摘要: - ============================================ PLATFORM_VERSION_CODENAME=Baklava PLATFORM_VERSION=Baklava TARGET_PRODUCT=aosp_cf_x86_64_only_phone TARGET_BUILD_VARIANT=userdebug TARGET_ARCH=x86_64 TARGET_ARCH_VARIANT=silvermont HOST_OS=linux HOST_OS_EXTRA=Linux-6.10.11-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete HOST_CROSS_OS=windows BUILD_ID=BP1A.250305.020 OUT_DIR=out ============================================
- 建構目標: - m
第一個版本預計需要數小時才能建構完成。後續建構作業所需時間會大幅減少。建構作業的輸出內容會顯示在 $OUT_DIR 中。
啟動 Cuttlefish
Cuttlefish 是用來測試建構版本的 Android 模擬器。
- 執行下列指令,下載、建構及安裝主機 Debian 套件: - sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl- git clone https://github.com/google/android-cuttlefish- cd android-cuttlefish- for dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd done- sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f- sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f- sudo usermod -aG kvm,cvdnetwork,render $USER- sudo reboot- 重新啟動會觸發安裝其他核心模組,並套用 - udev規則。
- 啟動 Cuttlefish: - launch_cvd --daemon
- 在網路瀏覽器中前往 - https://localhost:8443,連線至 Cuttlefish 裝置。系統會顯示虛擬 Android 裝置。
進行變更
請按照這個變更清單更新原始碼。
- 從結帳的根目錄 ( - aosp/目錄) 前往- frameworks/nativeGit 專案:- cd frameworks/native
- 使用下列指令啟動臨時專案: - repo start PROJECT_NAME.
- 使用編輯器在下列位置編輯 - SurfaceFlinger.cpp:- aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
- 尋找以下這行程式碼: - void SurfaceFlinger::updateColorMatrixLocked() {
- 在 - updateColorMatrixLocked()的開頭新增這一行:- mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f}, vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
- 建構程式碼: - m
- 更新裝置上的建構版本: - adb root- adb remount -R- adb root- adb sync- adb reboot
- 確認所選裝置的顏色變化與圖 1 所示類似。   - 圖 1. 成功變更顏色後的畫面外觀 
修正測試
本程式碼研究室的這部分會使用來源樹狀結構中的範例測試,但該測試會失敗。
如要執行、偵錯及修正測試,請按照下列操作說明進行:
- 執行: - atest DevCodelabTest- 測試失敗。 
- 檢查失敗測試的堆疊追蹤: - STACKTRACE: java.lang.AssertionError at org.junit.Assert.fail(Assert.java:87) at org.junit.Assert.assertTrue(Assert.java:42) at org.junit.Assert.assertTrue(Assert.java:53) at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)- 堆疊追蹤的最後一行會顯示失敗的測試 ( - testHelloWorld)。這項測試位於名為- DevCodelabTest.java的檔案中。
- 如要判斷要修正的測試位置,請在堆疊追蹤記錄的最後一行附加 - WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/,直到測試檔案名稱為止 (包括該名稱)。因此- android.test.example.devcodelab.DevCodelabTest會變成- WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java。
- 編輯 - platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java,並將- Assert.assertTrue(false)替換為- Assert.assertTrue(true)
- 再次執行測試,確認問題是否已修正: - atest DevCodelabTest
上傳程式碼以供審查
Repo 會將 git clone 等指令組合在一起,一次處理多個 Git 存放區 (或專案),簡化 Git 的使用方式。
如要對 Git 中的專案進行程式碼審查,請使用 Gerrit 網頁式程式碼審查系統。
- 假設您在 - frameworks/native專案中進行變更,請執行下列指令來上傳變更:- cd frameworks/native- repo start PROJECT_NAME.- git add .- git commit
- 輸入下列修訂版本訊息: - Android PROJECT_NAME. change Test: manual atest
- 上傳變更: - repo upload- 如果成功,您會看到類似以下的訊息: - Upload project frameworks/native/ to remote branch android16-release: branch PROJECT_NAME. ( 1 commit, Wed Aug 7 09:32:33 2019 -0700): ff46b36d android PROJECT_NAME. change to https://android-review.googlesource.com/ (y/N)? y remote: Processing changes: refs: 1, new: 1, done remote: remote: SUCCESS remote: remote: https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android PROJECT_NAME. change [NEW] remote: To https://android-review.googlesource.com/platform/frameworks/native * [new branch] PROJECT_NAME. -> refs/for/android16-release
在 Gerrit 中查看變更
如要查看 Gerrit 中的變更,請前往終端機中的連結輸出內容。連結類似如下:
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
還原變更
通常在測試後,經過審查和核准,您會在 Gerrit 中提交變更,並將其合併至存放區。在本程式碼研究室中,請改為還原您的工作:
- 在 Gerrit 中,按一下「Abandon」。 
- 在 - frameworks/native專案目錄 (或其子目錄) 中,捨棄相關聯的臨時分支版本:- repo abandon PROJECT_NAME.
- 還原您對測試檔案所做的變更。由於您未在測試變更中執行 - repo start、- git commit和- repo upload,因此可以重設檔案本身。假設您位於- aosp/platform_testing directory,請使用下列指令重設檔案:- git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java- git checkout .
Android 平台開發程式碼研究室到此結束。
取得說明
如果在進行本程式碼研究室時遇到錯誤,請使用任何頁面底部的問題追蹤工具連結回報錯誤。將問題傳送至 android-building 群組。
輸入 ps -A | grep crosvm,查看 crosvm 是否已在執行中。如果 crossvm 正在執行,請輸入 stop_cvd || true 或 kill crosvm 程序,並提供程序 PID。
