জেনেরিক বুট পার্টিশন

Android 12-এ, জেনেরিক boot ছবি, যাকে জেনেরিক কার্নেল ইমেজ (GKI) বলা হয়, সেটিতে জেনেরিক র‍্যামডিস্ক ও GKI কার্নেল থাকে।

Android 13 সহ লঞ্চ হওয়া ডিভাইসের ক্ষেত্রে, জেনেরিক ramdisk boot ইমেজ থেকে সরিয়ে আলাদা init_boot ইমেজে রাখা হয়। এই পরিবর্তনের ফলে boot ছবিতে শুধুমাত্র GKI কার্নেল থাকে।

যেসব ডিভাইস Android 12 বা তার আগের কার্নেল ভার্সন ব্যবহার করা চালিয়ে যাচ্ছে, সেগুলির ক্ষেত্রে জেনেরিক র‍্যামডিস্ক যেখানে ছিল সেখানেই থাকবে এবং নতুন init_boot ইমেজের প্রয়োজন হবে না।

একটি জেনেরিক র‍্যামডিস্ক তৈরি করতে, র‍্যামডিস্ক থেকে ভেন্ডর-নির্দিষ্ট রিসোর্সগুলি সরান যাতে জেনেরিক র‍্যামডিস্কে শুধুমাত্র প্রথম পর্যায়ের init এবং একটি প্রপার্টি ফাইল থাকে যাতে টাইমস্ট্যাম্প তথ্য থাকে।

সেইসব ডিভাইসে যেগুলি:

  • নির্দিষ্ট recovery পার্টিশন ব্যবহার করবেন না, সব রিকভারি বিট জেনেরিক র‍্যামডিস্ক থেকে vendor_boot র‍্যামডিস্কে সরানো হয়।

  • একটি নির্দিষ্ট recovery পার্টিশন ব্যবহার করুন, recovery ramdisk-এ কোনও পরিবর্তন করার প্রয়োজন নেই কারণ recovery ramdisk স্বয়ংসম্পূর্ণ।

স্থাপত্যশিল্প

Android 12 এবং তার পরবর্তী যেকোনও ভার্সনে চলা ডিভাইসের আর্কিটেকচার নিম্নলিখিত ডায়াগ্রামে ব্যাখ্যা করা হয়েছে। Android 13-এর সাথে লঞ্চ করা ডিভাইসে জেনেরিক র‍্যামডিস্ক সহ একটি নতুন init_boot ছবি থাকে। Android 12 থেকে Android 13-এ আপগ্রেড করা ডিভাইসগুলি Android 12-এর মতো একই আর্কিটেকচার ব্যবহার করে।

Android 13-এর সাথে লঞ্চ করা হয়েছে, কোনও ডেডিকেটেড রিকভারি নেই

ডিভাইস, GKI লঞ্চ/আপগ্রেড করা, কোনও ডেডিকেটেড রিকভারি নেই

ছবি ১. GKI সহ Android 13-এ লঞ্চ বা আপগ্রেড করা ডিভাইস, কোনও ডেডিকেটেড রিকভারি নেই।

Android 13, ডেডিকেটেড ও A/B রিকভারি (ডেডিকেটেড র‍্যামডিস্ক) সহ লঞ্চ করুন

ডিভাইস, GKI, ডেডিকেটেড ও A/B রিকভারি লঞ্চ/আপগ্রেড করা

ছবি ২. GKI, ডেডিকেটেড এবং A/B রিকভারি সহ Android 13-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।

ডিভাইসে recovery_a ও recovery_b পার্টিশন থাকলে এই ছবি দেখুন।

Android 13-এর সাথে লঞ্চ করা, ডেডিকেটেড ও নন-A/B রিকভারি (ডেডিকেটেড র‌্যামডিস্ক)

ডিভাইস লঞ্চ/আপগ্রেড করা, GKI, ডেডিকেটেড ও নন-A/B রিকভারি

ছবি ৩. GKI, ডেডিকেটেড এবং নন-A/B রিকভারি সহ Android 13-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।

ডিভাইসে recovery নামের কোনও পার্টিশন থাকলে এবং তাতে কোনও স্লট সাফিক্স না থাকলে এই ফিগারটি দেখুন।

