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

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

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

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

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

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

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

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

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

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

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

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

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

लागू करना

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

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

बदलावों को लागू करना

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

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

bootconfig कर्नल cmdline पैरामीटर जोड़ें. इससे कर्नल, bootconfig सेक्शन को ढूंढता है:

BOARD_KERNEL_CMDLINE += bootconfig

bootconfig पैरामीटर, BOARD_BOOTCONFIG वैरिएबल में मौजूद पैरामीटर से बनाए जाते हैं. ठीक उसी तरह जैसे कर्नल cmdline, BOARD\_KERNEL\_CMDLINE से बनाया जाता है.

किसी भी androidboot.* पैरामीटर को पहले जैसा ही रखा जा सकता है. जैसे:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

बूटलोडर में हुए बदलाव

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

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

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

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

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

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

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

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

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

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

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

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

पुष्टि के साथ, इंक्रीमेंटल तरीके से लागू करने का तरीका यहां दिया गया है:

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

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

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

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

कर्नेल के वर्शन 12-5.4 और इसके बाद के वर्शन में, bootconfig काम करता है. अगर आपको इससे पहले के किसी वर्शन(इसमें 11-5.4 भी शामिल है) पर डाउनग्रेड करना है, तो कर्नेल सीएमडीलाइन पैरामीटर का इस्तेमाल करना होगा.

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

समस्या का हल

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

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

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

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