Android 12 में, सामान्य boot इमेज को सामान्य कर्नेल इमेज (जीकेआई) कहा जाता है. इसमें सामान्य रैमडिस्क और जीकेआई कर्नेल शामिल होता है.
Android 13 के साथ लॉन्च होने वाले डिवाइसों के लिए, सामान्य ramdisk को boot इमेज से हटा दिया जाता है और इसे अलग init_boot इमेज में रख दिया जाता है. इस बदलाव के बाद, boot इमेज में सिर्फ़ GKI कर्नल रह जाता है.
Android 12 या कर्नल के पुराने वर्शन का इस्तेमाल करने वाले डिवाइसों को अपग्रेड करने के लिए, सामान्य रैमडिस्क उसी जगह पर रहता है जहां वह था. इसके लिए, नई init_boot इमेज की ज़रूरत नहीं होती.
जेनेरिक रैमडिस्क बनाने के लिए, वेंडर के हिसाब से तय किए गए संसाधनों को रैमडिस्क से बाहर ले जाएं, ताकि जेनेरिक रैमडिस्क में सिर्फ़ पहले चरण का init और एक प्रॉपर्टी फ़ाइल हो, जिसमें टाइमस्टैंप की जानकारी शामिल हो.
ऐसे डिवाइसों पर:
recoveryके लिए अलग से पार्टीशन का इस्तेमाल न करें. सभी रिकवरी बिट, सामान्य रैमडिस्क सेvendor_bootरैमडिस्क में ट्रांसफ़र हो जाते हैं.recoveryपार्टीशन का इस्तेमाल करें.recoveryramdisk में कोई बदलाव करने की ज़रूरत नहीं है, क्योंकिrecoveryramdisk में सब कुछ शामिल होता है.
वास्तुकला
यहां दिए गए डायग्राम में, Android 12 और इसके बाद के वर्शन वाले डिवाइसों के आर्किटेक्चर के बारे में बताया गया है.
Android 13 के साथ लॉन्च होने वाले डिवाइस में, नई init_boot इमेज होती है. इसमें सामान्य रैमडिस्क होता है.
Android 12 से Android 13 पर अपग्रेड किए गए डिवाइस, Android 12 के साथ इस्तेमाल किए गए आर्किटेक्चर का ही इस्तेमाल करते हैं.
Android 13 के साथ लॉन्च किया गया, कोई खास रिकवरी सिस्टम नहीं है
पहली इमेज. ऐसे डिवाइस जो GKI के साथ Android 13 पर लॉन्च हो रहे हैं या अपग्रेड हो रहे हैं. इनमें रिकवरी के लिए कोई अलग से सुविधा नहीं है.
Android 13 के साथ लॉन्च किया गया, डेडिकेटेड और A/B रिकवरी (डेडिकेटेड रैमडिस्क)
दूसरी इमेज. ऐसे डिवाइस जो Android 13 पर लॉन्च किए जा रहे हैं या अपग्रेड किए जा रहे हैं. इनमें जीकेआई, डेडिकेटेड, और ए/बी रिकवरी की सुविधा है.
अगर डिवाइस में recovery_a और recovery_b पार्टिशन हैं, तो इस इमेज को देखें.
Android 13 के साथ लॉन्च किया गया, डेडिकेटेड और नॉन-ए/बी रिकवरी (डेडिकेटेड रैमडिस्क)
तीसरी इमेज. ऐसे डिवाइस जो Android 13 पर लॉन्च हो रहे हैं या अपग्रेड हो रहे हैं. इनमें GKI, डेडिकेटेड, और नॉन-A/B रिकवरी की सुविधा है.
अगर डिवाइस में recovery नाम का कोई पार्टिशन है, लेकिन उसमें स्लॉट सफ़िक्स नहीं है, तो इस इमेज को देखें.
Android 12 पर लॉन्च या अपग्रेड किया गया, रिकवरी के लिए कोई खास सुविधा नहीं है
चौथी इमेज. GKI के साथ Android 12 पर लॉन्च या अपग्रेड किए जा रहे डिवाइसों के लिए, कोई खास रिकवरी मोड नहीं है.
Android 12 लॉन्च करें या उस पर अपग्रेड करें. साथ ही, रिकवरी के लिए खास तौर पर तैयार किया गया और A/B रिकवरी (खास तौर पर तैयार किया गया रैमडिस्क)
पांचवीं इमेज. ऐसे डिवाइस जो Android 12 पर लॉन्च किए जा रहे हैं या अपग्रेड किए जा रहे हैं. इनमें GKI, डेडिकेटेड, और A/B रिकवरी की सुविधा उपलब्ध है.
अगर डिवाइस में recovery_a और recovery_b पार्टीशन हैं, तो इस इमेज को देखें.
Android 12 को लॉन्च या अपग्रेड करें, डेडिकेटेड और नॉन-ए/बी रिकवरी (डेडिकेटेड रैमडिस्क)
छठी इमेज. ऐसे डिवाइस जो Android 12 पर अपग्रेड हो रहे हैं या लॉन्च हो रहे हैं. इनमें GKI, डेडिकेटेड, और नॉन-A/B रिकवरी की सुविधा है.
अगर डिवाइस में recovery नाम का कोई पार्टिशन है, लेकिन उसमें स्लॉट सफ़िक्स नहीं है, तो इस इमेज को देखें.
Android 12 पर अपग्रेड करें, रिकवरी-ऐज़-बूट (रिकवरी-ऐज़-रैमडिस्क)
सातवीं इमेज. Android 12 पर अपग्रेड किए गए डिवाइसों के लिए, जीकेआई नहीं है और रिकवरी-ऐज़-बूट की सुविधा है.
Android 12 पर अपग्रेड करें, रिकवरी के लिए अलग से रैमडिस्क (dedicated ramdisk)
आठवीं इमेज. Android 12 पर अपग्रेड किए जा रहे डिवाइसों के लिए, जीकेआई नहीं है और रिकवरी के लिए अलग से पार्टीशन है.
बूट इमेज का कॉन्टेंट
Android बूट इमेज में यह कॉन्टेंट शामिल होता है.
Android 13 के साथ लॉन्च होने वाले डिवाइसों के लिए
init_bootइमेज जोड़ी गई- हेडर वर्शन V4
- जेनेरिक रैमडिस्क इमेज
जेनरिक
bootइमेज- हेडर वर्शन V3 या
V4
- GKI boot.img सर्टिफ़िकेशन के लिए
boot_signature(सिर्फ़ v4). सर्टिफ़ाइड GKIboot.imgपर, वेरिफ़ाइड बूट के लिए हस्ताक्षर नहीं किया गया है. OEM को अब भी, डिवाइस के हिसाब से AVB कुंजी का इस्तेमाल करके, पहले से बनाए गएboot.imgपर हस्ताक्षर करने होंगे. - सामान्य
cmdline(GENERIC_KERNEL_CMDLINE) - GKI कर्नेल
- GKI boot.img सर्टिफ़िकेशन के लिए
- जेनरिक रैमडिस्क इमेज
- सिर्फ़ Android 12 और इससे पहले के वर्शन पर
bootकी इमेज में शामिल किया गया
- सिर्फ़ Android 12 और इससे पहले के वर्शन पर
- हेडर वर्शन V3 या
V4
vendor_bootइमेज (ज़्यादा जानकारी के लिए, वेंडर बूट पार्टिशन देखें)vendor_bootheader- डिवाइस के हिसाब से
cmdline(BOARD_KERNEL_CMDLINE)
- डिवाइस के हिसाब से
vendor_bootramdisk imagelib/modules- खाता वापस पाने के संसाधन (अगर खाता वापस पाने की कोई सुविधा उपलब्ध नहीं है)
dtbइमेज
recoveryइमेज- हेडर वर्शन V2
- अगर ज़रूरी हो, तो डिवाइस के हिसाब से रिकवरी के लिए
cmdline - नॉन-A/B रिकवरी पार्टिशन के लिए, हेडर का कॉन्टेंट स्टैंडअलोन होना चाहिए. इसके बारे में जानने के लिए, रिकवरी इमेज देखें. उदाहरण के लिए:
cmdlineकोbootऔरvendor_bootcmdlineके साथ नहीं जोड़ा गया है.- अगर ज़रूरी हो, तो हेडर में रिकवरी डीटीबीओ की जानकारी दी जाती है.
- A/B रिकवरी पार्टिशन के लिए, कॉन्टेंट को
bootऔरvendor_bootसे जोड़ा या अनुमान लगाया जा सकता है. उदाहरण के लिए: cmdlineकोbootऔरvendor_bootcmdlineके साथ जोड़ा गया है.- DTBO को
vendor_bootहेडर से समझा जा सकता है.
- अगर ज़रूरी हो, तो डिवाइस के हिसाब से रिकवरी के लिए
recoveryramdisk image- खाता वापस पाने से जुड़े संसाधन
- नॉन-A/B रिकवरी पार्टिशन के लिए, रैमडिस्क का कॉन्टेंट स्टैंडअलोन होना चाहिए. रिकवरी इमेज देखें. उदाहरण के लिए:
lib/modulesमें, रिकवरी मोड को बूट करने के लिए ज़रूरी सभी कर्नल मॉड्यूल होने चाहिए- रिकवरी रैमडिस्क में
initहोना चाहिए. - A/B रिकवरी पार्टिशन के लिए, रिकवरी रैमडिस्क को सामान्य और
vendor_bootरैमडिस्क से पहले जोड़ा जाता है. इसलिए, इसे स्टैंडअलोन होने की ज़रूरत नहीं होती. उदाहरण के लिए: lib/modulesमें,vendor_bootरैमडिस्क में मौजूद कर्नल मॉड्यूल के अलावा, सिर्फ़ रिकवरी मोड को बूट करने के लिए ज़रूरी अतिरिक्त कर्नल मॉड्यूल शामिल हो सकते हैं.- ऐसा हो सकता है कि
/initपर सिंबल लिंक मौजूद हो, लेकिन बूट इमेज में मौजूद पहले चरण के/initबाइनरी की वजह से यह लिंक काम न कर रहा हो.
- हेडर वर्शन V2
जेनरिक रैमडिस्क इमेज का कॉन्टेंट
सामान्य रैमडिस्क में ये कॉम्पोनेंट शामिल होते हैं.
initsystem/etc/ramdisk/build.propro.PRODUCT.bootimg.* buildप्रॉप- माउंट पॉइंट के लिए खाली डायरेक्ट्री:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/ first_stage_ramdisk/- माउंट पॉइंट के लिए डुप्लीकेट की गई खाली डायरेक्ट्री:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- माउंट पॉइंट के लिए डुप्लीकेट की गई खाली डायरेक्ट्री:
बूट इमेज इंटिग्रेशन
बिल्ड फ़्लैग से यह कंट्रोल किया जाता है कि init_boot, boot, recovery, और vendor_boot इमेज कैसे बनाई जाती हैं. बूलियन बोर्ड वैरिएबल की वैल्यू, स्ट्रिंग true होनी चाहिए या खाली होनी चाहिए (यह डिफ़ॉल्ट वैल्यू है).
TARGET_NO_KERNEL. यह वैरिएबल बताता है कि बिल्ड, पहले से बनी बूट इमेज का इस्तेमाल करता है या नहीं. अगर इस वैरिएबल कोtrueपर सेट किया गया है, तोBOARD_PREBUILT_BOOTIMAGEको पहले से बनी बूट इमेज (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img) की जगह पर सेट करेंBOARD_USES_RECOVERY_AS_BOOT. इस वैरिएबल से पता चलता है कि डिवाइस,recoveryइमेज कोbootइमेज के तौर पर इस्तेमाल करता है या नहीं. GKI का इस्तेमाल करते समय, यह वैरिएबल खाली होता है. साथ ही, रिकवरी संसाधनों कोvendor_bootमें ले जाना चाहिए.BOARD_USES_GENERIC_KERNEL_IMAGE. यह वैरिएबल दिखाता है कि बोर्ड, GKI का इस्तेमाल करता है. इस वैरिएबल से sysprops याPRODUCT_PACKAGESपर कोई असर नहीं पड़ता.यह बोर्ड-लेवल का GKI स्विच है. यहां दिए गए सभी वैरिएबल, इस वैरिएबल के हिसाब से काम करते हैं.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. यह वैरिएबल कंट्रोल करता है किvendor_bootके लिए, ramdisk रिकवरी के संसाधन बनाए गए हैं या नहीं.trueपर सेट होने पर, रिकवरी के संसाधन सिर्फ़vendor-ramdisk/के लिए बनाए जाते हैं. इन्हेंrecovery/root/के लिए नहीं बनाया जाता.अगर यह फ़ील्ड खाली है, तो रिकवरी के संसाधन सिर्फ़
recovery/root/के लिए बनाए जाते हैं,vendor-ramdisk/के लिए नहीं.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. यह वैरिएबल कंट्रोल करता है कि GSI AVB कुंजियां,vendor_bootके लिए बनाई गई हैं या नहीं.trueपर सेट होने पर, अगरBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:सेट है, तो GSI AVB कुंजियां
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avbके लिए बनाई जाती हैं.Is unset, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.
अगर
BOARD_RECOVERY_AS_ROOTकी वैल्यू खाली है, तो:सेट है, तो GSI AVB कुंजियां
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avbके लिए बनाई जाती हैं.Is unset, GSI AVB कुंजियां
$ANDROID_PRODUCT_OUT/ramdisk/avbपर बनाई जाती हैं.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. यह वैरिएबल कंट्रोल करता है किrecoveryइमेज में कर्नल है या नहीं. Android 12 के साथ लॉन्च किए गए और A/Brecoveryपार्टीशन का इस्तेमाल करने वाले डिवाइसों को इस वैरिएबल कोtrueपर सेट करना होगा. Android 12 के साथ लॉन्च होने वाले और नॉन-ए/बी का इस्तेमाल करने वाले डिवाइसों को इस वैरिएबल कोfalseपर सेट करना होगा, ताकि रिकवरी इमेज को अलग से न रखना पड़े.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. इस वैरिएबल से यह कंट्रोल किया जाता है कि टारगेट फ़ाइलों मेंIMAGES/के तहत$OUT/boot*.imgको कॉपी किया जाए या नहीं.aosp_arm64को इस वैरिएबल कोtrueपर सेट करना होगा.अन्य डिवाइसों को इस वैरिएबल को खाली छोड़ना होगा.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. यह वैरिएबल कंट्रोल करता है किinit_boot.imgजनरेट किया गया है या नहीं. साथ ही, यह वैरिएबलinit_boot.imgका साइज़ सेट करता है. इस विकल्प को सेट करने पर, सामान्य रैमडिस्क कोboot.imgके बजायinit_boot.imgमें जोड़ा जाता है. साथ ही, चेन किए गए vbmeta के लिए,BOARD_AVB_INIT_BOOT*वैरिएबल सेट करने पड़ते हैं.
अनुमति वाले कॉम्बिनेशन
| कॉम्पोनेंट या वैरिएबल | रिकवरी पार्टीशन के बिना डिवाइस को अपग्रेड करना | रिकवरी पार्टीशन की मदद से डिवाइस को अपग्रेड करना | रिकवरी पार्टिशन के बिना डिवाइस लॉन्च करना | A/B रिकवरी पार्टीशन वाले डिवाइस को लॉन्च करना | बिना ए/बी रिकवरी पार्टिशन वाले डिवाइस को लॉन्च करना | aosp_arm64 |
|---|---|---|---|---|---|---|
boot शामिल है |
हां | हां | हां | हां | हां | हां |
इसमें init_boot (Android 13) शामिल है |
नहीं | नहीं | हां | हां | हां | हां |
vendor_boot शामिल है |
ज़रूरी नहीं | ज़रूरी नहीं | हां | हां | हां | नहीं |
recovery शामिल है |
नहीं | हां | नहीं | हां | हां | नहीं |
BOARD_USES_RECOVERY_AS_BOOT |
true |
खाली | खाली | खाली | खाली | खाली |
BOARD_USES_GENERIC_KERNEL_IMAGE |
खाली | खाली | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
खाली | true या खाली |
खाली | true या खाली |
true या खाली |
खाली |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
खाली | > 0 | खाली | > 0 | > 0 | खाली |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
खाली | खाली | true |
खाली | खाली | खाली |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
खाली | खाली | true |
true |
true |
खाली |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
खाली | खाली | खाली | true |
खाली | खाली |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
खाली | खाली | खाली | खाली | खाली | true |
जिन डिवाइसों में recovery का अलग पार्टीशन होता है वे PRODUCT_BUILD_RECOVERY_IMAGE को true या खाली पर सेट कर सकते हैं. इन डिवाइसों के लिए, अगर BOARD_RECOVERYIMAGE_PARTITION_SIZE सेट है, तो recovery इमेज बनाई जाती है.
बूट के लिए चेन किए गए vbmeta को चालू करें
boot और init_boot इमेज के लिए, चेन किए गए vbmeta का इस्तेमाल करने का सुझाव दिया जाता है, ताकि स्वतंत्र रूप से ओटीए किया जा सके. इनके बारे में बताएं:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
उदाहरण के लिए, यह बदलाव देखें.
System-as-root
GKI का इस्तेमाल करने वाले डिवाइसों के लिए, सिस्टम-ऐज़-रूट की सुविधा काम नहीं करती. ऐसे डिवाइसों पर, BOARD_BUILD_SYSTEM_ROOT_IMAGE खाली होना चाहिए. सिस्टम-ऐज़-रूट की सुविधा, डाइनैमिक पार्टीशन का इस्तेमाल करने वाले डिवाइसों के लिए भी उपलब्ध नहीं है.
प्रॉडक्ट कॉन्फ़िगरेशन
जेनेरिक रैमडिस्क का इस्तेमाल करने वाले डिवाइसों को, उन फ़ाइलों की सूची इंस्टॉल करनी होगी जिन्हें रैमडिस्क में इंस्टॉल करने की अनुमति है. इसके लिए, device.mk में यहां दी गई वैल्यू डालें:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
generic_ramdisk.mk फ़ाइल, अन्य मेकफ़ाइलों को गलती से रैमडिस्क में अन्य फ़ाइलें इंस्टॉल करने से भी रोकती है. ऐसी फ़ाइलों को generic_ramdisk.mk में ले जाएं.vendor_ramdisk
डिवाइसों को सेट अप करने का तरीका
Android 13 के साथ लॉन्च होने वाले डिवाइसों, Android 12 पर अपग्रेड करने वाले डिवाइसों, और Android 12 के साथ लॉन्च होने वाले डिवाइसों के लिए, सेटअप करने के निर्देश अलग-अलग होते हैं. Android 13 पर, Android 12 की तरह ही सेट अप किए गए हों
Android 12 पर अपग्रेड किए गए डिवाइसों के लिए:
BOARD_USES_RECOVERY_AS_BOOTकी वैल्यू को बनाए रख सकता है. ऐसा करने पर, वे लेगसी कॉन्फ़िगरेशन का इस्तेमाल कर रहे होते हैं और नए बिल्ड वैरिएबल खाली होने चाहिए. अगर ऐसे डिवाइस:BOARD_USES_RECOVERY_AS_BOOTकोtrueपर सेट करें. आर्किटेक्चर तीसरी इमेज में दिखाया गया है.BOARD_USES_RECOVERY_AS_BOOTको खाली पर सेट करें. आर्किटेक्चर को चौथी इमेज में दिखाया गया है.
BOARD_USES_RECOVERY_AS_BOOTको खाली पर सेट किया जा सकता है. ऐसा करने पर, वे नए कॉन्फ़िगरेशन का इस्तेमाल कर रहे होते हैं. अगर ऐसे डिवाइस:
Android 12 के साथ लॉन्च होने वाले डिवाइसों को
BOARD_USES_RECOVERY_AS_BOOTको खाली पर सेट करना होगा और नए कॉन्फ़िगरेशन का इस्तेमाल करना होगा. अगर ऐसे डिवाइस:
aosp_arm64 सिर्फ़ GKI बनाता है, न कि vendor_boot या रिकवरी. इसलिए, यह पूरा टारगेट नहीं है. aosp_arm64बिल्ड कॉन्फ़िगरेशन के लिए, generic_arm64 देखें.
पहला विकल्प: रिकवरी के लिए कोई अलग पार्टीशन नहीं है
जिन डिवाइसों में recovery पार्टिशन नहीं होता उनमें boot पार्टिशन में, जेनरिक boot इमेज होती है. vendor_boot ramdisk में रिकवरी के सभी संसाधन शामिल होते हैं. इनमें lib/modules (वेंडर कर्नल मॉड्यूल के साथ) भी शामिल है. ऐसे डिवाइसों पर, प्रॉडक्ट कॉन्फ़िगरेशन generic_ramdisk.mk से इनहेरिट होता है.
BOARD वैल्यू सेट करना
ये वैल्यू सेट करें:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Init binaries and symlinks
vendor_boot ramdisk में /init से /system/bin/init सिमलंक हो सकता है. साथ ही, init_second_stage.recovery /system/bin/init पर हो सकता है. हालांकि, vendor_boot ramdisk के बाद सामान्य ramdisk को जोड़ा जाता है. इसलिए, /init symlink को बदल दिया जाता है. जब डिवाइस रिकवरी मोड में बूट होता है, तब दूसरे चरण के init को सपोर्ट करने के लिए /system/bin/init बाइनरी की ज़रूरत होती है. vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट यहां दिया गया है:
/init(जेनेरिक रैमडिस्क से, जिसेinit_first_stageसे बनाया गया है)/system/bin/init(vendor_ramdiskसे,init_second_stage.recoveryसे बनाया गया)
fstab फ़ाइलों को ट्रांसफ़र करना
जेनेरिक रैमडिस्क में इंस्टॉल की गई fstab फ़ाइलों को vendor_ramdisk में ले जाएं. उदाहरण के लिए, यह बदलाव देखें.
मॉड्यूल इंस्टॉल करना
डिवाइस के हिसाब से मॉड्यूल इंस्टॉल किए जा सकते हैं. vendor_ramdisk (अगर आपको डिवाइस के हिसाब से कोई मॉड्यूल इंस्टॉल नहीं करना है, तो यह चरण छोड़ें).
अगर मॉड्यूल
/first_stage_ramdiskमें इंस्टॉल होता है, तो मॉड्यूल केvendor_ramdiskवैरिएंट का इस्तेमाल करें. यह मॉड्यूल,initके रूट को/first_stage_ramdiskमें स्विच करने के बाद औरinitके रूट को/systemमें स्विच करने से पहले उपलब्ध होना चाहिए. उदाहरण के लिए, मेटाडेटा के चेकसम और वर्चुअल A/B कंप्रेशन देखें.अगर मॉड्यूल
/में इंस्टॉल होता है, तो मॉड्यूल केrecoveryवैरिएंट का इस्तेमाल करें. यह मॉड्यूल,initके रूट को/first_stage_ramdiskमें स्विच करने से पहले उपलब्ध होना चाहिए./के लिए मॉड्यूल इंस्टॉल करने के बारे में जानकारी पाने के लिए, पहली स्टेज का कंसोल लेख पढ़ें.
पहले चरण का कंसोल
पहले चरण का कंसोल, init के रूट को /first_stage_ramdisk में स्विच करने से पहले शुरू होता है. इसलिए, आपको मॉड्यूल का recovery वर्शन इंस्टॉल करना होगा.
डिफ़ॉल्ट रूप से, दोनों मॉड्यूल वैरिएंट build/make/target/product/base_vendor.mk में इंस्टॉल होते हैं. इसलिए, अगर डिवाइस की मेकफ़ाइल उस फ़ाइल से इनहेरिट करती है, तो आपको recovery वैरिएंट को अलग से इंस्टॉल करने की ज़रूरत नहीं है.
रिकवरी मॉड्यूल को साफ़ तौर पर इंस्टॉल करने के लिए, इसका इस्तेमाल करें.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
इससे यह पक्का होता है कि linker, sh, और toybox, $ANDROID_PRODUCT_OUT/recovery/root/system/bin पर इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/recovery/root/system/bin, vendor_ramdisk के तहत /system/bin पर इंस्टॉल हो जाता है.
पहले चरण के कंसोल के लिए ज़रूरी मॉड्यूल (उदाहरण के लिए, adbd) जोड़ने के लिए, यहां दिया गया तरीका अपनाएं.
PRODUCT_PACKAGES += adbd.recovery
इससे यह पक्का होता है कि बताए गए मॉड्यूल $ANDROID_PRODUCT_OUT/recovery/root/system/bin में इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/recovery/root/system/bin, vendor_ramdisk में इंस्टॉल हो जाता है./system/bin
मेटाडेटा के चेकसम
पहले चरण में माउंट करने के दौरान, मेटाडेटा के चेकसम की सुविधा काम कर सके, इसके लिए जिन डिवाइसों पर GKI इंस्टॉल नहीं किया जा सकता वे यहां दिए गए मॉड्यूल के ramdisk वर्शन को इंस्टॉल करते हैं. GKI के लिए सहायता जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
उदाहरण के लिए, बदलावों की यह सूची देखें.
वर्चुअल A/B कंप्रेस करने की सुविधा
वर्चुअल A/B कंप्रेशन के लिए, snapuserd को vendor_ramdisk पर इंस्टॉल करना ज़रूरी है. डिवाइस को virtual_ab_ota/compression.mk से इनहेरिट करना चाहिए. इससे snapuserd का vendor_ramdisk वैरिएंट इंस्टॉल होता है.
बूट प्रोसेस में हुए बदलाव
रिकवरी मोड या Android में बूट करने की प्रोसेस में कोई बदलाव नहीं होता. हालांकि, इसमें यह अपवाद शामिल है:
- Ramdisk
build.prop,/second_stage_resourcesमें चला जाता है, ताकि दूसरे चरणinitमें बूट के बिल्ड टाइमस्टैंप को पढ़ा जा सके.
ऐसा इसलिए होता है, क्योंकि संसाधन सामान्य रैमडिस्क से vendor_boot रैमडिस्क में ट्रांसफ़र हो जाते हैं. इसलिए, सामान्य रैमडिस्क को vendor_boot रैमडिस्क के साथ जोड़ने पर कोई बदलाव नहीं होता.
e2fsck को उपलब्ध कराएं
डिवाइस के मेकफ़ाइल, यहां से इनहेरिट किए जा सकते हैं:
virtual_ab_ota/launch_with_vendor_ramdisk.mkअगर डिवाइस पर वर्चुअल A/B की सुविधा काम करती है, लेकिन कंप्रेशन की सुविधा काम नहीं करती.virtual_ab_ota/compression.mkअगर डिवाइस पर वर्चुअल A/B कंप्रेशन की सुविधा काम करती है.
प्रॉडक्ट मेकफ़ाइलें, $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck इंस्टॉल करती हैं. रनटाइम के दौरान, पहली स्टेज init रूट को /first_stage_ramdisk में बदल देती है. इसके बाद, /system/bin/e2fsck को लागू करती है.
विकल्प 2a: रिकवरी के लिए अलग से और A/B पार्टीशन
इस विकल्प का इस्तेमाल उन डिवाइसों के लिए करें जिनमें A/B recovery पार्टीशन हैं. इसका मतलब है कि डिवाइस में recovery_a और recovery_b partition है. ऐसे डिवाइसों में A/B और वर्चुअल A/B डिवाइस शामिल हैं. इनमें रिकवरी पार्टीशन को अपडेट किया जा सकता है. इनका कॉन्फ़िगरेशन इस तरह से होता है:
AB_OTA_PARTITIONS += recovery
vendor_boot ramdisk में, ramdisk और वेंडर कर्नेल मॉड्यूल के वेंडर बिट शामिल होते हैं. इनमें ये शामिल हैं:
डिवाइस के हिसाब से
fstabफ़ाइलेंlib/modules(इसमें वेंडर कर्नेल मॉड्यूल शामिल हैं)
recovery रैमडिस्क में, रिकवरी के सभी संसाधन होते हैं. ऐसे डिवाइसों पर, प्रॉडक्ट कॉन्फ़िगरेशन generic_ramdisk.mk से इनहेरिट होता है.
BOARD वैल्यू सेट करना
A/B recovery पार्टीशन वाले डिवाइसों के लिए, ये वैल्यू सेट करें:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
बाइनरी और सिंबल लिंक शुरू करना
recovery रैमडिस्क में /init -> /system/bin/init सिमलंक और /system/bin/init पर init_second_stage.recovery शामिल हो सकता है. हालांकि, बूट रैमडिस्क को recovery रैमडिस्क के बाद जोड़ा जाता है. इसलिए, /init सिंबल लिंक को बदल दिया जाता है. जब डिवाइस रिकवरी मोड में बूट होता है, तब दूसरे चरण के init को सपोर्ट करने के लिए /system/bin/init
बाइनरी की ज़रूरत होती है.
जब डिवाइस recovery में बूट होता है, तब recovery + vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init(रैमडिस्क से,init_first_stageसे बनाया गया)/system/bin/init(recoveryरैमडिस्क से, जिसेinit_second_stage.recoveryसे बनाया गया है और/initसे एक्ज़ीक्यूट किया गया है)
डिवाइस के Android में बूट होने पर, vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init(जेनेरिक रैमडिस्क से, जिसेinit_first_stageसे बनाया गया है)
fstab फ़ाइलों को ट्रांसफ़र करना
जेनेरिक रैमडिस्क में इंस्टॉल की गई सभी fstab फ़ाइलों को vendor_ramdisk में ले जाएं. उदाहरण के लिए, यह बदलाव देखें.
मॉड्यूल इंस्टॉल करना
इसके अलावा, डिवाइस के हिसाब से मॉड्यूल इंस्टॉल किए जा सकते हैं. vendor_ramdisk (अगर आपको डिवाइस के हिसाब से कोई मॉड्यूल इंस्टॉल नहीं करना है, तो यह चरण छोड़ें). Init
रूट को स्विच नहीं करता है. मॉड्यूल का vendor_ramdisk वैरिएंट, vendor_ramdisk के रूट में इंस्टॉल होता है. vendor_ramdisk में मॉड्यूल इंस्टॉल करने के उदाहरणों के लिए, पहले चरण का कंसोल, मेटाडेटा के चेकसम, और वर्चुअल ए/बी कंप्रेसर देखें.
पहले चरण का कंसोल
मॉड्यूल के vendor_ramdisk वर्शन को इंस्टॉल करने के लिए, इसका इस्तेमाल करें:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
इससे यह पक्का होता है कि linker, sh, और toybox, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, vendor_ramdisk के तहत /system/bin पर इंस्टॉल हो जाता है.
पहले चरण के कंसोल के लिए ज़रूरी मॉड्यूल (उदाहरण के लिए, adbd) जोड़ने के लिए, इन मॉड्यूल के vendor_ramdisk वैरिएंट को चालू करें. इसके लिए, AOSP में ज़रूरी पैच अपलोड करें. इसके बाद, यहां दिया गया तरीका अपनाएं,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
इससे यह पक्का होता है कि बताए गए मॉड्यूल, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin में इंस्टॉल हो जाएं. अगर रिकवरी मोड में vendor_boot ramdisk
लोड किया जाता है, तो मॉड्यूल recovery में भी उपलब्ध होता है. अगर रिकवरी मोड में vendor_boot ramdisk लोड नहीं होता है, तो डिवाइस में adbd.recovery को इंस्टॉल किया जा सकता है.
मेटाडेटा के चेकसम
पहले चरण में माउंट करने के दौरान, मेटाडेटा के चेकसम की सुविधा काम कर सके, इसके लिए जिन डिवाइसों पर GKI इंस्टॉल नहीं किया जा सकता वे यहां दिए गए मॉड्यूल के ramdisk वर्शन को इंस्टॉल करते हैं. GKI के लिए सहायता जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
उदाहरण के लिए, बदलावों की यह सूची देखें.
वर्चुअल A/B कंप्रेस करने की सुविधा
वर्चुअल A/B कंप्रेशन के लिए, snapuserd को vendor_ramdisk पर इंस्टॉल किया जाना चाहिए. डिवाइस को virtual_ab_ota/compression.mk से इनहेरिट करना चाहिए. इससे snapuserd का vendor_ramdisk वैरिएंट इंस्टॉल होता है.
बूट प्रोसेस में हुए बदलाव
Android में बूट करने पर, बूट करने की प्रोसेस में कोई बदलाव नहीं होता. vendor_boot + जेनेरिक रैमडिस्क, बूट करने की मौजूदा प्रोसेस की तरह ही होता है. हालांकि, इसमें fstab, vendor_boot से लोड होता है. system/bin/recovery मौजूद न होने की वजह से, first_stage_init इसे सामान्य बूट के तौर पर हैंडल करता है.
रिकवरी मोड में बूट करने पर, बूट करने की प्रोसेस बदल जाती है. रिकवरी +
vendor_boot + सामान्य रैमडिस्क, मौजूदा रिकवरी प्रोसेस की तरह ही होती है. हालांकि, इसमें कर्नल को recovery इमेज के बजाय boot इमेज से लोड किया जाता है.
रिकवरी मोड में बूट करने की प्रोसेस यहां दी गई है.
बूटलोडर शुरू होता है. इसके बाद, ये काम करता है:
- यह रिकवरी +
vendor_boot+ जेनरिक रैमडिस्क को/पर पुश करता है. (अगर ओईएम, रिकवरी रैमडिस्क में कर्नेल मॉड्यूल को डुप्लीकेट करता है, तो उन्हेंBOARD_RECOVERY_KERNEL_MODULESमें जोड़कर डुप्लीकेट किया जाता है. इसलिए,BOARD_RECOVERY_KERNEL_MODULESजोड़ना ज़रूरी नहीं है.)vendor_boot - यह
bootपार्टिशन से कर्नल को चलाता है.
- यह रिकवरी +
कर्नेल, रैमडिस्क को
/पर माउंट करता है. इसके बाद, जेनेरिक रैमडिस्क से/initको एक्ज़ीक्यूट करता है.पहले चरण की init प्रोसेस शुरू होती है. इसके बाद, यह प्रोसेस ये काम करती है:
IsRecoveryMode() == trueऔरForceNormalBoot() == falseसेट करता है.- यह
/lib/modulesसे वेंडर कर्नेल मॉड्यूल लोड करता है. DoFirstStageMount()को कॉल करता है, लेकिनIsRecoveryMode() == trueकी वजह से माउंट करने की प्रोसेस को छोड़ देता है. (डिवाइस, रैमडिस्क को खाली नहीं करता, क्योंकि/अब भी वही है. हालांकि, यहSetInitAvbVersionInRecovery()को कॉल करता है.)- यह
recoveryramdisk से/system/bin/initसे दूसरे चरण की शुरुआत करता है.
e2fsck को उपलब्ध कराएं
डिवाइस के मेकफ़ाइल, यहां से इनहेरिट किए जा सकते हैं:
virtual_ab_ota/launch_with_vendor_ramdisk.mkअगर डिवाइस पर वर्चुअल A/B की सुविधा काम करती है, लेकिन कंप्रेशन की सुविधा काम नहीं करती.virtual_ab_ota/compression.mkअगर डिवाइस पर वर्चुअल A/B कंप्रेशन की सुविधा काम करती है.
प्रॉडक्ट मेकफ़ाइलें, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck इंस्टॉल करती हैं. रनटाइम के दौरान, पहली स्टेज init को एक्ज़ीक्यूट किया जाता है /system/bin/e2fsck.
दूसरा विकल्प (ख): रिकवरी के लिए अलग से और नॉन-ए/बी पार्टीशन
इस विकल्प का इस्तेमाल उन डिवाइसों के लिए करें जिनमें नॉन-ए/बी recovery पार्टिशन होता है. इसका मतलब है कि डिवाइस में recovery नाम का एक पार्टिशन होता है, जिसमें स्लॉट सफ़िक्स नहीं होता. इस तरह के डिवाइसों में ये शामिल हैं:
- ऐसे डिवाइस जिन पर A/B अपडेट की सुविधा उपलब्ध नहीं है;
- A/B और Virtual A/B डिवाइस, जिनमें रिकवरी पार्टीशन को अपडेट नहीं किया जा सकता. (यह असामान्य है.)
vendor_boot ramdisk में, ramdisk और वेंडर कर्नेल मॉड्यूल के वेंडर बिट शामिल होते हैं. इनमें ये शामिल हैं:
- डिवाइस के हिसाब से
fstabफ़ाइलें lib/modules(इसमें वेंडर के कर्नल मॉड्यूल शामिल हैं)
recovery इमेज में सभी ज़रूरी जानकारी होनी चाहिए. इसमें रिकवरी मोड को बूट करने के लिए, सभी ज़रूरी संसाधन शामिल होने चाहिए. जैसे:
- कर्नेल इमेज
- डीटीबीओ इमेज
lib/modulesमें कर्नेल मॉड्यूल- सिमलिंक के तौर पर पहले चरण का इनिट
/init -> /system/bin/init - सेकंड-स्टेज इनिट बाइनरी
/system/bin/init - डिवाइस के हिसाब से
fstabफ़ाइलें - खाता वापस पाने के लिए अन्य सभी संसाधन, जिनमें
recoveryबाइनरी भी शामिल है
ऐसे डिवाइसों पर, प्रॉडक्ट कॉन्फ़िगरेशन generic_ramdisk.mk से इनहेरिट होता है.
BOARD वैल्यू सेट करना
नॉन-ए/बी डिवाइसों के लिए, ये वैल्यू सेट करें:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
बाइनरी और सिंबल लिंक शुरू करना
recovery रैमडिस्क में /init -> /system/bin/init सिमलंक और /system/bin/init पर init_second_stage.recovery होना चाहिए. जब डिवाइस रिकवरी मोड में बूट होता है, तब /system/bin/init बाइनरी की ज़रूरत होती है, ताकि पहले और दूसरे चरण की शुरुआत, दोनों को सपोर्ट किया जा सके.
जब डिवाइस recovery में बूट होता है, तब recovery रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init -> /system/bin/init(recoveryरैमडिस्क से)/system/bin/init(recoveryरैमडिस्क से,init_second_stage.recoveryसे बनाया गया, और/initसे एक्ज़ीक्यूट किया गया)
डिवाइस के Android में बूट होने पर, vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init(रैमडिस्क से,init_first_stageसे बनाया गया)
fstab फ़ाइलों को ट्रांसफ़र करना
जेनेरिक रैमडिस्क में इंस्टॉल की गई किसी भी fstab फ़ाइल को vendor_ramdisk और recovery रैमडिस्क में ले जाएं. उदाहरण के लिए, यह बदलाव देखें.
मॉड्यूल इंस्टॉल करना
vendor_ramdisk और recovery ramdisk के लिए, डिवाइस के हिसाब से मॉड्यूल इंस्टॉल किए जा सकते हैं. अगर आपको डिवाइस के हिसाब से कोई मॉड्यूल इंस्टॉल नहीं करना है, तो यह चरण छोड़ दें. init
रूट को स्विच नहीं करता है. मॉड्यूल का vendor_ramdisk वैरिएंट, vendor_ramdisk के रूट में इंस्टॉल होता है. मॉड्यूल का recovery वैरिएंट, recovery रैमडिस्क के रूट में इंस्टॉल होता है. vendor_ramdisk और recovery ramdisk में मॉड्यूल इंस्टॉल करने के उदाहरणों के लिए, पहले चरण का कंसोल और मेटाडेटा के चेकसम देखें.
पहले चरण का कंसोल
मॉड्यूल के vendor_ramdisk वर्शन को इंस्टॉल करने के लिए, इसका इस्तेमाल करें:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
इससे यह पक्का होता है कि linker, sh, और toybox, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, vendor_ramdisk के तहत /system/bin पर इंस्टॉल हो जाता है.
पहले चरण के कंसोल के लिए ज़रूरी मॉड्यूल (उदाहरण के लिए, adbd) जोड़ने के लिए, इन मॉड्यूल के vendor_ramdisk वैरिएंट को चालू करें. इसके लिए, AOSP में ज़रूरी पैच अपलोड करें. इसके बाद, यहां दिया गया तरीका अपनाएं,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
इससे यह पक्का होता है कि बताए गए मॉड्यूल, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin में इंस्टॉल हो जाएं.
मॉड्यूल के recovery वैरिएंट को इंस्टॉल करने के लिए, vendor_ramdisk को recovery से बदलें:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
मेटाडेटा के चेकसम
पहले चरण में माउंट करने के दौरान, मेटाडेटा के चेकसम की सुविधा काम कर सके, इसके लिए जिन डिवाइसों पर GKI इंस्टॉल नहीं किया जा सकता वे यहां दिए गए मॉड्यूल के ramdisk वर्शन को इंस्टॉल करते हैं. GKI के लिए सहायता जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
पहले चरण में माउंट करने के दौरान, मेटाडेटा के चेकसम की सुविधा चालू करने के लिए, इन मॉड्यूल के रिकवरी वैरिएंट चालू करें और उन्हें इंस्टॉल करें.
बूट प्रोसेस में हुए बदलाव
Android में बूट करने पर, बूट करने की प्रोसेस में कोई बदलाव नहीं होता. vendor_boot + जेनेरिक रैमडिस्क, बूट करने की मौजूदा प्रोसेस की तरह ही होता है. हालांकि, इसमें fstab, vendor_boot से लोड होता है. system/bin/recovery मौजूद न होने की वजह से, first_stage_init इसे सामान्य बूट के तौर पर हैंडल करता है.
रिकवरी मोड में बूट करने पर, बूट प्रोसेस में कोई बदलाव नहीं होता. रिकवरी रैमडिस्क को उसी तरह लोड किया जाता है जिस तरह मौजूदा रिकवरी प्रोसेस में किया जाता है.
कर्नल को recovery इमेज से लोड किया जाता है. रिकवरी मोड में बूट करने की प्रोसेस यहां दी गई है.
बूटलोडर शुरू होता है. इसके बाद, ये काम करता है:
- यह कुकी, रिकवरी रैमडिस्क को
/पर पुश करती है. - यह
recoveryपार्टिशन से कर्नल को चलाता है.
- यह कुकी, रिकवरी रैमडिस्क को
कर्नेल, रैमडिस्क को
/पर माउंट करता है. इसके बाद,/initको एक्ज़ीक्यूट करता है. यहrecoveryरैमडिस्क से/system/bin/initका सिंबॉलिक लिंक होता है.पहले चरण की init प्रोसेस शुरू होती है. इसके बाद, यह प्रोसेस ये काम करती है:
IsRecoveryMode() == trueऔरForceNormalBoot() == falseसेट करता है.- यह
/lib/modulesसे वेंडर कर्नेल मॉड्यूल लोड करता है. DoFirstStageMount()को कॉल करता है, लेकिनIsRecoveryMode() == trueकी वजह से माउंट करने की प्रोसेस को छोड़ देता है. (डिवाइस, रैमडिस्क को खाली नहीं करता, क्योंकि/अब भी वही है. हालांकि, यहSetInitAvbVersionInRecovery()को कॉल करता है.)- यह
recoveryramdisk से/system/bin/initसे दूसरे चरण की शुरुआत करता है.
बूट इमेज के टाइमस्टैंप
यहां boot इमेज के टाइमस्टैंप वाली फ़ाइल का उदाहरण दिया गया है:
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
बिल्ड टाइम के दौरान,
system/etc/ramdisk/build.propफ़ाइल को सामान्य रैमडिस्क में जोड़ा जाता है. इस फ़ाइल में, बिल्ड के टाइमस्टैंप की जानकारी होती है.रनटाइम के दौरान, पहले चरण में
init, रैमडिस्क सेtmpfsमें फ़ाइलें कॉपी करता है. इसके बाद, रैमडिस्क को खाली कर देता है, ताकि दूसरे चरण मेंinitइस फ़ाइल को पढ़करbootइमेज के टाइमस्टैंप की प्रॉपर्टी सेट कर सके.