Android 12 লঞ্চ বা আপগ্রেড করা হয়েছে, কোনও ডেডিকেটেড রিকভারি নেই

ডিভাইস, GKI লঞ্চ/আপগ্রেড করা, কোনও ডেডিকেটেড রিকভারি নেই

ছবি ৪. GKI সহ Android 12-এ লঞ্চ বা আপগ্রেড করা ডিভাইস, কোনও ডেডিকেটেড রিকভারি নেই।

Android 12, ডেডিকেটেড ও A/B রিকভারি (ডেডিকেটেড র‍্যামডিস্ক) লঞ্চ বা আপগ্রেড করুন

ডিভাইস, GKI, ডেডিকেটেড এবং A/B রিকভারি লঞ্চ/আপগ্রেড করা

ছবি ৫. GKI, ডেডিকেটেড ও A/B রিকভারি সহ Android 12-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।

ডিভাইসে recovery_a ও recovery_b পার্টিশন থাকলে এই ছবি দেখুন।

Android 12 লঞ্চ বা আপগ্রেড করুন, ডেডিকেটেড ও নন-A/B রিকভারি (ডেডিকেটেড র‍্যামডিস্ক)

ডিভাইস লঞ্চ/আপগ্রেড, GKI, ডেডিকেটেড ও নন-A/B রিকভারি

ছবি ৬. GKI, ডেডিকেটেড ও নন-A/B রিকভারি সহ Android 12-এ লঞ্চ বা আপগ্রেড করা ডিভাইস।

ডিভাইসে recovery নামের কোনও পার্টিশন থাকলে এবং তাতে কোনও স্লট সাফিক্স না থাকলে এই ফিগারটি দেখুন।

Android 12, রিকভারি-অ্যাজ-বুট (রিকভারি-অ্যাজ-র‍্যামডিস্ক)-এ আপগ্রেড করুন

ডিভাইস লঞ্চ/আপগ্রেড, কোনও GKI নেই, বুট হিসেবে রিকভারি

ছবি ৭. Android 12-এ আপগ্রেড করা ডিভাইস, কোনও GKI নেই, বুট করার মতো রিকভারি।

Android 12-এ আপগ্রেড করুন, ডেডিকেটেড রিকভারি (ডেডিকেটেড র‍্যামডিস্ক)

ডিভাইস লঞ্চ/আপগ্রেড করা, GKI নেই, ডেডিকেটেড রিকভারি

ছবি ৮. Android 12-এ আপগ্রেড করা ডিভাইস, কোনও GKI নেই, ডেডিকেটেড রিকভারি।

বুট ইমেজ কন্টেন্ট

