Android 9 及更高版本支援使用 Android 建置系統建置product
分區。先前,Android 8.x 強制將 SoC 特定元件從system
分區分離到vendor
分區,而沒有為從 Android 建置系統建置的 OEM 特定元件指派專用空間。 Android 9 及更高版本提供了適用於不同分割區上的 priv-app 的附加權限和白名單功能。
關於產品分區
許多 OEM 定制 AOSP 系統映像來實現自己的功能以及運營商的要求。然而,此類客製化使得無法將單一系統映像用於多個軟體 SKU。每個影像必須不同才能支援自訂,例如不同的區域設定或營運商。使用單獨的product
分割區來包含自訂項,可以將單一系統映像用於多個軟體 SKU。 ( system
分區託管可在許多軟體 SKU 之間共用的通用程式碼)。 vendor
分區繼續託管特定於 SoC 的 BSP 程式碼,這些程式碼可以在基於給定 SoC 的多個裝置之間共用。
使用單獨的分割區有一些缺點,例如管理磁碟空間(必須保留有限的空間以供將來增長)以及維護分割區之間穩定的應用程式二進位介面(ABI) 。在決定使用product
分區之前,請花點時間考慮您獨特的 AOSP 實施和可能的緩解策略(例如在無線 (OTA) 更新期間對設備重新分區,這不是由Google 完成的,而是由一些OEM 完成的) )。動態分區將是一個很好的解決方案。
產品分區和權限
在 Android 9 及更高版本中,權限和白名單流程的變更會影響您在「產品」分割區上授予 priv-apps 權限的方式。 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 Framework 系統配置(
/product/etc/sysconfig/*
和/product/etc/permissions/*
) - 產品特定的媒體檔案 (
/product/media/audio/*
) - 產品特定的
bootanimation
文件
沒有自訂圖像
您不能使用custom_images
。他們缺乏對以下方面的支持:
- 將模組安裝到特定目標中。
custom_images
支援將工件複製到映像中,但無法透過將其目標分區指定為建置規則的一部分來將模組安裝到特定分區中。 - 宋支持。無法使用 Soong 建置系統建置
custom_images
。 - 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
分割區。
-
product_specific: true
Android.bp
中為 true -
Android.mk
中的LOCAL_PRODUCT_MODULE := true
啟用驗證啟動
為了防止product
分區被惡意軟體篡改,請為該分區啟用Android 驗證啟動 (AVB) (就像為vendor
和system
分區所做的那樣)。若要啟用 AVB,請包含以下建置標誌: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
。