Android 編譯 product 分區


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

 

編譯 product 分區

Android 9​ 支持使用 Android 編譯系統構建 /product 分區。之前,Android 8.x 強制將系統芯片 (SoC) 專屬組件從 /system 分區分隔到了 /vendor 分區,不會為從 Android 編譯系統構建的原始設備制造商 (OEM) 專屬組件提供專用空間。

product 分區簡介

許多原始設備制造商 (OEM) 會自定義 AOSP 系統映像,以實施自己的功能並滿足運營商的要求。不過,如果進行這類自定義,則無法針對多個軟件 SKU 使用單個系統映像,因為映像必須各不相同,才能支持不同的語言區域、運營商等;如果使用單獨的 /product 分區來包含自定義項,則可以無法針對多個軟件 SKU 使用單個系統映像(/system 分區會托管可在眾多軟件 SKU 之間共享的通用代碼)。/vendor 分區會繼續托管 SoC 專用板級 (BSP) 代碼,這類代碼可以基於指定 SoC 在多台設備之間共享。

使用單獨的分區存在一些弊端,例如,難以管理磁盤空間(應該預留一定的空間滿足未來增長的空間需求),以及難以在各分區之間維護穩定的應用二進制接口 (ABI)。在決定使用 /product 分區之前,請花些時間考慮一下您的 AOSP 實現的具體情況和可行的緩解策略(例如,在無線下載 (OTA) 更新期間對設備進行重新分區;此操作不是由 Google 來完成,而是由某些 OEM 來完成)。

舊式 /oem 與 /product

/product 分區與舊式 /oem 分區不同:

分區 屬性
/oem
  • 不可更新;通常在出廠時刷寫一次。
  • 根據品牌信息和顏色等細微差異進行構建。不同的 /oem 分區內容不會使其成為不同的產品軟件。
  • 系統分區不依賴於 /oem(僅當在其中找到特定文件時才使用該分區)。
  • 切勿在系統上使用除公共 API 之外的 API。
/product
  • 可更新
  • 搭配系統圖像(該分區與系統映像一起更新)
  • 按產品或產品系列構建。
  • 系統分區可以依賴於 /product 分區。
  • 可以使用非公共 API,因為它們同時更新。

出於這些原因,Android 9 支持新的 /product 分區,同時也針對依賴於舊式 /oem 分區的設備保留了對該分區的支持。

/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,因為它們缺乏對以下各項的支持:

  • 將模塊安裝到特定目標分區中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。

/product 分區和 /system 分區可以相互依賴。不過,在沒有 /product 分區的情況下,對通用系統映像 (GSI) 的測試必須能夠正常運行。

/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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM