ভার্চুয়াল A/B প্রয়োগ করুন

একটি নতুন ডিভাইসে ভার্চুয়াল A/B প্রয়োগ করতে, বা একটি লঞ্চ করা ডিভাইস পুনরুদ্ধার করতে, আপনাকে অবশ্যই ডিভাইস-নির্দিষ্ট কোডে পরিবর্তন করতে হবে।

পতাকা তৈরি করুন

ভার্চুয়াল A/B ব্যবহার করে এমন ডিভাইসগুলিকে অবশ্যই A/B ডিভাইস হিসাবে কনফিগার করতে হবে এবং গতিশীল পার্টিশনের সাথে চালু করতে হবে।

ভার্চুয়াল A/B দিয়ে লঞ্চ করা ডিভাইসগুলির জন্য, সেগুলিকে ভার্চুয়াল A/B ডিভাইস বেস কনফিগারেশনের উত্তরাধিকার হিসেবে সেট করুন:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

ভার্চুয়াল A/B সহ লঞ্চ করা ডিভাইসগুলির জন্য BOARD_SUPER_PARTITION_SIZE এর জন্য মাত্র অর্ধেক বোর্ডের আকার প্রয়োজন কারণ B স্লটগুলি আর সুপারে নেই৷ অর্থাৎ, BOARD_SUPER_PARTITION_SIZE অবশ্যই যোগফলের (আপডেট গোষ্ঠীর আকার) + ওভারহেডের থেকে বেশি বা সমান হতে হবে, যা অবশ্যই যোগফলের (পার্টিশনের আকার) + ওভারহেডের চেয়ে বেশি বা সমান হতে হবে।

Android 13 এবং উচ্চতর জন্য, ভার্চুয়াল A/B এর সাথে সংকুচিত স্ন্যাপশটগুলি সক্ষম করতে, নিম্নলিখিত বেস কনফিগারেশনটি উত্তরাধিকারী করুন:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)

এটি একটি নো-অপ কম্প্রেশন পদ্ধতি ব্যবহার করার সময় ভার্চুয়াল A/B সহ ব্যবহারকারীর স্থান স্ন্যাপশট সক্ষম করে। তারপরে আপনি কম্প্রেশন পদ্ধতিটি সমর্থিত পদ্ধতিগুলির মধ্যে একটিতে কনফিগার করতে পারেন, zstd এবং lz4 । অ্যান্ড্রয়েড 15-এর জন্য, ডিভাইসের চাহিদা মেলে কম্প্রেশনকে আরও কাস্টমাইজ করা যেতে পারে। আরও তথ্যের জন্য, ফাইন টিউনিং কম্প্রেশন দেখুন।

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Android 12-এর জন্য, ভার্চুয়াল A/B সহ সংকুচিত স্ন্যাপশটগুলি সক্ষম করতে, নিম্নলিখিত বেস কনফিগারেশনটি উত্তরাধিকারসূত্রে পান:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

XOR কম্প্রেশন

Android 13 এবং উচ্চতর ডিভাইসে আপগ্রেড করার জন্য, XOR কম্প্রেশন বৈশিষ্ট্যটি ডিফল্টরূপে সক্ষম করা হয় না। XOR কম্প্রেশন সক্ষম করতে, ডিভাইসের .mk ফাইলে নিম্নলিখিত যোগ করুন।

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true

android_t_baseline.mk থেকে পাওয়া ডিভাইসগুলির জন্য ডিফল্টরূপে XOR কম্প্রেশন সক্রিয় করা হয়।

ইউজারস্পেস মার্জ

ভার্চুয়াল A/B (Android T এবং এর পরে) এর আধুনিক সংস্করণে, স্ন্যাপশট একত্রিত করার প্রক্রিয়াটি সম্পূর্ণরূপে ইউজারস্পেসে ঘটে। এই পরিবর্তনটি snapuserd এবং dm-ব্যবহারকারীর দ্বারা সম্ভব হয়েছে। অ্যান্ড্রয়েড 13 এবং উচ্চতর ডিভাইসগুলির সাথে চালু হওয়া ডিভাইসগুলিতে ডিফল্টরূপে ইউজারস্পেস মার্জ সক্রিয় থাকে এবং পুরানো ডিভাইসগুলি আপগ্রেড করার জন্য, এই বৈশিষ্ট্যটি নিম্নলিখিতগুলির সাথে সেট করা যেতে পারে:

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true

বুট কন্ট্রোল HAL

বুট কন্ট্রোল HAL OTA ক্লায়েন্টদের বুট স্লট নিয়ন্ত্রণ করার জন্য একটি ইন্টারফেস প্রদান করে। ভার্চুয়াল A/B-এর জন্য বুট কন্ট্রোল HAL-এর একটি ছোট সংস্করণ আপগ্রেড প্রয়োজন কারণ ফ্ল্যাশিং বা ফ্যাক্টরি রিসেট করার সময় বুটলোডার সুরক্ষিত আছে তা নিশ্চিত করার জন্য অতিরিক্ত APIs প্রয়োজন। HAL সংজ্ঞার সর্বশেষ সংস্করণের জন্য IBootControl.hal এবং type.hal দেখুন।

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

