نقطة تفتيش بيانات المستخدمين

يقدّم 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 .