Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

添加新設備

使用此頁面中的信息為您的設備和產品創建makefile。

每個新的Android模塊必須具有一個配置文件,以使用模塊元數據,編譯時依賴性和打包說明來指導構建系統。 Android使用Soong構建系統 。有關Android構建系統的更多信息,請參見構建Android

了解構建層

構建層次結構包括與設備的物理組成相對應的抽象層。這些層在下表中描述。每一層都以一對多關係與其上一層相關。例如,一個架構可以有一個以上的板,而每個板可以有一個以上的產品。您可以將給定層中的元素定義為同一層中元素的特殊化,從而消除了複製並簡化了維護。

描述
產品 myProduct,myProduct_eu,myProduct_eu_fr,j2,sdk 產品層定義了運輸產品的功能規格,例如要構建的模塊,支持的語言環境以及各種語言環境的配置。換句話說,這是整個產品的名稱 。產品特定的變量在產品定義makefile中定義。產品可以繼承其他產品定義,從而簡化了維護。一種常見的方法是創建包含適用於所有產品的功能的基本產品,然後根據該基本產品創建產品變體。例如,兩個僅在無線電方面有所不同的產品(CDMA與GSM)可以從未定義無線電的同一基本產品繼承。
板/設備馬林魚藍線珊瑚板/設備層代表設備上塑料的物理層(即設備的工業設計)。該層還代表產品的裸示意圖。這些包括板上的外圍設備及其配置。使用的名稱僅是用於不同闆卡/設備配置的代碼。
手臂,x86,arm64,x86_64 架構層描述了板上運行的處理器配置和應用程序二進制接口(ABI)。

使用構建變體

為特定產品進行構建時,對最終發行版進行一些細微的變化非常有用。在模塊定義中,模塊可以使用LOCAL_MODULE_TAGS指定標籤,標籤可以是optional (默認), debugeng一個或多個值。

如果模塊未指定標籤(通過LOCAL_MODULE_TAGS ),則其標籤默認為optional 。僅當帶有PRODUCT_PACKAGES的產品配置需要時才安裝可選模塊。

這些是當前定義的構建變體。

變體描述
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構建有助於設備開發人員了解開發版本的性能和功能。為了維護用戶和用戶調試版本之間的一致性,並在用於調試的版本中實現可靠的指標,設備開發人員應遵循以下準則:

  • userdebug定義為啟用了root訪問權限的用戶構建,但以下情況除外:
    • 僅由用戶按需運行的僅用戶調試的應用
    • 僅在閒置維護期間運行的操作(在充電器/充滿電的情況下),例如使用dex2oatddex2oat進行後台編譯
  • 不要包括根據構建類型默認啟用/禁用的功能。不鼓勵開發人員使用任何會影響電池壽命的日誌記錄形式,例如調試日誌記錄或堆轉儲。
  • 應該明確定義在userdebug中默認啟用的所有調試功能,並與從事該項目的所有開發人員共享。您應該僅在有限的時間內啟用調試功能,直到解決您要調試的問題為止。

使用資源覆蓋自定義構建

Android構建系統使用資源覆蓋圖在構建時自定義產品。資源覆蓋指定了在默認值之上應用的資源文件。要使用資源疊加層,請修改項目構建文件以將PRODUCT_PACKAGE_OVERLAYS設置為相對於頂層目錄的路徑。當構建系統搜索資源時,該路徑將成為與當前根一起搜索的影子根。

最常見的自定義設置包含在文件frameworks / base / core / res / res / res / values / config.xml中

要在此文件上設置資源覆蓋,請使用以下方法之一將覆蓋目錄添加到項目構建文件中:

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

要么

PRODUCT_PACKAGE_OVERLAYS := vendor/ vendor-name /overlay

然後,將覆蓋文件添加到目錄中,例如:

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

在覆蓋config.xml文件中找到的任何字符串或字符串數組都將替換在原始文件中找到的字符串或字符串數組。

建立產品

您可以通過多種不同方式來組織設備的源文件。這是組織像素實現的一種方法的簡要說明。

Pixel通過名為marlin的主要設備配置實現。通過此設備配置,將使用產品定義makefile創建一個產品,該文件聲明有關該設備的特定於產品的信息,例如名稱和型號。您可以查看device/google/marlin目錄以了解所有這些設置。

編寫產品makefile

以下步驟描述瞭如何以類似於Pixel產品線的方式設置產品makefile:

  1. 為產品創建device/ <company-name> / <device-name>目錄。例如, device/google/marlin 。該目錄將包含您設備的源代碼以及用於生成它們的makefile。
  2. 創建一個device.mk makefile來聲明設備所需的文件和模塊。有關示例,請參閱device/google/marlin/device-marlin.mk
  3. 創建產品定義makefile,以基於設備創建特定產品。以下makefile取自device/google/marlin/aosp_marlin.mk作為示例。請注意,該產品通過Makefile繼承自device/google/marlin/device-marlin.mkvendor/google/marlin/device-vendor-marlin.mk文件,同時還聲明了特定於產品的信息,例如名稱,品牌,和模型。
    # 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 (其中包含marlin(像素)和旗魚(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. 創建一個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 用空格分隔的兩個字母的語言代碼列表,兩個字母的國家/地區代碼對,它們描述了用戶的幾種設置,例如UI語言和時間,日期以及貨幣格式。 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

設置ADB_VENDOR_KEYS以通過USB連接

ADB_VENDOR_KEYS環境變量使設備製造商無需人工授權就可以通過adb訪問可調試版本(-userdebug和-eng,但不能-user)。通常,adb為每台客戶端計算機生成一個唯一的RSA身份驗證密鑰,它將發送到任何連接的設備。這是adb授權對話框中顯示的RSA密鑰。或者,您可以將已知密鑰構建到系統映像中並與adb客戶端共享。這對於OS開發尤其是測試非常有用,因為它避免了與adb授權對話框手動交互的需要。

要創建供應商密鑰,一個人(通常是發行經理)應:

  1. 使用adb keygen生成密鑰對。對於Google設備,Google為每個新的OS版本生成一個新的密鑰對。
  2. 在源代碼樹中的某處檢查密鑰對。 Google將其存儲在例如vendor/google/security/adb/
  3. 將構建變量PRODUCT_ADB_KEYS設置為指向您的密鑰目錄。 Google通過在密鑰目錄中添加一個PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub的密鑰目錄中添加一個Android.mk文件來完成此PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub ,這有助於確保我們記得為每個操作系統版本生成一個新的密鑰對。

這是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如果尚未設置)。