為供應商模塊維護穩定的 KMI 至關重要。 GKI 內核以二進制形式構建和交付,供應商可加載模塊構建在單獨的樹中。生成的 GKI 內核和供應商模塊必須像構建在一起一樣工作。
通常,Linux 社區對主線內核的內核 ABI 穩定性概念持反對態度。面對不同的工具鏈、配置和不斷發展的 Linux 主線內核,在主線中保持穩定的 KMI 是不可行的。但是,可以在具有以下約束的高度受限的 GKI 環境中保持穩定的 KMI:
只有一個配置
gki_defconfig
可用於構建內核。KMI 僅在同一 LTS 和 Android 版本的內核中是穩定的,例如
android13-5.10
、android12-5.10
或android13-5.15
。- 沒有為
android-mainline
維護 KMI 穩定性。
- 沒有為
只有在 AOSP 中提供並為相應分支定義的特定Clang工具鏈用於構建內核和模塊。
僅監視符號列表中指定的模塊使用的已知符號的穩定性並考慮 KMI 符號。
- 推論是供應商模塊必須僅使用 KMI 符號。如果需要非 KMI 符號,則通過失敗的模塊加載來強制執行此約束。
凍結 KMI 分支後,允許更改但不能破壞 KMI。這些變化包括以下內容:
- 配置更改
- 內核代碼更改
- 工具鏈更改(包括更新)
使用密封構建過程和 LLVM 工具鏈
密封構建過程通過在kernel/manifest
中的repo
清單完全描述構建環境來確保穩定的 KMI。例如, android13-5.15
的清單包括工具鏈、構建腳本以及構建通用內核映像 (GKI) 內核所需的所有其他內容。各自的build.config
配置文件,例如 GKI 構建配置build.config.gki.aarch64
,確保正確使用包含的工具來生成一致的構建結果。
使用封閉式構建過程還可以確保樹的 ABI 描述是否由 Google 生成(例如,用於android13-5.15
的abi_gki_aarch64.xml
或在包含供應商模塊的本地樹中生成。用於創建和比較內核模塊接口 (KMI) 的ABI 描述也作為清單描述的存儲庫的一部分提供。
用於構建 GKI 內核的工具鏈必須與用於構建供應商模塊的工具鏈完全兼容。從 Android 10 開始,所有 Android 內核都必須使用 LLVM 工具鏈構建。使用 GKI,用於構建產品內核和供應商模塊的 LLVM 工具鏈必須生成與來自 AOSP 的 LLVM 工具鏈相同的 ABI,並且合作夥伴必須確保 KMI 與 GKI 內核兼容。強烈建議使用提供的構建工具,因為它們提供了兼容性保證。
下一步是什麼?
有關使用密封構建過程和 LLVM 工具鏈構建內核的說明,請參閱構建內核。
有關如何監控 ABI 和修復問題的說明,請參閱Android 內核 ABI 監控