Android 12 में बूट कॉन्फ़िगरेशन लागू करें

Android 12 में, बूट कॉन्फ़िगरेशन की सुविधा androidboot.* कर्नेल cmdline के विकल्पों को Android 11 और उससे पहले के वर्शन के साथ बदल देती है. बूट कॉन्फ़िगरेशन की सुविधा, बिल्ड और बूटलोडर से Android 12 तक कॉन्फ़िगरेशन की जानकारी भेजने का तरीका है.

इस सुविधा की मदद से, Android उपयोगकर्ता-स्पेस के कॉन्फ़िगरेशन पैरामीटर को कर्नेल के कॉन्फ़िगरेशन पैरामीटर से अलग किया जा सकता है. लंबे androidboot.* कर्नेल पैरामीटर को बूट कॉन्फ़िगरेशन फ़ाइल में ले जाने से कर्नेल cmdline पर जगह बनती है और यह आने वाले समय में इस्तेमाल करने के लिए उपलब्ध हो जाती है.

कर्नेल और Android यूज़र-स्पेस, दोनों में bootconfig काम करना चाहिए.

  • पहली रिलीज़, जिसमें यह सुविधा उपलब्ध है: Android 12
  • यह सहायता वाला पहला कर्नेल वर्शन: 12-5.4.xx कर्नेल

12-5.10.xx कर्नेल वर्शन के साथ लॉन्च होने वाले नए डिवाइसों के लिए, बूट कॉन्फ़िगरेशन की सुविधा लागू करें. अगर डिवाइस अपग्रेड किए जा रहे हैं, तो आपको इस सुविधा को लागू करने की ज़रूरत नहीं है.

उदाहरण और सोर्स

इस सेक्शन में उदाहरण और सोर्स कोड देखते समय, ध्यान रखें कि bootconfig कोड का फ़ॉर्मैट, Android 11 और इससे पहले के वर्शन में इस्तेमाल किए जाने वाले कर्नेल cmdline के फ़ॉर्मैट से थोड़ा अलग है. हालांकि, आपके इस्तेमाल के हिसाब से नीचे दिया गया अंतर अहम है:

  • पैरामीटर को न्यूलाइन एस्केप सीक्वेंस \n से अलग करना चाहिए, न कि स्पेस से.

बूटलोडर का उदाहरण

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

बिल्ड का उदाहरण

वेंडर बूट हेडर v4 के साथ vendor_boot.img को बनाने के mkbootimg बदलाव दिखाने वाले बिल्ड के उदाहरण के लिए, mkbootimg changes for bootconfig देखें. नीचे बताए गए काम करने के लिए, कटलफ़िश में होने वाले बदलाव देखें:

लागू करने का तरीका

पार्टनर को अपने बूटलोडर के लिए सहायता जोड़नी होगी. साथ ही, उन्हें अपने बिल्ड-टाइम androidboot.* पैरामीटर को kernel cmdline से बूट कॉन्फ़िगरेशन फ़ाइल में ले जाना होगा. इस बदलाव को तेज़ी से लागू करने का सबसे अच्छा तरीका यह है कि इसे तेज़ी से लागू किया जाए. इंंक्रीमेंटल प्रोसेस को फ़ॉलो करने के बारे में जानकारी के लिए, इंक्रीमेंटल लागू करने और पुष्टि करने वाला सेक्शन देखें.

अगर आपने ऐसे बदलाव किए हैं जो androidboot.* पैरामीटर के लिए /proc/cmdline फ़ाइल को खोजते हैं, तो उन्हें /proc/bootconfig फ़ाइल पर ले जाएं. ro.boot.* प्रॉपर्टी, bootconfig की नई वैल्यू के साथ सेट की गई हैं. इसलिए, आपको इन प्रॉपर्टी का इस्तेमाल करके कोड में बदलाव करने की ज़रूरत नहीं है.

बिल्ड में बदलाव करें

सबसे पहले, अपने बूट हेडर वर्शन को वर्शन 4 में बदलें:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

bootconfig कर्नेल cmdline पैरामीटर जोड़ें. इससे कर्नेल बूट कॉन्फ़िगरेशन सेक्शन खोजता है:

BOARD_KERNEL_CMDLINE += bootconfig

बूट कॉन्फ़िगरेशन पैरामीटर, BOARD_BOOTCONFIG वैरिएबल में मौजूद पैरामीटर से बनाए जाते हैं. यह ठीक वैसा ही है जैसे कि kernel cmdline को BOARD\_KERNEL\_CMDLINE से बनाया जाता है.

किसी भी androidboot.* पैरामीटर को ऐसे ही ट्रांसफ़र किया जा सकता है:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

बूटलोडर में किए गए बदलाव

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

बूटलोडर को vendor_boot.img के लेआउट की जानकारी, वेंडर बूट इमेज हेडर से मिलती है.

बूट कॉन्फ़िगरेशन मेमोरी ऐलोकेशन लेआउट का डायग्राम

