https://source.android.google.cn/devices/bootloader/product-partitions
編譯 product 分區
Android 9 支持使用 Android 編譯系統構建 /product
分區。之前,Android 8.x 強制將系統芯片 (SoC) 專屬組件從 /system
分區分隔到了 /vendor
分區,不會為從 Android 編譯系統構建的原始設備制造商 (OEM) 專屬組件提供專用空間。
product 分區簡介
許多原始設備制造商 (OEM) 會自定義 AOSP 系統映像,以實施自己的功能並滿足運營商的要求。不過,如果進行這類自定義,則無法針對多個軟件 SKU 使用單個系統映像,因為映像必須各不相同,才能支持不同的語言區域、運營商等;如果使用單獨的 /product
分區來包含自定義項,則可以無法針對多個軟件 SKU 使用單個系統映像(/system
分區會托管可在眾多軟件 SKU 之間共享的通用代碼)。/vendor
分區會繼續托管 SoC 專用板級 (BSP) 代碼,這類代碼可以基於指定 SoC 在多台設備之間共享。
使用單獨的分區存在一些弊端,例如,難以管理磁盤空間(應該預留一定的空間滿足未來增長的空間需求),以及難以在各分區之間維護穩定的應用二進制接口 (ABI)。在決定使用 /product
分區之前,請花些時間考慮一下您的 AOSP 實現的具體情況和可行的緩解策略(例如,在無線下載 (OTA) 更新期間對設備進行重新分區;此操作不是由 Google 來完成,而是由某些 OEM 來完成)。
舊式 /oem 與 /product
新 /product
分區與舊式 /oem
分區不同:
分區 | 屬性 |
---|---|
/oem |
|
/product |
|
出於這些原因,Android 9 支持新的 /product
分區,同時也針對依賴於舊式 /oem
分區的設備保留了對該分區的支持。
/product 組件
/product
分區包含以下組件:
- 產品專用的系統屬性 (
/product/build.prop
) - 產品專用的 RRO (
/product/overlay/*.apk
) - 產品專用的應用 (
/product/app/*.apk
) - 產品專用的特權應用 (
/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 支持。無法使用 Soong 編譯系統編譯
custom_images
。 - OTA 更新支持。
custom_images
用作出廠 ROM 映像,無法執行 OTA 更新。
維護分區之間的 ABI
Android 9 中的 /product
分區是 /system
分區的擴展。由於 /product
和 /system
分區之間的 ABI 穩定性較弱,因此必須同時升級這兩者,而且 ABI 應基於系統 SDK。如果系統 SDK 不涵蓋 /product
和 /system
之間的所有 API 表面,則 OEM 負責在這兩個分區之間維護自己的 ABI。
/product
分區和 /system
分區可以相互依賴。不過,在沒有 /product
分區的情況下,對通用系統映像 (GSI) 的測試必須能夠正常運行。
/product
分區不能對 /vendor
分區有任何依賴,而且 /product
分區和 /vendor
分區之間不允許有任何直接交互(由 SEpolicy 強制執行)。
實現 product 分區
在實現新 product 分區之前,請先了解 AOSP 中的相關 product 分區變化。接下來,為了設置 /product
,請添加以下開發板編譯標記或 product 編譯標記:
BOARD_USES_PRODUCTIMAGE
BOARD_PRODUCTIMAGE_PARTITION_SIZE
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
PRODUCT_PRODUCT_PROPERTIES for /product/build.prop
,應該在$(call inherit-product path/to/device.mk)
內,例如PRODUCT_PRODUCT_PROPERTIES += product.abc=ok
。
向 product 分區中安裝模塊
使用以下編譯標記向 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