Android 9 以上版本支援使用 Android 建構系統建構 product
分區。先前,Android 8.x 會強制將 SoC 專屬元件從 system
分割區分離至 vendor
分割區,但不會為從 Android 建構系統建構的 OEM 專屬元件保留空間。Android 9 以上版本提供額外的權限和白名單功能,可套用至不同分區的私人應用程式。
關於產品劃分
許多原始設備製造商 (OEM) 會自訂 AOSP 系統映像檔,以便實作自身功能和電信業者規定。不過,這類自訂設定會導致無法使用單一系統映像檔來處理多個軟體 SKU。每個映像檔都必須不同,才能支援自訂設定,例如不同的語言代碼或電信業者。使用單獨的 product
分區來容納自訂項目,即可為多個軟體 SKU 使用單一系統映像檔。(system
分割區會代管通用程式碼,可在許多軟體 SKU 之間共用)。vendor
區隔會繼續代管 SoC 專屬的 BSP 程式碼,可根據特定 SoC 在多個裝置之間共用。
使用個別分割區有某些缺點,例如管理磁碟空間 (必須保留有限的空間供未來擴充使用),以及在分割區之間維持穩定的應用程式二進位介面 (ABI)。決定是否使用 product
分割區之前,請先花時間考量您獨特的 AOSP 實作方式和可能的緩解策略 (例如在無線 (OTA) 更新期間重新分割裝置,這不是 Google 而是部分原始設備製造商 (OEM) 執行的操作)。動態分割是這類問題的理想解決方案。
產品劃分和權限
在 Android 9 以上版本中,權限和白名單程序的變更會影響您在「product」分區中授予私人應用程式權限的方式。permissions.xml
檔案必須與 priv-apps 位於相同的分割區。將 permissions.xml
檔案放入 priv-apps 的 system
分割區,並不會將這些權限擴充至 product
分割區中的 priv-apps,即使前者是後者的擴充功能也是如此。如要進一步瞭解權限和白名單程序,請參閱特權權限許可清單。
舊版 /oem 與 /product
我們有兩種 product
區隔屬性,取決於產品介面強制執行。此外,product
分區與舊版 oem
分區不同:
分區 | 屬性 |
---|---|
oem |
|
product |
|
product (強制執行介面) |
|
基於這些原因,Android 9 會支援 product
分區,同時保留對舊版 oem
分區的支援,以便支援依賴該分區的裝置。為將 product
分區與 system
分區解耦,Android 11 支援強制執行 product
介面。
/產品元件
product
區隔包含下列元件:
- 產品專屬系統屬性 (
/product/build.prop
) - 產品專屬 RRO (
/product/overlay/*.apk
) - 產品專屬應用程式 (
/product/app/*.apk
) - 產品專屬 priv-apps (
/product/priv-app/*.apk
) - 產品專屬程式庫 (
/product/lib/*
) - 產品專屬 Java 程式庫 (
/product/framework/*.jar
) - 產品專屬的 Android 架構系統設定 (
/product/etc/sysconfig/*
和/product/etc/permissions/*
) - 產品專屬媒體檔案 (
/product/media/audio/*
) - 產品專屬
bootanimation
檔案
沒有 custom_images
您無法使用 custom_images
。但不支援下列功能:
- 將模組安裝到特定目標。
custom_images
支援將構件複製到映像檔,但無法將模組安裝到特定區段,因為您無法將目標區段指定為建構規則的一部分。 - Soong 支援。
custom_images
無法使用 Soong 建構系統進行建構。 - OTA 更新支援。
custom_images
用於無法接收 OTA 更新的原廠 ROM 映像檔。
維護分區之間的 ABI
Android 9 中的 product
分區是 system
分區的擴充功能。product
和 system
區隔之間的 ABI 較弱,因此必須同時升級這兩個區隔,且 ABI 應以系統 SDK 為基礎。如果系統 SDK 未涵蓋 product
和 system
之間的所有 API 途徑,OEM 必須在兩個分區之間維護自己的 ABI。
product
和 system
區隔可能會彼此依附。不過,使用通用系統映像檔 (GSI) 的測試必須在沒有 product
分割區的情況下正常運作。
強制執行 product
介面後,product
分區就會與 system
分區解耦。product
分區只會使用 system
分區允許的介面。
product
分區不得透過 vendor
分區上的不穩定介面,產生任何依附元件。禁止 product
和 vendor
區隔之間的直接互動。(這是由 SEpolicy 強制執行。)
實作產品劃分
在實作新產品分區之前,請先查看 AOSP 中的相關產品分區變更。接著,如要設定 product
,請加入下列板卡或產品建構標記:
BOARD_USES_PRODUCTIMAGE
BOARD_PRODUCTIMAGE_PARTITION_SIZE
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
/product/build.prop
的PRODUCT_PRODUCT_PROPERTIES
。這些值必須位於$(call inherit-product path/to/device.mk)
中,如PRODUCT_PRODUCT_PROPERTIES += product.abc=ok
所示。
在產品分區中安裝模組
請使用下列建構標記,將模組安裝至 product
分區。
Android.bp
的product_specific: true
Android.mk
的LOCAL_PRODUCT_MODULE := true
啟用驗證開機程序
為避免 product
分區遭惡意軟體竄改,請為該分區啟用 Android 驗證啟動 (AVB) (就像為 vendor
和 system
分區啟用這項功能一樣)。如要啟用 AVB,請加入下列建構標記:BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
。