使用此頁面中的信息為您的設備和產品創建 makefile。
每個新的 Android 模塊都必須有一個配置文件,以使用模塊元數據、編譯時依賴項和打包指令來指導構建系統。 Android使用的宋楚瑜構建系統。見大樓的Android有關Android編譯系統的更多信息。
了解構建層
構建層次結構包括與設備物理構成相對應的抽象層。下表描述了這些層。每一層都以一對多的關係與它上面的一層相關。例如,一個架構可以有多個板,每個板可以有多個產品。您可以將給定層中的元素定義為同一層中元素的特化,從而消除複製並簡化維護。
層 | 例子 | 描述 |
---|---|---|
產品 | myProduct、myProduct_eu、myProduct_eu_fr、j2、sdk | 產品層定義了運輸產品的特性規範,例如要構建的模塊、支持的語言環境以及各種語言環境的配置。換句話說,這是整個產品的名稱。特定於產品的變量在產品定義 makefile 中定義。一個產品可以繼承其他產品定義,從而簡化維護。一種常見的方法是創建包含適用於所有產品的功能的基礎產品,然後基於該基礎產品創建產品變體。例如,兩個僅在無線電方面不同的產品(CDMA 與 GSM)可以從未定義無線電的同一基本產品繼承。 |
板/設備 | 馬林魚,藍線,珊瑚 | 板/器件層代表器件上塑料的物理層(即器件的工業設計)。該層還代表產品的裸露原理圖。這些包括板上的外圍設備及其配置。所使用的名稱只是不同電路板/設備配置的代碼。 |
拱 | 手臂,x86,arm64,x86_64 | 架構層描述了在板上運行的處理器配置和應用程序二進制接口 (ABI)。 |
使用構建變體
在為特定產品構建時,對最終版本構建進行細微的更改很有用。在一個模塊定義,該模塊可與指定標籤LOCAL_MODULE_TAGS
,其可以是一個或多個值optional
(默認), debug
和eng
。
如果模塊沒有指定標籤(由LOCAL_MODULE_TAGS
),它的標籤默認為optional
。如果它是由與產品配置所需的可選模塊僅安裝PRODUCT_PACKAGES
。
這些是當前定義的構建變體。
變體 | 描述 |
---|---|
eng | 這是默認風格。
|
user | 該變體旨在成為最終發布位。
|
userdebug | 同樣作為user ,但以下情況除外:
|
用戶調試指南
在測試中運行 userdebug 版本可幫助設備開發人員了解開發中版本的性能和功能。為了保持用戶和 userdebug 構建之間的一致性,並在用於調試的構建中獲得可靠的指標,設備開發人員應遵循以下準則:
- userdebug 被定義為啟用 root 訪問權限的用戶構建,除了:
- 僅由用戶按需運行的 userdebug-only 應用程序
- 該(對充電器/完全充電)僅在空閒運行維護操作,如使用
dex2oatd
對dex2oat
背景編譯
- 不要包含基於構建類型默認啟用/禁用的功能。不鼓勵開發人員使用影響電池壽命的任何形式的日誌記錄,例如調試日誌記錄或堆轉儲。
- 在 userdebug 中默認啟用的任何調試功能都應明確定義並與所有參與該項目的開發人員共享。您應該只在有限的時間內啟用調試功能,直到您嘗試調試的問題得到解決。
使用資源覆蓋自定義構建
Android 構建系統使用資源疊加在構建時自定義產品。資源覆蓋指定應用在默認值之上的資源文件。要使用資源覆蓋,修改項目構建文件集PRODUCT_PACKAGE_OVERLAYS
相對於你的頂級目錄的路徑。當構建系統搜索資源時,該路徑成為與當前根一起搜索的影子根。
最常見的自定義設置文件中包含的框架/基/核心/ RES / RES /價值/ 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/values/config.xml
在覆蓋中發現的任何字符串或字符串數組config.xml
文件替換那些在原來的文件中找到。
構建產品
您可以通過多種不同方式組織設備的源文件。以下是組織 Pixel 實現的一種方法的簡要說明。
像素與主命名的設備配置來實現marlin
。根據此設備配置,使用產品定義生成文件創建產品,該文件聲明有關設備的產品特定信息,例如名稱和型號。您可以查看該device/google/marlin
目錄下看到這一切是如何設置。
編寫產品makefile
以下步驟描述瞭如何以類似於 Pixel 產品線的方式設置產品 makefile:
- 創建一個
device/ <company-name> / <device-name>
為您的產品目錄。例如,device/google/marlin
。該目錄將包含您設備的源代碼以及構建它們的 makefile。 - 創建
device.mk
make文件,聲明設備所需的文件和模塊。對於一個示例,請參見device/google/marlin/device-marlin.mk
。 - 創建產品定義 makefile 以基於設備創建特定產品。下面生成文件取自
device/google/marlin/aosp_marlin.mk
作為一個例子。請注意,從產品繼承device/google/marlin/device-marlin.mk
和vendor/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文件。
- 創建
AndroidProducts.mk
文件指向產品的makefile文件。在此示例中,只需要產品定義生成文件。下面的例子是從device/google/marlin/AndroidProducts.mk
(其包含兩個槍魚,像素,和旗魚,像素XL,其中共享最配置):PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_marlin.mk \ $(LOCAL_DIR)/aosp_sailfish.mk COMMON_LUNCH_CHOICES := \ aosp_marlin-userdebug \ aosp_sailfish-userdebug
- 創建
BoardConfig.mk
包含板特定配置的makefile。對於一個示例,請參見device/google/marlin/BoardConfig.mk
。 - 對於Android的9只有更低,創建一個
vendorsetup.sh
文件到你的產品(“午餐套餐”)與一起添加到構建構建變量用破折號分開。例如:add_lunch_combo <product-name>-userdebug
- 此時,您可以基於同一設備創建更多產品變體。
設置產品定義變量
產品特定的變量在產品的 makefile 中定義。該表顯示了產品定義文件中維護的一些變量。
多變的 | 描述 | 例子 |
---|---|---|
PRODUCT_AAPT_CONFIG | aapt 配置,以創建軟件包時使用。 | |
PRODUCT_BRAND | 軟件定制的品牌(例如,運營商)(如果有)。 | |
PRODUCT_CHARACTERISTICS | aapt 特性以允許添加的變體特異資源包。 | tablet , nosdcard |
PRODUCT_COPY_FILES | 單詞的列表,喜歡source_path:destination_path 。構建本產品時,應將源路徑中的文件複製到目標路徑。用於複製步驟的規則定義在config/makefile 。 | |
PRODUCT_DEVICE | 工業設計名稱。這也是主板名稱,構建系統使用它來定位BoardConfig.mk 。 | tuna |
PRODUCT_LOCALES | 兩個字母語言代碼、兩個字母國家/地區代碼對的空格分隔列表,用於描述用戶的多種設置,例如 UI 語言和時間、日期和貨幣格式。在列出的第一個語言環境PRODUCT_LOCALES 作為產品的默認語言環境。 | en_GB , de_DE , es_ES , fr_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 為供應商分區。支持的分區名稱: SYSTEM , VENDOR , ODM , SYSTEM_EXT 和PRODUCT 。 |
配置默認系統語言和區域設置過濾器
使用此信息配置默認語言和系統區域設置過濾器,然後為新設備類型啟用區域設置過濾器。
特性
使用專用系統屬性配置默認語言和系統區域設置過濾器:
-
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
,以反映目標的要求。使用這種方法,在恢復出廠設置期間會保留默認值,因此初始設置看起來與用戶的第一次設置完全一樣。
設置 ADB_VENDOR_KEYS 以通過 USB 連接
所述ADB_VENDOR_KEYS
環境變量使設備製造商能夠訪問可調試構建(-userdebug和-eng,但不是-user)在ADB無需手動授權。通常 adb 為每台客戶端計算機生成一個唯一的 RSA 身份驗證密鑰,它將發送到任何連接的設備。這是 adb 授權對話框中顯示的 RSA 密鑰。作為替代方案,您可以將已知密鑰構建到系統映像中並與 adb 客戶端共享。這對於操作系統開發特別是測試很有用,因為它避免了手動與 adb 授權對話框交互的需要。
要創建供應商密鑰,一個人(通常是發布經理)應該:
- 使用生成密鑰對
adb keygen
。對於 Google 設備,Google 會為每個新的操作系統版本生成一個新的密鑰對。 - 檢查源樹中某處的密鑰對。谷歌將它們存儲在
vendor/google/security/adb/
,例如。 - 設置構建變量
PRODUCT_ADB_KEYS
來點你的關鍵目錄。谷歌通過將做到這一點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
如果它尚未設置。