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

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

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

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

  • केएमआई, कर्नल के एक ही एलटीएस और Android वर्शन में स्टेबल होता है. जैसे, android14-6.1, android15-6.6 या android16-6.12.

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

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

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

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

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

हर्मेटिक बिल्ड प्रोसेस यह पक्का करती है कि KMI स्थिर हो. इसके लिए, repo मेनिफ़ेस्ट में kernel/manifest बिल्ड एनवायरमेंट के बारे में पूरी जानकारी दी जाती है. उदाहरण के लिए, android16-6.12 के लिए मेनिफ़ेस्ट में टूलचेन, बिल्ड सिस्टम, और जेनेरिक कर्नल इमेज (जीकेआई) कर्नल बनाने के लिए ज़रूरी अन्य सभी चीज़ें शामिल होती हैं. बिल्ड कॉन्फ़िगरेशन, मुख्य रूप से BUILD.bazel, यह पक्का करता है कि शामिल किए गए टूल का इस्तेमाल सही तरीके से किया गया हो, ताकि बिल्ड के नतीजे एक जैसे हों.

हर्मेटिक बिल्ड प्रोसेस का इस्तेमाल करने से यह भी पक्का होता है कि ट्री के लिए ABI का ब्यौरा एक जैसा हो. भले ही, इसे Google ने जनरेट किया हो (उदाहरण के लिए, gki/aarch64/abi.stg android16-6.12 के लिए) या इसे वेंडर मॉड्यूल वाले लोकल ट्री में जनरेट किया गया हो. मेनिफ़ेस्ट में बताए गए रेपो के हिस्से के तौर पर, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के लिए एबीआई का ब्यौरा बनाने और उसकी तुलना करने वाले टूल भी उपलब्ध कराए जाते हैं.

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

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

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

  • एबीआई की निगरानी करने और समस्याओं को ठीक करने के निर्देशों के लिए, Android कर्नेल एबीआई मॉनिटरिंग पर जाएं