जीकेआई वर्शनिंग स्कीम

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

शर्तों के बारे में खास जानकारी

इस टेबल में, इस पेज पर और GKI अपडेट के लिए इस्तेमाल किए गए अहम शब्दों की खास जानकारी दी गई है.

नाम प्रतीक उदाहरण ब्यौरा
कर्नेल रिलीज़ w.x.y-zzz-k-suffix 5.4.42-android12-0-foo जीकेआई रिलीज़ के लिए यूनीक आइडेंटिफ़ायर. यह वैल्यू, uname से मिलती है.
KMI का वर्शन w.x-zzz-k 5.4-android12-0 यह GKI और गतिशील रूप से लोड होने वाले कर्नेल मॉड्यूल (DLKM) के बीच कर्नेल मॉड्यूल इंटरफ़ेस (KMI) के बारे में बताता है.
सब-लेवल y 42 उसी केएमआई वर्शन में कर्नेल रिलीज़ के रिलीज़ क्रम की जानकारी देता है.

यहां दी गई टेबल में, मिलते-जुलते अन्य शब्दों की सूची दी गई है.

नाम प्रतीक उदाहरण ब्यौरा
w.x.y w.x.y 5.4.42

ज़्यादा जानकारी के लिए, Linux केर्नेल मेकफ़ाइल देखें ("KERNELRelease" खोजें).

इस पूरे दस्तावेज़ में सीधे w.x.y का इस्तेमाल किया गया है. इसे आम तौर पर, तीन हिस्सों वाले वर्शन नंबर भी कहा जाता है. VINTF में इस्तेमाल किया गया शब्द, कर्नल वर्शन, अन्य शब्दों के साथ भ्रम पैदा कर सकता है. खास तौर पर, w.

इस वैरिएबल को libkver में kernel_version_tuple के तौर पर बताया जाता है.

इस टुपल में किसी भी अपडेट की वजह से कमी नहीं होनी चाहिए. इसमें OTA या मुख्य अपडेट भी शामिल हैं.

कर्नेल की शाखा ज़ेडज़ेड-डब्ल्यू.एक्स android12-5.4 इस शब्द का इस्तेमाल सामान्य कर्नेल शाखा टाइप में किया जाता है.
वर्शन w 5 इस दस्तावेज़ में इस शब्द का इस्तेमाल नहीं किया गया है. libkver में इस वैरिएबल को version कहा जाता है.
पैच लेवल x 4 इस दस्तावेज़ में इस शब्द का इस्तेमाल नहीं किया गया है. इस वैरिएबल को libkver में patch_level कहा जाता है.
Android रिलीज़ zzz android12

यह Android (मिठाई) रिलीज़ नंबर है, जिससे कर्नेल जुड़ा हुआ है.

AndroidRelease फ़ील्ड की तुलना करते समय, तुलना करने के लिए स्ट्रिंग से संख्या वाला हिस्सा निकाला जाता है.

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 रिलीज़ का यूनीक आईडी होता है. अगर दो GKI बाइनरी में एक ही कर्नेल रिलीज़ है, तो वे बाइट के हिसाब से एक जैसी होनी चाहिए.

किसी कर्नेल रिलीज़ में, KMI वर्शन, सब-लेवल, और सफ़िक्स शामिल होता है. इस दस्तावेज़ के लिए, KMI जनरेशन के बाद का सफ़िक्स अनदेखा किया जाता है.

KMI का वर्शन

परिभाषा

केएमआई वर्शन की जानकारी यहां दी गई है:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

ध्यान दें कि सब-लेवल y, KMI वर्शन का हिस्सा नहीं है. उदाहरण के लिए, Kernel रिलीज़ में, केएमआई वर्शन यह है:

5.4-android12-0

ब्यौरा

KMI वर्शन में, GKI और डाइनैमिक तौर पर लोड किए जा सकने वाले कर्नेल मॉड्यूल (DLKM) के बीच के कर्नेल मॉड्यूल इंटरफ़ेस (KMI) के बारे में बताया गया है.

अगर दो कर्नेल रिलीज़ का KMI वर्शन एक ही है, तो वे एक ही कर्नेल मॉड्यूल इंटरफ़ेस लागू करते हैं. एक के साथ काम करने वाले DLKM, दूसरे के साथ भी काम करते हैं.

