在 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
值設定,因此您無需設定
對使用這些屬性的程式碼進行變更
版本變更
首先,請將引導程式標頭版本升級至 4 版:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
新增 bootconfig
核心 cmdline 參數。如此一來,核心就會
啟動 Bootconfig 設定
BOARD_KERNEL_CMDLINE += bootconfig
bootconfig 參數是根據 BOARD_BOOTCONFIG
變數中的參數建立,就像是 kernel cmdline 是根據 BOARD\_KERNEL\_CMDLINE
建立一樣。
任何 androidboot.*
參數都可以原封不動地移動,如下所示:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
系統啟動載入程式變更
引導程式會在跳轉至核心之前設定 initramfs
。核心啟動設定會搜尋 bootconfig 區段,並尋找位於 initramfs,
最末端的預期拖車。
引導程式會從供應商的啟動映像檔標頭取得 vendor_boot.img
版面配置資訊。
圖 1. Android 12 的 bootconfig 記憶體配置
引導程式會在記憶體中建立 bootconfig 區段。bootconfig 區段包含下列項目的記憶體配置:
- 參數
- 4 B 尺寸:
parameters size
- 4 B 大小
parameters checksum
- 12 B 的 bootconfig 魔術字串 (
#BOOTCONFIG\n
)
參數來自兩個來源:建構期間已知的參數;以及 但無法在建構期間得知哪些參數。必須加入未知的參數。
建構時間已知的參數會封裝至 vendor_boot
的結尾
找到映像檔儲存部分的大小 (以位元組為單位)
的值vendor_bootconfig_size
。
建構期間未知的參數只有在 系統啟動載入程式。這些參數必須新增至 bootconfig 參數部分的結尾 才會套用 bootconfig 預告片。
如果您需要在套用 bootconfig 拖車後新增任何參數,請覆寫拖車並重新套用。
漸進式導入和驗證
按照 本節保留核心 cmdline 參數時, 新增 bootconfig 參數。
以下是漸進式導入步驟,並附上驗證程序:
- 發布系統啟動載入程式和建構變更,然後執行以下操作:
- 使用
BOARD_BOOTCONFIG
變數新增 bootconfig 參數。 - 請維持核心 cmdline 參數的原始狀態,以便裝置繼續正確啟動。如此一來 更加容易。
- 使用
- 驗證內容:檢查
/proc/bootconfig
中的內容。確認裝置啟動後,您會看到新加入的參數。 - 使用
BOARD_BOOTCONFIG
變數和啟動載入程式,移動 從核心 cmdline 到 bootconfig 的androidboot.*
參數。 - 確認每個參數都存在於
/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 參數。升級核心版本也是如此。
疑難排解
執行 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。