ভার্চুয়াল 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 অবশ্যই sum(আপডেট গ্রুপগুলির সাইজ) + ওভারহেড- এর চেয়ে বড় বা সমান হতে হবে, যা আবার sum(পার্টিশনগুলির সাইজ) + ওভারহেড- এর চেয়ে বড় বা সমান হতে হবে।

অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণগুলোতে, ভার্চুয়াল এ/বি (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)

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

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

অ্যান্ড্রয়েড ১২-এর ক্ষেত্রে, ভার্চুয়াল এ/বি (Virtual 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 কম্প্রেশন

অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণে আপগ্রেড করা ডিভাইসগুলিতে XOR কম্প্রেশন ফিচারটি ডিফল্টরূপে সক্রিয় থাকে না। XOR কম্প্রেশন সক্রিয় করতে, ডিভাইসটির .mk ফাইলে নিম্নলিখিতটি যোগ করুন।

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

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

ব্যবহারকারী স্থান একত্রীকরণ

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

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

বুট নিয়ন্ত্রণ HAL

বুট কন্ট্রোল HAL, OTA ক্লায়েন্টদের বুট স্লট নিয়ন্ত্রণ করার জন্য একটি ইন্টারফেস প্রদান করে। ভার্চুয়াল A/B-এর জন্য বুট কন্ট্রোল HAL-এর একটি মাইনর ভার্সন আপগ্রেড প্রয়োজন, কারণ ফ্ল্যাশিং বা ফ্যাক্টরি রিসেটের সময় বুটলোডার সুরক্ষিত রাখা নিশ্চিত করতে অতিরিক্ত API-এর প্রয়োজন হয়। 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 ফ্ল্যাগটি অন্তর্ভুক্ত করুন। এর সাথে f2fs: support aligned pinned file কার্নেল প্যাচটিও অন্তর্ভুক্ত করুন।

ভার্চুয়াল এ/বি কার্নেল সংস্করণ ৪.৩-এ যুক্ত হওয়া কিছু বৈশিষ্ট্যের উপর নির্ভর করে: snapshot এবং snapshot-merge টার্গেটের ওভারফ্লো স্ট্যাটাস বিট। অ্যান্ড্রয়েড ৯ এবং তার পরবর্তী সংস্করণসহ চালু হওয়া সমস্ত ডিভাইসে ইতিমধ্যে কার্নেল সংস্করণ ৪.৪ বা তার পরবর্তী সংস্করণ থাকা উচিত।

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

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

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

অ্যান্ড্রয়েড ১১ ফাস্টবুট প্রোটোকলে নিম্নলিখিত পরিবর্তনগুলো এনেছে:

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

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

  1. Query getvar snapshot-update-status .
  2. merging হলে বা snapshotted হলে, snapshot-update cancel কমান্ডটি দিন।
  3. ঝলকানো ধাপগুলো অনুসরণ করে এগিয়ে যান।

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

যেসব ডিভাইসে super-এ সম্পূর্ণ A/B স্টোরেজ বরাদ্দ করা নেই এবং প্রয়োজন অনুযায়ী /data ব্যবহার করার প্রত্যাশা করা হচ্ছে, তাদের জন্য ব্লক ম্যাপিং টুল ব্যবহার করার জোরালো পরামর্শ দেওয়া হচ্ছে। ব্লক ম্যাপিং টুল বিভিন্ন বিল্ডের মধ্যে ব্লক বরাদ্দকে সামঞ্জস্যপূর্ণ রাখে, যা স্ন্যাপশটে অপ্রয়োজনীয় রাইট কমিয়ে দেয়। এই বিষয়টি "Reducing OTA Size" শিরোনামের অধীনে নথিভুক্ত করা হয়েছে।

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

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

কম্প্রেশন সূক্ষ্মভাবে সমন্বয় করা

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

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

পিক্সেল ৮ প্রো-তে ইনক্রিমেন্টাল ওটিএ

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

পিক্সেল ৮ প্রো-তে সম্পূর্ণ OTA

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