Android বুট ইমেজে নিম্নলিখিত বিষয়গুলি থাকে।

  • Android 13-এর সাথে লঞ্চ করা ডিভাইসের জন্য init_boot ছবি যোগ করা হয়েছে

    • হেডার ভার্সন V4
    • জেনেরিক র‍্যামডিস্ক ইমেজ
  • জেনেরিক boot ছবি

    • শীর্ষক ভার্সন V3 অথবা V4
      • GKI boot.img সার্টিফিকেশনের জন্য boot_signature (শুধুমাত্র v4)। যাচাই করা বুটের জন্য সার্টিফায়েড GKI boot.img-তে সই করা নেই। OEM-কে এখনও ডিভাইস-নির্দিষ্ট AVB কী দিয়ে আগে থেকে তৈরি boot.img-এ সই করতে হবে।
      • সাধারণ cmdline (GENERIC_KERNEL_CMDLINE)
      • GKI কার্নেল
    • জেনেরিক র‍্যামডিস্ক ইমেজ
      • শুধুমাত্র Android 12 ও তার আগের ভার্সনের boot ছবিতে অন্তর্ভুক্ত
  • vendor_boot ছবি (বিস্তারিত জানতে, ভেন্ডর বুট পার্টিশন দেখুন)

    • vendor_boot হেডার
      • ডিভাইস-নির্দিষ্ট cmdline (BOARD_KERNEL_CMDLINE)
    • vendor_boot ramdisk image
      • lib/modules
      • অ্যাকাউন্ট ফিরিয়ে আনার রিসোর্স (ডেডিকেটেড অ্যাকাউন্ট ফিরিয়ে আনার সুবিধা না থাকলে)
    • dtb ছবি
  • recovery ছবি

    • হেডার ভার্সন V2
      • প্রয়োজন হলে, রিকভারির জন্য ডিভাইস-নির্দিষ্ট cmdline
      • A/B নয় এমন রিকভারি পার্টিশনের জন্য, হেডারের কন্টেন্টকে স্ট্যান্ডঅ্যালোন হতে হবে; দেখুন রিকভারি ইমেজ। যেমন:
      • cmdline, boot ও vendor_boot cmdline-এর সাথে কনক্যাটেনেট করা হয়নি।
      • প্রয়োজন হলে, হেডার রিকভারি DTBO নির্দিষ্ট করে।
      • A/B রিকভারি পার্টিশনের জন্য, কন্টেন্ট কনক্যাটিনেট করা বা boot ও vendor_boot থেকে অনুমান করা যেতে পারে। যেমন:
      • cmdline, boot এবং vendor_boot cmdline-এর সাথে কনক্যাটিনেট করা হয়েছে।
      • vendor_boot হেডার থেকে DTBO অনুমান করা যেতে পারে।
    • recovery ramdisk image
      • রিকভারি রিসোর্স
      • A/B নয় এমন রিকভারি পার্টিশনের জন্য, ramdisk-এর কন্টেন্টকে স্ট্যান্ডঅ্যালোন হতে হবে; রিকভারি ইমেজ দেখুন। যেমন:
      • lib/modules-এ অবশ্যই বুট করার জন্য প্রয়োজনীয় সমস্ত কার্নেল মডিউল থাকতে হবে রিকভারি মোড
      • রিকভারি র‍্যামডিস্কে init থাকতে হবে।
      • A/B রিকভারি পার্টিশনের জন্য, রিকভারি র‍্যামডিস্ককে জেনারেটিক এবং vendor_boot র‍্যামডিস্কের আগে যোগ করা হয়, তাই এটি স্ট্যান্ডঅ্যালোন হওয়ার প্রয়োজন নেই। যেমন:
      • lib/modules-এ vendor_boot ramdisk-এর মধ্যে থাকা কার্নেল মডিউল ছাড়াও, রিকভারি মোড বুট করার জন্য প্রয়োজনীয় অতিরিক্ত কার্নেল মডিউল থাকতে পারে।
      • /init-এ সিমলিঙ্ক থাকতে পারে, কিন্তু বুট ইমেজে ফার্স্ট-স্টেজ /init বাইনারি এটিকে আড়াল করে দেয়।

জেনেরিক র‍্যামডিস্ক ইমেজ কন্টেন্ট

জেনারেটিক র‍্যামডিস্কে নিম্নলিখিত কম্পোনেন্ট থাকে।

  • init
  • system/etc/ramdisk/build.prop
  • ro.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/B recovery পার্টিশন ব্যবহার করা ডিভাইসগুলিকে অবশ্যই এই ভেরিয়েবলকে 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-কে true-এ সেট করুন, আর্কিটেকচারটি ছবি ৩-এ দেখানো হয়েছে।

      • BOARD_USES_RECOVERY_AS_BOOT খালি হিসেবে সেট করুন, আর্কিটেকচারটি ছবি ৪-এ দেখানো হয়েছে।

    • BOARD_USES_RECOVERY_AS_BOOT খালি হিসেবে সেট করা যাবে। তারা তা করলে, তারা নতুন কনফিগারেশন ব্যবহার করছে। এই ধরনের ডিভাইস:

      • ডেডিকেটেড recovery পার্টিশন ব্যবহার করবেন না, ছবি ১-এ দেখানো আর্কিটেকচার অনুযায়ী এবং ডিভাইস সেট-আপ বিকল্প বিকল্প ১।

      • ডেডিকেটেড recovery পার্টিশন ব্যবহার করুন, আর্কিটেকচারটি ছবি ২ক বা ছবি ২খ-এ দেখানো হয়েছে এবং ডিভাইস সেট-আপ বিকল্পটি হল বিকল্প ২ক বা বিকল্প ২খ।

  • Android 12-এর সাথে লঞ্চ করা ডিভাইসগুলিকে অবশ্যই BOARD_USES_RECOVERY_AS_BOOT খালি রাখতে হবে এবং নতুন কনফিগারেশন ব্যবহার করতে হবে। এই ধরনের ডিভাইস:

    • ডেডিকেটেড recovery পার্টিশন ব্যবহার করবেন না, আর্কিটেকচারটি ছবি ১-এ দেখানো হয়েছে এবং ডিভাইস সেট-আপ বিকল্পটি হল বিকল্প ১।

    • একটি নির্দিষ্ট recovery পার্টিশন ব্যবহার করুন, আর্কিটেকচারটি ছবি 2a বা ছবি 2b-তে দেখানো হয়েছে এবং ডিভাইস সেটআপ বিকল্পটি হল বিকল্প 2a বা বিকল্প 2b।

