新增裝置

參考本頁資訊,為裝置建立 makefile, 產品。

每個新的 Android 模組都必須擁有設定檔來引導建構系統 以及模組中繼資料、編譯時間依附元件和封裝操作說明Android 採用 Soong 建構系統: 如要進一步瞭解 Android,請參閱建構 Android 建構系統

瞭解建構層

建構階層包括對應抽象層 例如實體化妝品這些圖層的說明如下表所示。 每個資料層在一對多關係中,都與上方的層級相關。適用對象 以一個架構為例,一個架構可以有多個主面板 多項產品您可以將特定圖層中的元素定義為 同一圖層中特定元素的專業化,可消除複製與 能簡化維護作業

層次 範例 說明
產品 myProduct、myProduct_eu、myProduct_eu_fr、j2、sdk 產品層會定義運送資料的特徵規格 例如要建構的模組、支援的語言代碼,以及 以便設定不同的語言代碼也就是說,這是名稱 或是產品的整體差異產品相關變數的定義如下: 產品定義 makefile產品可以沿用 這有助於簡化維護工作常見的做法 是建立基礎產品,其中包含適用於 ,然後根據這些依據建立產品子類 產品。例如兩項產品 無線電通訊 (CDMA 與 GSM) 也能沿用 並未定義無線電
桌遊/裝置 馬林, 藍線, 珊瑚紅 主機板/裝置層代表塑膠層中的實體塑膠層 裝置 (即裝置的工業設計)。這個資料層也代表 產品特性包括 Jamboard 上的周邊裝置,以及 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定這些名稱只是不同遊戲板/裝置的代碼 儲存空間設定
拱門型 arm、x86、arm64、x86_64 架構層會說明處理器設定 開發應用程式二進位檔介面 (ABI)。

使用建構變數

針對特定產品建構產品時,可能會 最終發布子版本中的變化版本在模組中 模組可使用 LOCAL_MODULE_TAGS 指定標記, 可以是一或多個 optional 值 (預設值)、 debugeng

如果模組未指定標記 (由 LOCAL_MODULE_TAGS 提供),則該模組 標記的預設值為 optional。只有在 這是 PRODUCT_PACKAGES 產品設定的必要元素。

以下是目前定義的建構變數。

Variant 說明
eng 這是預設變種版本。
  • 安裝以 engdebug 標記的模組。
  • 根據產品定義檔安裝的模組, 加上標記的模組
  • ro.secure=0
  • ro.debuggable=1
  • ro.kernel.android.checkjni=1
  • adb 預設為啟用。
user 變化版本應做為最終發布位元。
  • 安裝以 user 標記的模組。
  • 根據產品定義檔安裝的模組, 加上標記的模組
  • ro.secure=1
  • ro.debuggable=0
  • adb 預設為停用。
userdebug user 相同,但仍有以下例外:
  • 一併安裝具有 debug 標記的模組。
  • ro.debuggable=1
  • adb 預設為啟用。

使用者偵錯指南

在測試中執行使用者偵錯版本可協助裝置開發人員 以及開發中版本的效能和功能維持一致性 並在建構時提供可靠的指標 裝置開發人員應遵循下列規範:

  • userdebug 定義為已啟用 Root 存取權的使用者版本,但以下項目除外:
    • 僅限使用者偵錯的應用程式,只會由使用者隨選執行
    • 僅在閒置維護期間 (連接充電器/完全) 執行的作業 收費),例如使用 dex2oatd 和 用於背景編譯的 dex2oat
  • 請勿加入預設根據建構類型啟用/停用的功能。 開發人員不建議使用任何會影響電池續航力的記錄形式,例如 偵錯記錄或記憶體快照資料。
  • 凡是在使用者偵錯中預設啟用的偵錯功能,都必須明確定義 並與所有參與專案的開發人員分享建議您啟用偵錯功能 僅在限定期間內解決,直到您嘗試偵錯的問題解決為止。

使用資源重疊自訂建構

Android 建構系統會使用資源疊加層進行自訂 建構產品資源疊加層指定資源 可在預設值上套用的檔案如要使用資源疊加層,請修改專案 buildfile,將 PRODUCT_PACKAGE_OVERLAYS 設為 相對於頂層目錄的路徑。該路徑會變成遮蔽根,隨著 目前的根目錄。

最常自訂的設定包含在 frameworks/base/core/res/res/values/config.xml 檔案。

若要在此檔案中設定資源疊加層,請將疊加層目錄新增至 使用下列任一方法建構 buildfile:

PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay

PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay

接著,將疊加層檔案新增至目錄,例如:

vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml

疊加層 config.xml 檔案中顯示的任何字串或字串陣列會取代 原始檔案包含的映像檔

建構產品