पहला डायग्राम. Android 12 के लिए, बूट कॉन्फ़िगरेशन में मेमोरी असाइन करने की सुविधा

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

  • पैरामीटर
  • 4 B साइज़ parameters size
  • 4 B साइज़ parameters checksum
  • 12 B बूट कॉन्फ़िगरेशन मैजिक स्ट्रिंग (#BOOTCONFIG\n)

पैरामीटर दो सोर्स से आते हैं: ऐसे पैरामीटर जिनका पता बिल्ड के समय से है और ऐसे पैरामीटर जिनके बारे में बिल्ड के समय पता नहीं होता. अनजान पैरामीटर जोड़ने ज़रूरी हैं.

बिल्ड के समय वाले पैरामीटर, बूट कॉन्फ़िगरेशन सेक्शन में vendor_boot इमेज के आखिर में पैकेज किए जाते हैं. सेक्शन का साइज़, बाइट के तौर पर वेंडर बूट हेडर फ़ील्ड vendor_bootconfig_size में सेव किया जाता है.

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

अगर बूट कॉन्फ़िगरेशन ट्रेलर लागू करने के बाद, आपको कोई पैरामीटर जोड़ने की ज़रूरत है, तो ट्रेलर को ओवरराइट करें और उसे फिर से इस्तेमाल करें.

इंंक्रीमेंटल लागू करना और पुष्टि करना

इस सेक्शन में दी गई प्रोसेस का पालन करके, बूट कॉन्फ़िगरेशन की सुविधा को धीरे-धीरे लागू करें. bootconfig पैरामीटर जोड़े जाने के दौरान, kernel cmdline पैरामीटर को खाली छोड़ दें.

पुष्टि के साथ, बढ़ते क्रम में लागू करने के लिए ये चरण हैं:

  1. बूटलोडर को बनाएं और उसमें बदलाव करें. इसके बाद, ये काम करें:
    1. नया बूट कॉन्फ़िगरेशन पैरामीटर जोड़ने के लिए, BOARD_BOOTCONFIG वैरिएबल का इस्तेमाल करें.
    2. kernel cmdline पैरामीटर को पहले की तरह रखें, ताकि डिवाइस सही तरीके से चालू हो सके. इससे डीबग करना और पुष्टि करना ज़्यादा आसान हो जाता है.
  2. /proc/bootconfig के कॉन्टेंट की जांच करके, अपने काम की पुष्टि करें. पुष्टि करें कि डिवाइस चालू होने के बाद, आपको जोड़ा गया नया पैरामीटर दिखता है.
  3. BOARD_BOOTCONFIG वैरिएबल और बूटलोडर का इस्तेमाल करके, androidboot.* पैरामीटर को kernel cmdline से bootconfig में ले जाएं.
  4. पुष्टि करें कि हर पैरामीटर /proc/bootconfig में मौजूद है और वे /proc/cmdline में नहीं हैं. अगर इसकी पुष्टि की जा सकती है, तो लागू करने की प्रोसेस पूरी हो गई है.

ओटीए पर अपग्रेड और डाउनग्रेड करने के बारे में बातें

जब आप Android के अलग-अलग वर्शन या कर्नेल के अलग-अलग वर्शन के बीच ओटीए अपग्रेड और डाउनग्रेड मैनेज करते हों, तब खास बातों का ध्यान रखना चाहिए.

Android 12 पहला वर्शन है, जिसमें बूट कॉन्फ़िगरेशन की सुविधा मौजूद है. अगर इससे पहले किसी भी वर्शन पर डाउनग्रेड किया जाता है, तो बूट कॉन्फ़िगरेशन के बजाय kernel cmdline पैरामीटर का इस्तेमाल करना होगा.

Kernel वर्शन 12-5.4 और इसके बाद के वर्शन, बूट कॉन्फ़िगरेशन के साथ काम करते हैं. अगर इससे पहले किसी भी वर्शन(जिसमें 11-5.4 शामिल है) पर डाउनग्रेड किया जाता है, तो kernel cmdline पैरामीटर का इस्तेमाल किया जाना चाहिए.

Android 11 और उससे पहले के वर्शन से लेकर Android 12 और उसके बाद वाले वर्शन में किए जाने वाले अपग्रेड, कर्नेल cmdline पैरामीटर का इस्तेमाल जारी रख सकते हैं. कर्नेल वर्शन को अपग्रेड करने पर भी ऐसा ही होता है.

समस्या हल करना

पुष्टि करें चरण पूरा करने के दौरान, अगर आपको /proc/bootconfig में सही पैरामीटर नहीं दिखते हैं, तो logcat में कर्नेल लॉग देखें. अगर कर्नेल के साथ बूट कॉन्फ़िगरेशन के लिए काम करता है, तो उसके लिए एक लॉग एंट्री हमेशा मौजूद रहेगी.

लॉग आउटपुट का उदाहरण

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

अगर आपको गड़बड़ी का लॉग दिखता है, तो इसका मतलब है कि बूट कॉन्फ़िगरेशन को लोड करने में कोई समस्या थी. अलग-अलग तरह की गड़बड़ी देखने के लिए, init/main.c देखें.