Android 編譯 product 分區

https://source.android.google.cn/devices/bootloader/product-partitionsandroid

 

編譯 product 分區

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
  • 不可更新;一般在出廠時刷寫一次。
  • 根據品牌信息和顏色等細微差別進行構建。不一樣的 /oem 分區內容不會使其成爲不一樣的產品軟件。
  • 系統分區不依賴於 /oem(僅當在其中找到特定文件時才使用該分區)。
  • 切勿在系統上使用除公共 API 以外的 API。
/product
  • 可更新
  • 搭配系統圖像(該分區與系統映像一塊兒更新)
  • 按產品或產品系列構建。
  • 系統分區能夠依賴於 /product 分區。
  • 可使用非公共 API,由於它們同時更新。

出於這些緣由,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

相關文章
相關標籤/搜索