Android 12 में Bootconfig लागू करना

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

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

कर्नेल और एंड्रॉइड यूजर-स्पेस दोनों को bootconfig समर्थन करना चाहिए।

  • पहली रिलीज़ जिसमें यह समर्थन है: Android 12
  • पहला कर्नेल संस्करण जिसमें यह समर्थन है: 12-5.4.xx कर्नेल

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

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

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

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

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

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

उदाहरण बनाएँ

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

कार्यान्वयन

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

यदि आपके पास ऐसे परिवर्तन हैं जो 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 सेट करता है। कर्नेल बूट कॉन्फ़िगरेशन बूटकॉन्फिग अनुभाग की खोज करता है, और अपेक्षित ट्रेलर के साथ initramfs, के बिल्कुल अंत में देखता है।

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

Diagram of bootconfig memory allocation layout

चित्र 1. Android 12 बूटकॉन्फिग मेमोरी आवंटन

बूटलोडर मेमोरी में बूटकॉन्फिग अनुभाग बनाता है। Bootconfig अनुभाग में निम्नलिखित के लिए मेमोरी आवंटन शामिल हैं:

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

पैरामीटर दो स्रोतों से आते हैं: पैरामीटर जो निर्माण के समय ज्ञात होते हैं, और पैरामीटर जो निर्माण के समय ज्ञात नहीं होते हैं। अज्ञात पैरामीटर जोड़े जाने चाहिए.

निर्माण के समय ज्ञात पैरामीटर्स को बूटकॉन्फिग अनुभाग में vendor_boot छवि के अंत में पैक किया जाता है। अनुभाग का आकार विक्रेता बूट हेडर फ़ील्ड vendor_bootconfig_size में संग्रहीत किया जाता है (बाइट्स के रूप में)।

जो पैरामीटर बिल्ड टाइम पर ज्ञात नहीं होते हैं वे केवल बूटलोडर में रनटाइम पर ज्ञात होते हैं। बूटकॉन्फिग ट्रेलर लागू होने से पहले इन्हें बूटकॉन्फिग पैरामीटर अनुभाग के अंत में जोड़ा जाना चाहिए।

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

वृद्धिशील कार्यान्वयन और सत्यापन

इस अनुभाग में दी गई प्रक्रिया का पालन करके बूटकॉन्फिग सुविधा को क्रमिक रूप से लागू करें। बूटकॉन्फिग पैरामीटर जोड़े जाने के दौरान कर्नेल सीएमडीलाइन पैरामीटर को अछूता छोड़ दें।

सत्यापन के साथ वृद्धिशील कार्यान्वयन के लिए ये चरण हैं:

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

ओटीए अपग्रेड और डाउनग्रेडिंग पर विचार

जब आप एंड्रॉइड के विभिन्न संस्करणों, या विभिन्न कर्नेल संस्करणों के बीच ओटीए अपग्रेड और डाउनग्रेड का प्रबंधन कर रहे हैं, तो विशेष ध्यान रखा जाना चाहिए।

एंड्रॉइड 12 बूटकॉन्फिग सपोर्ट वाला पहला संस्करण है। यदि उससे पहले किसी भी संस्करण में अपग्रेड किया जा रहा है, तो बूटकॉन्फिग के बजाय कर्नेल सीएमडीलाइन पैरामीटर का उपयोग किया जाना चाहिए।

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

एंड्रॉइड 11 और पुराने से एंड्रॉइड 12 और बाद में अपग्रेड कर्नेल सीएमडीलाइन पैरामीटर का उपयोग करना जारी रख सकते हैं। यही बात कर्नेल संस्करणों को अपग्रेड करने के लिए भी लागू होती है।

समस्या निवारण

जब आप सत्यापन चरण निष्पादित करते हैं, यदि आपको /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 देखें।