AOSP के सामान्य कर्नेल, kernel.org के कर्नेल के डाउनस्ट्रीम में होते हैं. इन्हें Android के सामान्य कर्नेल या ACK भी कहा जाता है. इनमें Android कम्यूनिटी के लिए ज़रूरी पैच शामिल होते हैं. ये पैच, मेनलाइन या लॉन्ग टर्म सपोर्ट (एलटीएस) वाले कर्नेल में मर्ज नहीं किए गए होते हैं. इन पैच में ये शामिल हो सकते हैं:
- Android की सुविधाओं के लिए, अपस्ट्रीम फ़ंक्शनैलिटी के बैकपोर्ट और चेरी-पिक की ज़रूरत होती है
- ऐसी सुविधाएं जो Android डिवाइसों के लिए तैयार हैं, लेकिन अब भी अपस्ट्रीम पर उन पर काम चल रहा है
- वेंडर/ओईएम की ऐसी सुविधाएं जो नेटवर्क में शामिल अन्य पार्टनर के लिए काम की हों
android-mainline, Android की सुविधाओं के लिए मुख्य डेवलपमेंट ब्रांच है. जब Linus Torvalds कोई रिलीज़ या रिलीज़ कैंडिडेट पोस्ट करते हैं, तब Linux mainline को android-mainline में मर्ज कर दिया जाता है. साल 2019 से पहले, Android के सामान्य कर्नल, हाल ही में घोषित किए गए एलटीएस कर्नल को क्लोन करके बनाए जाते थे. साथ ही, इनमें Android के लिए खास तौर पर बनाए गए पैच जोड़े जाते थे. इस प्रोसेस को 2019 में बदल दिया गया था, ताकि नए Android कॉमन कर्नल को android-mainline से अलग किया जा सके. इस नए मॉडल में, Android पैच को फ़ॉरवर्ड पोर्ट करने और उनकी जांच करने के लिए ज़्यादा मेहनत नहीं करनी पड़ती. ऐसा इसलिए, क्योंकि यह मॉडल एक ही नतीजे को धीरे-धीरे हासिल करता है. android-mainline की लगातार टेस्टिंग की जाती है. इसलिए, इस मॉडल में पब्लिश होने के दिन से ही अच्छी क्वालिटी वाला कर्नल शामिल होता है.
जब अपस्ट्रीम में कोई नया एलटीएस घोषित किया जाता है, तो उससे जुड़ा सामान्य कर्नल android-mainline से ब्रांच किया जाता है. इससे पार्टनर, एलटीएस वर्शन के एलान से पहले ही प्रोजेक्ट शुरू कर सकते हैं. इसके लिए, उन्हें android-mainline से मर्ज करना होगा. नई कॉमन कर्नल ब्रांच बनने के बाद, पार्टनर आसानी से मर्ज सोर्स को नई ब्रांच में बदल सकते हैं.
अन्य सामान्य कर्नल ब्रांच को, उनसे जुड़ी एलटीएस कर्नल से नियमित तौर पर मर्ज किया जाता है.
आम तौर पर, एलटीएस रिलीज़ पोस्ट होने के तुरंत बाद इन वर्शन को मर्ज कर दिया जाता है. उदाहरण के लिए, जब Linux 6.1.75 पोस्ट किया गया था, तब इसे 6.1 के सामान्य कर्नल (android14-6.1) में मर्ज कर दिया गया था. पार्टनर को सलाह दी जाती है कि वे अपने कर्नल को अपडेट करें, ताकि वे एलटीएस और Android से जुड़ी गड़बड़ियों को ठीक करने के अपडेट के साथ अप-टू-डेट रहें.
ACK KMI कर्नेल ब्रांच
जीकेआई कर्नेल में, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) स्थिर होता है. केएमआई की पहचान, कर्नेल वर्शन और Android प्लैटफ़ॉर्म रिलीज़ के हिसाब से की जाती है. इसलिए, ब्रांच के नाम ANDROID_RELEASE-KERNEL_VERSION होते हैं.
उदाहरण के लिए, Android 14 के लिए 6.1 GKI कर्नेल का नाम android14-6.1 है. Android 15 के लिए, जीकेआई कर्नेल android15-6.6 को पेश किया गया था.
कॉमन कर्नल हैरारकी
android-mainline से ब्रांच
कॉमन कर्नल हैरारकी का टॉप लेवल, इमेज 1 में दिखाया गया है.
पहली इमेज. android-mainline कर्नल से कॉमन कर्नल बनाना
ध्यान दें कि 2022 में, android-mainline से एक नया Android कॉमन कर्नल android14-6.1 बनाया गया था. साल 2023 में, जब अगला एलटीएस वर्शन लॉन्च किया गया, तब android15-6.6 को android-mainline से अलग कर दिया गया.
पहले फ़िगर में दिखाया गया है कि हर कर्नल वर्शन, दो GKI कर्नल के लिए आधार हो सकता है.
उदाहरण के लिए, v5.15 के दो कर्नल android13-5.15 और android14-5.15 हैं. ये दोनों, अपने-अपने प्लैटफ़ॉर्म रिलीज़ के लिए फ़ीचर कर्नल हैं. 5.10 के लिए भी ऐसा ही किया गया था. android12-5.10 को तब बनाया गया था, जब एलटीएस का एलान किया गया था. साथ ही, android13-5.10 को android12-5.10 से स्प्रिंग 2021 में कर्नेल फ़ीचर के पूरे माइलस्टोन पर ब्रांच किया गया था, ताकि Android 13 के लिए सुविधाओं को डेवलप किया जा सके. Android 15 (2024) से, हर कर्नेल वर्शन के लिए सिर्फ़ एक नया जीकेआई कर्नेल होगा. इसमें कोई android15-6.1 कर्नेल नहीं होगा.
ACK KMI ब्रांच का लाइफ़साइकल
दूसरी इमेज में, ACK KMI ब्रांच का लाइफ़साइकल दिखाया गया है.
दूसरी इमेज. 6.6 ACK KMI ब्रांच का लाइफ़साइकल
डेवलपमेंट प्रोसेस और ब्रांच के लाइफ़साइकल के बारे में ज़्यादा जानकारी देने के लिए, इमेज 2 में 6.6 के लिए ACK KMI ब्रांच पर फ़ोकस किया गया है.
हर ACK KMI ब्रांच, तीन चरणों से गुज़रती है. इन्हें इमेज 2 में दिखाया गया है. हर ब्रांच में अलग-अलग रंगों से इन चरणों को दिखाया गया है. जैसा कि दिखाया गया है, एलटीएस को नियमित तौर पर मर्ज किया जाता है, भले ही वह किसी भी फ़ेज़ में हो.
डेवलपमेंट फ़ेज़
इसे बनाने के बाद, ACK KMI ब्रांच डेवलपमेंट फ़ेज़ में चली जाती है. इसे इमेज 2 में dev के तौर पर लेबल किया गया है. साथ ही, यह Android के अगले प्लैटफ़ॉर्म रिलीज़ के लिए, सुविधाओं के योगदान के लिए उपलब्ध होती है. दूसरे डायग्राम में, android15-6.6 तब बनाया गया था, जब 6.6 को नया अपस्ट्रीम एलटीएस कर्नल घोषित किया गया था.
स्टेबलाइज़ेशन फ़ेज़
जब ACK KMI ब्रांच को 'सुविधा पूरी तरह से उपलब्ध है' के तौर पर मार्क कर दिया जाता है, तब यह स्टेबलाइज़ेशन फ़ेज़ में चली जाती है. इसे इमेज 2 में स्टेबल के तौर पर लेबल किया गया है. पार्टनर की सुविधाओं और बग ठीक करने से जुड़े अपडेट अब भी स्वीकार किए जाते हैं. हालांकि, इंटरफ़ेस पर असर डालने वाले किसी भी बदलाव का पता लगाने के लिए, केएमआई ट्रैकिंग की सुविधा चालू की जाती है. इस फ़ेज़ में, केएमआई में नुकसान पहुंचाने वाले बदलावों को स्वीकार किया जाता है. साथ ही, केएमआई की परिभाषा को पहले से तय किए गए कैडेंस (आम तौर पर हर दो हफ़्ते) पर अपडेट किया जाता है. केएमआई मॉनिटरिंग के बारे में ज़्यादा जानने के लिए, जीकेआई की खास जानकारी देखें.
KMI फ़्रोज़न फ़ेज़
किसी नई रिलीज़ को AOSP पर पुश करने से पहले, ACK KMI ब्रांच को फ़्रीज़ कर दिया जाता है. यह ब्रांच के बंद होने तक फ़्रीज़ रहती है. इसका मतलब है कि केएमआई में कोई भी ऐसा बदलाव स्वीकार नहीं किया जाएगा जिससे केएमआई पर असर पड़े. ऐसा तब तक नहीं किया जाएगा, जब तक सुरक्षा से जुड़ी कोई गंभीर समस्या न हो. इस समस्या को, स्टेबल केएमआई पर असर डाले बिना ठीक नहीं किया जा सकता. केएमआई में बदलाव से बचने के लिए, एलटीएस से मर्ज किए गए कुछ पैच में बदलाव किया जा सकता है या उन्हें हटाया जा सकता है. ऐसा तब किया जाता है, जब Android डिवाइसों के लिए फ़िक्स की ज़रूरत नहीं होती.
जब ACK KMI ब्रांच फ़्रीज़ हो जाती है, तब बग ठीक करने और पार्टनर की सुविधाओं को स्वीकार किया जा सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक मौजूदा KMI कॉमन कर्नल काम कर रहा हो. केएमआई को एक्सटेंड किया जा सकता है. इसके लिए, नए एक्सपोर्ट किए गए सिंबल का इस्तेमाल किया जा सकता है. हालांकि, यह तब तक किया जा सकता है, जब तक मौजूदा केएमआई में शामिल इंटरफ़ेस पर कोई असर न पड़े. KMI में नए इंटरफ़ेस जोड़े जाने पर, वे तुरंत स्टेबल हो जाते हैं. साथ ही, आने वाले समय में होने वाले बदलावों से उन पर कोई असर नहीं पड़ता.
उदाहरण के लिए, केएमआई इंटरफ़ेस के ज़रिए इस्तेमाल किए गए कॉमन कर्नेल के स्ट्रक्चर में कोई फ़ील्ड जोड़ने की अनुमति नहीं है. ऐसा इसलिए, क्योंकि इससे इंटरफ़ेस की परिभाषा बदल जाती है:
struct foo {
int original_field1;
int original_field2;
int new_field; // Not allowed
};
int do_foo(struct foo &myarg)
{
do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);
हालांकि, नया फ़ंक्शन जोड़ने में कोई समस्या नहीं है:
struct foo2 {
struct foo orig_foo;
int new_field;
};
int do_foo2(struct foo2 &myarg)
{
do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);
GKI कर्नेल के पूरे लाइफ़टाइम के लिए, यूज़रस्पेस के साथ बैकवर्ड कंपैटिबिलिटी बनाए रखी जाती है. इससे यह पक्का होता है कि कर्नेल का इस्तेमाल, Android प्लैटफ़ॉर्म के उस वर्शन के लिए सुरक्षित तरीके से किया जा सकता है जिसके साथ डिवाइस लॉन्च किया गया था. पिछले वर्शन के साथ लगातार टेस्टिंग करने से, कंपैटिबिलिटी बनी रहती है. इसलिए, इमेज 2 में android15-6.6
कर्नेल का इस्तेमाल, Android 15 और इसके बाद के वर्शन वाले डिवाइसों के लिए किया जा सकता है. Android प्लैटफ़ॉर्म का नया वर्शन, पिछले वर्शन के साथ भी काम करता है. इसलिए, Android 15 वाले डिवाइसों पर android14-6.1 कर्नल का इस्तेमाल किया जा सकता है. इसे लॉन्च या अपग्रेड करने के लिए इस्तेमाल किया जा सकता है.
केएमआई जनरेशन नंबर
अगर स्टेबलाइज़ेशन फ़ेज़ के दौरान एलटीएस मर्ज होता है या इसके बाद कोई सुरक्षा समस्या या अन्य इवेंट होता है जिसके लिए KMI बदलने वाले पैच को स्वीकार करना ज़रूरी है, तो build.config.common में रिकॉर्ड किया गया KMI जनरेशन नंबर बढ़ जाता है. uname कमांड का इस्तेमाल करके, मौजूदा केएमआई जनरेशन का पता लगाया जा सकता है:
$ uname -r
6.6.30-android15-6-g86d10b30f51f
प्लैटफ़ॉर्म रिलीज़ के बाद वाला नंबर, केएमआई जनरेशन होता है. इस मामले में यह 6 है.
अगर केएमआई जनरेशन बदलता है, तो कर्नल, वेंडर मॉड्यूल के साथ काम नहीं करता है. ये मॉड्यूल, केएमआई के पिछले जनरेशन के मुताबिक होते हैं. इसलिए, मॉड्यूल को फिर से बनाना होगा और कर्नल के साथ सिंक्रोनस तरीके से अपडेट करना होगा. केएमआई फ़्रीज़ होने के बाद, केएमआई जनरेशन में बदलाव होने की संभावना बहुत कम होती है.
कर्नल के बीच काम करने की सुविधा
एक ही एलटीएस फ़ैमिली के कर्नल के बीच कंपैटिबिलिटी की ज़रूरी शर्तें, नए GKI कर्नल से बदल रही हैं.
GKI कर्नल
जीकेआई कर्नेल, Android प्लैटफ़ॉर्म की उन सभी रिलीज़ के साथ काम करते हैं जिनमें कर्नेल वर्शन काम करता था. इसके अलावा, Android प्लैटफ़ॉर्म के रिलीज़ किए गए वर्शन, पिछली रिलीज़ के GKI कर्नल के साथ काम करते हैं. इसलिए, Android 15 (2024) पर चलने वाले डिवाइसों पर, Android 14 (2023) के लिए डेवलप किए गए android14-6.1 कर्नल का सुरक्षित तरीके से इस्तेमाल किया जा सकता है. यह पुष्टि की जाती है कि जीकेआई कर्नेल, सभी रिलीज़ के साथ काम करते हैं या नहीं. इसके लिए, जीकेआई कर्नेल की लगातार वीटीएस और सीटीएस टेस्टिंग की जाती है.
केएमआई स्थिर है, ताकि वेंडर इमेज में कर्नेल मॉड्यूल को फिर से बनाए बिना कर्नेल को अपडेट किया जा सके.
अलग-अलग जीकेआई कर्नेल के बीच केएमआई के साथ काम करने की सुविधा नहीं होती. इसलिए, उदाहरण के लिए, सभी मॉड्यूल को फिर से बनाए बिना, android14-6.1 कर्नल को android15-6.6 कर्नल से नहीं बदला जा सकता.
GKI कर्नल, सिर्फ़ शुरुआती और बाद की रिलीज़ के लिए काम करते हैं.
ये सुविधाएं, पुराने वर्शन के लिए उपलब्ध नहीं हैं. इसलिए, Android 14 (2023) पर काम करने वाले डिवाइसों के लिए, android15-6.6 कर्नल काम नहीं करता.
कंपैटबिलिटी मैट्रिक्स
इस टेबल में, Android के हर प्लैटफ़ॉर्म रिलीज़ के साथ काम करने वाले और टेस्ट किए गए कर्नल वर्शन दिखाए गए हैं.
| Android प्लैटफ़ॉर्म रिलीज़ | इस्तेमाल किए जा सकने वाले कर्नल |
|---|---|
| Android 16 (2025) |
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
| Android 15 (2024) |
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
| Android 14 (2023) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
| Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
| Android 12 (2021) |
android12-5.10
android12-5.4
android11-5.4
|
सॉफ़्टवेयर के अपडेट और सिक्योरिटी पैच
ACK को अपस्ट्रीम से एलटीएस मर्ज मिलते हैं. साथ ही, Android के लिए खास तौर पर बनाए गए कोड से जुड़ी गड़बड़ियां ठीक की जाती हैं. इन सुधारों में, कर्नल के वे सभी सुरक्षा पैच शामिल होते हैं जिनका ज़िक्र, हर महीने जारी होने वाले Android सुरक्षा बुलेटिन में किया जाता है और जो ACK के लिए ज़रूरी होते हैं.
ऐसा हो सकता है कि ACKs को kernel.org पर मौजूद अपस्ट्रीम स्टेबल कर्नल की तुलना में ज़्यादा समय तक सहायता मिले. इस मामले में, Google इस सेक्शन में दिखाई गई सेवा बंद होने की तारीख (ईओएल) तक, एक्सटेंडेड सपोर्ट देता है. जब कर्नल का ईओएल हो जाता है, तो Google उन्हें सपोर्ट नहीं करता. साथ ही, उन पर काम करने वाले डिवाइसों को असुरक्षित माना जाता है.
कर्नल 6.6 से, स्टेबल कर्नल के लिए सपोर्ट की अवधि चार साल है.
इस टेबल में, पुष्टि किए गए अनुरोधों (एसीके) के लिए तय की गई समयसीमाएं दी गई हैं:
| ACK ब्रांच | लॉन्च की तारीख |
Support lifetime (years) |
ईओएल |
|---|---|---|---|
| android11-5.4 | 2019-11-24 | 6 | 2026-01-01 |
| android12-5.4 | 2019-11-24 | 6 | 2026-01-01 |
| android12-5.10 | 2020-12-13 | 6 | 2027-07-01 |
| android13-5.10 | 2020-12-13 | 6 | 2027-07-01 |
| android13-5.15 | 2021-10-31 | 6 | 2028-07-01 |
| android14-5.15 | 2021-10-31 | 6 | 2028-07-01 |
| android14-6.1 | 2022-12-11 | 6 | 2029-07-01 |
| android15-6.6 | 2023-10-29 | 4 | 2028-07-01 |
| android16-6.12 | 2024-11-17 | 4 | 2029-07-01 |
सामान्य कर्नल टेस्टिंग
सामान्य कर्नलों की जांच, कई सीआई सिस्टम के साथ-साथ वेंडर की डाउनस्ट्रीम टेस्टिंग से भी की जाती है.
Linux कर्नेल फ़ंक्शनल टेस्ट
Linux Kernel Functional Test (LKFT) टेस्ट, arm32 और arm64 आर्किटेक्चर वाले डिवाइसों के सेट पर, kselftest, LTP, VTS, और CTS जैसे अलग-अलग टेस्ट सुइट शुरू करते हैं. हाल ही के टेस्ट के नतीजे, android-lkft पेज पर देखे जा सकते हैं.
KernelCI टेस्टिंग
KernelCI के बिल्ड और बूट टेस्ट, तब शुरू किए जाते हैं, जब किसी सामान्य कर्नल ब्रांच में कोई नया पैच जोड़ा जाता है. कई बोर्ड पर, सैकड़ों बिल्ड कॉन्फ़िगरेशन की जांच की जाती है और उन्हें बूट किया जाता है. Android कर्नल के हाल ही के नतीजे, KernelCL साइट पर देखे जा सकते हैं.
Android ऐप्लिकेशन के लिए, सबमिट करने से पहले और सबमिट करने के बाद की जाने वाली टेस्टिंग
प्रीसबमिट टेस्ट का इस्तेमाल, Android के सामान्य कर्नल में गड़बड़ियों को रोकने के लिए किया जाता है. टेस्ट के नतीजों की खास जानकारी, Android के सामान्य कर्नल गेरिट में कोड में किए गए बदलाव के 'Checks' टैब में देखी जा सकती है.
Android में पोस्टसबमिट टेस्टिंग, Android के कॉमन कर्नल ब्रांच में पब्लिश की गई नई बिल्ड पर की जाती है. ऐसा तब होता है, जब ci.android.com में Android के कॉमन कर्नल ब्रांच में नए पैच जोड़े जाते हैं. ci.android.com में aosp_kernel को ब्रांच के नाम के तौर पर डालने पर, आपको कर्नल ब्रांच की एक सूची दिखेगी. इसमें नतीजे भी उपलब्ध होंगे. उदाहरण के लिए, android-mainline के नतीजे, Android कंटीन्यूअस बिल्ड इंटिग्रेशन (Android CI) डैशबोर्ड पर देखे जा सकते हैं. Test Results टैब में टेस्ट का स्टेटस देखने के लिए, किसी बिल्ड पर क्लिक करें.
Android प्लैटफ़ॉर्म के सोर्स ट्री में, test-mapping के ज़रिए तय किए गए टेस्ट, Android कर्नल ब्रांच के लिए प्रीसबमिट के तौर पर चलाए जाते हैं. इन टेस्ट को kernel-presubmit टेस्ट ग्रुप के साथ चलाया जाता है. उदाहरण के लिए, test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING में दिया गया यह कॉन्फ़िगरेशन, Android के सामान्य कर्नल कोड चेक-इन के दौरान vts_kernel_proc_file_api_test को प्रीसबमिट टेस्ट के तौर पर चालू करता है.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
ज़ीरो डे टेस्टिंग
0-दिन की टेस्टिंग में, नए पैच सबमिट किए जाने पर, Android के सभी सामान्य कर्नल ब्रांच पर पैच-बाय-पैच टेस्टिंग की जाती है. बूट, फ़ंक्शनल, और परफ़ॉर्मेंस से जुड़े अलग-अलग टेस्ट किए जाते हैं. cros-kernel-buildreports सार्वजनिक ग्रुप में शामिल हों.
टेस्ट मैट्रिक्स
| Android कॉमन कर्नल | Android प्लैटफ़ॉर्म के रिलीज़ हुए वर्शन | टेस्ट सुइट | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| मुख्य नेविगेशन | 16 | 15 | 14 | 13 | 12 | LKFT | KernelCI | सबमिट करने से पहले | सबमिट करने के बाद | ज़ीरो डे | |
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android16-6.12
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Android के सामान्य कर्नल में योगदान देना
आम तौर पर, सुविधा को मेनलाइन Linux पर डेवलप किया जाना चाहिए, न कि Android के सामान्य कर्नेल पर. हम अपस्ट्रीम डेवलपमेंट को बढ़ावा देते हैं. डेवलपमेंट स्वीकार किए जाने के बाद, इसे ज़रूरत के हिसाब से किसी खास ACK ब्रांच में वापस पोर्ट किया जा सकता है. Android Kernel Team, Android नेटवर्क को बेहतर बनाने के लिए, अपस्ट्रीमिंग से जुड़े प्रयासों में आपकी मदद करके खुश है.
Gerrit पर पैच सबमिट करें और योगदान से जुड़े इन दिशा-निर्देशों का पालन करें.