保持穩定的內核模塊接口 (KMI)

為供應商模塊維護穩定的 KMI 至關重要。 GKI 內核以二進制形式構建和交付,供應商可加載模塊構建在單獨的樹中。生成的 GKI 內核和供應商模塊必須像構建在一起一樣工作。

通常,Linux 社區對主線內核的內核 ABI 穩定性概念持反對態度。面對不同的工具鏈、配置和不斷發展的 Linux 主線內核,在主線中保持穩定的 KMI 是不可行的。但是,可以在具有以下約束的高度受限的 GKI 環境中保持穩定的 KMI:

  • 只有一個配置gki_defconfig可用於構建內核。

  • KMI 僅在同一 LTS 和 Android 版本的內核中是穩定的,例如android13-5.10android12-5.10android13-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.15abi_gki_aarch64.xml或在包含供應商模塊的本地樹中生成。用於創建和比較內核模塊接口 (KMI) 的ABI 描述也作為清單描述的存儲庫的一部分提供。

用於構建 GKI 內核的工具鏈必須與用於構建供應商模塊的工具鏈完全兼容。從 Android 10 開始,所有 Android 內核都必須使用 LLVM 工具鏈構建。使用 GKI,用於構建產品內核和供應商模塊的 LLVM 工具鏈必須生成與來自 AOSP 的 LLVM 工具鏈相同的 ABI,並且合作夥伴必須確保 KMI 與 GKI 內核兼容。強烈建議使用提供的構建工具,因為它們提供了兼容性保證。

下一步是什麼?