एक स्थिर कर्नेल मॉड्यूल इंटरफ़ेस बनाए रखें

वेंडर मॉड्यूल के लिए, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) का रखरखाव करना बहुत ज़रूरी है. GKI कर्नेल को बाइनरी फ़ॉर्मैट में बनाया और शिप किया जाता है. साथ ही, वेंडर के लोड किए जा सकने वाले मॉड्यूल को अलग ट्री में बनाया जाता है. GKI कर्नेल और वेंडर मॉड्यूल, एक साथ बनाए गए हों, जैसे काम करने चाहिए.

आम तौर पर, Linux कम्यूनिटी ने मुख्य कर्नेल के लिए, इन-कर्नेल एबीआई के स्थिर होने के बारे में सोचने से इनकार किया है. अलग-अलग टूलचेन, कॉन्फ़िगरेशन, और लगातार बेहतर होते हुए Linux मेनलाइन कर्नेल की वजह से, मेनलाइन में केएमआई को स्थिर बनाए रखना मुमकिन नहीं है. हालांकि, इन पाबंदियों के साथ, GKI के बहुत सीमित वर्शन में भी स्थिर केएमआई बनाए रखा जा सकता है:

  • कर्नेल को बनाने के लिए, सिर्फ़ एक कॉन्फ़िगरेशन, gki_defconfig का इस्तेमाल किया जा सकता है.

  • केएमआई, किसी एक ही केरल के LTS और Android वर्शन में ही काम करता है. जैसे, android13-5.10, android12-5.10 या android13-5.15.

    • android-mainline के लिए, KMI की स्थिरता बनाए रखी नहीं गई है.
  • कर्नेल और मॉड्यूल बनाने के लिए, एओएसपी में दिए गए सिर्फ़ उस Clang टूलचेन का इस्तेमाल किया जाता है जो उससे जुड़ी ब्रांच के लिए तय किया गया है.

  • सिंबल की सूची में बताए गए सिंबल का इस्तेमाल, मॉड्यूल के लिए किया जाता है. इन सिंबल के स्थिर रहने की निगरानी की जाती है और इन्हें केएमआई सिंबल माना जाता है.

    • खास बात यह है कि वेंडर मॉड्यूल में सिर्फ़ केएमआई सिंबल का इस्तेमाल किया जाना चाहिए. अगर KMI-सिम्बल के अलावा किसी अन्य सिम्बल की ज़रूरत है, तो इस पाबंदी को लागू करने के लिए मॉड्यूल लोड नहीं किए जाते.
  • केएमआई शाखा को फ़्रीज़ करने के बाद, उसमें बदलाव किए जा सकते हैं. हालांकि, केएमआई को नहीं तोड़ा जा सकता. इन बदलावों में ये शामिल हैं:

    • कॉन्फ़िगरेशन में बदलाव
    • Kernel कोड में बदलाव
    • टूलचेन में बदलाव (इसमें अपडेट शामिल हैं)

हेर्मेटिक बिल्ड प्रोसेस और LLVM टूलचेन का इस्तेमाल करना

हर्मेटिक बिल्ड प्रोसेस से यह पक्का होता है कि केएमआई स्थिर रहे. इसके लिए, repo में मौजूद मेनिफ़ेस्टkernel/manifest में बिल्ड एनवायरमेंट के बारे में पूरी जानकारी दी जाती है. उदाहरण के लिए, android13-5.15 के लिए मेनिफ़ेस्ट में टूलचेन, बिल्ड स्क्रिप्ट, और जनरेटिक कर्नेल इमेज (जीकेआई) कर्नेल बनाने के लिए ज़रूरी सभी चीज़ें शामिल होती हैं. GKI बिल्ड कॉन्फ़िगरेशन build.config.gki.aarch64 जैसी संबंधित build.config कॉन्फ़िगरेशन फ़ाइलें, यह पक्का करती हैं कि शामिल टूल का इस्तेमाल सही तरीके से किया जा रहा है, ताकि बिल्ड के नतीजे एक जैसे हों.

हर्मेटिक बिल्ड प्रोसेस का इस्तेमाल करने से यह भी पक्का होता है कि ट्री के लिए एबीआई ब्यौरा एक जैसा है, भले ही उसे Google ने जनरेट किया हो (उदाहरण के लिए, abi_gki_aarch64.xml android13-5.15 के लिए) या किसी ऐसे लोकल ट्री में जनरेट किया गया है जिसमें वेंडर मॉड्यूल शामिल हैं. मेनिफ़ेस्ट में बताए गए रिपॉज़िटरी में, एबीआई के ब्यौरे को बनाने और उसकी तुलना करने के लिए टूल भी दिए जाते हैं. ये टूल, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के लिए होते हैं.

GKI कर्नेल बनाने के लिए इस्तेमाल किया गया टूलचैन, वेंडर मॉड्यूल बनाने के लिए इस्तेमाल किए गए टूलचैन के साथ पूरी तरह से काम करना चाहिए. Android 10 के बाद, सभी Android कर्नेल को LLVM टूलचेन की मदद से बनाया जाना चाहिए. जीकेआई की मदद से, प्रॉडक्ट कर्नेल और वेंडर मॉड्यूल बनाने के लिए इस्तेमाल की जाने वाली एलएलवीएम टूलचेन को, AOSP से मिलने वाले एलएलवीएम टूलचेन के तौर पर एक ही एबीआई जनरेट करना होगा. साथ ही, पार्टनर को यह पक्का करना होगा कि केएमआई, जीकेआई कर्नेल के साथ काम करता हो. हमारा सुझाव है कि आप दिए गए बिल्ड टूल का इस्तेमाल करें, क्योंकि ये सबसे बेहतर तरीके से काम करते हैं.

आगे क्या करना है?

  • हेर्मेटिक बिल्ड प्रोसेस और LLVM टूलचैन का इस्तेमाल करके, कर्नेल बनाने के निर्देशों के लिए, कर्नेल बनाना लेख पढ़ें.

  • एबीआई को मॉनिटर करने और समस्याओं को ठीक करने के तरीके के बारे में जानने के लिए, Android Kernel ABI Monitoring लेख पढ़ें