يقدّم Android 10 نقطة التحقّق من بيانات المستخدمين (UDC)، والتي
تسمح لنظام التشغيل Android بالعودة إلى حالته السابقة عند إجراء بث من جهاز Android عبر شبكة غير سلكيّة.
تعذّر إجراء تحديث (OTA). باستخدام ميزة "التحديث من خلال الجهاز"، إذا تعذّر تحديث Android عبر الجهاز، يمكن للجهاز
الرجوع بأمان إلى حالته السابقة. على الرغم من أنّ
التحديثات من خلال ميزة A/B تحلّ هذه المشكلة في عملية التمهيد المبكر، فإنّه لا يمكن الترجيع
عند تعديل قسم بيانات المستخدم (المثبَّت على /data
).
تتيح ميزة UDC للجهاز استعادة قسم بيانات المستخدم حتى بعد تعديله. تحقّق ميزة UDC ذلك من خلال إمكانات نقاط التحقق في نظام الملفات، وتنفيذ بديل عندما لا يتوافق نظام الملفات مع نقاط التحقق، والدمج مع آلية A/B لنظام التشغيل المشغِّل مع السماح أيضًا بالتوافق مع التحديثات غير المستندة إلى A/B، وتوفير إمكانية ربط إصدار المفتاح ومنع إعادة التمهيد للمفتاح.
التأثير في المستخدم
تحسّن ميزة UDC من تجربة تحديث OTA للمستخدمين نظرًا لخسارة عدد أقل من المستخدمين بياناتها عند فشل تحديث 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. بالنسبة إلى واجهات برمجة التطبيقات الأخرى التي تستخدمها 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
، تأكّد من وضع علامة 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
في إعدادات kernel.
أضِف علامة checkpoint=block
إلى القسم <fs_mgr_flags>
في fstab
تم تثبيت الجهاز في /data
.
الاطّلاع على السجلات
يتم إنشاء إدخالات السجلّ عند استدعاء واجهات برمجة تطبيقات نقطة التحقق.
التحقُّق
لاختبار عملية تنفيذ UDC، عليك تنفيذ VtsKernelCheckpointTest
مجموعة من اختبارات VTS
.