在 Android 12 中實現 Bootconfig

在Android中12,BOOTCONFIG功能取代了androidboot.*在使用內核CMDLINE選項與Android 11和降低。 bootconfig 功能是一種將配置詳細信息從構建和引導加載程序傳遞到 Android 12 的機制。

此功能提供了一種將 Android 用戶空間的配置參數與內核的配置參數分開的方法。移動冗長androidboot.*內核參數的BOOTCONFIG文件上的內核CMDLINE創造空間,並使其可用於將來的易於擴展。

內核和Android用戶空間必須支持bootconfig

  • 支持此功能的第一個版本:Android 12
  • 具有此支持的第一個內核版本:12-5.4.xx 內核

落實與12-5.10.xx內核版本推出設備的BOOTCONFIG功能。如果您要升級設備,則不需要實施它。

示例和來源

同時查看本節中的例子和源代碼,注意的格式bootconfig代碼僅針對Android 11中使用並降低內核CMDLINE的格式略有不同。但是,以下區別對您的使用很重要:

  • 參數必須由換行符轉義序列分離\n ,而不是空格。

引導加載程序示例

有關引導加載程序示例,請參閱 Cuttlefish U-boot 參考引導加載程序實現。下面列出了參考中的兩個提交。第一個將引導頭版本支持升級到最新版本。在示例中,第一次提交將版本支持更新(或升級)到下一個 v4。第二個做兩件事;它添加了 bootconfig 處理,並演示了在運行時添加參數:

構建示例

對於一個構建的例子,示出了mkbootimg變化來構建vendor_boot.img與供應商的引導頭V4,見mkbootimg changes for bootconfig 。請參閱墨魚更改以執行以下操作:

執行

合作夥伴必須支持添加到他們的引導程序,並把他們的集結時間androidboot.*從內核CMDLINE到BOOTCONFIG文件參數。實施此更改的最佳方法是逐步進行;看到增量實施和驗證,在下面一個漸進的過程信息部分。

如果您有搜索的/ proc / CMDLINE文件更改androidboot.*參數,將它們指向的/ proc / BOOTCONFIG文件,而不是。該ro.boot.*屬性設置新bootconfig值,所以你不需要做使用這些屬性更改代碼做。

構建更改

首先,將您的引導頭版本升級到版本 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

添加bootconfig內核CMDLINE參數。這使內核查找 bootconfig 部分:

BOARD_KERNEL_CMDLINE += bootconfig

該BOOTCONFIG參數從參數創建BOARD_BOOTCONFIG變量,很像內核CMDLINE從創建BOARD\_KERNEL\_CMDLINE

任何androidboot.*參數可以移動原樣,類似於以下:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

引導加載程序更改

引導加載程序設置的initramfs跳轉到內核之前。該內核配置為BOOTCONFIG部分搜索,並期待它是在的最後initramfs,與預期的預告片。

引導加載程序得到vendor_boot.img來自供應商的引導映像頭佈局信息。

Diagram of bootconfig memory allocation layout

圖1.的Android 12 BOOTCONFIG存儲器分配

引導加載程序在內存中創建 bootconfig 部分。 bootconfig 部分包含以下內容的內存分配:

  • 參數
  • 4 B尺寸parameters size
  • 4 B尺寸parameters checksum
  • 12乙BOOTCONFIG魔串( #BOOTCONFIG\n

參數有兩個來源:構建時已知的參數和構建時未知的參數。必須添加未知參數。

在生成時已知參數被包裝到所述的端部vendor_boot在BOOTCONFIG部分圖像。段的大小被存儲(如字節)在供應商啟動報頭字段vendor_bootconfig_size

在構建時未知的參數僅在運行時在引導加載程序中已知。在應用 bootconfig 預告片之前,必須將這些添加到 bootconfig 參數部分的末尾。

如果在應用 bootconfig 預告片後需要添加任何參數,請覆蓋預告片並重新應用它。

增量實施和驗證

按照本節中給出的過程逐步實現 bootconfig 功能。添加 bootconfig 參數時,保持內核 cmdline 參數不變。

這些是增量實施的步驟,帶有驗證:

  1. 使引導程序和內部的變化,然後執行以下操作:
    1. 使用BOARD_BOOTCONFIG變量添加一個新的BOOTCONFIG參數。
    2. 保持內核 cmdline 參數保持原樣,以便設備可以繼續正確啟動。這使得調試和驗證更加容易。
  2. 通過檢查的內容確認您的工作/proc/bootconfig 。驗證您在設備啟動後看到新添加的參數。
  3. 移動androidboot.*從內核CMDLINE參數BOOTCONFIG,使用BOARD_BOOTCONFIG變量和引導程序。
  4. 驗證每個參數的存在/proc/bootconfig ,他們不在/proc/cmdline 。如果您可以驗證這一點,則您的實施是成功的。

OTA升級降級註意事項

在管理不同版本的 Android 或不同內核版本之間的 OTA 升級和降級時,應特別小心。

Android 12 是第一個支持 bootconfig 的版本。如果降級到之前的任何版本,則必須使用內核 cmdline 參數而不是 bootconfig。

內核版本 12-5.4 及更高版本支持 bootconfig。如果降級到之前的任何版本(包括 11-5.4),必須使用內核 cmdline 參數。

從 Android 11 及更早版本升級到 Android 12 及更高版本可以繼續使用內核 cmdline 參數。升級內核版本也是如此。

故障排除

當您執行的驗證步驟,如果你沒有看到預期的參數/proc/bootconfig ,檢查內核日誌中logcat 。如果內核支持 bootconfig,總會有一個日誌條目存在。

示例日誌輸出

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

如果您看到返回的錯誤日誌,則加載 bootconfig 時出現問題。要看到不同的錯誤類型,查看初始化/ main.c中