產品分區

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
  • 不可更新;通常在工廠閃爍一次。
  • 根據品牌和顏色等細微變化構建。 oem分區內容不同並不代表產品軟件不同。
  • system分區不依賴於oem分區。 (僅當在那裡找到特定文件時才使用oem分區)。
  • 僅在system分區上使用公共 API。
product
  • 可更新
  • 加上系統鏡像(它們一起更新)
  • 按產品或產品系列構建。
  • 系統分區可以依賴於product分區。
  • 可以使用非公共 API,因為它們是同時更新的。
product (強制接口)
  • 可更新
  • 與系統映像解耦。
  • 按產品或產品系列構建。
  • system分區不依賴於product分區。
  • 不能使用隱藏 API,只能在system分區上使用公共和系統 API。

由於這些原因,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 沒有覆蓋productsystem之間的所有 API 表面,OEM 必須在兩個分區之間維護自己的 ABI。

productsystem分區可以相互依賴。但是,使用通用系統映像 (GSI)的測試必須在沒有product分區的情況下正常工作。

product接口被強制執行時, product分區與system分區解耦。 product分區僅使用system分區中允許的接口。

product分區不能對vendor分區有任何依賴。禁止productvendor分區之間的直接交互。 (這是由 SEpolicy 強制執行的。)

實施產品分區

在實施新的產品分區之前,請查看AOSP 中的相關產品分區更改。然後,要設置product ,包括以下 board 或 product-build 標誌:

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • /product/build.propPRODUCT_PRODUCT_PROPERTIES 。這些必須在$(call inherit-product path/to/device.mk)內,如PRODUCT_PRODUCT_PROPERTIES += product.abc=ok

將模塊安裝到產品分區

使用以下構建標誌將模塊安裝到product分區。

  • product_specific: trueAndroid.bp中為 true
  • LOCAL_PRODUCT_MODULE := trueAndroid.mk中為真

啟用驗證啟動

為防止product分區被惡意軟件篡改,請為該分區啟用Android 驗證啟動 (AVB) (就像您為vendorsystem分區所做的那樣)。要啟用 AVB,請包含以下構建標誌: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS