يطرح Android 10 ميزة "نقطة التحقّق من بيانات المستخدم" (UDC)، التي تتيح لنظام Android الرجوع إلى حالته السابقة في حال تعذّر تثبيت تحديث Android عبر الهواء (OTA). باستخدام ميزة UDC، إذا تعذّر تثبيت تحديث Android عبر الهواء، يمكن للجهاز الرجوع بأمان إلى حالته السابقة. على الرغم من أنّ
التحديثات من النوع A/B تحلّ هذه المشكلة في مرحلة التشغيل المبكّرة، لا يكون الرجوع إلى الحالة السابقة
متاحًا عند تعديل قسم بيانات المستخدم (المثبَّت على /data).
تتيح ميزة UDC للجهاز إرجاع قسم بيانات المستخدم إلى حالته السابقة حتى بعد تعديله. تحقّق ميزة UDC ذلك من خلال إمكانات نقطة التحقّق لنظام الملفات، وتنفيذ بديل عندما لا يتيح نظام الملفات نقاط التحقّق، والتكامل مع آلية A/B في أداة تحميل التشغيل مع إتاحة التحديثات غير من النوع A/B، وإتاحة ربط إصدار المفتاح ومنع إرجاع المفتاح إلى إصدار سابق.
تأثير الميزة على المستخدمين
تحسّن ميزة UDC تجربة تحديث Android عبر الهواء للمستخدمين، إذ يفقد عدد أقل من المستخدمين بياناتهم عند تعذّر تثبيت تحديث Android عبر الهواء. ويمكن أن يقلّل ذلك من عدد طلبات الدعم الواردة من المستخدمين الذين يواجهون مشاكل أثناء عملية التحديث. ومع ذلك، عند تعذّر تثبيت تحديث Android عبر الهواء، قد يلاحظ المستخدمون إعادة تشغيل الجهاز عدة مرات.
آلية العمل
وظيفة نقطة التحقّق في أنظمة الملفات المختلفة
بالنسبة إلى نظام الملفات F2FS، تضيف ميزة UDC وظيفة نقطة التحقّق إلى إصدار 4.20 من النواة Linux الأساسية، وتُعيد نقلها إلى جميع النواة الشائعة التي تتيحها الأجهزة التي تعمل بنظام Android 10.
بالنسبة إلى أنظمة الملفات الأخرى، تستخدم ميزة UDC جهازًا افتراضيًا لبرنامج إدارة الأجهزة يُعرف باسم dm_bow لوظيفة نقطة التحقّق. يقع dm_bow بين الجهاز ونظام الملفات. عند تثبيت قسم، يتم إصدار أمر تقليم، ما يؤدي إلى إصدار نظام الملفات لأوامر تقليم على جميع الكتل الخالية. يعترض dm_bow عمليات التقليم هذه ويستخدمها لإعداد قائمة بالكتل الخالية. بعد ذلك، يتم إرسال عمليات القراءة والكتابة إلى الجهاز بدون تعديل، ولكن قبل السماح بعملية الكتابة، يتم الاحتفاظ بنسخة احتياطية من البيانات اللازمة للاستعادة في كتلة خالية.
عملية نقطة التحقّق
عند تثبيت قسم يحمل العلامة checkpoint=fs/block، يستدعي Android الدالة restoreCheckpoint على محرك الأقراص للسماح للجهاز باستعادة أي نقطة تحقّق حالية. بعد ذلك، تستدعي الدالة init الدالة needsCheckpoint لتحديد ما إذا كان الجهاز في حالة برنامج إقلاع من النوع A/B أو إذا تم ضبط عدد محاولات إعادة التحديث. إذا كان أي من هذين الشرطين صحيحًا، يستدعي Android الدالة createCheckpoint لإضافة علامات التثبيت أو إنشاء جهاز dm_bow.
بعد تثبيت القسم، يتم استدعاء رمز نقطة التحقّق لإصدار عمليات التقليم.
بعد ذلك، تستمر عملية التشغيل كالمعتاد. في LOCKED_BOOT_COMPLETE، يستدعي Android الدالة commitCheckpoint لتثبيت نقطة التحقّق الحالية، ويستمر التحديث كالمعتاد.
إدارة مفاتيح KeyMint (المعروفة سابقًا باسم Keymaster)
تُستخدم مفاتيح KeyMint لتشفير الجهاز أو لأغراض أخرى. لإدارة هذه المفاتيح، يؤخّر Android طلبات حذف المفاتيح إلى أن يتم تثبيت نقطة التحقّق.
مراقبة الحالة
تتحقّق خدمة الحالة من توفّر مساحة كافية على القرص لإنشاء نقطة تحقّق. تقع خدمة الحالة في
cp_healthDaemon
في Checkpoint.cpp.
يتضمّن البرنامج الخفي للحالة السلوكيات التالية التي يمكن ضبطها:
ro.sys.cp_msleeptime: تتحكّم في عدد مرات تحقّق الجهاز من استخدام القرص.ro.sys.cp_min_free_bytes: تتحكّم في الحد الأدنى للقيمة التي تبحث عنها خدمة الحالة.ro.sys.cp_commit_on_full: تتحكّم في ما إذا كان البرنامج الخفي للحالة يعيد تشغيل الجهاز أو يثبّت نقطة التحقّق ويستمر عندما يكون القرص ممتلئًا.
واجهات برمجة تطبيقات نقطة التحقّق
تُستخدم واجهات برمجة تطبيقات نقطة التحقّق من قِبل ميزة UDC. بالنسبة إلى واجهات برمجة التطبيقات الأخرى التي تستخدمها ميزة UDC، يُرجى الاطّلاع على
IVold.aidl.
void startCheckpoint(int retry)
تنشئ نقطة تحقّق.
يستدعي الإطار هذا الإجراء عندما يكون جاهزًا لبدء تحديث. يتم إنشاء نقطة التحقّق قبل تثبيت أنظمة الملفات التي تم التحقّق من نقاطها، مثل بيانات المستخدم، في وضع القراءة والكتابة بعد إعادة التشغيل. إذا كان عدد محاولات إعادة التحديث موجبًا، تتعامل واجهة برمجة التطبيقات مع تتبُّع محاولات إعادة التحديث، ويستدعي برنامج التحديث الدالة needsRollback للتحقّق مما إذا كان مطلوبًا إرجاع التحديث إلى إصدار سابق. إذا كان عدد محاولات إعادة التحديث هو -1، فإنّ واجهة برمجة التطبيقات تستند إلى قرار أداة تحميل التشغيل من النوع A/B.
لا يتم استدعاء هذا الإجراء عند إجراء تحديث عادي من النوع A/B.
void commitChanges()
تثبّت التغييرات.
يستدعي إطار العمل هذا الإجراء بعد إعادة التشغيل عندما تكون التغييرات جاهزة للإتمام. يتم استدعاء هذا الإجراء قبل كتابة البيانات (مثل الصور والفيديوهات والرسائل القصيرة وإيصال الاستلام من الخادم) إلى بيانات المستخدم وقبل BootComplete.
إذا لم يكن هناك تحديث نشط تم التحقّق من نقاطه، لن يكون لهذا الإجراء أي تأثير.
abortChanges()
تفرض إعادة التشغيل وتعود إلى نقطة التحقّق. تتجاهل جميع تعديلات بيانات المستخدم منذ إعادة التشغيل الأولى.
يستدعي الإطار هذا الإجراء بعد إعادة التشغيل ولكن قبل commitChanges.
يتم تقليل retry_counter عند استدعاء هذا الإجراء. ويتم إنشاء إدخالات السجلّ.
bool needsRollback()
تحدّد ما إذا كان مطلوبًا العودة إلى الحالة السابقة.
على الأجهزة التي لا تتضمّن نقاط تحقّق، تعرض الدالة false. على الأجهزة التي تتضمّن نقاط تحقّق، تعرض الدالة true أثناء عملية تشغيل لا تتضمّن نقاط تحقّق.
تنفيذ ميزة UDC
التنفيذ المرجعي
للاطّلاع على مثال حول كيفية تنفيذ ميزة UDC، يُرجى الاطّلاع على dm-bow.c.
للاطّلاع على مستندات إضافية حول الميزة، يُرجى الاطّلاع على dm-bow.txt.
الإعداد
في on fs في ملف init.hardware.rc، تأكَّد من توفّر ما يلي:
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، تأكَّد من وضع العلامة latemount على /data.
/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، تأكَّد من وضع العلامة earlymount أو first_stage_mount على /metadata.
/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 يتيح نقاط التحقّق. لمزيد من المعلومات، يُرجى الاطّلاع على وظيفة نقطة التحقّق في أنظمة الملفات المختلفة.
أضِف العلامة checkpoint=fs إلى قسم <fs_mgr_flags> من fstab للجهاز المثبَّت في /data.
الأنظمة غير F2FS
بالنسبة إلى الأنظمة غير F2FS، يجب تفعيل dm-bow في إعدادات النواة.
أضِف العلامة checkpoint=block إلى قسم <fs_mgr_flags> من fstab للجهاز المثبَّت في /data.
التحقّق من السجلات
يتم إنشاء إدخالات السجلّ عند استدعاء واجهات برمجة تطبيقات نقطة التحقّق.
التحقق من صحة البيانات
لاختبار عملية تنفيذ ميزة UDC، شغِّل مجموعة اختبارات VTS VtsKernelCheckpointTest.