在 Android 12 中,bootconfig 功能會取代 Android 11 以下版本使用的androidboot.*
核心 cmdline 選項。啟動設定功能是一種機制,可將設定詳細資料從建構和啟動載入程式傳遞至 Android 12。
這項功能可讓您將 Android 使用者空間的設定參數與核心的設定參數分開。將冗長的 androidboot.*
核心參數移至 bootconfig 檔案,可釋出核心指令列空間,方便日後擴充。
核心和 Android 使用者空間都必須支援 bootconfig
。
- 首次支援此功能的版本:Android 12
- 首次支援此功能的 Kernel 版本:12-5.4.xx Kernel
為搭載 12-5.10.xx 核心版本推出的新裝置導入 bootconfig 功能。如果您要升級裝置,則不需要實作這項功能。
範例和來源
查看本節中的範例和原始碼時,請注意 bootconfig
程式碼的格式與 Android 11 以下版本使用的核心指令列格式略有不同。不過,下列差異對您的使用體驗至關重要:
- 參數必須以換行逸出序列
\n
分隔,而非空格。
系統啟動載入程式範例
如需系統啟動載入程式範例,請參閱 Cuttlefish U-boot 參考系統啟動載入程式實作。參考資料中的兩個提交內容如下所示。第一個升級會將啟動標頭版本支援升級至最新版本。在範例中,第一個提交會將版本支援更新 (或升級) 至下一個版本 v4。第二個函式會執行兩項作業:新增 bootconfig 處理作業,並示範在執行階段新增參數:
建構範例
如需建構範例,瞭解如何建構具有供應商啟動標頭 v4 的 vendor_boot.img
,請參閱 mkbootimg changes for
bootconfig
。
mkbootimg
請參閱 Cuttlefish 變更,瞭解如何執行下列操作:
- 使用 (或升級至) 供應商啟動標頭版本 v4。
- 將 bootconfig 新增至核心 cmdline,並將所選參數移至 bootconfig。
實作
合作夥伴必須在開機載入程式中新增支援,並將建構時間 androidboot.*
參數從核心 cmdline 移至 bootconfig 檔案。實作這項變更的最佳方式是逐步進行;如要瞭解如何逐步完成,請參閱「逐步實作和驗證」一節。
如果您有變更會搜尋 /proc/cmdline 檔案中的 androidboot.*
參數,請改為指向 /proc/bootconfig
檔案。系統會使用新的 bootconfig
值設定 ro.boot.*
屬性,因此您不必變更使用這些屬性的程式碼。
版本變更
首先,請將啟動標頭版本升級至版本 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
新增 bootconfig
核心指令列參數。這會讓核心尋找 bootconfig 區段:
BOARD_KERNEL_CMDLINE += bootconfig
開機設定參數是從 BOARD_BOOTCONFIG
變數中的參數建立,與從 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 區段包含下列項目的記憶體配置:
- 參數
- 4 B 尺寸
parameters size
- 4 B 尺寸
parameters checksum
- 12B 開機設定魔術字串 (
#BOOTCONFIG\n
)
參數來自兩個來源:建構時已知的參數,以及建構時未知的參數。必須新增不明參數。
建構時已知的參數會封裝到啟動設定區段的 vendor_boot
映像檔結尾。區段大小會以位元組為單位,儲存在供應商開機標頭欄位 vendor_bootconfig_size
中。
建構時未知的參數只會在開機載入程式的執行階段中得知。這些參數必須加到 bootconfig 參數區段的結尾,然後才能套用 bootconfig 預告片。
如果需要在套用 bootconfig 尾碼後新增任何參數,請覆寫尾碼並重新套用。
逐步導入及驗證
請按照本節的程序,逐步實作 bootconfig 功能。新增 bootconfig 參數時,請勿變更核心 cmdline 參數。
以下是漸進式導入的步驟,並附上驗證程序:
- 製作開機載入程式並建構變更,然後執行下列操作:
- 使用
BOARD_BOOTCONFIG
變數新增開機設定參數。 - 請保留核心 cmdline 參數,確保裝置能繼續正常開機。這可大幅簡化偵錯和驗證作業。
- 使用
- 請檢查
/proc/bootconfig
的內容,驗證您的工作。確認裝置啟動後,您會看到新加入的參數。 - 使用
BOARD_BOOTCONFIG
變數和系統啟動載入程式,將核心指令列中的androidboot.*
參數移至 bootconfig。 - 確認每個參數都存在於
/proc/bootconfig
中,且不在/proc/cmdline
中。如果可以驗證,表示導入作業成功。
OTA 升級和降級注意事項
管理不同 Android 版本或不同核心版本之間的 OTA 升級和降級時,請特別注意。
Android 12 是第一個支援 bootconfig 的版本。如果降級至之前的任何版本,則必須使用核心 cmdline 參數,而非 bootconfig。
核心版本 12-5.4 以上支援 bootconfig。如果降級至該版本之前的任何版本(包括 11-5.4),則必須使用核心指令列參數。
從 Android 11 以下版本升級至 Android 12 以上版本時,仍可繼續使用核心指令列參數。升級核心版本也是如此。
疑難排解
執行驗證步驟時,如果沒有在 /proc/bootconfig
中看到預期參數,請檢查 logcat
中的核心記錄。如果核心支援,則一律會有 bootconfig 的記錄項目。
記錄輸出範例
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
如果系統傳回錯誤記錄,表示載入 bootconfig 時發生問題。如要查看不同類型的錯誤,請參閱 init/main.c。