你可以透過多種方式整理裝置的來源檔案。相關摘要如下 描述一個組織 Pixel 實作的方法。

Pixel 的實作方式為名為 marlin。在這項裝置設定中,產品是以 用於宣告產品專屬資訊的產品定義 makefile 例如名稱和型號如要查看 device/google/marlin 目錄,即可查看設定過程。

寫入產品 makefile

下列步驟說明如何以類似的方式,設定 Product makefile 的優點:

  1. 建立 device/<company-name>/<device-name> 的 產品。例如:device/google/marlin。這個目錄將包含原始碼 以及製作檔案
  2. 建立 device.mk makefile,宣告 裝置。如需範例,請參閱 device/google/marlin/device-marlin.mk
  3. 建立產品定義 makefile,以便根據裝置建立特定產品。 下列 makefile 取自 device/google/marlin/aosp_marlin.mk 做為範例。 請注意,產品繼承自 「device/google/marlin/device-marlin.mk」和 vendor/google/marlin/device-vendor-marlin.mk 檔案透過 makefile 此元素也可用於宣告產品專屬資訊,例如名稱、品牌和型號。
    # Inherit from the common Open Source product configuration
    $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
    $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
    
    PRODUCT_NAME := aosp_marlin
    PRODUCT_DEVICE := marlin
    PRODUCT_BRAND := Android
    PRODUCT_MODEL := AOSP on msm8996
    PRODUCT_MANUFACTURER := Google
    PRODUCT_RESTRICT_VENDOR_FILES := true
    
    PRODUCT_COPY_FILES += device/google/marlin/fstab.common:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.marlin
    
    $(call inherit-product, device/google/marlin/device-marlin.mk)
    $(call inherit-product-if-exists, vendor/google_devices/marlin/device-vendor-marlin.mk)
    
    PRODUCT_PACKAGES += \
        Launcher3QuickStep \
        WallpaperPicker
    

    如需其他資訊,請參閱「設定產品定義變數」一文 可加入 Makefile 的產品專用變數。

  4. 建立指向產品 makefile 的 AndroidProducts.mk 檔案。於 這個範例中,只需要產品定義 makefile。以下範例來自 device/google/marlin/AndroidProducts.mk (包含馬林島、Pixel、 和 Sailfish,而 Pixel XL 具備以下特性:
    PRODUCT_MAKEFILES := \
    	$(LOCAL_DIR)/aosp_marlin.mk \
    	$(LOCAL_DIR)/aosp_sailfish.mk
    
    COMMON_LUNCH_CHOICES := \
    	aosp_marlin-userdebug \
    	aosp_sailfish-userdebug
    
  5. 建立包含主機專用設定的 BoardConfig.mk makefile。 如需範例,請參閱 device/google/marlin/BoardConfig.mk
  6. 如果是 Android 9 以下版本,請建立 vendorsetup.sh 檔案,新增產品 (「午餐組合」) 以及建構變數 以連字號分隔例如:
    add_lunch_combo <product-name>-userdebug
    
  7. 此時,你可以根據相同裝置建立更多產品子類。

設定產品定義變數

產品相關變數是在產品的 makefile 中定義。這份表格列出 產品定義檔案內維護的變數。

變數 說明 範例
PRODUCT_AAPT_CONFIG 建立套件時使用的 aapt 設定。
PRODUCT_BRAND 針對品牌 (例如電信業者) 自訂軟體。
PRODUCT_CHARACTERISTICS aapt 特性,可在套件中加入變化版本專屬資源。 tabletnosdcard
PRODUCT_COPY_FILES 類似「source_path:destination_path」的字詞清單。來源路徑中的檔案 建構此產品時,應複製到目的地路徑。副本的規則 步驟是在 config/makefile 中定義。
PRODUCT_DEVICE 工業設計名稱。這也是主機板名稱,建構系統使用這個名稱 找出「BoardConfig.mk」。 tuna
PRODUCT_LOCALES 以空格分隔的雙字母語言代碼清單,雙字母國家/地區代碼 描述使用者的多項設定,例如使用者介面語言和時間、日期和 貨幣格式。PRODUCT_LOCALES 中列出的第一個語言代碼會做為 產品的預設語言代碼。 en_GBde_DEes_ESfr_CA
PRODUCT_MANUFACTURER 製造商名稱。 acme
PRODUCT_MODEL 使用者看見的最終產品名稱。
PRODUCT_NAME 使用者看到的整個產品名稱。會顯示在「設定」>「設定」中 關於畫面。
PRODUCT_OTA_PUBLIC_KEYS 產品的無線 (OTA) 公開金鑰清單。
PRODUCT_PACKAGES 要安裝的 APK 和模組清單。 日曆聯絡人
PRODUCT_PACKAGE_OVERLAYS 指出要使用預設資源或新增任何產品相關疊加層。 vendor/acme/overlay
PRODUCT_SYSTEM_PROPERTIES 列出系統屬性指派,格式為 "key=value" 系統分區您可以透過以下項目設定其他分區的系統屬性: PRODUCT_<PARTITION>_PROPERTIES 如本 PRODUCT_VENDOR_PROPERTIES 做為供應商分區。支援的分區 名稱:SYSTEMVENDORODMSYSTEM_EXTPRODUCT

設定預設系統語言和語言代碼篩選器

使用這項資訊設定預設語言和系統語言代碼篩選器,然後啟用 新裝置類型的語言代碼篩選器。

屬性

使用專屬系統設定預設語言和系統語言代碼篩選器 屬性:

  • ro.product.locale:用於設定預設語言代碼。這原本設為 PRODUCT_LOCALES 變數中的語言代碼;可覆寫 該值。(詳情請參閱 設定產品定義變數表格)。
  • ro.localization.locale_filter:用於設定語言代碼篩選器,使用 套用至語言代碼名稱的規則運算式。例如:
    • 「包含」篩選器:^(de-AT|de-DE|en|uk).* - 只允許德文 (奧地利和德國) 變體)、所有英文變體,以及烏克蘭文
    • 專屬篩選器:^(?!de-IT|es).* - 排除德文 (義大利變體) 和全部 西班牙文的變體。

