इस पेज पर, सामान्य कर्नेल इमेज (जीकेआई) के वर्शन से जुड़ी स्कीम के बारे में बताया गया है. Generic Kernel Image (GKI) का एक यूनीक आइडेंटिफ़ायर होता है, जिसे kernel release कहा जाता है. कर्नेल रिलीज़ में, कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) वर्शन और सब-लेवल शामिल होते हैं. कर्नेल रिलीज़, रिलीज़ की जा रही इमेज के हिसाब से होती है. वहीं, केएमआई वर्शन उस इंटरफ़ेस को दिखाता है जिससे रिलीज़ बनाई गई है. केएमआई वर्शन, कई कर्नेल रिलीज़ के साथ काम कर सकता है. कोई भी कर्नेल रिलीज़, सिर्फ़ एक KMI वर्शन से जुड़ी होती है. अगर कभी भी कर्नेल मॉड्यूल इंटरफ़ेस में बदलाव करना पड़ता है, तो केएमआई वर्शन में हुए बदलाव को दिखाने के लिए, केएमआई जनरेशन को दोहराया जाता है.
शर्तों के बारे में खास जानकारी
यहां दी गई टेबल में, इस पेज और GKI के अपडेट के लिए इस्तेमाल किए गए अहम शब्दों के बारे में बताया गया है.
नाम | प्रतीक | उदाहरण | ब्यौरा |
---|---|---|---|
कर्नेल रिलीज़ | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | GKI रिलीज़ के लिए यूनीक आइडेंटिफ़ायर. यह वैल्यू, uname से मिलती है. |
KMI का वर्शन | w.x-zzz-k | 5.4-android12-0 | GKI और डाइनैमिक तौर पर लोड किए जा सकने वाले कर्नेल मॉड्यूल (डीएलकेएम) के बीच के कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के बारे में बताता है. |
सब-लेवल | y | 42 | इससे, एक ही KMI वर्शन में कर्नेल रिलीज़ के क्रम के बारे में पता चलता है. |
यहां दी गई टेबल में, मिलते-जुलते अन्य शब्दों की सूची दी गई है.
नाम | प्रतीक | उदाहरण | ब्यौरा |
---|---|---|---|
w.x.y | w.x.y | 5.4.42 |
ज़्यादा जानकारी के लिए, Linux kernel के लिए Makefiles देखें. इसके लिए, "KERNELRELEASE" खोजें. इस दस्तावेज़ में, w.x.y का सीधे तौर पर इस्तेमाल किया गया है. इसे आम तौर पर, तीन हिस्सों वाले वर्शन नंबर भी कहा जाता है. VINTF में इस्तेमाल किया गया शब्द, कर्नल वर्शन, अन्य शब्दों के साथ भ्रम पैदा कर सकता है. खास तौर पर, w. libkver में, इस वैरिएबल को kernel_version_tuple कहा जाता है. इस टुपल में किसी भी अपडेट की वजह से कमी नहीं होनी चाहिए. इसमें OTA या मुख्य अपडेट भी शामिल हैं. |
कर्नेल की शाखा | 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 रिलीज़ का यूनीक आईडी होता है. अगर दो GKI बाइनरी में एक ही कर्नेल रिलीज़ है, तो वे बाइट के हिसाब से एक जैसी होनी चाहिए.
कर्नेल रिलीज़ में केएमआई वर्शन, सब-लेवल, और सफ़िक्स शामिल होता है. इस दस्तावेज़ के लिए, KMI जनरेशन के बाद का सफ़िक्स अनदेखा किया जाता है.
KMI का वर्शन
परिभाषा
KMI वर्शन को इस तरह परिभाषित किया गया है:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
ध्यान दें कि सब-लेवल y
, KMI वर्शन का हिस्सा नहीं है. कर्नेल रिलीज़ के उदाहरण के लिए, केएमआई वर्शन यह है:
5.4-android12-0
ब्यौरा
केएमआई वर्शन में, GKI और डाइनैमिक तौर पर लोड किए जा सकने वाले कर्नेल मॉड्यूल (डीएलकेएम) के बीच के कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) के बारे में बताया गया है.
अगर दो कर्नेल रिलीज़ का KMI वर्शन एक ही है, तो वे एक ही कर्नेल मॉड्यूल इंटरफ़ेस लागू करते हैं. एक के साथ काम करने वाले डीएलकेएम, दूसरे के साथ भी काम करते हैं.
ओटीए अपडेट की वजह से, केएमआई वर्शन में कमी नहीं होनी चाहिए.
सब-लेवल
सब-लेवल y
, एक ही KMI वर्शन में कर्नेल रिलीज़ के क्रम के बारे में बताता है.
दो ऐसे कर्नेल रिलीज़ के लिए जिनका KMI वर्शन एक जैसा है, लेकिन सब-लेवल क्रमशः Y1 और Y2 है:
- अगर Y1, Y2 से कम या उसके बराबर है, तो Y1 पर काम करने वाले डिवाइस को Y2 पर अपडेट किया जा सकता है.
- अगर Y1, Y2 से ज़्यादा है, तो Y1 पर काम करने वाले डिवाइस को Y2 पर अपडेट नहीं किया जा सकता.
इसका मतलब है कि अगर KMI वर्शन में कोई बदलाव नहीं होता है, तो किसी भी OTA अपडेट से सब-लेवल कम नहीं होना चाहिए.
किसी डिवाइस से 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 या उससे पहले के वर्शन के लिए, डिवाइस बनाने वाली कंपनियां, डिवाइस मेनिफ़ेस्ट में मैन्युअल तरीके से, KMI वर्शन के Android रिलीज़ वाले हिस्से की जानकारी देती हैं. ज़्यादा जानकारी के लिए, VINTF के kernel match rules देखें.
Android S में, केएमआई वर्शन के Android रिलीज़ वाले हिस्से को कर्नेल से निकाला जा सकता है और बिल्ड के समय डिवाइस मेनिफ़ेस्ट में इंजेक्ट किया जा सकता है.
आम तौर पर, कर्नेल कॉन्फ़िगरेशन की ज़रूरी शर्तें नहीं बदलती हैं. इसलिए, काम करने के तरीके के मैट्रिक्स में k
को कोड में बदलने की ज़रूरत नहीं है. हालांकि, अगर कभी भी कोर कॉन्फ़िगरेशन की ज़रूरी शर्तों में बदलाव करना पड़े, तो इन बातों का ध्यान रखें:
- साथ काम करने वाले डिवाइसों के मैट्रिक्स से उससे जुड़ी ज़रूरी शर्त हटा दी जाती है.
- केएमआई जनरेशन की शर्तों के आधार पर, नई ज़रूरी शर्तों की जांच करने के लिए, अतिरिक्त वीटीएस टेस्ट जोड़े गए हैं.
OTA मेटाडेटा में बूट इमेज का वर्शन
भले ही, बूट इमेज को ओटीए अपडेट की मदद से अपडेट किया गया हो, लेकिन इसे payload.bin
के ओटीए पेलोड फ़ॉर्मैट में रैप किया जाना चाहिए. ओटीए पेलोड, हर पार्टीशन के लिए एक version
फ़ील्ड को कोड में बदलता है. जब update_engine
किसी ओटीए पेलोड को मैनेज करता है, तो वह इस फ़ील्ड की तुलना करता है, ताकि यह पक्का किया जा सके कि पार्टीशन को डाउनग्रेड न किया गया हो.
भ्रम से बचने के लिए, ओटीए मेटाडेटा में बूट पार्टिशन के लिए version
फ़ील्ड को boot image version
कहा जाता है.
रैमडиск को हमेशा नए सिरे से बनाया जाता है. इसलिए, पूरी बूट इमेज के बारे में बताने के लिए, रैमडиск के टाइमस्टैंप का इस्तेमाल करना काफ़ी है. बूट इमेज के वर्शन में, kernel रिलीज़ को कोड में बदलने की ज़रूरत नहीं है. ऐसा तब तक नहीं करना चाहिए, जब तक कि आने वाले समय में किसी पुरानी बूट इमेज को नए kernel बाइनरी से स्टिच नहीं किया जा रहा हो.
ओटीए अपडेट से पहले, ओटीए क्लाइंट किसी भी अन्य पार्टीशन की तरह ही, बूट इमेज के वर्शन की जांच करता है.