從舊有核心建置遷移至 uwu_kernel
使用 uwuCLI
建議使用 uwuCLI 進行初次轉換:
uwu請依提示選擇裝置和核心遷移。
uwuCLI 會讀取現有裝置設定,並盡可能轉換核心建置設定。生成的設定未必是最終結果。遷移完成後,請確認核心設定、DTB/DTBO 和核心模組符合裝置實際情況。
Kernel
舊有核心建置通常使用以下變數指定核心:
TARGET_KERNEL_SOURCE := kernel/<vendor>/<kernel>
TARGET_KERNEL_ARCH := arm64
BOARD_KERNEL_IMAGE_NAME := Image遷移後,請在 uwu_kernel 模組中直接宣告這些資訊:
uwu_kernel {
name: "kernel",
kernel_dir: "kernel/<vendor>/<kernel>",
kernel_arch: "arm64",
image_name: "Image",
}只有裝置確實需要時才設定工具鏈、額外 Kbuild flags 和其他特殊設定。完整屬性請參閱設定參考。
Kernel configuration
舊有核心建置可以透過 TARGET_KERNEL_CONFIG、TARGET_KERNEL_ADDITIONAL_FLAGS 等變數設定核心組態和額外建置旗標。例如:
TARGET_KERNEL_CONFIG := \
gki_defconfig \
vendor/device.config
TARGET_KERNEL_ADDITIONAL_FLAGS := \
CONFIG_EXAMPLE=y遷移後,請直接表達相同的設定關係:
additional_flags: [
"CONFIG_EXAMPLE=y",
],
config: {
defconfig: "gki_defconfig",
fragments: [
"vendor/device.config",
],
},DTB 和 DTBO
一般裝置可以直接宣告對應輸出:
dtb: {
enabled: true,
target: "dtbs",
image_name: "dtb.img",
},
dtbo: {
enabled: true,
target: "dtbs",
image_name: "dtbo.img",
page_size: 4096,
},若要使用 Qualcomm DT merge,請在 dtb 中設定 qcom_merge。啟用後,dtb.enabled 和 dtbo.enabled 必須同時設為 true:
dtb: {
enabled: true,
qcom_merge: true,
target: "dtbs",
image_name: "dtb.img",
},
dtbo: {
enabled: true,
target: "dtbs",
image_name: "dtbo.img",
page_size: 4096,
},Kernel modules
核心模組是遷移時最需要人工檢查的部分。
舊有核心建置將模組安裝位置與載入清單分散在多個 Make 變數和外部清單中,彼此還有交叉引用。例如裝置可能會使用:
BOARD_SYSTEM_KERNEL_MODULES_LOAD
BOARD_VENDOR_KERNEL_MODULES_LOAD
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
BOOT_KERNEL_MODULES
SYSTEM_KERNEL_MODULESuwu_kernel 不使用這些舊有變數。每個需要安裝核心模組的分割區,都必須分別指定:
- install list:要安裝到該分割區的模組;
- load list:要從該分割區載入的模組。
例如:
modules: {
enabled: true,
system_dlkm_module_install_list: [
"modules.include.system_dlkm",
],
system_dlkm_module_load_list: [
"modules.load.system_dlkm",
],
vendor_dlkm_module_install_list: [
"modules.include.vendor_dlkm",
],
vendor_dlkm_module_load_list: [
"modules.load.vendor_dlkm",
],
},Install list 說明分割區包含什麼;load list 說明要載入什麼。因此必須符合:
load list ⊆ install listuwu_kernel 會在建置時檢查此關係。如果 load list 中的模組未列於對應 install list,建置就會失敗。模組不會只因出現在 load list 中就自動安裝。
這是刻意的設計:最終模組配置應能直接從裝置設定確認,不必重新推導規則。
uwuCLI 會解析舊有核心模組設定及其引用的靜態模組清單,再生成對應的 install list 和 load list 設定。如果無法可靠轉換,uwuCLI 會回報問題。轉換完成後,仍請確認各分割區的清單符合裝置實際情況。
自動收集模組相依項目
Install list 不必手動列出所有模組相依項目。啟用 auto_collect_deps 後,uwu_kernel 會根據清單中的模組自動收集相依項目,並加入最終 install list:
modules: {
enabled: true,
auto_collect_deps: true,
vendor_dlkm_module_install_list: [
"modules.include.vendor_dlkm",
],
vendor_dlkm_module_load_list: [
"modules.load.vendor_dlkm",
],
},auto_collect_deps 只會補上 install list 所需的模組相依項目,不會根據 load list 推斷要安裝哪些模組。裝置所需的 install list 和 load list 仍須明確指定。
External modules
若裝置使用主核心樹之外的 external modules,請指定 external module root 和要建置的模組:
modules: {
enabled: true,
external_module_root: "kernel/<vendor>/<device>-modules",
external_modules: [
"vendor/example",
],
},預設情況下,uwu_kernel 會使用 external module 自己的建置系統,並提供核心原始碼和輸出目錄等資訊。
若 external module 屬於主核心 Kbuild tree,且需要透過 Kbuild 的 M= 模式建置,請在模組路徑後加上 :kbuild:
modules: {
enabled: true,
external_module_root: "kernel/<vendor>/<device>-modules",
external_modules: [
"vendor/example:kbuild",
],
},這等同於透過主核心建置系統執行 M=<module> modules 和對應的 modules_install。請勿只為保留舊有建置結構而複製額外 Make 規則。
模組屬性和支援的設定請參閱設定參考。
接入 Android 建置
定義 uwu_kernel 後,還需要設定 Android 建置使用此模組。
請在裝置設定中選擇 Soong kernel:
BOARD_USES_SOONG_KERNEL := true
SOONG_KERNEL_MODULE := //device/<vendor>/<device>:kernel並將核心加入產品:
PRODUCT_PACKAGES += kernel其他模組應透過 uwu_kernel 的公開輸出引用核心產物。請勿依賴 out/soong/.intermediates 中的特定路徑。
可用輸出請參閱輸出。
無法自動遷移的設定
部分舊有設定描述的不只是核心建置參數,因此無法安全地直接轉換。常見情況包括:
- 自訂 DTB/DTBO Makefile;
- 依賴特定
KERNEL_OUT、DTB_OUT或DTBO_OUT路徑的腳本; - 平台專用的核心建置 wrapper。
遇到這些設定時,請先確認預期結果,再以 uwu_kernel 表達該結果。
請勿為了逐行重現舊有 Make 實作,而在 Soong 中重新建立相同的隱含規則。
若多個裝置都需要 uwu_kernel 目前無法表達的功能,請在 Issue Tracker 提出 issue。
驗證
遷移後先執行一般建置:
uni至少確認:
- kernel image 可以正常生成;
- 最終
.config符合裝置預期; - DTB/DTBO 可以生成,且裝置能正常開機;
- 核心模組安裝至正確分割區;
- 模組 load list 符合開機需求;
- 裝置可以正常開機並運作。
常見問題請參閱疑難排解。