啟用語言代碼篩選器

如要啟用篩選器,請設定 ro.localization.locale_filter 系統屬性字串值。

在期間透過 oem/oem.prop 設定篩選器屬性值和預設語言 原廠校正可以設定限制,而不必將濾鏡烘焙到系統映像檔。 務必將這些屬性新增至原始設備製造商 (OEM) 分區,方法是將其新增至 PRODUCT_OEM_PROPERTIES 變數,如下所示:

# Delegation for OEM customization
PRODUCT_OEM_PROPERTIES += \
    ro.product.locale \
    ro.localization.locale_filter

接著,在實際工作環境中,實際值會寫入 oem/oem.prop 來反映目標 Google Cloud 就是最佳選擇此方法會在恢復原廠設定期間保留預設值,因此 看起來就像使用者首次設定一樣

設定 ADB_VENDOR_KEYS 以便透過 USB 連線

ADB_VENDOR_KEYS 環境變數可讓裝置製造商存取 無需手動授權即可對 ADB 執行可進行偵錯的版本 (-userdebug 和 -eng,但不包含 -user)。 一般來說,ADB 會為每台用戶端電腦產生專屬 RSA 驗證金鑰,以便將金鑰 連線至任何連線裝置這是 ADB 授權對話方塊中顯示的 RSA 金鑰。身為 您也可以在系統映像檔中建構已知的金鑰,並與 ADB 用戶端分享。 這對 OS 開發和測試來說非常實用,因為這樣就不必手動 與 ADB 授權對話方塊互動

如要建立供應商金鑰,請由一人 (通常是發布管理員) 執行下列步驟:

  1. 使用 adb keygen 產生金鑰組。Google 會針對 Google 裝置產生新的 金鑰組。
  2. 檢查原始碼樹狀結構中某處的金鑰組。Google 會將圖片儲存在 例如 vendor/google/security/adb/
  3. 將建構變數 PRODUCT_ADB_KEYS 設為指向您的金鑰目錄。 具體做法是將 Android.mk 檔案新增至 PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub,需要 可確保我們記得為每個 OS 版本產生新的金鑰組。

以下是 Google 使用的 makefile 目錄,以便我們儲存每個項目的簽入金鑰組 版本:

PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub

ifeq ($(wildcard $(PRODUCT_ADB_KEYS)),)
  $(warning ========================)
  $(warning The adb key for this release)
  $(warning )
  $(warning   $(PRODUCT_ADB_KEYS))
  $(warning )
  $(warning does not exist. Most likely PLATFORM_VERSION in build/core/version_defaults.mk)
  $(warning has changed and a new adb key needs to be generated.)
  $(warning )
  $(warning Please run the following commands to create a new key:)
  $(warning )
  $(warning   make -j8 adb)
  $(warning   LOGNAME=android-eng HOSTNAME=google.com adb keygen $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS)))
  $(warning )
  $(warning and upload/review/submit the changes)
  $(warning ========================)
  $(error done)
endif

如要使用這些供應商金鑰,工程師只需設定 ADB_VENDOR_KEYS 環境變數,指向儲存金鑰組的目錄。 這會指示 adb 先嘗試這些標準金鑰,然後再改回產生的 需要手動授權的主機金鑰。「adb」無法連線至未經授權的帳戶時 裝置時,如果不是,錯誤訊息會建議您設定 ADB_VENDOR_KEYS 設定