تنفيذ اختبار 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.

في الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث، لتفعيل لقطات الشاشة المضغوطة باستخدام اختبار 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. تكون ميزة دمج مساحة المستخدم مفعَّلة تلقائيًا في الأجهزة التي تعمل بالإصدار 13 من Android والإصدارات الأحدث، ويمكن ضبط هذه الخاصية في الأجهزة القديمة التي يتم ترقيتها باستخدام ما يلي:

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

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

يقدّم HAL لوحة التحكّم في عملية التشغيل واجهة لعملاء OTA للتحكّم في خانات التشغيل. تتطلّب ميزة A/B الافتراضي ترقية إصدار بسيطة لواجهة برمجة التطبيقات لنظام التحكّم في التشغيل، لأنّ واجهات برمجة التطبيقات إضافية تكون مطلوبة لضمان حماية برنامج الإقلاع أثناء عملية التفليش أو إعادة الضبط على الإعدادات الأصلية. اطّلِع على 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

متطلبات النواة

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

بالنسبة إلى الأجهزة التي تستخدم نظام F2FS، يجب تضمين تصحيح f2fs: export FS_NOCOW_FL flag to user في نظام التشغيل لإصلاح تثبيت الملفات. يجب أيضًا تضمين تصحيح kernel الخاص بخدمة f2fs: support aligned pinned file.

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

لتفعيل لقطات الذاكرة المضغوطة، يجب أن يكون الإصدار الأدنى للنواة متوافقًا مع 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 - لعرض القيمة التي أبلغ عنها واجهة برمجة التطبيقات لوحدة التحكّم في عملية التمهيد إلى أداة تحميل البرامج:
    • إذا كانت الحالة هي MERGING، يجب أن يعرض برنامج الإقلاع القيمة merging.
    • إذا كانت الحالة هي SNAPSHOTTED، يجب أن يعرض برنامج الإقلاع القيمة snapshotted.
    • بخلاف ذلك، يجب أن يعرض برنامج الإقلاع القيمة none.
  • snapshot-update merge - يُكمِل عملية دمج، ويبدأ التشغيل في وضع recovery/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 عند الضرورة، ننصحك بشدة باستخدام أداة ربط الكتل. تحافظ أداة ربط الكتل على اتساق تخصيص الكتل بين النُسخ، مما يقلل من عمليات الكتابة غير الضرورية إلى اللقطة. تم توثيق ذلك ضمن تقليل حجم التحديثات من خلال الهواء.

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

يمكن ضبط حِزم OTA لمقاييس أداء مختلفة. يقدّم 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 ثانية

تحديث OTA كامل على هاتف 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 ثانية