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

Android 12 में, बूट कॉन्फ़िगरेशन सुविधा 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 से अलग किया जाना चाहिए.

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

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

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

बिल्ड के ऐसे उदाहरण के लिए, जो बिल्ड में mkbootimg बदलाव दिखाता है वेंडर बूट हेडर v4 के साथ vendor_boot.img, 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 पैरामीटर जोड़ें. इससे कर्नेल बूट कॉन्फ़िगरेशन सेक्शन:

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 को सेट अप करता है. कर्नेल बूट कॉन्फ़िगरेशन बूट कॉन्फ़िगरेशन सेक्शन से जुड़ी जानकारी खोज सकता है और उसे आपकी साइट के सबसे आखिर में अनुमानित ट्रेलर के साथ initramfs,.

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

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

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

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

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

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

bootconfig, कर्नेल के 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

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