इस पेज पर, सामान्य कर्नेल इमेज (जीकेआई) के वर्शन से जुड़ी स्कीम के बारे में बताया गया है. ऐप्लिकेशन जेनरिक कर्नेल इमेज (जीकेआई) इसमें एक यूनीक आइडेंटिफ़ायर होता है, जिसे कर्नेल रिलीज़ कहा जाता है. कर्नेल रिलीज़ में शामिल है के. कर्नेल रिलीज़, रिलीज़ की जा रही इमेज के हिसाब से होती है, जबकि केएमआई वर्शन के लिए उस इंटरफ़ेस को दिखाता है जिससे रिलीज़ बनाई जाती है. KMI वर्शन इस डिवाइस पर काम कर सकता है कई कर्नेल रिलीज़ के लिए हैं. कोई भी कर्नेल रिलीज़, सिर्फ़ एक KMI वर्शन से जुड़ी होती है. अगर कभी भी कर्नेल मॉड्यूल इंटरफ़ेस को बदलना पड़ता है, तो KMI वर्शन में हुए बदलाव को दिखाने के लिए, KMI जनरेशन को दोहराया जाता है.
शर्तों के बारे में खास जानकारी
यहां दी गई टेबल में, इस पेज पर इस्तेमाल किए गए अहम शब्दों और देख सकते हैं.
नाम | प्रतीक | उदाहरण | ब्यौरा |
---|---|---|---|
कर्नेल रिलीज़ | W.x.y-Zzz-क-सफ़िक्स | 5.4.42-android12-0-foo | GKI रिलीज़ के लिए यूनीक आइडेंटिफ़ायर. यह मान है
uname ने लौटाया. |
KMI वर्शन | w.x-zzz-k | 5.4-android12-0 | यह GKI और के बीच कर्नेल मॉड्यूल इंटरफ़ेस (KMI) के बारे में बताता है डाइनैमिक रूप से लोड होने वाले कर्नेल मॉड्यूल (DLKM). |
सब-लेवल | y | 42 | इसमें कर्नेल रिलीज़ के रिलीज़ क्रम के बारे में बताया जाता है केएमआई वाला वर्शन इस्तेमाल कर रहे हैं. |
यहां दी गई टेबल में, रेफ़रंस के तौर पर अन्य मिलते-जुलते शब्दों की सूची दी गई है.
नाम | प्रतीक | उदाहरण | ब्यौरा |
---|---|---|---|
w.x.y | w.x.y | 5.4.42 |
ज़्यादा जानकारी के लिए, Linux kernel के लिए Makefiles देखें. इसके लिए, "KERNELRELEASE" खोजें. इस दस्तावेज़ में, w.x.y का सीधे तौर पर इस्तेमाल किया गया है. यह भी है इसे आम तौर पर तीन भागों वाला वर्शन नंबर कहा जाता है. VINTF में इस्तेमाल किया गया शब्द, कर्नल वर्शन, अन्य शब्दों के साथ भ्रम पैदा कर सकता है. खास तौर पर, w. libkver में, इस वैरिएबल को kernel_version_tuple कहा जाता है. इस टुपल में किसी भी अपडेट की वजह से कमी नहीं होनी चाहिए. इसमें OTA या मुख्य अपडेट भी शामिल हैं. |
कर्नेल ब्रांच | ज़ेडज़ेड-डब्ल्यू.एक्स | Android12-5.4 | इस शब्द का उपयोग में किया गया है कर्नेल के सामान्य ब्रांच टाइप. |
वर्शन | w | 5 | इस दस्तावेज़ में इस शब्द का इस्तेमाल नहीं किया गया है. इस वैरिएबल को यह कहा जाता है libkver में वर्शन है. |
पैच लेवल | x | 4 | इस दस्तावेज़ में इस शब्द का इस्तेमाल नहीं किया गया है. इस वैरिएबल को libkver में patch_level कहा जाता है. |
Android रिलीज़ | ज़ेडज़ेड | Android12 |
यह Android (डेज़र्ट) रिलीज़ का वह नंबर है जिससे कर्नेल जुड़ा है.
Android रिलीज़ नंबर को किसी भी अपडेट से कम नहीं करना चाहिए. इसमें ये अपडेट भी शामिल हैं ओटीए या मेनलाइन. |
केएमआई जनरेशन | 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
ब्यौरा
केएमआई वर्शन में, जीकेआई और जीकेआई के बीच कर्नेल मॉड्यूल इंटरफ़ेस (केएमआई) बताया गया है डाइनैमिक रूप से लोड होने वाले कर्नेल मॉड्यूल (DLKM).
अगर दो कर्नेल रिलीज़ का KMI वर्शन एक ही है, तो वे एक ही कर्नेल मॉड्यूल इंटरफ़ेस लागू करते हैं. एक के साथ काम करने वाले DLKM, दूसरे के साथ भी काम करते हैं.
ओटीए अपडेट की वजह से, केएमआई वर्शन में कमी नहीं होनी चाहिए.
सब-लेवल
सब-लेवल 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
देखें.
वीआईएनटीएफ़ की जांच
Android 11 या उससे पहले के वर्शन के लिए, डिवाइस बनाने वाली कंपनियां, डिवाइस मेनिफ़ेस्ट में मैन्युअल तरीके से, KMI वर्शन के Android रिलीज़ वाले हिस्से की जानकारी देती हैं. ज़्यादा जानकारी के लिए, VINTF के kernel match नियम देखें.
Android S में, KMI वर्शन के Android रिलीज़ वाले हिस्से को कोर से निकाला जा सकता है और बिल्ड के समय डिवाइस मेनिफ़ेस्ट में इंजेक्ट किया जा सकता है.
आम तौर पर, कर्नेल कॉन्फ़िगरेशन की ज़रूरी शर्तें नहीं बदलती हैं. इसलिए, काम करने के तरीके के मैट्रिक्स में k
को कोड में बदलने की ज़रूरत नहीं है. हालांकि, अगर कभी भी कोर कॉन्फ़िगरेशन की ज़रूरी शर्तों में बदलाव करना पड़े, तो इन बातों का ध्यान रखें:
- साथ काम करने वाले मैट्रिक्स से जुड़ी ज़रूरी शर्त को हटा दिया गया है.
- शर्तों के साथ नई शर्तों की जांच करने के लिए, अतिरिक्त वीटीएस टेस्ट जोड़े गए हैं पर काम कर रहा था.
ओटीए मेटाडेटा में इमेज का बूट वर्शन
भले ही, बूट इमेज को ओटीए अपडेट की मदद से अपडेट किया गया हो, लेकिन इसे payload.bin
के ओटीए पेलोड फ़ॉर्मैट में रैप किया जाना चाहिए. OTA पेलोड,
हर सेगमेंट के लिए version
फ़ील्ड. जब update_engine
किसी OTA पेलोड को मैनेज करता है, तो वह इस फ़ील्ड की तुलना करता है, ताकि यह पक्का किया जा सके कि पार्टीशन को डाउनग्रेड न किया गया हो.
किसी भी तरह की उलझन से बचने के लिए, ओटीए में बूट पार्टिशन के लिए version
फ़ील्ड
मेटाडेटा को boot image version
कहा जाता है.
रैमडиск को हमेशा नए सिरे से बनाया जाता है. इसलिए, पूरी बूट इमेज के बारे में बताने के लिए, रैमडиск के टाइमस्टैंप का इस्तेमाल करना काफ़ी है. इसके लिए, बूट इमेज वर्शन में कर्नेल रिलीज़ एन्कोड करें, जब तक कि आप पुरानी इमेज को स्टिच न कर रहे हों इमेज को आने वाले समय में नई कर्नेल बाइनरी में चालू करें.
ओटीए अपडेट से पहले, ओटीए क्लाइंट बूट इमेज वर्शन की जांच करता है किसी अन्य विभाजन की तरह ही रख सकते हैं.