অ্যান্ড্রয়েড ১০-এ ইউজার ডেটা চেকপয়েন্ট (UDC) চালু করা হয়েছে, যা কোনো অ্যান্ড্রয়েড ওভার-দ্য-এয়ার (OTA) আপডেট ব্যর্থ হলে অ্যান্ড্রয়েডকে তার পূর্ববর্তী অবস্থায় ফিরে যেতে সাহায্য করে। UDC-এর সাহায্যে, যদি কোনো অ্যান্ড্রয়েড OTA আপডেট ব্যর্থ হয়, তবে ডিভাইসটি নিরাপদে তার পূর্ববর্তী অবস্থায় ফিরে যেতে পারে। যদিও A/B আপডেটগুলো আর্লি বুটের ক্ষেত্রে এই সমস্যার সমাধান করে, কিন্তু ইউজার ডেটা পার্টিশন (যা /data তে মাউন্ট করা থাকে) পরিবর্তিত হলে রোলব্যাক সমর্থিত নয়।
UDC ডিভাইসটিকে ইউজার ডেটা পার্টিশন পরিবর্তিত হওয়ার পরেও পূর্বাবস্থায় ফিরিয়ে আনতে সক্ষম করে। UDC ফিচারটি ফাইল সিস্টেমে চেকপয়েন্ট সক্ষমতা, ফাইল সিস্টেম চেকপয়েন্ট সমর্থন না করলে একটি বিকল্প ব্যবস্থা, বুটলোডার A/B মেকানিজমের সাথে ইন্টিগ্রেশন (নন-A/B আপডেট সমর্থন সহ), এবং কী ভার্সন বাইন্ডিং ও কী রোলব্যাক প্রতিরোধের মাধ্যমে এই কাজটি সম্পন্ন করে।
ব্যবহারকারীর প্রভাব
UDC ফিচারটি ব্যবহারকারীদের জন্য OTA আপডেটের অভিজ্ঞতা উন্নত করে, কারণ OTA আপডেট ব্যর্থ হলে কম সংখ্যক ব্যবহারকারী তাদের ডেটা হারান। এর ফলে, আপডেট প্রক্রিয়া চলাকালীন সমস্যায় পড়া ব্যবহারকারীদের কাছ থেকে আসা সাপোর্ট কলের সংখ্যা কমে যেতে পারে। তবে, যখন কোনো OTA আপডেট ব্যর্থ হয়, ব্যবহারকারীরা লক্ষ্য করতে পারেন যে ডিভাইসটি একাধিকবার রিবুট হচ্ছে।
এটি কীভাবে কাজ করে
বিভিন্ন ফাইল সিস্টেমে চেকপয়েন্ট কার্যকারিতা
F2FS ফাইল সিস্টেমের জন্য, UDC আপস্ট্রিম ৪.২০ লিনাক্স কার্নেলে চেকপয়েন্ট কার্যকারিতা যোগ করে এবং অ্যান্ড্রয়েড ১০ চালিত ডিভাইস দ্বারা সমর্থিত সকল প্রচলিত কার্নেলে এটি ব্যাকপোর্ট করে।
অন্যান্য ফাইল সিস্টেমের জন্য, UDC চেকপয়েন্ট কার্যকারিতার জন্য dm_bow নামক একটি ডিভাইস ম্যাপার ভার্চুয়াল ডিভাইস ব্যবহার করে। dm_bow ডিভাইস এবং ফাইল সিস্টেমের মাঝে অবস্থান করে। যখন একটি পার্টিশন মাউন্ট করা হয়, তখন একটি ট্রিম জারি করা হয়, যার ফলে ফাইল সিস্টেম সমস্ত খালি ব্লকে ট্রিম কমান্ড জারি করে। dm_bow এই ট্রিমগুলো গ্রহণ করে এবং একটি খালি ব্লকের তালিকা তৈরি করতে সেগুলো ব্যবহার করে। এরপর রিড এবং রাইটগুলো অপরিবর্তিত অবস্থায় ডিভাইসে পাঠানো হয়, কিন্তু রাইটের অনুমতি দেওয়ার আগে, রিস্টোরের জন্য প্রয়োজনীয় ডেটা একটি খালি ব্লকে ব্যাকআপ করা হয়।
চেকপয়েন্ট প্রক্রিয়া
যখন checkpoint=fs/block ফ্ল্যাগযুক্ত কোনো পার্টিশন মাউন্ট করা হয়, তখন অ্যান্ড্রয়েড ড্রাইভটিতে restoreCheckpoint কল করে, যাতে ডিভাইসটি যেকোনো বর্তমান চেকপয়েন্ট পুনরুদ্ধার করতে পারে। এরপর init needsCheckpoint ফাংশনটি কল করে এটি নির্ধারণ করার জন্য যে, ডিভাইসটি বুটলোডার A/B অবস্থায় আছে কিনা অথবা আপডেট রিট্রাই কাউন্ট সেট করা আছে কিনা। যদি এর কোনোটি সত্য হয়, তবে অ্যান্ড্রয়েড createCheckpoint কল করে হয় মাউন্ট ফ্ল্যাগ যোগ করে অথবা একটি dm_bow ডিভাইস তৈরি করে।
পার্টিশনটি মাউন্ট হওয়ার পর, ট্রিমস জারি করার জন্য চেকপয়েন্ট কোড কল করা হয়। এরপর বুট প্রক্রিয়া স্বাভাবিকভাবে চলতে থাকে। LOCKED_BOOT_COMPLETE পর্যায়ে, অ্যান্ড্রয়েড বর্তমান চেকপয়েন্টটি কমিট করার জন্য commitCheckpoint কল করে এবং আপডেটটি স্বাভাবিকভাবে চলতে থাকে।
KeyMint (পূর্বে Keymaster) কীগুলি পরিচালনা করুন
KeyMint কী-গুলো ডিভাইস এনক্রিপশন বা অন্যান্য উদ্দেশ্যে ব্যবহৃত হয়। এই কী-গুলো পরিচালনা করার জন্য, অ্যান্ড্রয়েড চেকপয়েন্ট কমিট না হওয়া পর্যন্ত কী ডিলিট করার কলগুলো বিলম্বিত করে।
স্বাস্থ্য পর্যবেক্ষণ করুন
একটি হেলথ ডেমন যাচাই করে যে চেকপয়েন্ট তৈরি করার জন্য ডিস্কে পর্যাপ্ত জায়গা আছে কিনা। হেলথ ডেমনটি Checkpoint.cpp ফাইলের cp_healthDaemon এ অবস্থিত।
হেলথ ডেমনটির নিম্নলিখিত আচরণগুলো কনফিগার করা যেতে পারে:
-
ro.sys.cp_msleeptime: ডিভাইসটি কত ঘন ঘন ডিস্কের ব্যবহার পরীক্ষা করবে তা নিয়ন্ত্রণ করে। -
ro.sys.cp_min_free_bytes: হেলথ ডেমন যে সর্বনিম্ন মানটি খোঁজে, তা নিয়ন্ত্রণ করে। -
ro.sys.cp_commit_on_full: ডিস্ক পূর্ণ হয়ে গেলে হেলথ ডেমন ডিভাইসটি রিবুট করবে, নাকি চেকপয়েন্ট কমিট করে কাজ চালিয়ে যাবে, তা এটি নিয়ন্ত্রণ করে।
চেকপয়েন্ট এপিআই
UDC ফিচারটি চেকপয়েন্ট API ব্যবহার করে। UDC দ্বারা ব্যবহৃত অন্যান্য API-এর জন্য, IVold.aidl দেখুন।
void startCheckpoint(int retry)
একটি চেকপয়েন্ট তৈরি করে।
যখন ফ্রেমওয়ার্কটি একটি আপডেট শুরু করার জন্য প্রস্তুত হয়, তখন এটি এই মেথডটিকে কল করে। রিবুটের পর ইউজারডেটার মতো চেকপয়েন্টযুক্ত ফাইল সিস্টেমগুলো রিড/রাইট (R/W) মোডে মাউন্ট করার আগে চেকপয়েন্টটি তৈরি করা হয়। যদি রিট্রাই কাউন্ট ধনাত্মক হয়, তাহলে এপিআই রিট্রাইগুলো ট্র্যাক করার কাজটি পরিচালনা করে এবং আপডেটারটি আপডেটটি রোলব্যাক করার প্রয়োজন আছে কিনা তা পরীক্ষা করার জন্য needsRollback মেথডটিকে কল করে। যদি রিট্রাই কাউন্ট -1 হয়, তাহলে এপিআই এ/বি বুটলোডারের সিদ্ধান্তের ওপর নির্ভর করে।
সাধারণ A/B আপডেট করার সময় এই মেথডটি কল করা হয় না।
void commitChanges()
পরিবর্তনগুলো কার্যকর করে।
রিবুটের পরে যখন পরিবর্তনগুলো কমিট করার জন্য প্রস্তুত হয়, তখন ফ্রেমওয়ার্ক এই মেথডটি কল করে। ইউজারডেটাতে ডেটা (যেমন ছবি, ভিডিও, এসএমএস, সার্ভার থেকে প্রাপ্তি স্বীকার) লেখার আগে এবং BootComplete আগে এটি কল করা হয়।
যদি কোনো সক্রিয় চেকপয়েন্টযুক্ত আপডেট না থাকে, তাহলে এই পদ্ধতিটির কোনো প্রভাব থাকে না।
abortChanges()
জোরপূর্বক রিবুট করে এবং চেকপয়েন্টে ফিরে যায়। প্রথম রিবুটের পর থেকে করা সমস্ত ইউজারডেটা পরিবর্তন বাতিল করে দেয়।
ফ্রেমওয়ার্কটি রিবুটের পরে কিন্তু commitChanges আগে এই মেথডটি কল করে। এই মেথডটি কল করা হলে retry_counter কমে যায়। লগ এন্ট্রি তৈরি হয়।
বুলিয়ান নিডসরোলব্যাক()
রোলব্যাক প্রয়োজন কিনা তা নির্ধারণ করে।
নন-চেকপয়েন্ট ডিভাইসগুলিতে, এটি false রিটার্ন করে। চেকপয়েন্ট ডিভাইসগুলিতে, এটি একটি নন-চেকপয়েন্ট বুটের সময় true (true) রিটার্ন করে।
ইউডিসি বাস্তবায়ন করুন
রেফারেন্স বাস্তবায়ন
UDC কীভাবে প্রয়োগ করা যেতে পারে তার একটি উদাহরণের জন্য, dm-bow.c দেখুন। এই বৈশিষ্ট্যটির উপর অতিরিক্ত ডকুমেন্টেশনের জন্য, dm-bow.txt দেখুন।
সেটআপ
আপনার init.hardware.rc ফাইলে, নিশ্চিত করুন যে on fs রয়েছে:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
on late-fs , আপনার init.hardware.rc ফাইলে নিম্নলিখিত বিষয়গুলো নিশ্চিত করুন:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
আপনার fstab.hardware ফাইলে, /data latemount হিসেবে ট্যাগ করা আছে কিনা তা নিশ্চিত করুন।
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs
মেটাডেটা পার্টিশন যোগ করুন
UDC-এর নন-বুটলোডার রিট্রাই কাউন্ট এবং কীগুলো সংরক্ষণের জন্য একটি মেটাডেটা পার্টিশন প্রয়োজন। একটি মেটাডেটা পার্টিশন তৈরি করুন এবং এটিকে /metadata তে আর্লি মাউন্ট করুন।
আপনার fstab.hardware ফাইলে, /metadata earlymount অথবা first_stage_mount হিসেবে ট্যাগ করা আছে কিনা তা নিশ্চিত করুন।
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
পার্টিশনটিকে সব শূন্য দিয়ে শুরু করুন।
BoardConfig.mk তে নিম্নলিখিত লাইনগুলো যোগ করুন:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
সিস্টেম আপডেট করুন
F2FS সিস্টেম
যেসব সিস্টেম ডেটা ফরম্যাট করার জন্য F2FS ব্যবহার করে, সেগুলোর ক্ষেত্রে নিশ্চিত করুন যে আপনার F2FS সংস্করণটি চেকপয়েন্ট সমর্থন করে। আরও তথ্যের জন্য, বিভিন্ন ফাইল সিস্টেমে চেকপয়েন্ট কার্যকারিতা দেখুন।
/data তে মাউন্ট করা ডিভাইসটির জন্য fstab-এর <fs_mgr_flags> সেকশনে checkpoint=fs ফ্ল্যাগটি যোগ করুন।
নন-এফ২এফএস সিস্টেম
নন-এফ২এফএস সিস্টেমের ক্ষেত্রে, কার্নেল কনফিগে dm-bow অবশ্যই সক্রিয় করতে হবে।
/data তে মাউন্ট করা ডিভাইসটির জন্য fstab-এর <fs_mgr_flags> সেকশনে checkpoint=block ফ্ল্যাগটি যোগ করুন।
লগ পরীক্ষা করুন
চেকপয়েন্ট এপিআই কল করা হলে লগ এন্ট্রি তৈরি হয়।
বৈধতা
আপনার UDC ইমপ্লিমেন্টেশন পরীক্ষা করার জন্য, VtsKernelCheckpointTest নামক VTS টেস্ট সেটটি চালান।