इस पेज पर, जेनेरिक कर्नेल इमेज (जीकेआई) के वर्शनिंग स्कीम के बारे में बताया गया है. जेनेरिक कर्नेल इमेज (जीकेआई) का एक यूनीक आइडेंटिफ़ायर होता है. इसे कर्नेल रिलीज़ कहा जाता है. कर्नेल रिलीज़ में, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) का वर्शन और सबलेवल शामिल होता है. कर्नेल रिलीज़, रिलीज़ की जा रही इमेज के लिए खास होता है. वहीं, केएमआई वर्शन उस इंटरफ़ेस को दिखाता है जिससे कोई रिलीज़ बनाई जाती है. एक केएमआई वर्शन, कई कर्नेल रिलीज़ के साथ काम कर सकता है. एक कर्नेल रिलीज़, सिर्फ़ एक केएमआई वर्शन से जुड़ा होता है. अगर कर्नेल मॉड्यूल इंटरफ़ेस में बदलाव करना पड़ता है, तो केएमआई वर्शन में बदलाव दिखाने के लिए, केएमआई जनरेशन को दोहराया जाता है.
शब्दावली की खास जानकारी
यहां दी गई टेबल में, इस पेज पर इस्तेमाल किए गए अहम शब्दों और जीकेआई के अपडेट के बारे में खास जानकारी दी गई है.
| नाम | सिंबल | उदाहरण | ब्यौरा |
|---|---|---|---|
| कर्नेल रिलीज़ | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | यह जीकेआई रिलीज़ का यूनीक आइडेंटिफ़ायर है. यह
वैल्यू है जो unameसे मिलती है. |
| केएमआई वर्शन | w.x-zzz-k | 5.4-android12-0 | यह जीकेआई और डाइनैमिक तरीके से लोड किए जा सकने वाले कर्नेल मॉड्यूल (डीएलकेएम) के बीच कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के बारे में बताता है. |
| सबलेवल | y | 42 | यह एक ही केएमआई वर्शन में, कर्नेल रिलीज़ के रिलीज़ ऑर्डर के बारे में बताता है. |
यहां दी गई टेबल में, रेफ़रंस के तौर पर अन्य मिलते-जुलते शब्द दिए गए हैं.
| नाम | सिंबल | उदाहरण | ब्यौरा |
|---|---|---|---|
| w.x.y | w.x.y | 5.4.42 |
ज़्यादा जानकारी के लिए, Linux Kernel Makefiles देखें. इसके लिए, "KERNELRELEASE" खोजें. इस पूरे दस्तावेज़ में, w.x.y का सीधे तौर पर इस्तेमाल किया गया है. आम तौर पर, इसे तीन हिस्सों वाला वर्शन नंबर भी कहा जाता है. VINTF में इस्तेमाल किया गया शब्द, कर्नेल वर्शन, अन्य शब्दों , खास तौर पर w के साथ भ्रम पैदा कर सकता है. libkver में इस वैरिएबल को kernel_version_tuple कहा जाता है. इस टपल को किसी भी अपडेट से कम नहीं किया जाना चाहिए. इनमें ओटीए या मेनलाइन अपडेट भी शामिल हैं. |
| कर्नेल ब्रांच | zzz-w.x | android12-5.4 | इस शब्द का इस्तेमाल, Common kernel branch types में किया गया है. |
| वर्शन | w | 5 | इस शब्द का इस्तेमाल, इस दस्तावेज़ में नहीं किया गया है. libkver में इस वैरिएबल को version कहा जाता है. |
| पैच लेवल | x | 4 | इस शब्द का इस्तेमाल, इस दस्तावेज़ में नहीं किया गया है. libkver में इस वैरिएबल को patch_level कहा जाता है. |
| Android रिलीज़ | zzz | android12 |
यह Android (डेज़र्ट) रिलीज़ नंबर है, जिससे कर्नेल जुड़ा होता है.
Android रिलीज़ नंबर को किसी भी अपडेट से कम नहीं किया जाना चाहिए. इनमें ओटीए या मेनलाइन अपडेट भी शामिल हैं. |
| केएमआई जनरेशन | k | 0 |
यह एक अतिरिक्त नंबर है, जिसे किसी भी समस्या से निपटने के लिए जोड़ा जाता है. अगर सुरक्षा से जुड़े किसी बग को ठीक करने के लिए, एक ही Android रिलीज़ में केएमआई में बदलाव करने की ज़रूरत पड़ती है, तो केएमआई जनरेशन को बढ़ाया जाता है. केएमआई जनरेशन नंबर, 0 से शुरू होता है. |
वर्शनिंग डिज़ाइन
कर्नेल रिलीज़
परिभाषा
जीकेआई के साथ शिप होने वाले डिवाइसों के लिए, कर्नेल रिलीज़ को इस तरह से परिभाषित किया जाता है:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
ज़्यादा जानकारी के लिए, किसी डिवाइस से कर्नेल रिलीज़ का पता लगाना लेख पढ़ें.
कर्नेल रिलीज़ का एक उदाहरण यहां दिया गया है.
5.4.42-android12-0-00544-ged21d463f856
ब्यौरा
कर्नेल रिलीज़, जीकेआई रिलीज़ का यूनीक आईडी होता है. अगर दो जीकेआई बाइनरी का कर्नेल रिलीज़ एक ही है, तो वे बाइट के हिसाब से एक जैसी होनी चाहिए.
कर्नेल रिलीज़ में, केएमआई वर्शन, सबलेवल, और सफ़िक्स शामिल होता है. इस दस्तावेज़ के लिए, केएमआई जनरेशन के बाद वाले सफ़िक्स को अनदेखा कर दिया जाता है.
केएमआई वर्शन
परिभाषा
केएमआई वर्शन को इस तरह से परिभाषित किया जाता है:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
ध्यान दें कि सबलेवल, y केएमआई वर्शन का हिस्सा नहीं है. कर्नेल रिलीज़ में दिए गए उदाहरण
के लिए, केएमआई वर्शन यह है:
5.4-android12-0
ब्यौरा
केएमआई वर्शन, जीकेआई और डाइनैमिक तरीके से लोड किए जा सकने वाले कर्नेल मॉड्यूल (डीएलकेएम) के बीच कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के बारे में बताता है.
अगर दो कर्नेल रिलीज़ का केएमआई वर्शन एक ही है, तो वे एक ही कर्नेल मॉड्यूल इंटरफ़ेस को लागू करते हैं. डीएलकेएम जो एक के साथ काम करते हैं, वे दूसरे के साथ भी काम करते हैं.
केएमआई वर्शन को किसी भी ओटीए अपडेट से कम नहीं किया जाना चाहिए.
सबलेवल
सबलेवल, y, एक ही केएमआई वर्शन में, कर्नेल रिलीज़ के रिलीज़ ऑर्डर के बारे में बताता है.
एक ही केएमआई वर्शन वाले दो कर्नेल रिलीज़ के लिए, जिनमें सबलेवल क्रमशः Y1 और Y2 हैं:
- अगर Y1, Y2 से कम या उसके बराबर है, तो Y1 पर चलने वाला डिवाइस, Y2 पर अपडेट किया जा सकता है.
- अगर Y1, Y2 से ज़्यादा है, तो Y1 पर चलने वाले डिवाइस को Y2 पर अपडेट नहीं किया जा सकता.
इसका मतलब है कि अगर केएमआई वर्शन में कोई बदलाव नहीं होता है, तो सबलेवल को किसी भी ओटीए अपडेट से कम नहीं किया जाना चाहिए.
किसी डिवाइस से कर्नेल रिलीज़ का पता लगाना
पूरा कर्नेल रिलीज़, uname -r या
uname(2)
को इस कोड स्निपेट के साथ एक्ज़ीक्यूट करके पाया जा सकता है:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
आउटपुट का एक उदाहरण यहां दिया गया है:
5.4.42-android12-0-00544-ged21d463f856
इस दस्तावेज़ के लिए, कर्नेल की जानकारी निकालते समय, केएमआई जनरेशन के बाद की किसी भी जानकारी को अनदेखा कर दिया जाता है. ज़्यादा जानकारी के लिए, uname -r के आउटपुट को इस रेगुलर एक्सप्रेशन से पार्स किया जाता है. इसमें यह माना जाता है कि zzz हमेशा "android" से शुरू होता है:
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
अनदेखा की गई जानकारी में, ci.android.com का बिल्ड नंबर, बेसलाइन कर्नेल पर पैच की संख्या, और गिट कमिट के SHA हैश जैसी जानकारी शामिल हो सकती है.
libkver
libkver लाइब्रेरी, कर्नेल रिलीज़ या केएमआई वर्शन स्ट्रिंग को पार्स करने के लिए, C++ इंटरफ़ेस उपलब्ध कराती है. libkver से मिलने वाले एपीआई की सूची देखने के लिए, देखें
packages/modules/Gki/libkver/include/kver.
VINTF की जांच
Android 11 या इससे पहले के वर्शन के लिए, केएमआई वर्शन का Android रिलीज़ वाला हिस्सा, डिवाइस बनाने वाली कंपनियां, डिवाइस मेनिफ़ेस्ट में मैन्युअल तरीके से तय करती हैं. ज़्यादा जानकारी के लिए, VINTF कर्नेल मैच के नियम देखें.
Android S से, केएमआई वर्शन का Android रिलीज़ वाला हिस्सा, कर्नेल से निकाला जा सकता है और बिल्ड के समय, इसे डिवाइस मेनिफ़ेस्ट में डाला जा सकता है.
आम तौर पर, कर्नेल कॉन्फ़िगरेशन की ज़रूरी शर्तें नहीं बदलती हैं. इसलिए, कंपैटिबिलिटी मैट्रिक्स में k को एनकोड करने की ज़रूरत नहीं होती. हालांकि, अगर कर्नेल कॉन्फ़िगरेशन की ज़रूरी शर्त में बदलाव करने की ज़रूरत पड़ती है, तो पक्का करें कि:
- कंपैटिबिलिटी मैट्रिक्स से, उससे जुड़ी ज़रूरी शर्त हटा दी गई हो.
- केएमआई जनरेशन के आधार पर, नई ज़रूरी शर्तों की जांच करने के लिए, VTS के अतिरिक्त टेस्ट जोड़े गए हों.
ओटीए मेटाडेटा में बूट इमेज का वर्शन
अगर बूट इमेज को ओटीए के ज़रिए अपडेट किया जाता है, तब भी इसे ओटीए पेलोड फ़ॉर्मैट, payload.bin में रैप किया जाना चाहिए. ओटीए पेलोड, हर पार्टिशन के लिए version फ़ील्ड को एनकोड करता है. जब update_engine किसी ओटीए पेलोड को हैंडल करता है, तो वह इस फ़ील्ड की तुलना करता है, ताकि यह पक्का किया जा सके कि पार्टिशन को डाउनग्रेड न किया गया हो.
किसी भी तरह के भ्रम से बचने के लिए, ओटीए
मेटाडेटा में बूट पार्टिशन के लिए version फ़ील्ड को boot image version कहा जाता है.
रैमडिस्क हमेशा नए सिरे से बनाया जाता है. इसलिए, पूरी बूट इमेज के बारे में बताने के लिए, रैमडिस्क टाइमस्टैंप का इस्तेमाल करना काफ़ी है. बूट इमेज के वर्शन में कर्नेल रिलीज़ को एनकोड करने की ज़रूरत नहीं है. हालांकि, अगर आपको आने वाले समय में किसी नई कर्नेल बाइनरी में पुरानी बूट इमेज को जोड़ना है, तो ऐसा किया जा सकता है.
ओटीए अपडेट से पहले, ओटीए क्लाइंट, बूट इमेज के वर्शन की जांच उसी तरह करता है जैसे किसी अन्य पार्टिशन की.