ভার্চুয়াল 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 ও তার পরবর্তী ভার্সনের জন্য, Virtual 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। Android 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

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

Userspace মার্জ

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

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

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

বুট কন্ট্রোল HAL OTA ক্লায়েন্টদের বুট স্লট কন্ট্রোল করার জন্য ইন্টারফেস প্রদান করে। ফ্ল্যাশিং বা ফ্যাক্টরি রিসেটের সময় বুটলোডার সুরক্ষিত আছে কিনা তা নিশ্চিত করতে অতিরিক্ত API-এর প্রয়োজন হয় বলে ভার্চুয়াল A/B-এর জন্য বুট কন্ট্রোল HAL-এর মাইনর ভার্সন আপগ্রেড প্রয়োজন হয়। HAL সংজ্ঞার লেটেস্ট ভার্সনের জন্য IBootControl.hal এবং types.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-এর এন্ট্রিতে check fs_mgr ফ্ল্যাগ যোগ করুন। নিচে একটি উদাহরণ দেওয়া হল:

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

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

স্ন্যাপশট নেওয়ার সুবিধা চালু করতে, CONFIG_DM_SNAPSHOT-কে true-এ সেট করুন।

F2FS ব্যবহার করা ডিভাইসের জন্য, ফাইল পিনিং সংক্রান্ত সমস্যা সমাধান করতে f2fs: export FS_NOCOW_FL flag to user কার্নেল প্যাচ অন্তর্ভুক্ত করুন। এছাড়াও, f2fs: support aligned pinned file কার্নেল প্যাচ অন্তর্ভুক্ত করুন।

ভার্চুয়াল A/B, কার্নেল ভার্সন 4.3-এ যোগ করা ফিচারের উপর নির্ভর করে: snapshot এবং snapshot-merge টার্গেটে ওভারফ্লো স্ট্যাটাস বিট। Android 9 ও তার পরবর্তী যেকোনও ভার্সন সহ লঞ্চ করা সব ডিভাইসে আগে থেকেই 4.4 বা এর পরবর্তী যেকোনও ভার্সনের কার্নেল থাকতে হবে।

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

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

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

Android 11, fastboot প্রোটোকলে নিম্নলিখিত পরিবর্তনগুলি করে:

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

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

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

কম্প্রেশন অ্যালগরিদম দুটি পদ্ধতির মাধ্যমে আরও কাস্টমাইজ করা যেতে পারে: (কম্প্রেশন লেভেল) (স্পিডের বিনিময়ে অর্জিত কম্প্রেশনের পরিমাণ) এবং (কম্প্রেশন ফ্যাক্টর) (সর্বাধিক কম্প্রেস করা যায় এমন উইন্ডোর সাইজ)। কম্প্রেশন লেভেল নির্দিষ্ট কিছু অ্যালগরিদমের জন্য উপলভ্য, যেমন zstd এবং লেভেল পরিবর্তন করলে স্পিড ও কম্প্রেশন রেশিওর মধ্যে ট্রেড-অফ করতে হয়। কম্প্রেশন ফ্যাক্টর OTA ইনস্টলেশনের সময় ব্যবহৃত সর্বাধিক কম্প্রেশন উইন্ডো সাইজ বর্ণনা করে। ডিফল্ট হিসেবে ৬৪k সেট করা থাকে, তবে বিল্ড প্যারামিটার 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 ১৮ মিনিট ১৫ সেকেন্ড ২.৫ জিবি ৩২.৭ সেকেন্ড ৯৮.৬ সেকেন্ড
zstd ২৪ মিনিট ৪৯ সেকেন্ড ২.০৫ জিবি ৩৬.৩ সেকেন্ড ১৩৩.২ সেকেন্ড
none ১৬ মিনিট ৪২ সেকেন্ড ৪.৭৬ জিবি ২৮.৭ সেকেন্ড ৭৬.৬ সেকেন্ড

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

পোস্ট-ইনস্টল ফেজ ছাড়া ইনস্টল করার সময় COW স্পেসের ব্যবহার OTA-এর পরে বুট হওয়ার সময় স্ন্যাপশট মার্জ করার সময়
lz4 ১৫ মিনিট ১১ সেকেন্ড ৪.১৬ জিবি ১৭.৬ সেকেন্ড ৮২.২ সেকেন্ড
zstd ১৬ মিনিট ১৯ সেকেন্ড ৩.৪৬ জিবি ২১.০ সেকেন্ড ১০৬.৩ সেকেন্ড
কোনওটিই নয় ১৩ মিনিট ৩৩ সেকেন্ড ৬.৩৯ জিবি ১৮.৫ সেকেন্ড ৯২.৫ সেকেন্ড