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