在 Android 12 中實作 Bootconfig

在 Android 12 中,bootconfig 功能取代了 與 Android 11 搭配使用的 androidboot.* 核心 cmdline 選項 下方。Bootconfig 功能是用來傳遞設定的機制 從建構和系統啟動載入程式到 Android 12 的詳細內容

這項功能可讓您分隔 Android 的設定參數 核心使用者空間移動較長的 androidboot.* 核心 參數新增至 bootconfig 檔案。 會在核心 cmdline 上建立空間,然後 供日後擴展時使用

核心和 Android 使用者空間都必須支援 bootconfig

  • 支援此支援功能的第一個版本:Android 12
  • 提供這項支援的第一個核心版本:12-5.4.xx 核心

為使用 12-5.10.xx 版本的裝置實作開機設定功能 核心版本如果您要升級裝置,則不需要實作這個步驟。

範例和來源

查看本節的範例和原始碼時,請注意格式 bootconfig 程式碼的格式與 Android 11 以下版本使用的核心 cmdline。 不過,下列差異會影響您的使用:

  • 參數必須以新行逸出序列 \n 分隔,而非 聊天室。

系統啟動載入程式範例

如需系統啟動載入程式範例,請參閱 Cuttlefish U-boot 參考系統啟動載入程式 。參考資料中列出兩個修訂版本。首次更新 開機標頭版本支援至最新版本。在本例中,第一個 將版本支援更新 (或升級) 到下一個 v4。第二個 執行兩項工作並示範如何使用 bootconfig 處理功能,並示範如何新增參數 的廣告:

建構範例

針對顯示 mkbootimg 變更以建構 含有廠商啟動標頭 v4 的 vendor_boot.img,請參閱 mkbootimg changes for bootconfig。 請參閱 Cuttlefish 變更以執行下列操作:

實作

合作夥伴必須對其系統啟動載入程式新增支援,並移動建構時間 androidboot.* 參數從核心 cmdline 到 bootconfig 檔案。採行這項變更的最佳方式就是逐步完成。請參閱 漸進式導入和驗證一節 參閱相關文章,瞭解如何完成漸進式程序。

如果您變更了搜尋「androidboot.*」的 /proc/cmdline 檔案 參數,請改為指向 /proc/bootconfig 檔案。ro.boot.* 屬性以新的 bootconfig 值設定,因此您無需設定 對使用這些屬性的程式碼進行變更

版本變更

首先,將 Boot 標頭版本更新為第 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 版面配置資訊 開機映像檔標頭。

Bootconfig 記憶體配置配置的圖表

圖 1. Android 12 開機設定記憶體配置

系統啟動載入程式會在記憶體中建立 bootconfig 區段。Bootconfig 區段 包含下列項目的記憶體配置:

  • 參數
  • 4 B 尺寸:parameters size
  • 4 B 尺寸:parameters checksum
  • 12 B 開機魔法字串 (#BOOTCONFIG\n)

參數來自兩個來源:建構期間已知的參數;以及 但無法在建構期間得知哪些參數。必須加入未知的參數。

建構時間已知的參數會封裝至 vendor_boot 的結尾 找到映像檔儲存部分的大小 (以位元組為單位) 的值vendor_bootconfig_size

建構期間未知的參數只有在 系統啟動載入程式。這些參數必須新增至 bootconfig 參數部分的結尾 才會套用 bootconfig 預告片。

如果您在套用 bootconfig 預告片後需要新增參數, 覆寫預告片並重新套用

漸進式導入和驗證

按照 本節保留核心 cmdline 參數時, 新增 bootconfig 參數。

以下是使用驗證漸進式實作的步驟:

  1. 發布系統啟動載入程式和建構變更,然後執行以下操作:
    1. 使用 BOARD_BOOTCONFIG 變數新增 bootconfig 參數。
    2. 請維持核心 cmdline 參數的格式,確保裝置能夠正常顯示 就能繼續正確啟動如此一來 更加容易。
  2. 檢查 /proc/bootconfig 的內容,驗證作業。驗證 會在裝置啟動後看到新增的參數
  3. androidboot.* 參數從核心 cmdline 移至 啟動設定檔,使用 BOARD_BOOTCONFIG 變數和系統啟動載入程式。
  4. 確認每個參數都存在於 /proc/bootconfig 中,而且 這類使用者並未/proc/cmdline中使用。如果可以驗證這個狀態,您的導入作業 成功。

OTA 升級和降級注意事項

您管理 OTA 升級與降級至不同版本的 Android 或其他核心版本都應特別留意。

Android 12 是第一個包含 bootconfig 的版本 聯絡。如要降級至之前的任何版本,核心 cmdline 參數 ,而非 bootconfig。

核心 12-5.4 以上版本支援 Bootconfig。如果降級 至該版本之前的任何版本(包括 11 到 5.4),核心 cmdline 參數必須

從 Android 11 以下版本升級至 Android 12 以上版本,即可繼續使用 核心 cmdline 參數。升級核心版本也是如此。

疑難排解

執行 verify 步驟時,如果畫面沒有顯示預期的參數, 在 /proc/bootconfig 中,查看 logcat 中的核心記錄。一律會有記錄 項目。

記錄輸出範例

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

如果系統傳回錯誤記錄,表示載入 bootconfig。如要查看其他錯誤類型,請檢視 init/main.c