在 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 變更以執行下列操作:
- 使用 (或 uprev to) 供應商啟動標頭版本 v4。
- 將bootconfig 新增至核心 cmdline,並將所選參數移至 bootconfig。
導入作業
合作夥伴必須為系統啟動載入程式新增支援,並將建構時間 androidboot.*
參數從核心 cmdline 移至 bootconfig 檔案。如要實作這項變更,最佳做法是逐步進行;請參閱漸進式實作與驗證一節,瞭解如何逐步進行。
如果您進行的變更會在 /proc/cmdline 檔案中搜尋 androidboot.*
參數,請改為將參數指向 /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
變數中的參數建立,就像從 BOARD\_KERNEL\_CMDLINE
建立核心 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
- 12 B 開機魔法字串 (
#BOOTCONFIG\n
)
參數來自兩個來源:建構期間已知的參數,以及建構期間無法得知的參數。必須加入未知的參數。
建構時間已知的參數會封裝至 bootconfig 區段 vendor_boot
映像檔的結尾處。區段大小會以位元組的形式儲存在廠商啟動標頭欄位 vendor_bootconfig_size
中。
建構期間未知的參數,只能在系統啟動載入程式中得知。您必須在 bootconfig 參數區段的結尾處加上這些參數,才能套用 bootconfig 預告片。
在套用 Bootconfig 預告片後,如果需要新增參數,請覆寫預告片並重新套用。
漸進式導入和驗證
按照本節提供的程序,逐步實作開機設定功能。新增 Bootconfig 參數時,請勿變更核心 cmdline 參數。
以下是使用驗證漸進式實作的步驟:
- 發布系統啟動載入程式和建構變更,然後執行下列操作:
- 請使用
BOARD_BOOTCONFIG
變數新增 bootconfig 參數。 - 請讓核心 cmdline 參數維持原樣,讓裝置可以繼續正常啟動。如此一來,偵錯和驗證作業就會更加輕鬆。
- 請使用
- 檢查
/proc/bootconfig
的內容,驗證作業。確認裝置啟動後會顯示新增的參數。 - 使用
BOARD_BOOTCONFIG
變數和系統啟動載入程式,將androidboot.*
參數從核心 cmdline 移至 Bootconfig。 - 確認每個參數都存在於
/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
中的核心記錄。如果核心支援 bootconfig,系統一律會顯示 bootconfig 的記錄項目。
記錄輸出範例
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
如果您看到傳回錯誤記錄,表示載入 bootconfig 時發生問題。如要查看其他錯誤類型,請參閱 init/main.c。