Fstab পরিবর্তন

মেটাডেটা পার্টিশনের অখণ্ডতা বুট প্রক্রিয়ার জন্য অপরিহার্য, বিশেষ করে একটি OTA আপডেট প্রয়োগ করার পরে। সুতরাং, first_stage_init মাউন্ট করার আগে মেটাডেটা পার্টিশনটি অবশ্যই পরীক্ষা করা উচিত। এটি নিশ্চিত করতে, /metadata এর জন্য এন্ট্রিতে fs_mgr check পতাকা যোগ করুন। নিম্নলিখিত একটি উদাহরণ প্রদান করে:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

কার্নেলের প্রয়োজনীয়তা

স্ন্যাপশট সক্ষম করতে, CONFIG_DM_SNAPSHOT true সেট করুন।

F2FS ব্যবহার করা ডিভাইসগুলির জন্য, f2fs অন্তর্ভুক্ত করুন: ফাইল পিনিং ঠিক করতে ব্যবহারকারীর কার্নেল প্যাচে FS_NOCOW_FL পতাকা রপ্তানি করুনf2fs অন্তর্ভুক্ত করুন: পাশাপাশি প্রান্তিককৃত পিন করা ফাইল কার্নেল প্যাচ সমর্থন করে

ভার্চুয়াল A/B কার্নেল সংস্করণ 4.3-এ যোগ করা বৈশিষ্ট্যের উপর নির্ভর করে: snapshot এবং snapshot-merge টার্গেটে ওভারফ্লো স্ট্যাটাস বিট। অ্যান্ড্রয়েড 9 এবং তার পরে চালু হওয়া সমস্ত ডিভাইসে ইতিমধ্যে কার্নেল সংস্করণ 4.4 বা তার পরে থাকা উচিত।

সংকুচিত স্ন্যাপশট সক্রিয় করতে, ন্যূনতম সমর্থিত কার্নেল সংস্করণ 4.19। CONFIG_DM_USER=m বা CONFIG_DM_USER=y সেট করুন। পূর্বের (একটি মডিউল) ব্যবহার করলে, মডিউলটি অবশ্যই প্রথম পর্যায়ের রামডিস্কে লোড করতে হবে। ডিভাইস মেকফাইলে নিম্নলিখিত লাইন যোগ করে এটি অর্জন করা যেতে পারে:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

ফাস্টবুট টুলিং পরিবর্তন

Android 11 ফাস্টবুট প্রোটোকলে নিম্নলিখিত পরিবর্তনগুলি করে:

  • getvar snapshot-update-status — বুট কন্ট্রোল HAL বুটলোডারের সাথে যোগাযোগ করে এমন মান প্রদান করে:
    • যদি রাজ্য MERGING হয়, বুটলোডার অবশ্যই merging ফিরে আসবে।
    • যদি স্টেটটি SNAPSHOTTED হয়, বুটলোডারকে অবশ্যই snapshotted নিয়ে ফিরতে হবে।
    • অন্যথায়, বুটলোডার অবশ্যই none ফেরত দেবে না।
  • snapshot-update merge — একটি মার্জ অপারেশন সম্পূর্ণ করে, প্রয়োজনে পুনরুদ্ধার/ফাস্টবুট-এ বুট করা হয়। এই কমান্ডটি তখনই বৈধ যদি snapshot-update-status merging হয় এবং শুধুমাত্র fastbootd-এ সমর্থিত হয়।
  • snapshot-update cancel — বুট কন্ট্রোল HAL-এর মার্জ স্ট্যাটাস CANCELLED এ সেট করে। ডিভাইসটি লক থাকা অবস্থায় এই কমান্ডটি অবৈধ।
  • erase বা wipemetadata , userdata , বা বুট কন্ট্রোল HAL-এর জন্য মার্জ স্ট্যাটাস ধারণ করা একটি পার্টিশন erase বা মুছে wipe জন্য স্ন্যাপশট মার্জ স্ট্যাটাস পরীক্ষা করা উচিত। যদি স্থিতিটি MERGING বা SNAPSHOTTED হয়, তাহলে ডিভাইসটির অপারেশন বাতিল করা উচিত।
  • set_active — একটি set_active কমান্ড যা সক্রিয় স্লট পরিবর্তন করে স্ন্যাপশট মার্জ স্ট্যাটাস চেক করা উচিত। স্ট্যাটাস MERGING হলে, ডিভাইসটির অপারেশন বাতিল করা উচিত। স্লট নিরাপদে SNAPSHOTTED অবস্থায় পরিবর্তন করা যেতে পারে।

