產品分區

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
  • 不可更新;一般在工廠就閃過一次。
  • 根據品牌和顏色等微小變化而建立。 oem分區內容不同並不代表產品軟體不同。
  • system分區不依賴oem分區。 (僅當在oem分割區中找到特定檔案時,它才使用該分割區)。
  • 僅在system分割區上使用公共 API。
product
  • 可更新
  • 加上系統鏡像(它們一起更新)
  • 按產品或產品系列建置。
  • 系統分區可以取決於product分區。
  • 可以使用非公共 API,因為它們是同時更新的。
product (強制介面)
  • 可更新
  • 與系統鏡像解耦。
  • 按產品或產品系列建置。
  • system分區不依賴product分區。
  • 不能使用隱藏API,只能使用system分割區上的公用API和系統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 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 未涵蓋productsystem之間的所有 API 表面,OEM 必須在兩個分割區之間維護自己的 ABI。

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

當強制執行product介面時, product分區與system分區解耦。 product分區僅使用system分區允許的介面。

product分區不得透過不穩定的介面對vendor分區產生任何依賴性。禁止productvendor分區之間的直接互動。 (這是由 SEpolicy 強制執行的。)

實施產品分區

在實施新的產品分割區之前,請先查看AOSP 中的相關產品分割區變更。然後,要設定product ,請包含以下板或產品建構標誌:

  • 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: true Android.bp中為 true
  • Android.mk中的LOCAL_PRODUCT_MODULE := true

啟用驗證啟動

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