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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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