تنفيذ اختبار A/B الافتراضي

لتطبيق A/B افتراضي على جهاز جديد أو لإجراء تعديلات على جهاز تم إطلاقه، يجب إجراء تغييرات على رمز خاص بالجهاز.

علامات الإنشاء

يجب ضبط الأجهزة التي تستخدم اختبار A/B الافتراضي على أنّها أجهزة A/B وتشغيلها باستخدام ملف تعريف ديناميكي.

بالنسبة إلى الأجهزة التي يتم إطلاقها باستخدام اختبار A/B الافتراضي، اضبطها على اكتساب الإعدادات الأساسية لاختبار A/B الافتراضية للجهاز:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

لا تحتاج الأجهزة التي يتم تشغيلها باستخدام ميزة A/B الافتراضي إلى سوى نصف حجم اللوحة لتحميل BOARD_SUPER_PARTITION_SIZE لأنّ خانات B لم تعُد في وضع Super. وهذا يعني أنّه يجب أن يكون BOARD_SUPER_PARTITION_SIZE أكبر من أو يساوي sum(size of update groups) + overhead، والذي يجب بدوره أن يكون أكبر من أو يساوي sum(size of partitions) + overhead.

في نظام التشغيل Android 13 والإصدارات الأحدث، يجب اكتساب الإعدادات الأساسية التالية لتفعيل اللقطات المضغوطة باستخدام Virtual A/B

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)

يتيح ذلك لقطات مساحة المستخدم باستخدام اختبار A/B الافتراضي أثناء استخدام طريقة ضغط بدون أي عملية. يمكنك بعد ذلك ضبط طريقة الضغط على إحدى الطرق المتوافقة،zstd وlz4. في الإصدار 15 من نظام Android، يمكن تخصيص ميزة الضغط بشكل أكبر لتلبية احتياجات الجهاز. لمزيد من المعلومات، اطّلِع على تحسين الضغط.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

في نظام Android 12، لتفعيل اللقطات المضغوطة باستخدام اختبار A/B افتراضي، يجب اكتساب الإعدادات الأساسية التالية:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

ضغط XOR

بالنسبة إلى الأجهزة التي يتم ترقيتها إلى Android 13 والإصدارات الأحدث، لا يتم تفعيل ميزة ضغط XOR تلقائيًا. لتفعيل ضغط XOR، أضِف ما يلي إلى ملف .mk على الجهاز.

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true

يكون ضغط XOR مفعَّلاً تلقائيًا للأجهزة التي ترث من android_t_baseline.mk.

دمج مساحة المستخدم

في الإصدار الحديث من اختبار A/B الافتراضي (Android T والإصدارات الأحدث)، تتم عملية دمج المقتطفات بالكامل في مساحة المستخدم. ويكون هذا التغيير ممكنًا من خلال Snapuserd وdm-user. في الأجهزة التي تعمل بنظام Android 13 والإصدارات الأحدث، يكون دمج مساحة المستخدم مفعَّلاً تلقائيًا، ويمكن ضبط هذه السمة في الأجهزة القديمة التي يتم ترقيتها باستخدام ما يلي:

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true

HAL للتحكّم في عملية التشغيل

يقدّم HAL لوحة التحكّم في عملية التشغيل واجهة لعملاء OTA للتحكّم في خانات التشغيل. تتطلّب ميزة A/B الافتراضي ترقية إصدار بسيطة لواجهة برمجة التطبيقات لنظام التحكّم في التشغيل (HAL) لأنّ واجهات برمجة التطبيقات إضافية تكون مطلوبة لضمان حماية برنامج الإقلاع أثناء عملية التفليش أو إعادة الضبط على الإعدادات الأصلية. اطّلِع على IBootControl.hal و types.hal للاطّلاع على أحدث إصدار من تعريف HAL.

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

تغييرات في ملف fstab

إنّ سلامة قسم البيانات الوصفية ضرورية لعملية التشغيل، خاصةً بعد تطبيق تحديث OTA مباشرةً. لذا، يجب التحقّق من قسم البيانات الوصفية قبل أن يثبته first_stage_init. لضمان حدوث ذلك، أضِف العلامة check fs_mgr إلى إدخال /metadata. في ما يلي مثال:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

متطلبات النواة (Kernel)

لتفعيل ميزة أخذ اللقطات، يجب ضبط CONFIG_DM_SNAPSHOT على true.

بالنسبة إلى الأجهزة التي تستخدم F2FS، يجب تضمين تصحيح f2fs: export FS_NOCOW_FL flag to user في نواة النظام لإصلاح تثبيت الملفات. ضمِّن أيضًا تصحيح نواة f2fs: الدعم المثبّت.

تعتمد ميزة A/B الافتراضي على الميزات التي تمت إضافتها في الإصدار 4.3 من kernel: بت حالة الامتلاء في استهدافَي snapshot وsnapshot-merge. يجب أن يتوفّر الإصدار 4.4 من النواة أو إصدار أحدث على جميع الأجهزة التي تعمل بنظام التشغيل Android 9 والإصدارات الأحدث.

لتفعيل اللقطات المضغوطة، يكون الحد الأدنى المتوافق مع إصدار النواة هو 4.19. اضبط القيمة على CONFIG_DM_USER=m أو CONFIG_DM_USER=y. في حال استخدام الطريقة السابقة (وحدة)، يجب تحميل الوحدة في ذاكرة الوصول العشوائي (RAM) للخطوة الأولى. ويمكن تحقيق ذلك من خلال إضافة السطر التالي إلى Makefile في الجهاز:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

التغييرات في أدوات Fastboot

