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

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

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

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

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

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

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

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

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

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

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

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

वेंडर बूट हेडर 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 kernel cmdline पैरामीटर जोड़ें. इससे, कर्नेल को bootconfig सेक्शन ढूंढने में मदद मिलती है:

BOARD_KERNEL_CMDLINE += bootconfig

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

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

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

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

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

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

bootconfig मेमोरी ऐलोकेशन लेआउट का डायग्राम

पहली इमेज. Android 12 के bootconfig के लिए मेमोरी का बंटवारा

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

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

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

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

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

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

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

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

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

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

ओटीए (Over-The-Air) से वर्शन अपग्रेड और डाउनग्रेड करने से जुड़ी बातें

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

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

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

Android 11 और इससे पहले के वर्शन से Android 12 और उसके बाद के वर्शन पर अपग्रेड करने पर, kernel 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 देखें.