এই পরিবর্তনগুলি দুর্ঘটনাবশত একটি ডিভাইসকে বুট করার অযোগ্য করা প্রতিরোধ করার জন্য ডিজাইন করা হয়েছে, তবে সেগুলি স্বয়ংক্রিয় টুলিংয়ের জন্য ব্যাঘাত সৃষ্টি করতে পারে। যখন কমান্ডগুলি সমস্ত পার্টিশনকে ফ্ল্যাশ করার একটি উপাদান হিসাবে ব্যবহার করা হয়, যেমন fastboot flashall চালানো, তখন নিম্নলিখিত প্রবাহটি ব্যবহার করার পরামর্শ দেওয়া হয়:

  1. getvar snapshot-update-status জিজ্ঞাসা করুন।
  2. merging বা snapshotted হলে, snapshot-update cancel ইস্যু করুন।
  3. ঝলকানি পদক্ষেপ নিয়ে এগিয়ে যান।

স্টোরেজ প্রয়োজনীয়তা হ্রাস করুন

যে ডিভাইসগুলিতে সুপারে সম্পূর্ণ A/B স্টোরেজ বরাদ্দ নেই, এবং প্রয়োজনে /data ব্যবহার করার আশা করছেন, তাদের ব্লক ম্যাপিং টুল ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করা হয়। ব্লক ম্যাপিং টুল বিল্ডগুলির মধ্যে ব্লক বরাদ্দকে সামঞ্জস্য রাখে, স্ন্যাপশটে অপ্রয়োজনীয় লেখাগুলি হ্রাস করে। এটি ওটিএ আকার হ্রাস করার অধীনে নথিভুক্ত করা হয়েছে।

OTA কম্প্রেশন অ্যালগরিদম

OTA প্যাকেজগুলি বিভিন্ন পারফরম্যান্স মেট্রিক্সের জন্য টিউন করা যেতে পারে। অ্যান্ড্রয়েড বেশ কয়েকটি সমর্থিত কম্প্রেশন পদ্ধতি প্রদান করে ( lz4 , zstd , এবং none ) যেগুলির মধ্যে ইনস্টলের সময়, COW স্থান ব্যবহার, বুট সময় এবং স্ন্যাপশট মার্জ সময়ের মধ্যে ট্রেডঅফ রয়েছে৷ কম্প্রেশন সহ ভার্চুয়াল ab-এর জন্য সক্রিয় ডিফল্ট বিকল্প হল lz4 compression method

ফাইন টিউনিং কম্প্রেশন

কম্প্রেশন অ্যালগরিদম দুটি পদ্ধতির মাধ্যমে আরও কাস্টমাইজ করা যেতে পারে: ( কম্প্রেশন স্তর ) (গতির খরচে অর্জিত কম্প্রেশনের পরিমাণ) এবং ( কম্প্রেশন ফ্যাক্টর ) (সর্বোচ্চ সংকোচনযোগ্য উইন্ডো আকার)। কম্প্রেশন লেভেল নির্দিষ্ট অ্যালগরিদমের জন্য উপলব্ধ যেমন zstd , এবং লেভেল পরিবর্তন করলে গতি এবং কম্প্রেশন অনুপাতের মধ্যে ট্রেডঅফ হয়। কম্প্রেশন ফ্যাক্টর OTA ইনস্টলেশনের সময় ব্যবহৃত সর্বাধিক কম্প্রেশন উইন্ডোর আকার বর্ণনা করে। ডিফল্ট 64k এ সেট করা আছে, কিন্তু বিল্ড প্যারামিটার PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR কাস্টমাইজ করে ওভাররাইড করা যেতে পারে। সমর্থিত কম্প্রেশন ফ্যাক্টর 4k, 8k, 16k, 32k, 64k, 128k এবং 256k।

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Pixel 8 Pro-এ ক্রমবর্ধমান OTA

পোস্ট ইন্সটল পর্বের সাথে ইনস্টল করার সময় COW স্পেস ব্যবহার পোস্ট OTA বুট সময় স্ন্যাপশট মার্জ সময়
lz4 18 মিনিট 15 সেকেন্ড 2.5 জিবি 32.7 সেকেন্ড 98.6 সেকেন্ড
zstd 24 মিনিট 49 সেকেন্ড 2.05 জিবি 36.3 সেকেন্ড 133.2 সেকেন্ড
কোনটি 16 মিনিট 42 সেকেন্ড 4.76 জিবি 28.7 সেকেন্ড 76.6 সেকেন্ড

Pixel 8 Pro-এ সম্পূর্ণ OTA

পোস্ট ইন্সটল পর্বের সাথে ইনস্টল করার সময় COW স্পেস ব্যবহার পোস্ট OTA বুট সময় স্ন্যাপশট মার্জ সময়
lz4 15 মিনিট 11 সেকেন্ড 4.16 জিবি 17.6 সেকেন্ড 82.2 সেকেন্ড
zstd 16 মিনিট 19 সেকেন্ড 3.46 জিবি 21.0 সেকেন্ড 106.3 সেকেন্ড
কোনটি 13 মিনিট 33 সেকেন্ড 6.39 জিবি 18.5 সেকেন্ড 92.5 সেকেন্ড