Android 9 支持使用 Android 編譯系統構建 /product
分區。以前,Android 8.x 強制將系統芯片 (SoC) 專屬組件從 /system
分區分隔到了 /vendor
分區,不會爲從 Android 編譯系統構建的原始設備製造商 (OEM) 專屬組件提供專用空間。express
product 分區簡介
許多原始設備製造商 (OEM) 會自定義 AOSP 系統映像,以實施本身的功能並知足運營商的要求。不過,若是進行這類自定義,則沒法針對多個軟件 SKU 使用單個系統映像,由於映像必須各不相同,才能支持不一樣的語言區域、運營商等;若是使用單獨的 /product
分區來包含自定義項,則能夠沒法針對多個軟件 SKU 使用單個系統映像(/system
分區會託管可在衆多軟件 SKU 之間共享的通用代碼)。/vendor
分區會繼續託管 SoC 專用板級 (BSP) 代碼,這類代碼能夠基於指定 SoC 在多臺設備之間共享。apache
使用單獨的分區存在一些弊端,例如,難以管理磁盤空間(應該預留必定的空間知足將來增加的空間需求),以及難以在各分區之間維護穩定的應用二進制接口 (ABI)。在決定使用 /product
分區以前,請花些時間考慮一下您的 AOSP 實現的具體狀況和可行的緩解策略(例如,在無線下載 (OTA) 更新期間對設備進行從新分區;此操做不是由 Google 來完成,而是由某些 OEM 來完成)。app
舊式 /oem 與 /product
新 /product
分區與舊式 /oem
分區不一樣:框架
分區 | 屬性 |
---|---|
/oem |
|
/product |
|
出於這些緣由,Android 9 支持新的 /product
分區,同時也針對依賴於舊式 /oem
分區的設備保留了對該分區的支持。less
/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
,由於它們缺少對如下各項的支持:ui
- 將模塊安裝到特定目標分區中。
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。this
/product
分區和 /system
分區能夠相互依賴。不過,在沒有 /product
分區的狀況下,對通用系統映像 (GSI) 的測試必須可以正常運行。google
/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