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