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