Android 開發人員程式碼研究室

想協助開發安裝最廣泛的作業系統嗎? 。是的,您即將踏上成為 Android 平台工程師的旅程。

雖然這條路充滿挑戰,但 Android 團隊會在每次發布時,盡力簡化您的旅程。這個團隊每天透過直接行動 參與 Android 開放原始碼計畫 (AOSP) 中。

因此你只需下車,啟動終端機,來寫下歷史新頁。

目標

本程式碼研究室的任務有兩個:

  1. 讓您一窺 Android 工程師在平台 (作業系統) 上工作的開發人員工作流程。
  2. 歡迎提供意見回饋 大致瞭解 Android 工具、說明文件和開發人員工作流程

必要條件

本程式碼研究室的需求清單是衍生自一般 Android 開放原始碼計畫)。如要使用本程式碼研究室,請設定下列項目:

環境

一般而言,使用者可以直接在工作站上建構及開發應用程式。由於您可能會在不同的終端機中工作,且許多指令都會依終端機而異,因此您需要在每個終端機工作階段中重新執行這些指令。具體而言 包括 source build/envsetup.shlunch 指令

設定工作站

  1. 在您的裝置上安裝必要套件, 工作站
  2. 在終端機中,安裝 Repo 並取得所有 Git 存放區的憑證

初始化並同步處理程式碼

  1. 前往主目錄:

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

    mkdir aosp
  3. 前往以下目錄:

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

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

  6. 同步處理原始碼:

    repo sync -j8

首次同步處理可能需要一小時以上的時間。

每個存放區結帳作業都會以資訊清單檔案表示。 我們允許一次超過 1 個存放區結帳,只要兩者 存在於不同目錄中但請注意,每次檢出和建構作業會使用約 300 GB 的空間 (且會持續增加),因此請將檢出來源程式碼庫的次數限制為 2 次,或是使用次要硬碟來擴充系統。

建構程式碼

如要建構 Android,您必須選取目標 使用 lunch 指令建構的裝置類型。目標是裝置變體,例如特定型號或板型規格。

指定「aosp_cf_x86_64_phone-userdebug」裝置可讓您 建構 Cuttlefish 虛擬 Android 裝置 不必使用實體裝置進行測試

如要改為建構及更新實體裝置,請選擇其他目標,然後按照指示操作 請參閱刷新裝置的操作說明。

  1. 請從原始碼檢出的根層級執行下列指令,設定建構 Android 裝置的環境:

    source build/envsetup.sh
  2. 將建構目標傳遞至 lunch 指令,如下所示:

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
  3. 您可以使用以下方式,在結帳流程的任何位置建構程式碼:

    m

首次版本預計需要數小時的時間。後續的版本會大幅影響 縮短作業時間

啟動 Cuttlefish

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

  1. 如果您從未安裝 Cuttlefish,就必須安裝必要的 Cuttlefish 依附元件。在終端機視窗中,執行下列指令,下載、建構及安裝主機 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. 前往 Cuttlefish 裝置:https://localhost:8443 Cloud Shell 環境中的檔案期待收到採用 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
    adb sync
    adb reboot

確認所選裝置上的顏色變更與顯示的內容類似 圖 1.

成功變更顏色的範例

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

測試程式碼

本程式碼研究室的這部分會使用位於來源樹狀結構中且失敗的範例測試。這個做法採用 Atest 並測試程式碼。

如要使用測試,請按照下列指示操作:

  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)
  3. 請參閱以下說明

    platform_testing/tests/example/devcodelab
    
  4. 如要編輯檔案,請在以下位置找出測試名稱: android.test.example.devcodelab.DevCodelabTest,並將 . 替換為 /) 以取得這個結果:

    src/android/test/example/devcodelab/DevCodelabTest.java
    
  5. 接著編輯

    platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    

    以取代

    Assert.assertTrue(false)
    

    取代為

    Assert.assertTrue(true)
    
  6. 再次執行測試,確認問題是否已修正:

    atest DevCodelabTest

上傳代碼供審查

Repo 透過繫結指令 (例如 git clone) 運作來簡化 Git 的使用方法 一次跨多個 Git 存放區 (或專案) 調度資源

請參閱「原始碼控管工具」,瞭解 Git 和 Repo 的總覽,以及 Android 原始碼作業的完整說明文件連結。如要查看完整的 Git 專案清單,以及與各專案相關聯的分支的個別專案 (路徑),請參閱 Android 開放原始碼計畫存放區

如要審查 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 中查看變更

前往終端機中顯示的連結,類似以下連結:

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

這已完成 Android 平台開發的入門程式碼研究室。如要瞭解後續步驟,請參閱「提交修補程式」一文;如要進一步瞭解 Android 開發作業,請參閱本網站的其他內容。

還原變更

通常在測試後,並經過審查及核准程序,您會在 Gerrit 中提交變更,並將其合併至存放區。

為了配合本程式碼研究室的目的,請在 Gerrit 中按一下「Abandon」,還原變更清單。

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

repo abandon codelab .

別忘了,一併還原您對測試檔案所做的變更。由於您並未 repo startgit commitrepo upload變更,您可以重設 檔案本身如果您位於 aosp/platform_testing directory,請使用 以下說明如何重設檔案:

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

到這裡就完成了!答得好!

取得說明

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