Android 12-এ, জেনেরিক boot ছবি, যাকে
জেনেরিক কার্নেল ইমেজ (GKI) বলা হয়,
সেটিতে জেনেরিক র্যামডিস্ক ও GKI কার্নেল থাকে।
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 রিকভারি (ডেডিকেটেড র্যামডিস্ক) সহ লঞ্চ করুন
ছবি ২. GKI, ডেডিকেটেড এবং A/B রিকভারি সহ Android 13-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।
ডিভাইসে recovery_a ও recovery_b পার্টিশন থাকলে এই ছবি দেখুন।
Android 13-এর সাথে লঞ্চ করা, ডেডিকেটেড ও নন-A/B রিকভারি (ডেডিকেটেড র্যামডিস্ক)
ছবি ৩. GKI, ডেডিকেটেড এবং নন-A/B রিকভারি সহ Android 13-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।
ডিভাইসে recovery নামের কোনও পার্টিশন থাকলে এবং তাতে কোনও
স্লট সাফিক্স না থাকলে এই ফিগারটি দেখুন।
Android 12 লঞ্চ বা আপগ্রেড করা হয়েছে, কোনও ডেডিকেটেড রিকভারি নেই
ছবি ৪. GKI সহ Android 12-এ লঞ্চ বা আপগ্রেড করা ডিভাইস, কোনও ডেডিকেটেড রিকভারি নেই।
Android 12, ডেডিকেটেড ও A/B রিকভারি (ডেডিকেটেড র্যামডিস্ক) লঞ্চ বা আপগ্রেড করুন
ছবি ৫. GKI, ডেডিকেটেড ও A/B রিকভারি সহ Android 12-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।
ডিভাইসে recovery_a ও recovery_b পার্টিশন থাকলে এই ছবি দেখুন।
Android 12 লঞ্চ বা আপগ্রেড করুন, ডেডিকেটেড ও নন-A/B রিকভারি (ডেডিকেটেড র্যামডিস্ক)
ছবি ৬. GKI, ডেডিকেটেড ও নন-A/B রিকভারি সহ Android 12-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।
ডিভাইসে recovery নামের কোনও পার্টিশন থাকলে এবং তাতে কোনও
স্লট সাফিক্স না থাকলে এই ফিগারটি দেখুন।
Android 12, রিকভারি-অ্যাজ-বুট (রিকভারি-অ্যাজ-র্যামডিস্ক)-এ আপগ্রেড করুন
ছবি ৭. Android 12-এ আপগ্রেড করা ডিভাইস, কোনও GKI নেই, বুট করার মতো রিকভারি।
Android 12-এ আপগ্রেড করুন, ডেডিকেটেড রিকভারি (ডেডিকেটেড র্যামডিস্ক)
ছবি ৮. Android 12-এ আপগ্রেড করা ডিভাইস, কোনও GKI নেই, ডেডিকেটেড রিকভারি।
বুট ইমেজ কন্টেন্ট
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_bootহেডার- ডিভাইস-নির্দিষ্ট
cmdline(BOARD_KERNEL_CMDLINE)
- ডিভাইস-নির্দিষ্ট
vendor_bootramdisk imagelib/modules- অ্যাকাউন্ট ফিরিয়ে আনার রিসোর্স (ডেডিকেটেড অ্যাকাউন্ট ফিরিয়ে আনার সুবিধা না থাকলে)
dtbছবি
recoveryছবি- হেডার ভার্সন V2
- প্রয়োজন হলে, রিকভারির জন্য ডিভাইস-নির্দিষ্ট
cmdline - A/B নয় এমন রিকভারি পার্টিশনের জন্য, হেডারের কন্টেন্টকে স্ট্যান্ডঅ্যালোন হতে হবে; দেখুন রিকভারি ইমেজ। যেমন:
cmdline,bootওvendor_bootcmdline-এর সাথে কনক্যাটেনেট করা হয়নি।- প্রয়োজন হলে, হেডার রিকভারি DTBO নির্দিষ্ট করে।
- A/B রিকভারি পার্টিশনের জন্য, কন্টেন্ট কনক্যাটিনেট করা বা
bootওvendor_bootথেকে অনুমান করা যেতে পারে। যেমন: cmdline,bootএবংvendor_bootcmdline-এর সাথে কনক্যাটিনেট করা হয়েছে।vendor_bootহেডার থেকে DTBO অনুমান করা যেতে পারে।
- প্রয়োজন হলে, রিকভারির জন্য ডিভাইস-নির্দিষ্ট
recoveryramdisk image- রিকভারি রিসোর্স
- A/B নয় এমন রিকভারি পার্টিশনের জন্য, ramdisk-এর কন্টেন্টকে স্ট্যান্ডঅ্যালোন হতে হবে; রিকভারি ইমেজ দেখুন। যেমন:
lib/modules-এ অবশ্যই বুট করার জন্য প্রয়োজনীয় সমস্ত কার্নেল মডিউল থাকতে হবে রিকভারি মোড- রিকভারি র্যামডিস্কে
initথাকতে হবে। - A/B রিকভারি পার্টিশনের জন্য, রিকভারি র্যামডিস্ককে
জেনারেটিক এবং
vendor_bootর্যামডিস্কের আগে যোগ করা হয়, তাই এটি স্ট্যান্ডঅ্যালোন হওয়ার প্রয়োজন নেই। যেমন: lib/modules-এvendor_bootramdisk-এর মধ্যে থাকা কার্নেল মডিউল ছাড়াও, রিকভারি মোড বুট করার জন্য প্রয়োজনীয় অতিরিক্ত কার্নেল মডিউল থাকতে পারে।/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. এই ভেরিয়েবল থেকে বোঝা যায় যে ডিভাইসটিbootছবি হিসেবেrecoveryছবি ব্যবহার করে কিনা। 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-এর জন্য তৈরি করা হয়েছে।সেট করা না থাকলে, GSI AVB কীগুলি
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb-এর জন্য তৈরি করা হয়।
খালি থাকলে, যদি
BOARD_RECOVERY_AS_ROOT:সেট করা থাকলে, GSI AVB কী
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb-এ তৈরি করা হয়।আনসেট করা থাকলে, GSI AVB কী
$ANDROID_PRODUCT_OUT/ramdisk/avb-এ বিল্ড করা হয়।
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. এই ভেরিয়েবলটি নিয়ন্ত্রণ করে যেrecoveryছবিতে কার্নেল থাকবে কিনা। Android 12 ভার্সন সহ লঞ্চ করা এবং A/Brecoveryপার্টিশন ব্যবহার করা ডিভাইসগুলিকে অবশ্যই এই ভেরিয়েবলকেtrueহিসেবে সেট করতে হবে। Android 12-এর সাথে লঞ্চ হওয়া এবং নন-A/B ব্যবহার করা ডিভাইসের ক্ষেত্রে রিকভারি ইমেজ স্বয়ংসম্পূর্ণ রাখতে এই ভেরিয়েবলfalse-এ সেট করতে হবে।BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. এই ভেরিয়েবেল কন্ট্রোল করে যে$OUT/boot*.imgটার্গেট ফাইলের অধীনেIMAGES/-এ কপি করা হয়েছে কিনা।aosp_arm64-কে এই ভেরিয়েবেলtrue-এ সেট করতে হবে।অন্যান্য ডিভাইসকে এই ভেরিয়েবল খালি রাখতে হবে।
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. এই ভেরিয়েবেল নিয়ন্ত্রণ করে যেinit_boot.imgজেনারেট করা হয়েছে কিনা এবং সাইজ সেট করে। সেট করা হলে,boot.img-এর পরিবর্তেinit_boot.img-তে জেনেরিক ramdisk যোগ করা হয় এবং চেন করা vbmeta-এর জন্যBOARD_AVB_INIT_BOOT*ভেরিয়েবল সেট করতে হয়।
অনুমোদিত কম্বিনেশন
| কম্পোনেন্ট বা ভেরিয়েবল | রিকভারি পার্টিশন ছাড়াই ডিভাইস আপগ্রেড করুন | রিকভারি পার্টিশন সহ ডিভাইস আপগ্রেড করা | রিকভারি পার্টিশন ছাড়াই ডিভাইস চালু করুন | A/B রিকভারি পার্টিশন সহ ডিভাইস লঞ্চ করা | A/B রিকভারি পার্টিশন নেই এমন ডিভাইস লঞ্চ করা | aosp_arm64 |
|---|---|---|---|---|---|---|
এর মধ্যে boot আছে |
হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ |
init_boot (Android 13) আছে |
no | no | হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ |
এর মধ্যে vendor_boot আছে |
ঐচ্ছিক | ঐচ্ছিক | হ্যাঁ | হ্যাঁ | হ্যাঁ | no |
এর মধ্যে recovery আছে |
no | হ্যাঁ | no | হ্যাঁ | হ্যাঁ | no |
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 |
খালি | > ০ | খালি | > ০ | > ০ | খালি |
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 খুবই সাজেস্ট করা হয়, যাতে
স্বতন্ত্র OTA দেওয়া যায়। নিম্নলিখিত বিষয়গুলি উল্লেখ করুন:
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
যেমন, এই পরিবর্তন দেখুন।
সিস্টেম-অ্যাজ-রুট
GKI ব্যবহার করে এমন ডিভাইসের জন্য System-as-root কাজ করে না। এই ধরনের ডিভাইসে, BOARD_BUILD_SYSTEM_ROOT_IMAGE ফাঁকা থাকতে হবে। ডায়নামিক পার্টিশন ব্যবহার করে এমন ডিভাইসের ক্ষেত্রেও
সিস্টেম-অ্যাজ-রুট কাজ করে না।
প্রোডাক্ট কনফিগারেশন
যেসব ডিভাইস জেনেরিক র্যামডিস্ক ব্যবহার করে সেগুলিকে র্যামডিস্কে ইনস্টল করার অনুমতি আছে এমন ফাইলের একটি তালিকা ইনস্টল করতে হবে।
এটি করতে, নিম্নলিখিত বিষয়গুলি
device.mk-এ উল্লেখ করুন:
$(call inherit-product, $(SRC_TARGET_DIR)/product/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খালি হিসেবে সেট করা যাবে। তারা তা করলে, তারা নতুন কনফিগারেশন ব্যবহার করছে। এই ধরনের ডিভাইস:
Android 12-এর সাথে লঞ্চ করা ডিভাইসগুলিকে অবশ্যই
BOARD_USES_RECOVERY_AS_BOOTখালি রাখতে হবে এবং নতুন কনফিগারেশন ব্যবহার করতে হবে। এই ধরনের ডিভাইস:
কারণ aosp_arm64 শুধুমাত্র GKI (এবং vendor_boot বা রিকভারি নয়) তৈরি করে, এটি
সম্পূর্ণ টার্গেট নয়। aosp_arm64বিল্ড কনফিগারেশনের জন্য, generic_arm64 দেখুন।
বিকল্প ১: কোনও ডেডিকেটেড রিকভারি পার্টিশন নেই
recovery পার্টিশন ছাড়া ডিভাইসে boot পার্টিশনে জেনেরিক boot ইমেজ থাকে। vendor_boot র্যামডিস্কে সব রিকভারি রিসোর্স থাকে,
যার মধ্যে 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 বাইনারি ও সিমলিঙ্ক
vendor_boot ramdisk-এ /init থেকে /system/bin/init symlink থাকতে পারে,
এবং /system/bin/init-এ init_second_stage.recovery থাকতে পারে। তবে, যেহেতু vendor_boot ramdisk-এর পরে
জেনেরিক ramdisk কনক্যাটেনেট করা হয়, তাই /init
সিমলিঙ্ক ওভাররাইট করা হয়। ডিভাইস রিকভারি মোডে বুট করলে, সেকেন্ড স্টেজ ইনিটকে সাপোর্ট করার জন্য
/system/bin/init বাইনারি প্রয়োজন। vendor_boot + জেনেরিক র্যামডিস্কের
কন্টেন্ট নিচে দেওয়া হল:
/init(জেনেরিক ramdisk থেকে,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-এ ইনস্টল হয়, যা তারপরে vendor_ramdisk-এর অধীনে
/system/bin-এ ইনস্টল হয়।
প্রথম পর্যায়ের কনসোলের জন্য প্রয়োজনীয় মডিউল (যেমন, adbd) যোগ করতে, নিম্নলিখিত পদ্ধতি অনুসরণ করুন।
PRODUCT_PACKAGES += adbd.recovery
এটি নিশ্চিত করে যে নির্দিষ্ট মডিউলগুলি
$ANDROID_PRODUCT_OUT/recovery/root/system/bin-এ ইনস্টল করা আছে, যা পরে vendor_ramdisk-এর অধীনে
/system/bin-এ ইনস্টল করা আছে।
মেটাডেটা চেকসাম
প্রথম পর্যায়ের মাউন্ট চলাকালীন মেটাডেটা
চেকসাম
সাপোর্ট করতে, GKI সাপোর্ট করে না এমন ডিভাইস নিম্নলিখিত মডিউলের র্যামডিস্ক
ভেরিয়েন্ট ইনস্টল করে। 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বুটের বিল্ড টাইমস্ট্যাম্প পড়তে পারে।
রিসোর্স জেনেরিক ramdisk থেকে vendor_boot ramdisk-এ সরানো হয় বলে, জেনেরিক ramdisk-কে vendor_boot ramdisk-এর সাথে কনক্যাটিনেট করার ফলাফল
পরিবর্তিত হয় না।
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 এক্সিকিউট করে।
বিকল্প ২ক: ডেডিকেটেড ও 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
Init বাইনারি ও সিমলিঙ্ক
recovery ramdisk-এ /init -> /system/bin/init symlink থাকতে পারে এবং
init_second_stage.recovery /system/bin/init-এ থাকতে পারে। তবে, যেহেতু boot
ramdisk recovery ramdisk-এর পরে কনক্যাটেনেট করা হয়, তাই /init সিমলিঙ্ক
ওভাররাইট করা হয়। ডিভাইস রিকভারি মোডে বুট করলে, সেকেন্ড স্টেজ ইনিট সাপোর্ট করার জন্য /system/bin/init
বাইনারি প্রয়োজন।
ডিভাইস recovery-এ বুট করলে, recovery +
vendor_boot + জেনেরিক র্যামডিস্কের কন্টেন্ট নিচে দেওয়া হল:
/init(ramdisk থেকে,init_first_stageথেকে তৈরি)/system/bin/init(recoveryramdisk থেকে, যাinit_second_stage.recoveryথেকে তৈরি এবং/initথেকে এক্সিকিউট করা হয়েছে)
ডিভাইস Android-এ বুট করলে, vendor_boot + generic
ramdisks-এর কন্টেন্ট নিচে উল্লেখ করা হল:
/init(সাধারণ র্যামডিস্ক থেকে,init_first_stageথেকে তৈরি)
fstab ফাইল সরান
সাধারণ র্যামডিস্কে ইনস্টল করা যেকোনও fstab ফাইলকে
vendor_ramdisk-এ সরান। যেমন, এই
পরিবর্তন দেখুন।
মডিউল ইনস্টল করা
ঐচ্ছিকভাবে, আপনি vendor_ramdisk-এর জন্য ডিভাইস-নির্দিষ্ট মডিউল ইনস্টল করতে পারেন (ইনস্টল করার জন্য কোনও ডিভাইস-নির্দিষ্ট মডিউল না থাকলে
এই ধাপটি এড়িয়ে যান)। Init
রুট পরিবর্তন করে না। মডিউলের vendor_ramdisk ভেরিয়েন্ট vendor_ramdisk-এর রুটে
ইনস্টল হয়।
vendor_ramdisk-এ মডিউল ইনস্টল করার উদাহরণ দেখতে, ফার্স্ট স্টেজ কনসোল, মেটাডেটা
চেকসাম এবং ভার্চুয়াল A/B
কম্প্রেশন দেখুন।
প্রথম স্টেজ কনসোল
মডিউলের vendor_ramdisk ভ্যারিয়েন্ট ইনস্টল করতে, নিম্নলিখিতগুলি ব্যবহার করুন:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
এটি নিশ্চিত করে যে linker, sh এবং toybox
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin-এ ইনস্টল হয়, যা তারপরে
vendor_ramdisk-এর অধীনে /system/bin-এ ইনস্টল হয়।
ফার্স্ট স্টেজ কনসোলের (যেমন, adbd) জন্য প্রয়োজনীয় মডিউল যোগ করতে, AOSP-তে
প্রাসঙ্গিক প্যাচ আপলোড করে এইসব মডিউলের vendor_ramdisk ভ্যারিয়েন্ট চালু করুন
এবং তারপরে নিম্নলিখিতগুলি ব্যবহার করুন,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
এটি নিশ্চিত করে যে নির্দিষ্ট মডিউলগুলি
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin-এ ইনস্টল করা আছে। রিকভারি মোডে vendor_boot ramdisk
লোডিং করা হলে, মডিউলটি recovery-এও উপলভ্য থাকে। রিকভারি মোডে
vendor_boot র্যামডিস্ক লোড না হলে, ডিভাইস বিকল্প হিসেবে
adbd.recovery-ও ইনস্টল করতে পারে।
মেটাডেটা চেক্সাম
প্রথম পর্যায়ের মাউন্ট চলাকালীন মেটাডেটা
চেকসাম সংক্রান্ত সহায়তা প্রদান করতে, GKI ইনস্টল করে না এমন ডিভাইস নিম্নলিখিত মডিউলের
র্যামডিস্ক ভেরিয়েন্ট ইনস্টল করে। 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+ জেনেরিক র্যামডিস্ক পুশ করে। (If the OEM duplicates kernel modules in recovery ramdisk by adding them toBOARD_RECOVERY_KERNEL_MODULES),vendor_bootis optional.)bootপার্টিশন থেকে কার্নেল রান করে।
কার্নেল
/-এ ramdisk মাউন্ট করে, তারপর জেনেরিক ramdisk থেকে/initএক্সিকিউট করে।প্রথম স্টেজ ইনিট শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:
IsRecoveryMode() == trueওForceNormalBoot() == falseসেট করে।/lib/modulesথেকে ভেন্ডর কার্নেল মডিউল লোড করে।- কল
DoFirstStageMount()করে কিন্তু মাউন্ট করা এড়িয়ে যায় কারণIsRecoveryMode() == true। (The device doesn't free ramdisk (because/is still the same) but does callSetInitAvbVersionInRecovery().) recoveryramdisk থেকে/system/bin/initথেকে দ্বিতীয় ধাপের ইনিট শুরু হয়।
e2fsck উপলভ্য করুন
ডিভাইস মেকফাইল এখান থেকে ইনহেরিট করতে পারে:
virtual_ab_ota/launch_with_vendor_ramdisk.mkডিভাইস ভার্চুয়াল A/B কাজ করলেও কম্প্রেশন কাজ না করলে।ডিভাইসে ভার্চুয়াল A/B কম্প্রেশন কাজ করলে
virtual_ab_ota/compression.mk।
প্রোডাক্ট মেকফাইল
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck ইনস্টল করে। রানটাইমে, প্রথম স্টেজ init এক্সিকিউট করে /system/bin/e2fsck।
বিকল্প ২খ: ডেডিকেটেড ও নন-এ/বি রিকভারি পার্টিশন
A/B recovery পার্টিশন নেই এমন ডিভাইসের জন্য এই বিকল্প ব্যবহার করুন; অর্থাৎ,
ডিভাইসে recovery নামের পার্টিশন আছে, কিন্তু স্লট সাফিক্স নেই। এই ধরনের ডিভাইসের
মধ্যে রয়েছে:
- নন-A/B ডিভাইস;
- A/B ও ভার্চুয়াল A/B ডিভাইস, যার রিকভারি পার্টিশন আপডেট করা যায় না। (এটি অস্বাভাবিক।)
vendor_boot ramdisk-এ ramdisk-এর ভেন্ডর বিট এবং ভেন্ডর
কার্নেল মডিউল থাকে, যার মধ্যে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত:
- ডিভাইস-নির্দিষ্ট
fstabটি ফাইল lib/modules(এতে ভেন্ডর কার্নেল মডিউল অন্তর্ভুক্ত)
recovery ছবিটি অবশ্যই স্বয়ংসম্পূর্ণ হতে হবে। এতে রিকভারি মোড বুট করার জন্য প্রয়োজনীয় সব রিসোর্স থাকতে হবে, যার মধ্যে এগুলি অন্তর্ভুক্ত:
- কার্নেল ইমেজ
- DTBO ছবি
lib/modules-এ কার্নেল মডিউল- সিমলিঙ্ক হিসেবে ফার্স্ট-স্টেজ ইনিট
/init -> /system/bin/init - সেকেন্ড-স্টেজ ইনিট বাইনারি
/system/bin/init - ডিভাইস-নির্দিষ্ট
fstabটি ফাইল recoveryবাইনারি সহ অ্যাকাউন্ট ফিরিয়ে আনার অন্যান্য সব রিসোর্স
এই ধরনের ডিভাইসে, প্রোডাক্ট কনফিগারেশন generic_ramdisk.mk থেকে উত্তরাধিকার সূত্রে
পাওয়া যায়।
BOARD ভ্যালু সেট করা
A/B নয় এমন ডিভাইসের জন্য নিম্নলিখিত ভ্যালু সেট করুন:
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
Init বাইনারি ও সিমলিঙ্ক
recovery ramdisk-এ অবশ্যই একটি /init -> /system/bin/init symlink এবং
init_second_stage.recovery /system/bin/init-এ থাকতে হবে। ডিভাইস রিকভারি মোডে বুট করার সময়, প্রথম ও দ্বিতীয় পর্যায়ের init-এর জন্য /system/bin/init বাইনারি প্রয়োজন।
ডিভাইস recovery-এ বুট করলে, recovery র্যামডিস্কের কন্টেন্ট
নিম্নলিখিত হয়:
/init -> /system/bin/init(recoveryramdisk থেকে)/system/bin/init(recoveryর্যামডিস্ক থেকে,init_second_stage.recoveryথেকে তৈরি এবং/initথেকে এক্সিকিউট করা হয়েছে)
ডিভাইস Android-এ বুট করলে, vendor_boot + generic
ramdisks-এর কন্টেন্ট নিচে উল্লেখ করা হল:
/init(ramdisk থেকে,init_first_stageথেকে তৈরি)
fstab ফাইল সরান
জেনেরিক র্যামডিস্কে ইনস্টল করা যেকোনও fstab ফাইল vendor_ramdisk এবং recovery র্যামডিস্কে সরান। উদাহরণ হিসেবে, এই
পরিবর্তন দেখুন।
মডিউল ইনস্টল করা
আপনি vendor_ramdisk এবং
recovery ramdisk-এ ডিভাইস-নির্দিষ্ট মডিউল ইনস্টল করতে পারবেন (ইনস্টল করার জন্য কোনও ডিভাইস-নির্দিষ্ট মডিউল না থাকলে
এই ধাপটি এড়িয়ে যান)। init
রুট পরিবর্তন করে না। মডিউলের vendor_ramdisk ভেরিয়েন্ট vendor_ramdisk-এর
রুট ফোল্ডারে ইনস্টল হয়। recovery র্যামডিস্কের রুটে মডিউলের recovery ভেরিয়েন্ট
ইনস্টল করা হয়। vendor_ramdisk এবং recovery র্যামডিস্কে মডিউল ইনস্টল করার উদাহরণ দেখতে, ফার্স্ট স্টেজ কনসোল এবং মেটাডেটা
চেকসাম দেখুন।
প্রথম পর্যায়ের কনসোল
মডিউলের vendor_ramdisk ভ্যারিয়েন্ট ইনস্টল করতে, নিম্নলিখিতগুলি ব্যবহার করুন:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
এটি নিশ্চিত করে যে linker, sh এবং toybox
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin-এ ইনস্টল হয়, যা তারপরে
vendor_ramdisk-এর অধীনে /system/bin-এ ইনস্টল হয়।
ফার্স্ট স্টেজ কনসোলের (যেমন, adbd) জন্য প্রয়োজনীয় মডিউল যোগ করতে, AOSP-তে
প্রাসঙ্গিক প্যাচ আপলোড করে এইসব মডিউলের vendor_ramdisk ভ্যারিয়েন্ট চালু করুন
এবং তারপরে নিম্নলিখিতগুলি ব্যবহার করুন,
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 এটিকে সাধারণ বুট হিসেবে হ্যান্ডেল করে।
রিকভারি মোডে বুট করার সময়, বুট প্রসেস পরিবর্তন হয় না। আগেকার রিকভারি প্রসেসের মতোই রিকভারি
ramdisk লোড করা হয়।
recovery ইমেজ থেকে কার্নেল লোড করা হয়। রিকভারি মোডের
বুট প্রসেস নিচে দেওয়া হল।
বুটলোডার শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:
/-এ রিকভারি র্যামডিস্ক পুশ করে।recoveryপার্টিশন থেকে কার্নেল রান করে।
কার্নেল
/-এ র্যামডিস্ক মাউন্ট করে তারপর/initএক্সিকিউট করে, যাrecoveryর্যামডিস্ক থেকে/system/bin/init-এর সিমলিঙ্ক।প্রথম স্টেজ ইনিট শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:
IsRecoveryMode() == trueওForceNormalBoot() == falseসেট করে।/lib/modulesথেকে ভেন্ডর কার্নেল মডিউল লোড করে।- কল
DoFirstStageMount()করে কিন্তু মাউন্ট করা এড়িয়ে যায় কারণIsRecoveryMode() == true। (The device doesn't free ramdisk (because/is still the same) but does callSetInitAvbVersionInRecovery().) 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
বিল্ড করার সময়, জেনেরিক ramdisk-এ একটি
system/etc/ramdisk/build.propফাইল যোগ করা হয়। এই ফাইলে বিল্ডের টাইমস্ট্যাম্প সংক্রান্ত তথ্য থাকে।রানটাইমে, প্রথম ধাপ
inittmpfs-এ র্যামডিস্ক থেকে ফাইল কপি করে যাতে র্যামডিস্ক খালি করার আগে দ্বিতীয় ধাপinitএই ফাইল পড়তে পারে এবংbootছবির টাইমস্ট্যাম্প প্রপার্টি সেট করতে পারে।