嘗試 Android 開發

本教學課程可讓您首次嘗試開發 Android 作業系統。

設定 Android 開發環境

下載及建構 Android 來源的 main 分支前,請確認硬體符合必要條件,且已正確安裝必要軟體。您也應該熟悉下列字詞:

Git
Git 是免費的開放原始碼分散式版本管控系統。Android 會使用 Git 執行本機作業,例如分支、修訂版本、差異比較和編輯。如需 Git 學習相關資訊,請參閱 Git 說明文件
Repo
Repo 是圍繞 Git 的 Python 包裝函式,可簡化在多個 Git 存放區中執行複雜作業的程序。Repo 不會取代 Git 的所有版本控制作業,只會讓複雜的 Git 作業更容易完成。Repo 會使用資訊清單檔案,將 Git 專案匯入 Android 超級專案。
資訊清單檔案
資訊清單檔案是 XML 檔案,可指定 Android 來源中的各個 Git 專案在 AOSP 來源樹狀結構中的放置位置。

符合硬體需求

您的開發工作站應符合下列硬體需求,甚至超越這些要求:

  • 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 的 AOSP 主分支會隨附預先建構的 OpenJDK、Make 和 Python 3 版本,因此不需要額外的安裝步驟。下一個章節將說明如何安裝 Repo。

安裝存放區

請按照下列步驟安裝 Repo:

  1. 下載目前的套件資訊:

    sudo apt-get update
  2. 執行下列指令安裝 Repo 啟動器:

    sudo apt-get install repo

    Repo 啟動器會提供 Python 指令碼,用於初始化檢查作業並下載完整的 Repo 工具。

    如果成功,請跳至步驟 4。

  3. (選用) 使用下列一系列指令手動安裝 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 啟動器。

  4. 確認 Repo launcher 版本:

    repo version

    輸出內容應顯示 2.4 以上版本,例如:

    repo launcher version 2.45

下載 Android 原始碼

Android 原始碼位於 Google 代管的多個 Git 存放區。每個 Git 存放區都包含 Android 來源的完整記錄,包括來源的變更內容和變更時間。如要下載 Android 原始碼,請按照下列步驟操作:

  1. 前往主目錄:

    cd ~
  2. 在目錄中建立本機工作子目錄:

    mkdir aosp
  3. 前往目錄:

    cd aosp
  4. 初始化 Android 開放原始碼計畫存放區原始碼主要分支版本 (預設):

    repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
  5. 輸入或接受 Git 憑證 (名稱、電子郵件地址)。

  6. 同步處理原始碼:

    repo sync -c -j8

    如果在下載時遇到任何問題,請參閱排解及修正同步處理問題

建構程式碼

如要建構程式碼,請按照下列步驟操作:

  1. 在工作目錄中取得 envsetup.sh 指令碼,以設定建構環境:

    source build/envsetup.sh
  2. 使用 lunch 指令指定要建構的目標裝置類型。目標是裝置排列組合 (例如特定型號或板型規格),指定這個目標:

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug

    您應該會看到目標和建構環境的概要:

    ============================================
    PLATFORM_VERSION_CODENAME=VanillaIceCream
    PLATFORM_VERSION=VanillaIceCream
    PRODUCT_INCLUDE_TAGS=com.android.mainline
    TARGET_PRODUCT=aosp_arm
    TARGET_BUILD_VARIANT=eng
    TARGET_ARCH=arm
    TARGET_ARCH_VARIANT=armv7-a-neon
    TARGET_CPU_VARIANT=generic
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=AOSP.MAIN
    OUT_DIR=out
    ============================================
    
  3. 建構目標:

    m

第一次建構作業可能需要花上好幾個小時。後續建構所需的時間會大幅減少。建構作業的輸出內容會顯示在 $OUT_DIR 中。

啟動 Cuttlefish

Cuttlefish 是用來測試版本的 Android 模擬器。

  1. 執行下列指令,下載、建構及安裝主機 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 規則。

  2. 啟動 Cuttlefish:

    launch_cvd --daemon
    
  3. 在網路瀏覽器中前往 https://localhost:8443,即可連線至 Cuttlefish 裝置。系統會顯示虛擬 Android 裝置。

進行變更

根據這個範例變更清單更新原始碼。

  1. 從檢出的根目錄 (aosp/ 目錄) 前往 frameworks/native Git 專案:

    cd frameworks/native
  2. 使用下列指令啟動臨時專案:

    repo start <some-name> .
  3. 使用編輯器編輯下列位置的 SurfaceFlinger.cpp

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. 尋找以下這一行:

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. 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});
    
  6. 建構程式碼:

    m
  7. 更新裝置上的版本:

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. 確認所選裝置的顏色變更與圖 1 類似。

    成功變更顏色的範例

    圖 1. 成功變更顏色後的畫面外觀

修正測試

本程式碼研究室的這部分會使用源樹中失敗的範例測試。

如要執行、偵錯及修正測試,請按照下列操作說明進行:

  1. 執行:

    atest DevCodelabTest

    測試失敗。

  2. 檢查失敗測試的堆疊追蹤:

    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 的檔案中。

  3. 如要判斷要修正的測試位置,請將 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

  4. 編輯 platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java,並將 Assert.assertTrue(false) 替換為 Assert.assertTrue(true)

  5. 再次執行測試,確認問題已修正:

    atest DevCodelabTest

上傳程式碼以供審查

Repo 會將 git clone 等指令合併為一組,讓您一次在多個 Git 存放區 (或專案) 中執行,簡化 Git 使用方式。

如要對 Git 中的專案進行程式碼審查,請使用 Gerrit 網路程式碼審查系統。

  1. 假設您已在 frameworks/native 專案中進行變更,請執行下列指令來上傳變更內容:

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. 針對修訂訊息,輸入以下內容:

    Android codelab change
    Test: manual atest
    
  3. 上傳變更:

    repo upload

    如果成功,您會看到類似以下的訊息:

    Upload project frameworks/native/ to remote branch main:
     branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
            ff46b36d android codelab 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 codelab change [NEW]
    remote:
    To https://android-review.googlesource.com/platform/frameworks/native
    * [new branch]          codelab -> refs/for/main
    

在 Gerrit 中查看變更

如要查看 Gerrit 中的變更,請前往終端機中的連結輸出內容。連結會類似以下內容:

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

還原變更

一般而言,在測試後、經過審查及核准後,您可以在 Gerrit 中提交變更,並將其合併至存放區。相反地,請還原為符合本程式碼研究室的目的,並還原工作:

  1. 在 Gerrit 中按一下「Abandon」

  2. 捨棄 frameworks/native 專案目錄 (或其子目錄) 中的相關臨時分支版本:

    repo abandon codelab .
  3. 還原對測試檔案所做的變更。由於您並未針對測試變更執行 repo startgit commitrepo upload,因此可以重設檔案本身。假設您位於 aosp/platform_testing directory 中,請使用下列指令重設檔案:

    git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    git checkout .

這就完成 Android 平台開發程式碼研究室。

取得說明

如果您在本程式碼研究室中遇到錯誤,請使用任何頁面底部的「Issue Tracker」連結回報問題。將問題傳送至 android-building 群組。

輸入 ps -A | grep crosvm 即可查看 crosvm 是否已在執行。如果正在執行 crossvm,請輸入 stop_cvd || truekill crosvm 程序,並指定程序 PID。