ตั้งแต่วันที่ 27 มีนาคม 2025 เป็นต้นไป เราขอแนะนำให้ใช้ android-latest-release
แทน aosp-main
เพื่อสร้างและมีส่วนร่วมใน AOSP โปรดดูข้อมูลเพิ่มเติมที่หัวข้อการเปลี่ยนแปลงใน AOSP
รักษาอินเทอร์เฟซของโมดูลเคอร์เนลให้เสถียร
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
การรักษาอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ที่เสถียรสำหรับโมดูลของผู้ให้บริการเป็นสิ่งสําคัญ มีการคอมไพล์และจัดส่งเคอร์เนล GKI ในรูปแบบไบนารี และสร้างโมดูลที่โหลดได้ของผู้จำหน่ายในต้นไม้แยกต่างหาก เคอร์เนล GKI และโมดูลของผู้ให้บริการที่ได้ต้องทํางานราวกับว่าสร้างขึ้นด้วยกัน
โดยทั่วไปแล้ว ชุมชน Linux ไม่ชอบแนวคิดเรื่องความเสถียรของ ABI ในเคอร์เนลสำหรับเคอร์เนลหลัก เมื่อมีเครื่องมือต่างๆ การกำหนดค่า และเคอร์เนลหลักของ Linux ที่พัฒนาอยู่เสมอ การดูแลรักษา KMI ที่เสถียรในเวอร์ชันหลักจึงทำได้ยาก อย่างไรก็ตาม คุณสามารถรักษา KMI ให้เสถียรในสภาพแวดล้อม GKI ที่มีข้อจำกัดสูงได้โดยใช้ข้อจำกัดต่อไปนี้
คุณใช้การกำหนดค่า gki_defconfig
เพียงรายการเดียวเพื่อสร้างเคอร์เนลได้
KMI จะเสถียรเฉพาะในเคอร์เนลเวอร์ชัน LTS และ Android เดียวกัน เช่น android14-6.1
, android15-6.6
หรือ android16-6.12
- ไม่มีความเสถียรของ KMI สำหรับ
android-mainline
มีการใช้เฉพาะเครื่องมือ toolchain ของ Clang ที่เฉพาะเจาะจงซึ่งให้มาใน AOSP และกำหนดไว้สำหรับสาขาที่เกี่ยวข้องในการสร้างเคอร์เนลและโมดูล
ระบบจะตรวจสอบเฉพาะสัญลักษณ์ที่ทราบว่าโมดูลใช้ตามที่ระบุไว้ในรายการสัญลักษณ์เพื่อดูความเสถียรและพิจารณาว่าเป็นสัญลักษณ์ KMI
- ผลที่ตามมาคือข้อบังคับว่าโมดูลของผู้ให้บริการต้องใช้สัญลักษณ์ KMI เท่านั้น ระบบจะบังคับใช้ข้อจำกัดนี้โดยการโหลดโมดูลไม่สำเร็จหากต้องใช้สัญลักษณ์ที่ไม่ใช่ KMI
หลังจากแช่แข็งสาขา KMI แล้ว ระบบจะอนุญาตให้ทำการเปลี่ยนแปลงได้ แต่จะเปลี่ยนแปลงในลักษณะที่ทำลาย KMI ไม่ได้
การเปลี่ยนแปลงเหล่านี้มีดังนี้
- การเปลี่ยนแปลงการกําหนดค่า
- การเปลี่ยนแปลงโค้ดเคอร์เนล
- การเปลี่ยนแปลงใน Toolchain (รวมถึงการอัปเดต)
ใช้กระบวนการบิลด์แบบปิดผนึกและชุดเครื่องมือ LLVM
กระบวนการสร้างแบบปิดผนึกช่วยให้มั่นใจได้ว่า KMI จะเสถียรเนื่องจากrepo
ไฟล์ Manifest ใน
kernel/manifest
จะอธิบายสภาพแวดล้อมการสร้างอย่างสมบูรณ์ เช่น ไฟล์ Manifest สำหรับ android16-6.12
ประกอบด้วยชุดเครื่องมือ ระบบการสร้าง และทุกอย่างที่จำเป็นในการสร้างเคอร์เนล Generic Kernel Image (GKI) การกําหนดค่าบิลด์ ซึ่งส่วนใหญ่คือ BUILD.bazel
จะตรวจสอบว่าใช้เครื่องมือที่รวมไว้อย่างถูกต้องเพื่อสร้างผลลัพธ์การสร้างที่สอดคล้องกัน
การใช้กระบวนการบิลด์แบบปิดผนึกยังช่วยให้มั่นใจว่าคำอธิบาย ABI สำหรับต้นไม้จะสอดคล้องกันไม่ว่าจะสร้างขึ้นโดย Google (เช่น gki/aarch64/abi.stg
สำหรับ android16-6.12
) หรือสร้างขึ้นในต้นไม้ในเครื่องซึ่งมีโมดูลของผู้ให้บริการ นอกจากนี้ยังมีเครื่องมือสร้างและเปรียบเทียบคำอธิบาย ABI สำหรับอินเทอร์เฟซโมดูลเคอร์เนล (KMI) อยู่ในที่เก็บซึ่งอธิบายโดยไฟล์ Manifest ด้วย
เครื่องมือที่ใช้สร้างเคอร์เนล GKI ต้องเข้ากันได้กับเครื่องมือที่ใช้สร้างโมดูลของผู้ให้บริการอย่างสมบูรณ์ ตั้งแต่ Android 10 เป็นต้นไป จะต้องสร้างเคอร์เนล Android ทั้งหมดด้วยชุดเครื่องมือ LLVM เมื่อใช้ GKI เครื่องมือทางเทคนิค LLVM ที่ใช้สร้างเคอร์เนลของผลิตภัณฑ์และโมดูลของผู้ให้บริการต้องสร้าง ABI เดียวกันกับเครื่องมือทางเทคนิค LLVM จาก AOSP และพาร์ทเนอร์ต้องตรวจสอบว่า KMI เข้ากันได้กับเคอร์เนล GKI
เราขอแนะนำให้ใช้เครื่องมือสร้างที่ให้มา เนื่องจากเครื่องมือเหล่านี้มีความเข้ากันได้ดีที่สุด
สิ่งต่อไปที่ควรทำ
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-27 UTC"],[],[],null,["# Maintain a stable kernel module interface\n\nIt's critical to maintain a stable kernel module interface (KMI) for vendor\nmodules. The GKI kernel is\nbuilt and shipped in binary form and vendor-loadable modules are built in a\nseparate tree. The resulting GKI kernel and vendor modules must work as\nthough they were built together.\n\nGenerally, the Linux community has\n[frowned on the notion of in-kernel ABI\nstability](https://www.kernel.org/doc/Documentation/process/stable-api-nonsense.rst)\nfor the mainline kernel. In the face of different toolchains, configurations,\nand an ever-evolving Linux mainline kernel, it isn't feasible to maintain a\nstable KMI in mainline. However, it's possible to maintain a stable KMI in\nthe highly-constrained GKI environment with these constraints:\n\n- Only a single configuration, `gki_defconfig`, can be used to build the\n kernel.\n\n- The KMI is only stable within the same LTS and Android version of a kernel,\n such as `android14-6.1`, `android15-6.6` or `android16-6.12`.\n\n - No KMI stability is maintained for `android-mainline`.\n- Only the specific *Clang* toolchain supplied in AOSP and defined for the\n corresponding branch is used for building kernel and modules.\n\n- Only symbols known to be used by modules as specified in a symbol list are\n monitored for stability and considered KMI symbols.\n\n - The corollary is that vendor modules must use only KMI symbols. This constraint is enforced by failing module loads if non-KMI-symbols are required.\n- After the KMI branch is frozen, changes are allowed but can't break the KMI.\n These changes include the following:\n\n - Config changes\n - Kernel code changes\n - Toolchain changes (including updates)\n\nUse the hermetic build process and LLVM toolchain\n-------------------------------------------------\n\nThe hermetic build process ensures a stable KMI by having `repo` manifests in\n`kernel/manifest` completely describe the build environment. For example, the\n[manifest for `android16-6.12`](https://android.googlesource.com/kernel/manifest/+/refs/heads/common-android16-6.12/default.xml)\nincludes the toolchain, build system, and everything else required to build the\nGeneric Kernel Image (GKI) kernel. The build configuration, primarily\n[`BUILD.bazel`](https://android.googlesource.com/kernel/common/+/refs/heads/android16-6.12/BUILD.bazel),\nensures that the included tools are used correctly to generate consistent build\nresults.\n\nUsing a hermetic build process also ensures that the ABI description for the\ntree is consistent whether generated by Google (for example,\n[`gki/aarch64/abi.stg`](https://android.googlesource.com/kernel/common/+/refs/heads/android16-6.12/gki/aarch64/abi.stg)\nfor `android16-6.12`) or generated in a local tree that includes the vendor\nmodules. The\n[tools to create and compare the ABI description](https://android.googlesource.com/kernel/build/+/refs/heads/main-kernel/abi/)\nfor the Kernel Module Interface (KMI) are also provided as part of the repo\ndescribed by the manifest.\n\nThe toolchain used to build the GKI kernel must be completely compatible with\nthe toolchain used to build vendor modules. As of Android\n10, all Android kernels must be built\nwith an LLVM toolchain. With GKI, the LLVM toolchain used to build product\nkernels and vendor modules must generate the same ABI as the LLVM toolchain from\nAOSP and partners must ensure that the KMI is compatible with the GKI kernel.\nUsing the provided build tools is strongly encouraged as they provide the\nbest compatibility.\n\nWhat's next?\n------------\n\n- For instructions on building the kernel using the hermetic build process and\n LLVM toolchain, refer to refer to\n [Build kernels](/docs/setup/build/building-kernels).\n\n- For instructions on how to monitor the ABI and fix issues, refer to\n [Android Kernel ABI Monitoring](/docs/core/architecture/kernel/abi-monitor)"]]