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

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

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

यह ज़रूरी है कि कर्नेल और Android का उपयोगकर्ता स्पेस, दोनों bootconfig के साथ काम करें.

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

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

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

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

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

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

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

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

बिल्ड के ऐसे उदाहरण के लिए जिसमें mkbootimg को वेंडर बूट हेडर v4 के साथ बनाने के लिए, vendor_boot.img में किए गए बदलाव दिखाए गए हैं, mkbootimg changes for bootconfig देखें. ये काम करने के लिए, Cuttlefish में किए गए बदलाव देखें:

लागू करना

पार्टनर को अपने बूटलोडर में यह सुविधा जोड़नी होगी. साथ ही, बिल्ड के दौरान इस्तेमाल किए जाने वाले androidboot.* पैरामीटर को कर्नेल 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 वैरिएबल में मौजूद पैरामीटर से बनाए जाते हैं. ठीक उसी तरह जैसे कर्नेल cmdline, BOARD\_KERNEL\_CMDLINE से बनाया जाता है.

किसी भी androidboot.* पैरामीटर को उसी तरह से ले जाया जा सकता है. जैसे, यहां दिखाया गया है:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

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

कर्नेल पर जाने से पहले, बूटलोडर initramfs सेट अप करता है. The kernel boot configuration searches for the bootconfig section, and looks for it to be at the very end of initramfs, with the expected trailer.

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

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

पहली इमेज. Android 12 बूटकॉन्फ़िग के लिए मेमोरी का बंटवारा

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

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

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

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

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

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

धीरे-धीरे लागू करना और पुष्टि करना

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

यहां, धीरे-धीरे लागू करने और पुष्टि करने के चरण दिए गए हैं:

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

ओटीए अपग्रेड और डाउनग्रेड करने से जुड़ी ज़रूरी बातें

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

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

कर्नेल के वर्शन 12-5.4 और इसके बाद के वर्शन, बूटकॉन्फ़िग के साथ काम करते हैं. अगर इससे पहले के किसी वर्शन(11-5.4 भी शामिल है) पर डाउनग्रेड किया जा रहा है, तो कर्नेल 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 देखें.