產品劃分

Android 9 以上版本支援使用 Android 建構系統建構 product 分區。先前,Android 8.x 會強制將 SoC 專屬元件從 system 分割區分離至 vendor 分割區,但不會為從 Android 建構系統建構的 OEM 專屬元件保留空間。Android 9 以上版本提供額外的權限和白名單功能,可套用至不同分區的私人應用程式。

關於產品劃分

許多原始設備製造商 (OEM) 會自訂 AOSP 系統映像檔,以便實作自身功能和電信業者規定。不過,這類自訂設定會導致無法使用單一系統映像檔來處理多個軟體 SKU。每個映像檔都必須不同,才能支援自訂設定,例如不同的語言代碼或電信業者。使用單獨的 product 分區來容納自訂項目,即可為多個軟體 SKU 使用單一系統映像檔。(system 分割區會代管通用程式碼,可在許多軟體 SKU 之間共用)。vendor 區隔會繼續代管 SoC 專屬的 BSP 程式碼,可根據特定 SoC 在多個裝置之間共用。

使用個別分割區有某些缺點,例如管理磁碟空間 (必須保留有限的空間供未來擴充使用),以及在分割區之間維持穩定的應用程式二進位介面 (ABI)。決定是否使用 product 分割區之前,請先花時間考量您獨特的 AOSP 實作方式和可能的緩解策略 (例如在無線 (OTA) 更新期間重新分割裝置,這不是 Google 而是部分原始設備製造商 (OEM) 執行的操作)。動態分割是這類問題的理想解決方案。

產品劃分和權限

在 Android 9 以上版本中,權限和白名單程序的變更會影響您在「product」分區中授予私人應用程式權限的方式。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,因為這些 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 無法使用 Soong 建構系統進行建構。
  • OTA 更新支援custom_images 用於無法接收 OTA 更新的原廠 ROM 映像檔。

維護分區之間的 ABI

Android 9 中的 product 分區是 system 分區的擴充功能。productsystem 區隔之間的 ABI 較弱,因此必須同時升級這兩個區隔,且 ABI 應以系統 SDK 為基礎。如果系統 SDK 未涵蓋 productsystem 之間的所有 API 途徑,OEM 必須在兩個分區之間維護自己的 ABI。

productsystem 區隔可能會彼此依附。不過,使用通用系統映像檔 (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 分區。

  • Android.bpproduct_specific: true
  • Android.mkLOCAL_PRODUCT_MODULE := true

啟用驗證開機程序

為避免 product 分區遭惡意軟體竄改,請為該分區啟用 Android 驗證啟動 (AVB) (就像為 vendorsystem 分區啟用這項功能一樣)。如要啟用 AVB,請加入下列建構標記:BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS