構建安卓

按照這些說明開始構建 Android。

設置環境

使用envsetup.sh腳本初始化環境:

source build/envsetup.sh

或者

. build/envsetup.sh

有關相關命令的說明,請參閱platform/build/envsetup.sh中的腳本,包括用於選擇設備目標的lunch和用於構建非捆綁應用程序的tapas ,例如參考電視應用程序

您需要在每次repo sync後重新發出此命令以獲取對該腳本的任何更改。請注意,將source替換為. (一個點)節省了幾個字符,縮寫形式更常用於文檔中。

envsetup.sh腳本導入多個命令,使您能夠使用 Android 源代碼,包括本練習中使用的命令。

要查看可用命令的完整列表,請運行:

hmm

選擇目標

午餐

選擇用lunch構建哪個目標。 lunch product_name - build_variant選擇product_name作為要構建的產品,選擇build_variant作為要構建的變體,並將這些選擇存儲在環境中,以供後續調用m和其他類似命令讀取。

確切的配置可以作為參數傳遞。例如,以下命令引用了模擬器的完整構建,並啟用了所有調試:

lunch aosp_arm-eng

如果不帶參數運行, lunch會提示您從菜單中選擇一個目標,但請注意,該菜單並不包括所有可能性。請參閱為 AOSP 中支持的所有設備的構建配置選擇設備構建,或與您的團隊成員討論您正在使用的設備的正確午餐。

所有構建目標都採用BUILD-BUILDTYPE形式,其中BUILD是指代特定功能組合的代號。 BUILDTYPE是以下之一。

建築類型使用
用戶訪問受限;適合生產
用戶調試像用戶一樣,但具有 root 訪問權限和調試功能;調試首選
英語帶有附加調試工具的開發配置

userdebug build 的行為應該與user build 相同,能夠啟用通常違反平台安全模型的額外調試。這使得userdebug構建有利於用戶測試,具有更強的診斷能力。使用userdebug構建進行開發時,請遵循userdebug 指南

eng build 優先考慮在平台上工作的工程師的工程生產力。 eng構建關閉了用於提供良好用戶體驗的各種優化。否則, eng構建具有類似於useruserdebug構建的行為,以便設備開發人員可以看到代碼在這些環境中的行為方式。

要查看當前午餐設置,請運行以下命令:

echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"

有關為實際硬件構建和運行的更多信息,請參閱閃存設備

小吃

tapas命令配置未捆綁應用程序的構建。它選擇由 Android 構建系統構建的單個應用程序。與lunch不同, tapas不要求為設備構建圖像。

運行tapas help以獲取有關該命令的更多信息。

構建代碼

本節是一個快速摘要,以確保設置已完成。

m構建一切。 m可以使用-jN參數處理並行任務。如果您不提供-j參數,構建系統會自動選擇它認為最適合您的系統的並行任務計數。

m

如上所述,您可以通過在m命令行中列出它們的名稱來構建特定模塊而不是完整的設備映像。此外, m還提供了一些用於特殊目的的偽目標。一些例子是:

  • droid - m droid是正常構建。這個目標在這裡是因為默認目標需要一個名稱。
  • all - m all構建m droid所做的一切,加上沒有droid標籤的一切。構建服務器運行它以確保構建樹中的所有內容並具有Android.mk文件。
  • m - 從樹的頂部運行構建。這很有用,因為您可以從子目錄中運行make 。如果您設置了TOP環境變量,它將使用它。如果不這樣做,它會從當前目錄查找樹,試圖找到樹的頂部。您可以通過不帶參數運行m來構建整個源代碼樹,也可以通過指定它們的名稱來構建特定目標。
  • mma - 構建當前目錄中的所有模塊及其依賴項。
  • mmma - 構建提供的目錄中的所有模塊及其依賴項。
  • croot - cd到樹的頂部。
  • clean - m clean刪除此配置的所有輸出和中間文件。這與rm -rf out/相同。

運行m help查看m提供的其他偽目標。

運行構建

您可以在模擬器上運行您的構建,也可以在設備上閃存它。因為您已經使用lunch選擇了構建目標,所以它不太可能在與構建目標不同的目標上運行。

使用 fastboot 刷機

要刷新設備,請使用fastboot ,它應該在成功構建後包含在您的路徑中。有關說明,請參閱刷寫設備

模擬 Android 設備

模擬器會在構建過程中自動添加到您的路徑中。要運行模擬器,請鍵入:

emulator

了解構建指紋

要跟踪和報告與特定 Android 構建相關的問題,了解構建指紋非常重要。構建指紋是一個唯一的、人類可讀的字符串,其中包含發布給每個構建的製造商信息。有關精確語法,請參閱 Android 兼容性定義文檔 (CDD)構建參數部分中的FINGERPRINT描述。

構建指紋代表特定的 Android 實現和修訂。這個唯一的密鑰允許應用程序開發人員和其他人報告特定固件版本的問題。有關 Android 問題報告流程,請參閱報告錯誤

構建指紋封裝了所有 Android 實現細節:

  • API:Android 和本機,以及軟 API 行為
  • 核心 API 和一些系統 UI 行為
  • CDD 中定義的兼容性和安全要求
  • 應用程序為滿足預期要求的目標設備而採用的產品規格和使用功能設置
  • 硬件和軟件組件的實現

有關完整的詳細信息,請參閱CDD ,有關創建全新 Android 設備的說明,請參閱添加新設備

排查常見構建錯誤

Java 版本錯誤

如果您嘗試構建與您的 Java 版本不一致的 Android 版本, make如下消息中止:

************************************************************
You are attempting to build with the incorrect version
of java.

Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at
    https://source.android.com/source/initializing.html
************************************************************

以下是可能的原因和解決方案:

  • 未能按照JDK 要求安裝正確的 JDK。確保您已按照設置環境選擇目標中的步驟進行操作。
  • 之前安裝的另一個 JDK 出現在您的路徑中。將正確的 JDK 添加到路徑的開頭或刪除有問題的 JDK。

沒有USB權限

默認情況下,在大多數 Linux 系統上,非特權用戶無法訪問 USB 端口。如果您看到權限被拒絕錯誤,請按照配置 USB 訪問中的說明進行操作。

如果ADB已經在運行並且在設置這些規則後無法連接到設備,您可以使用adb kill-server將其終止。該命令會導致 ADB 使用新配置重新啟動。