لتنفيذ ميزة "اختبار أ/ب الافتراضي" على جهاز جديد أو تعديل جهاز تم إطلاقه، يجب إجراء تغييرات على الرمز البرمجي الخاص بالجهاز.
علامات الإصدار
يجب ضبط الأجهزة التي تستخدم ميزة 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 يجب أن تكون أكبر من أو تساوي مجموع(حجم مجموعات التحديث) + الحمل الزائد، والذي يجب بدوره أن يكون أكبر من أو يساوي مجموع(حجم الأقسام) + الحمل الزائد.
في نظام التشغيل 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)
يتيح ذلك أخذ لقطات من مساحة المستخدم باستخدام ميزة Virtual A/B أثناء استخدام طريقة ضغط لا تؤدي إلى أي عملية. يمكنك بعد ذلك ضبط طريقة الضغط على إحدى الطرق المتوافقة،zstd وlz4. في نظام التشغيل Android 15، يمكن تخصيص عملية الضغط بشكل أكبر لتلبية احتياجات الجهاز. لمزيد من المعلومات، اطّلِع على الضبط الدقيق للضغط.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
في نظام التشغيل Android 12، لتفعيل اللقطات المضغوطة باستخدام ميزة Virtual 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
بالنسبة إلى الأجهزة التي يتم ترقيتها إلى الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث، لن تكون
ميزة ضغط 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 التحكم في فتحات التشغيل. تتطلّب ميزة Virtual A/B ترقية إصدار ثانوي من HAL الخاص بعنصر التحكّم في التشغيل، لأنّه يجب توفير واجهات برمجة تطبيقات إضافية لضمان حماية برنامج إقلاع أثناء عملية تثبيت ذاكرة ROM أو إعادة الضبط على الإعدادات الأصلية. راجِع 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
تُعد سلامة قسم البيانات الوصفية أمرًا ضروريًا لعملية التشغيل،
خاصةً بعد تطبيق تحديث عبر الأثير مباشرةً. لذلك، يجب التحقّق من قسم البيانات الوصفية قبل أن يتمكّن 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 في تصحيح نواة المستخدم لإصلاح تثبيت الملفات. يجب تضمين تصحيح النواة f2fs: support aligned pinned file أيضًا.
تعتمد ميزة Virtual A/B على ميزات تمت إضافتها في إصدار النواة 4.3: بت حالة التجاوز في هدفَي snapshot وsnapshot-merge. يجب أن تتضمّن جميع الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android والإصدارات الأحدث إصدار النواة 4.4 أو إصدارًا أحدث.
لتفعيل اللقطات المضغوطة، يجب أن يكون إصدار النواة 4.19 على الأقل.
اضبط القيمة على CONFIG_DM_USER=m أو CONFIG_DM_USER=y. في حال استخدام الخيار الأول (وحدة)، يجب تحميل الوحدة في ramdisk في المرحلة الأولى. يمكن تحقيق ذلك من خلال إضافة السطر التالي إلى ملف Makefile الخاص بالجهاز:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
التغييرات في أدوات Fastboot
يُجري نظام التشغيل Android 11 التغييرات التالية على بروتوكول fastboot:
-
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، يُنصح باتّباع الخطوات التالية:
- طلب البحث
getvar snapshot-update-status - إذا كان
mergingأوsnapshotted، أصدِرsnapshot-update cancel. - اتّبِع خطوات التثبيت.
تقليل متطلبات مساحة التخزين
ننصح بشدة باستخدام أداة ربط الكتل للأجهزة التي لم يتم تخصيص مساحة تخزين كاملة بنظام التشغيل A/B في القسم الفائق، والتي من المتوقّع أن تستخدم /data حسب الحاجة. تحافظ أداة ربط الحِزم على اتّساق عملية تخصيص الحِزم بين الإصدارات، ما يقلّل من عمليات الكتابة غير الضرورية إلى اللقطة. يمكنك الاطّلاع على التفاصيل ضمن تقليل حجم التحديث عبر الأثير.
خوارزميات الضغط عبر الأثير
يمكن ضبط حِزم OTA لمقاييس أداء مختلفة. يتيح نظام التشغيل Android عدة طرق ضغط متوافقة (lz4 وzstd وnone) تتفاوت في وقت التثبيت ومساحة التخزين المستخدَمة في عملية النسخ عند الكتابة ووقت التشغيل ووقت دمج اللقطات. الخيار التلقائي المفعَّل لـ "اختبار أ/ب" الافتراضي مع الضغط هو lz4
compression method.
الضبط الدقيق للضغط
يمكن تخصيص خوارزميات الضغط بشكل أكبر من خلال طريقتَين:
(مستوى الضغط) (مقدار الضغط الذي يتم تحقيقه على حساب السرعة) و (عامل الضغط) (الحد الأقصى لحجم النافذة القابلة للضغط).
يتوفّر مستوى الضغط لبعض الخوارزميات، مثل zstd، ويؤدي تغيير المستوى إلى مفاضلة بين السرعة ونسبة الضغط.
يصف عامل الضغط الحد الأقصى لحجم نافذة الضغط المستخدَمة أثناء عملية تثبيت تحديث عبر الأثير (OTA). يتم ضبط القيمة التلقائية على 64 ألفًا، ولكن يمكن إلغاؤها من خلال تخصيص
مَعلمة الإنشاء PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR. عوامل الضغط المتوافقة هي 4k و8k و16k و32k و64k و128k و256k.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
تحديثات عبر الأثير الإضافية على هاتف 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 ثانية |