يُجري نظام التشغيل Android 11 التغييرات التالية على بروتوكول البوت السريع:

  • getvar snapshot-update-status — يعرض القيمة التي أرسلها عنصر التحكم في التشغيل HAL إلى برنامج الإقلاع:
    • إذا كانت الحالة هي MERGING، يجب أن يعرض برنامج الإقلاع القيمة merging.
    • إذا كانت الحالة هي SNAPSHOTTED، يجب أن يعرض برنامج الإقلاع القيمة snapshotted.
    • بخلاف ذلك، يجب أن يعرض برنامج الإقلاع القيمة none.
  • snapshot-update merge — يتم إكمال عملية الدمج، مع بدء عملية الاسترداد/Fastbootd إذا لزم الأمر. لا يكون هذا الأمر صالحًا إلا إذا كان snapshot-update-status هو merging، ولا يتوفّر إلا في fastbootd.
  • snapshot-update cancel: لضبط حالة دمج HAL الخاص بوحدة التحكّم في التشغيل على CANCELLED. هذا الأمر غير صالح عندما يكون الجهاز مقفلاً.
  • erase أو wipe: يجب أن يتحقّق erase أو wipe من metadata أو userdata أو أحد الأقسام التي تحتوي على حالة الدمج لـ HAL الخاص بإدارة التمهيد من حالة دمج اللقطة. إذا كانت الحالة هي MERGING أو SNAPSHOTTED، من المفترَض أن يلغي الجهاز العملية.
  • set_active: يجب أن يتحقّق الأمر set_active الذي يغيّر الفتحة النشطة من حالة دمج اللقطة. إذا كانت الحالة هي MERGING، يجب أن يوقف الجهاز العملية. يمكن تغيير الخانة بأمان في حالة SNAPSHOTTED.

تم تصميم هذه التغييرات لمنع جعل الجهاز غير قابل للتشغيل عن طريق الخطأ، ولكن يمكن أن تؤدي إلى تعطيل الأدوات المبرمَجة. عند استخدام الأوامر كأحد مكونات فلاش جميع الأقسام، مثل تشغيل fastboot flashall، ننصح باستخدام الخطوات التالية:

  1. طلب البحث getvar snapshot-update-status
  2. إذا كان merging أو snapshotted، يُرجى إصدار snapshot-update cancel.
  3. اتّبِع خطوات الفلاش.

تقليل متطلبات مساحة التخزين

بالنسبة إلى الأجهزة التي لا تتضمّن مساحة تخزين كاملة لنظام التشغيل A/B مخصّصة في وضع "الأداء الفائق"، والتي يُتوقّع أن تستخدم /data حسب الحاجة، ننصحك بشدة باستخدام أداة ربط الكتل. تحافظ أداة ربط الكتل على اتساق تخصيص الكتل بين النُسخ، ما يقلل من عمليات الكتابة غير الضرورية إلى اللقطة. تم توثيق ذلك ضمن تقليل حجم التحديثات عبر الهواء.

خوارزميات ضغط الهواء عبر الهواء

يمكن ضبط حزم التحديث عبر الهواء للاطّلاع على مقاييس الأداء المختلفة. يقدّم Android عدة طرق ضغط متوافقة (lz4 وzstd وnone) تتضمن حلولاً وسطًا بين وقت التثبيت ومساحة استخدام تقنية COW ووقت التمهيد ووقت دمج اللقطات. الخيار التلقائي المفعّل لميزة "التحليل الافتراضي" مع الضغط هو lz4 compression method.

ضبط دقيق لضغط الفيديو

يمكن تخصيص خوارزميات الضغط بشكل أكبر من خلال طريقتَين: (مستوى الضغط) (مقدار الضغط الذي يتم تحقيقه على حساب السرعة) و (عامل الضغط) (الحد الأقصى لحجم النافذة القابلة للضغط). يتوفّر مستوى الضغط لبعض الخوارزميات، مثل zstd، ويؤدي تغيير المستوى إلى مفاضلة بين السرعة ونسبة الضغط. يصف مُعامل الضغط الحد الأقصى لحجم نافذة الضغط المستخدَم أثناء التثبيت عبر OTA. يتم ضبط القيمة التلقائية على 64 كيلوبايت، ولكن يمكن إلغاء هذه القيمة من خلال تخصيص مَعلمة الإنشاء PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR. عوامل الضغط المتوافقة هي 4k و8k و16k و32k و64k و128k و256k.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

تحديثات OTA متزايدة على هاتف Pixel 8 Pro

مدّة التثبيت بدون مرحلة ما بعد التثبيت استخدام مساحة COW وقت التشغيل بعد التحديث عبر الهواء مدة دمج اللقطة
lz4 18 دقيقة و15 ثانية ‫2.5 غيغابايت 32.7 ثانية 98.6 ثانية
zstd 24 دقيقة و49 ثانية 2.05 غيغابايت 36.3 ثانية 133.2 ثانية
بلا 16 دقيقة و42 ثانية 4.76 غيغابايت 28.7 ثانية 76.6 ثانية

التحديث عبر الهواء بالكامل على هاتف Pixel 8 Pro

وقت التثبيت بدون مرحلة ما بعد التثبيت استخدام مساحة COW وقت التشغيل بعد التحديث عبر الهواء مدة دمج اللقطة
Lz4 15 دقيقة و11 ثانية ‫4.16 غيغابايت 17.6 ثانية 82.2 ثانية
zstd 16 دقيقة و19 ثانية ‫3.46 غيغابايت 21.0 ثانية 106.3 ثانية
بلا 13 دقيقة و33 ثانية 6.39 غيغابايت 18.5 ثانية 92.5 ثانية