لتنفيذ اختبار 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
، يُنصح
باستخدام الخطوات التالية:
- طلب البحث
getvar snapshot-update-status
. - إذا كان
merging
أوsnapshotted
، يُرجى إصدارsnapshot-update cancel
. - اتّبِع خطوات الفلاش.
تقليل متطلبات مساحة التخزين
بالنسبة إلى الأجهزة التي لا تتضمّن مساحة تخزين كاملة لنظام التشغيل 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 ثانية |