Android 9 及更高版本支持使用 Android 構建系統構建product
分區。以前,Android 8.x 強制將 SoC 特定組件從system
分區到vendor
分區分離,而沒有為從 Android 構建系統構建的 OEM 特定組件分配專用空間。 Android 9 及更高版本提供了適用於不同分區上的 priv-apps 的額外權限和白名單功能。
關於產品分區
許多 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 位於同一分區中。在system
分區中為 priv-apps 放置一個permissions.xml
文件不會將這些權限擴展到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
。 - 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 或 product-build 標誌:
-
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 -
LOCAL_PRODUCT_MODULE := true
在Android.mk
中為真
啟用驗證啟動
為防止product
分區被惡意軟件篡改,請為該分區啟用Android 驗證啟動 (AVB) (就像您為vendor
和system
分區所做的那樣)。要啟用 AVB,請包含以下構建標誌: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
。