इस पेज पर, सामान्य कर्नल इमेज (जीकेआई) के वर्शनिंग स्कीम के बारे में बताया गया है. जेनेरिक कर्नल इमेज (GKI) में एक यूनीक आइडेंटिफ़ायर होता है, जिसे कर्नल रिलीज़ कहा जाता है. कर्नेल रिलीज़ में, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) का वर्शन और सबलेवल शामिल होता है. कर्नेल रिलीज़, रिलीज़ की जा रही इमेज के हिसाब से होती है. वहीं, केएमआई वर्शन उस इंटरफ़ेस को दिखाता है जिससे कोई रिलीज़ बनाई जाती है. केएमआई का कोई वर्शन, कर्नेल के कई रिलीज़ के साथ काम कर सकता है. कर्नेल रिलीज़, सिर्फ़ एक KMI वर्शन से जुड़ी होती है. अगर कर्नेल मॉड्यूल इंटरफ़ेस में बदलाव करना ज़रूरी हो, तो केएमआई जनरेशन को दोहराया जाता है, ताकि केएमआई वर्शन में हुए बदलाव को दिखाया जा सके.
सेवा की शर्तों के बारे में खास जानकारी
इस पेज पर और GKI अपडेट के लिए इस्तेमाल किए गए अहम शब्दों के बारे में यहां दी गई टेबल में बताया गया है.
| नाम | सिंबल | उदाहरण | ब्यौरा |
|---|---|---|---|
| कर्नेल रिलीज़ | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | GKI रिलीज़ के लिए यूनीक आइडेंटिफ़ायर. यह uname से मिली वैल्यू है. |
| केएमआई वर्शन | w.x-zzz-k | 5.4-android12-0 | इसमें जीकेआई और डाइनैमिक तरीके से लोड किए जा सकने वाले कर्नेल मॉड्यूल (डीएलकेएम) के बीच कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के बारे में बताया गया है. |
| सबलेवल | y | 42 | इससे एक ही केएमआई वर्शन में, कर्नेल रिलीज़ के रिलीज़ होने के क्रम के बारे में पता चलता है. |
यहां दी गई टेबल में, रेफ़रंस के तौर पर अन्य मिलते-जुलते शब्द दिए गए हैं.
| नाम | सिंबल | उदाहरण | ब्यौरा |
|---|---|---|---|
| w.x.y | w.x.y | 5.4.42 |
ज़्यादा जानकारी के लिए, Linux कर्नेल मेकफ़ाइलें देखें. इसके लिए, "KERNELRELEASE" खोजें. इस दस्तावेज़ में, w.x.y का सीधे तौर पर इस्तेमाल किया गया है. इसे आम तौर पर, तीन हिस्सों वाला वर्शन नंबर भी कहा जाता है. VINTF में इस्तेमाल किया गया शब्द, कर्नेल वर्शन, अन्य शब्दों के साथ भ्रम पैदा कर सकता है. खास तौर पर, w के साथ. इस वैरिएबल को libkver में kernel_version_tuple कहा जाता है. इस टपल को किसी भी अपडेट से कम नहीं किया जाना चाहिए. इसमें ओटीए या मेनलाइन अपडेट शामिल हैं. |
| कर्नेल ब्रांच | zzz-w.x | android12-5.4 | इस शब्द का इस्तेमाल कॉमन कर्नल ब्रांच टाइप में किया जाता है. |
| वर्शन | w | 5 | इस शब्द का इस्तेमाल इस दस्तावेज़ में नहीं किया गया है. इस वैरिएबल को libkver में version कहा जाता है. |
| पैच लेवल | x | 4 | इस शब्द का इस्तेमाल इस दस्तावेज़ में नहीं किया गया है. इस वैरिएबल को libkver में patch_level कहा जाता है. |
| Android रिलीज़ | zzz | android12 |
यह Android (डेज़र्ट) का रिलीज़ नंबर है, जिससे कर्नल जुड़ा होता है.
किसी भी अपडेट से Android के रिलीज़ नंबर में कमी नहीं आनी चाहिए. इनमें ओटीए या मेनलाइन अपडेट शामिल हैं. |
| KMI जनरेट करना | k | 0 |
यह एक अतिरिक्त नंबर है, जिसे किसी असामान्य इवेंट से निपटने के लिए जोड़ा गया है. अगर सुरक्षा से जुड़ी किसी गड़बड़ी को ठीक करने के लिए, Android के एक ही वर्शन में KMI में बदलाव करने की ज़रूरत होती है, तो KMI जनरेशन बढ़ जाता है. केएमआई जनरेशन नंबर 0 से शुरू होता है. |
वर्शनिंग डिज़ाइन
कर्नेल रिलीज़
परिभाषा
GKI के साथ शिप किए जाने वाले डिवाइसों के लिए, कर्नल रिलीज़ को इस तरह से तय किया जाता है:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
ज़्यादा जानकारी के लिए, किसी डिवाइस से कर्नल रिलीज़ का पता लगाना लेख पढ़ें.
यहां कर्नल रिलीज़ का एक उदाहरण दिया गया है.
5.4.42-android12-0-00544-ged21d463f856
ब्यौरा
कर्नल रिलीज़, GKI रिलीज़ का यूनीक आईडी होता है. अगर दो जीकेआई बाइनरी का कर्नल रिलीज़ एक जैसा है, तो वे बाइट के हिसाब से एक जैसी होनी चाहिए.
कर्नेल रिलीज़ में केएमआई वर्शन, सबलेवल, और सफ़िक्स शामिल होता है. इस दस्तावेज़ के लिए, KMI जनरेट होने के बाद वाले प्रत्यय को अनदेखा कर दिया जाता है.
केएमआई वर्शन
परिभाषा
केएमआई वर्शन के बारे में यहां बताया गया है:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
ध्यान दें कि सबलेवल, y KMI वर्शन का हिस्सा नहीं है. कर्नेल रिलीज़ में दिए गए उदाहरण के लिए, केएमआई वर्शन यह है:
5.4-android12-0
ब्यौरा
केएमआई वर्शन, जीकेआई और डाइनैमिक तरीके से लोड किए जा सकने वाले कर्नेल मॉड्यूल (डीएलकेएम) के बीच कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के बारे में बताता है.
अगर दो कर्नल रिलीज़ का KMI वर्शन एक जैसा है, तो वे एक ही कर्नल मॉड्यूल इंटरफ़ेस लागू करते हैं. जो डीएलकेएम एक के साथ काम करते हैं वे दूसरे के साथ भी काम करते हैं.
ओटीए अपडेट से, केएमआई वर्शन कम नहीं होना चाहिए.
सबलेवल
सबलेवल, y, एक ही केएमआई वर्शन में कर्नेल रिलीज़ के रिलीज़ होने के क्रम के बारे में बताता है.
एक ही केएमआई वर्शन वाले दो कर्नल रिलीज़ के लिए, जिनमें सबलेवल Y1 और Y2 हैं:
- अगर Y1, Y2 से कम या उसके बराबर है, तो Y1 वर्शन वाले डिवाइस को Y2 वर्शन का अपडेट मिल सकता है.
- अगर Y1, Y2 से ज़्यादा है, तो Y1 वर्शन वाले डिवाइस को Y2 वर्शन पर अपडेट नहीं किया जा सकता.
इसका मतलब है कि अगर KMI का वर्शन नहीं बदलता है, तो किसी भी OTA अपडेट से सबलेवल को कम नहीं किया जाना चाहिए.
किसी डिवाइस से कर्नल रिलीज़ का पता लगाना
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
इस दस्तावेज़ के लिए, कर्नल की जानकारी निकालते समय, KMI जनरेट होने के बाद की किसी भी जानकारी को अनदेखा किया जाता है. ज़्यादा औपचारिक तौर पर, uname -r के आउटपुट को यहां दिए गए regex के साथ पार्स किया जाता है. मान लें कि zzz हमेशा "android" से शुरू होता है:
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
अनदेखी की गई जानकारी में, ci.android.com का बिल्ड नंबर, बेसलाइन कर्नल पर पैच की संख्या, और git कमिट के SHA हैश जैसी जानकारी शामिल हो सकती है.
libkver
libkver लाइब्रेरी, कर्नल रिलीज़ या केएमआई वर्शन स्ट्रिंग को पार्स करने के लिए C++ इंटरफ़ेस उपलब्ध कराती है. libkver के ज़रिए उपलब्ध कराए गए एपीआई की सूची देखने के लिए, packages/modules/Gki/libkver/include/kver पर जाएं.
VINTF चेक
Android 11 या इससे पहले के वर्शन के लिए, KMI वर्शन का Android रिलीज़ वाला हिस्सा, डिवाइस बनाने वाली कंपनियां डिवाइस के मेनिफ़ेस्ट में मैन्युअल तरीके से तय करती हैं. ज़्यादा जानकारी के लिए, VINTF कर्नल मैच के नियम देखें.
Android S से, केएमआई वर्शन के Android रिलीज़ वाले हिस्से को कर्नेल से निकाला जा सकता है. साथ ही, इसे बिल्ड के समय डिवाइस मेनिफ़ेस्ट में डाला जा सकता है.
आम तौर पर, कर्नल कॉन्फ़िगरेशन की ज़रूरी शर्तें नहीं बदलती हैं. इसलिए, कंपैटिबिलिटी मैट्रिक्स में k को एन्कोड करने की कोई ज़रूरत नहीं है. हालांकि, अगर कर्नल कॉन्फ़िगरेशन की ज़रूरी शर्तों में बदलाव करना ज़रूरी हो, तो पक्का करें कि ये शर्तें पूरी हों:
- इसके बाद, कंपैटिबिलिटी मैट्रिक्स से ज़रूरी शर्तें हटा दी जाती हैं.
- वीटीएस के अतिरिक्त टेस्ट जोड़े गए हैं, ताकि केएमआई जनरेट करने की नई शर्तों की जांच की जा सके.
OTA मेटाडेटा में बूट इमेज का वर्शन
अगर बूट इमेज को ओटीए के ज़रिए अपडेट किया जाता है, तब भी उसे ओटीए पेलोड फ़ॉर्मैट, payload.bin में रैप किया जाना चाहिए. OTA पेलोड, हर पार्टीशन के लिए version फ़ील्ड को कोड में बदलता है. जब update_engine किसी ओटीए पेलोड को मैनेज करता है, तो वह इस फ़ील्ड की तुलना करता है, ताकि यह पक्का किया जा सके कि पार्टीशन को डाउनग्रेड न किया गया हो.
गड़बड़ी से बचने के लिए, ओटीए मेटाडेटा में बूट पार्टीशन के लिए version फ़ील्ड को boot image version कहा जाता है.
रामडिस्क को हमेशा शुरू से बनाया जाता है. इसलिए, पूरी बूट इमेज के बारे में बताने के लिए, ramdisk timestamp का इस्तेमाल करना काफ़ी है. बूट इमेज वर्शन में कर्नल रिलीज़ को एन्कोड करने की कोई ज़रूरत नहीं है. ऐसा तब तक न करें, जब तक आपको आने वाले समय में किसी पुरानी बूट इमेज को नए कर्नल बाइनरी से न जोड़ना हो.
ओटीए अपडेट से पहले, ओटीए क्लाइंट बूट इमेज के वर्शन की जांच करता है. यह जांच, किसी अन्य पार्टीशन की तरह ही की जाती है.