KMI वर्शन को किसी भी ओटीए अपडेट से कम नहीं करना चाहिए.

सब-लेवल

सब-लेवल y, एक ही KMI वर्शन में मौजूद कर्नेल रिलीज़ के क्रम के बारे में बताता है.

दो ऐसे कर्नेल रिलीज़ के लिए जिनका KMI वर्शन एक जैसा है, लेकिन सब-लेवल क्रमशः Y1 और Y2 है:

  • अगर Y1, Y2 से कम या उसके बराबर है, तो Y1 वाले डिवाइस को Y2 पर अपडेट मिल सकता है.
  • अगर Y1, Y2 से ज़्यादा है, तो Y1 पर काम करने वाले डिवाइस को Y2 पर अपडेट नहीं किया जा सकता.

इसका मतलब है कि अगर केएमआई वर्शन में कोई बदलाव नहीं होता है, तो किसी भी ओटीए अपडेट से सब-लेवल कम नहीं होना चाहिए.

किसी डिवाइस से kernel रिलीज़ का पता लगाना

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 के बिल्ड नंबर, बेसलाइन कर्नेल के ऊपर पैच की संख्या, और git कमिट के SHA हैश जैसी जानकारी शामिल हो सकती है.

libkver

libkver लाइब्रेरी, C++ इंटरफ़ेस उपलब्ध कराती है, ताकि कर्नेल रिलीज़ या KMI वर्शन स्ट्रिंग को पार्स किया जा सके. libkver के ज़रिए एक्सपोज़ किए गए एपीआई की सूची देखने के लिए, packages/modules/Gki/libkver/include/kver देखें.

VINTF की जांच

Android 11 या इससे पहले के वर्शन के लिए, केएमआई वर्शन के Android रिलीज़ वाले हिस्से की जानकारी, डिवाइस बनाने वाली कंपनियों के डिवाइस मेनिफ़ेस्ट में मैन्युअल तरीके से दी जाती है. ज़्यादा जानकारी के लिए, VINTF के kernel match नियम देखें.

Android S में, KMI वर्शन के Android रिलीज़ वाले हिस्से को कोर से निकाला जा सकता है और बिल्ड के समय डिवाइस मेनिफ़ेस्ट में इंजेक्ट किया जा सकता है.

आम तौर पर, कर्नेल कॉन्फ़िगरेशन की ज़रूरी शर्तें नहीं बदलती हैं. इसलिए, काम करने के तरीके के मैट्रिक्स में k को कोड में बदलने की ज़रूरत नहीं है. हालांकि, अगर कभी भी कोर कॉन्फ़िगरेशन की ज़रूरी शर्तों में बदलाव करना पड़ता है, तो इन बातों का ध्यान रखें:

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

OTA मेटाडेटा में बूट इमेज का वर्शन

भले ही, बूट इमेज को ओटीए अपडेट की मदद से अपडेट किया गया हो, लेकिन इसे payload.bin के ओटीए पेलोड फ़ॉर्मैट में रैप किया जाना चाहिए. ओटीए पेलोड, हर पार्टीशन के लिए version फ़ील्ड को कोड में बदलता है. जब update_engine किसी OTA पेलोड को मैनेज करता है, तो वह इस फ़ील्ड की तुलना करता है, ताकि यह पक्का किया जा सके कि पार्टीशन को डाउनग्रेड न किया गया हो.

किसी तरह की उलझन से बचने के लिए, ओटीए मेटाडेटा में बूट पार्टिशन के लिए version फ़ील्ड को boot image version कहा जाता है.

रैमडиск को हमेशा नए सिरे से बनाया जाता है. इसलिए, पूरी बूट इमेज के बारे में बताने के लिए, रैमडиск के टाइमस्टैंप का इस्तेमाल करना काफ़ी है. बूट इमेज के वर्शन में, kernel रिलीज़ को कोड में बदलने की ज़रूरत नहीं है. ऐसा तब तक नहीं करना चाहिए, जब तक कि आने वाले समय में किसी पुरानी बूट इमेज को नए kernel बाइनरी से स्टिच नहीं किया जा रहा हो.

ओटीए अपडेट से पहले, ओटीए क्लाइंट किसी भी अन्य पार्टीशन की तरह ही, बूट इमेज के वर्शन की जांच करता है.