কারণ 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

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

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 (recovery ramdisk থেকে, যা 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 ইমেজ থেকে লোড করা হয়। রিকভারি মোডের বুট প্রসেস নিচে দেওয়া হল।

  1. বুটলোডার শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:

    1. /-এ রিকভারি + vendor_boot + জেনেরিক র‍্যামডিস্ক পুশ করে। (If the OEM duplicates kernel modules in recovery ramdisk by adding them to BOARD_RECOVERY_KERNEL_MODULES), vendor_boot is optional.)
    2. boot পার্টিশন থেকে কার্নেল রান করে।
  2. কার্নেল /-এ ramdisk মাউন্ট করে, তারপর জেনেরিক ramdisk থেকে /init এক্সিকিউট করে।

  3. প্রথম স্টেজ ইনিট শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:

    1. IsRecoveryMode() == true ও ForceNormalBoot() == false সেট করে।
    2. /lib/modules থেকে ভেন্ডর কার্নেল মডিউল লোড করে।
    3. কল DoFirstStageMount() করে কিন্তু মাউন্ট করা এড়িয়ে যায় কারণ IsRecoveryMode() == true। (The device doesn't free ramdisk (because / is still the same) but does call SetInitAvbVersionInRecovery().)
    4. recovery ramdisk থেকে /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

recovery ramdisk-এ অবশ্যই একটি /init -> /system/bin/init symlink এবং init_second_stage.recovery /system/bin/init-এ থাকতে হবে। ডিভাইস রিকভারি মোডে বুট করার সময়, প্রথম ও দ্বিতীয় পর্যায়ের init-এর জন্য /system/bin/init বাইনারি প্রয়োজন।

ডিভাইস recovery-এ বুট করলে, recovery র‍্যামডিস্কের কন্টেন্ট নিম্নলিখিত হয়:

  • /init -> /system/bin/init (recovery ramdisk থেকে)
  • /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 ইমেজ থেকে কার্নেল লোড করা হয়। রিকভারি মোডের বুট প্রসেস নিচে দেওয়া হল।

  1. বুটলোডার শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:

    1. /-এ রিকভারি র‍্যামডিস্ক পুশ করে।
    2. recovery পার্টিশন থেকে কার্নেল রান করে।
  2. কার্নেল /-এ র‍্যামডিস্ক মাউন্ট করে তারপর /init এক্সিকিউট করে, যা recovery র‍্যামডিস্ক থেকে /system/bin/init-এর সিমলিঙ্ক।

  3. প্রথম স্টেজ ইনিট শুরু হয়, তারপর নিম্নলিখিত কাজগুলি করে:

    1. IsRecoveryMode() == true ও ForceNormalBoot() == false সেট করে।
    2. /lib/modules থেকে ভেন্ডর কার্নেল মডিউল লোড করে।
    3. কল DoFirstStageMount() করে কিন্তু মাউন্ট করা এড়িয়ে যায় কারণ IsRecoveryMode() == true। (The device doesn't free ramdisk (because / is still the same) but does call SetInitAvbVersionInRecovery().)
    4. recovery ramdisk থেকে /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 ফাইল যোগ করা হয়। এই ফাইলে বিল্ডের টাইমস্ট্যাম্প সংক্রান্ত তথ্য থাকে।

  • রানটাইমে, প্রথম ধাপ init tmpfs-এ র‍্যামডিস্ক থেকে ফাইল কপি করে যাতে র‍্যামডিস্ক খালি করার আগে দ্বিতীয় ধাপ init এই ফাইল পড়তে পারে এবং boot ছবির টাইমস্ট্যাম্প প্রপার্টি সেট করতে পারে।