في Android 10، لم يعُد نظام ملفات الجذر
مضمّنًا في ramdisk.img
، بل يتم دمجه بدلاً من ذلك في
system.img
(أي أنّه يتم إنشاء system.img
دائمًا كملف
إذا تم ضبط BOARD_BUILD_SYSTEM_ROOT_IMAGE
). الأجهزة
التي تعمل بالإصدار 10 من نظام التشغيل Android:
- استخدام تنسيق قسم النظام بصفتها الجذر (يتم فرضه تلقائيًا من خلال الإصدار بدون خيارات لتغيير السلوك)
- يجب استخدام قرص RAM، وهو مطلوب لنظام dm-linear.
- يجب ضبط
BOARD_BUILD_SYSTEM_ROOT_IMAGE
علىfalse
. لا يُستخدَم هذا الإعداد إلا للتمييز بين الأجهزة التي تستخدم ملف ramdisk والأجهزة التي لا تستخدمه (وبدلاً من ذلك يتم تركيبsystem.img
مباشرةً).
يختلف معنى إعداد "النظام بصفتها الجذر" بين الإصدار 9 من Android
والإصدار 10 من Android. في إعدادات نظام Android 9 الذي يعمل كجذر
، يتم ضبط BOARD_BUILD_SYSTEM_ROOT_IMAGE
على
true
، ما يفرض على عملية الإنشاء دمج نظام الملفات الجذر في
system.img
ثم تثبيت system.img
كنظام الملفات
الجذر (rootfs). هذه الإعدادات إلزامية للأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android، ولكنها اختيارية للأجهزة التي يتم ترقيتها إلى الإصدار 9 من نظام التشغيل Android والأجهزة التي تعمل بإصدارات أقدم من Android. في عملية الإعداد التي تجعل نظام التشغيل Android
10 هو الجذر، يُدمج الإصدار دائمًا
$TARGET_SYSTEM_OUT
و$TARGET_ROOT_OUT
في
system.img
، ويكون هذا الإعداد هو السلوك التلقائي لجميع الأجهزة التي تعمل
بنظام التشغيل Android 10.
يُجري نظام التشغيل Android 10 تغييرات إضافية للتوافق مع الأقسام الديناميكية، وهو نظام لتقسيم مساحة المستخدم يتيح إجراء تحديثات عبر الهواء (OTA) ل إنشاء الأقسام أو تغيير حجمها أو إزالتها. في إطار هذا التغيير، لم تعُد نواة Linux قادرة على تركيب قسم النظام المنطقي على الأجهزة التي تعمل بالإصدار Android 10، لذا تُعالج هذه العملية من خلال مرحلة الإعداد الأولى.
توضّح الأقسام التالية متطلبات استخدام "النظام بصفتها الجذر" لتلقّي التحديثات عبر الهواء للنظام فقط، كما تقدّم إرشادات حول تحديث الأجهزة لاستخدام "النظام بصفتها الجذر" (بما في ذلك تغييرات تنسيق التقسيم ومتطلبات نواة dm-verity). للحصول على تفاصيل عن التغييرات التي طرأت على ذاكرة التخزين المؤقت (RAM)، يُرجى الاطّلاع على مقالة أقسام ذاكرة التخزين المؤقت (RAM).
لمحة عن تحديثات النظام فقط عبر شبكة غير سلكية
تتطلب تحديثات OTA للنظام فقط، التي تتيح تحديث إصدارات Android
system.img
وproduct.img
بدون تغيير أقسام
أخرى، تصميم قسم النظام بصفتها الجذر. يجب أن تستخدم جميع الأجهزة التي تعمل بالإصدار 10 من نظام Android تنسيقًا يتضمّن قسمًا للنظام فقط لأجل تفعيل التحديثات عبر الهواء للنظام فقط.
- إنّ أجهزة A/B التي تُحمِّل قسم
system
كنظام جذر تستخدم حاليًا نظام التشغيل كجذر ولا تتطلّب إجراء تغييرات لتفعيل تحديثات النظام عبر الهواء. - بالنسبة إلى الأجهزة غير المزوّدة بميزة A/B والتي تُثبّت قسم
system
في/system
، يجب تحديثها لاستخدام/system
تنسيق قسم النظام بصفتها الجذر لتفعيل تحديثات النظام عبر الهواء.
لمعرفة التفاصيل حول الأجهزة التي تستخدم ميزة A/B والأجهزة التي لا تستخدمها، يُرجى الرجوع إلى تحديثات نظام A/B (سلسة).
استخدام المحتوى المركّب الخاص بالمورّد (<=AOSP 14)
يتيح لك تراكب المورّد إمكانية تراكب التغييرات على قسم vendor
أثناء تشغيل الجهاز. تراكب المورّد هو مجموعة من وحدات المورّد في ملف التمهيد product
التي يتم تراكبها على ملف التمهيد vendor
عند تشغيل الجهاز، ما يؤدي إلى استبدال الوحدات الحالية وإضافتها إليها.
عند تشغيل الجهاز، تُكمل عملية init
مرحلة التثبيت الأولى
وتقرأ الخصائص التلقائية. بعد ذلك، يبحث عن كل ملف فرعي في /product/vendor_overlay/<target_vendor_version>
ويثبته في دليل القسم vendor
المقابل له،
إذا تم استيفاء الشروط التالية:
- تتوفر ميزة
/vendor/<overlay_dir>
. - يحتوي
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
على سياق الملف نفسه المستخدَم في/vendor/<overlay_dir>
. - يُسمح بتركيب
init
في سياق الملف/vendor/<overlay_dir>
.
تنفيذ ميزة "العنصر الذي يظهر على سطح التطبيق" لمقدّم الخدمة
ثبِّت ملفات تراكب المورّدين في directory
/product/vendor_overlay/<target_vendor_version>
. تُضاف هذه الملفات فوق قسم vendor
عند تشغيل الجهاز، ما يؤدي إلى استبدال الملفات التي تحمل الاسم نفسه وإضافة أي ملفات جديدة. لا يمكن للطبقة الإضافية الخاصة بالمورّد إزالة الملفات
من قسم vendor
.
يجب أن تتضمّن ملفات تراكب المورّدين سياق الملف نفسه المستخدَم في الملفات المستهدفة
التي تحلّ محلها في قسم vendor
. تكون الملفات في
دليل /product/vendor_overlay/<target_vendor_version>
مزوّدة تلقائيًا بالسياق vendor_file
. في حال حدوث عدم تطابق في سياق الملفات
بين ملفات التراكب الخاصة بالمورّد والملفات التي تستبدلها، حدِّد ذلك في
سياسة الأمان الخاصة بالجهاز. يتم ضبط سياق الملف على مستوى الدليل. إذا كان
سياق الملف لدليل التراكب الخاص بالمورّد لا يتطابق مع الدليل الهدف،
ولم يتم تحديد سياق الملف الصحيح في سياسة الأمان الخاصة بالجهاز،
لن يتم تراكب دليل التراكب الخاص بالمورّد على الدليل الهدف.
لاستخدام ميزة "التراكب من المصنّع"، يجب أن يفعّل ملفّ kernel OverlayFS من خلال ضبط الإعداد
CONFIG_OVERLAY_FS=y
. يجب أيضًا دمج النواة من
النواة الشائعة 4.4 أو إصدار أحدث، أو تصحيحها باستخدام "overlayfs:
override_creds=off option bypass creator_cred"
.
مثال على تنفيذ تراكب المورّد
يوضّح هذا الإجراء تنفيذ تراكب مورّد يتراكب مع
الدلائل /vendor/lib/*
و/vendor/etc/*
و
/vendor/app/*
.
-
أضِف ملفات المورّدين المُعدّة مسبقًا في
device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/
:device/google/device/vendor_overlay/28/lib/libfoo.so device/google/device/vendor_overlay/28/lib/libbar.so device/google/device/vendor_overlay/28/etc/baz.xml device/google/device/vendor_overlay/28/app/qux.apk
-
ثبِّت ملفات المورّدين المُعدّة مسبقًا في ملف
product/vendor_overlay
فيdevice/google/device/device.mk
:PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
-
حدِّد سياقات الملفات إذا كانت ملفات قسم
vendor
المستهدَف لها سياقات غيرvendor_file
. بما أنّ/vendor/lib/*
يستخدم سياقvendor_file
، لا يتضمّن هذا المثال هذا الدليل.أضِف ما يلي إلى
device/google/device-sepolicy/private/file_contexts
:/(product|system/product)/vendor_overlay/[0-9]+/etc(/.*)? u:object_r:vendor_configs_file:s0 /(product|system/product)/vendor_overlay/[0-9]+/app(/.*)? u:object_r:vendor_app_file:s0
-
اسمح لعملية
init
بتركيب تراكب المورّد على ملف سياقات أخرى غيرvendor_file
. بما أنّ عمليةinit
تملك إذنًا بالتركيب في سياقvendor_file
، لا يحدِّد هذا المثال السياسة المتعلّقة بـvendor_file
.أضِف ما يلي إلى
device/google/device-sepolicy/public/init.te
:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
التحقّق من التداخل مع موفّر الخدمة
للتحقّق من صحة إعدادات تراكب بيانات المورّد، أضِف الملفات في ملف
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
وتحقّق مما إذا كانت الملفات متراكبة على الملفات في ملف
/vendor/<overlay_dir>
.
بالنسبة إلى إصدارات userdebug
، تتوفّر وحدة اختبار Atest:
$ atest -v fs_mgr_vendor_overlay_test
التحديث إلى نظام التشغيل بصفتها الجذر
لتحديث الأجهزة غير المزوّدة بميزة A/B لاستخدام نظام التشغيل كجذر، عليك تعديل
مخطّط التقسيم لكل من boot.img
وsystem.img
، وإعداد
dm-verity، وإزالة أي تبعيات متعلقة بالتشغيل في مجلدات ملف التمهيد
الخاصة بالجهاز.
تعديل الأقسام
على عكس أجهزة A/B التي تعيد استخدام القسم /boot
ليكون قسم الاسترداد، يجب أن تحافظ الأجهزة غير المزوّدة بميزة A/B على قسم /recovery
منفصلاً لأنّها لا تحتوي على قسم الفتحة الاحتياطية (على سبيل المثال، من boot_a
إلى boot_b
). إذا تمت إزالة القسم /recovery
على جهاز غير مزوّد بميزة A/B وتم جعله مشابهًا لنظام A/B، قد يتعطّل وضع الاسترداد أثناء تحديث تعذّر إكماله على القسم /boot
. لهذا السبب، يجب أن يكون القسم /recovery
قسمًا منفصلاً عن القسم /boot
في الأجهزة التي لا تستخدم ميزة "التثبيت الثنائي"، ما يعني
أنّه سيستمر تحديث صورة الاسترداد بطريقة مؤجلة (أي بالطريقة نفسها المتّبعة في الأجهزة التي تعمل بالإصدار 8.1.0 من نظام التشغيل Android أو الإصدارات الأقدم).
يسرد الجدول التالي الاختلافات في أقسام الصور للأجهزة غير المزوّدة بميزة "التحديث الثنائي" قبل توفّر الإصدار 9 من Android وبعده.
صورة | ذاكرة الوصول العشوائي (قبل الإصدار 9) | System-as-root (بعد الإصدار 9) |
---|---|---|
boot.img |
يحتوي على نواة وramdisk.img :
ramdisk.img -/ - init.rc - init - etc -> /system/etc - system/ (mount point) - vendor/ (mount point) - odm/ (mount point) ... |
يحتوي على نواة تشغيل عادية فقط. |
recovery.img |
يحتوي على نواة استرداد وملف استرداد
ramdisk.img . |
|
system.img |
أن تتضمّن ما يلي:
system.img -/ - bin/ - etc - vendor -> /vendor - ... |
يحتوي على المحتوى المدمج من system.img و
ramdisk.img الأصليَين:
system.img -/ - init.rc - init - etc -> /system/etc - system/ - bin/ - etc/ - vendor -> /vendor - ... - vendor/ (mount point) - odm/ (mount point) ... |
لا تتغيّر الأقسام نفسها، إذ يستخدم كلّ من ملف ramdisk ونظام التشغيل كجذر مخطّط التقسيم التالي:
/boot
/system
/system
/recovery
/vendor
، وما إلى ذلك
إعداد dm-verity
في وضع "النظام بصفته الجذر"، يجب أن تثبِّت النواة system.img
ضمن
/
(نقطة الربط) باستخدام
dm-verity. يتيح إطار عمل AOSP استخدام حلول dm-verity التالية
في system.img
.
vboot 1.0
بالنسبة إلى vboot 1.0، يجب أن تُحلِّل النواة
البيانات الوصفية الخاصة بنظام التشغيل Android على
/system
، ثم تحوّلها إلى
مَعلمات dm-verity لإعداد dm-verity (يتطلب ذلك
تصحيحات النواة هذه).
يوضّح المثال التالي الإعدادات ذات الصلة ببرنامج dm-verity لنظام التشغيل بصفتها الجذر في سطر تعليمات برمجية
kernel:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="system none ro,0 1 android-verity /dev/sda34" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f
vboot 2.0
بالنسبة إلى vboot 2.0
(AVB)، يجب أن يدمج أداة تحميل البرامج
external/avb/libavb، التي تُحلِّل بعد ذلك
وصف hashtree لـ /system
، وتحوِّله
إلى
مَعلمات dm-verity، وتُمرِّر المَعلمات أخيرًا إلى
kernel من خلال سطر أوامر kernel. (قد تكون أوصاف شجرة التجزئة لـ /system
على /vbmeta
أو على /system
نفسها).
يتطلب الإصدار 2.0 من vboot تصحيحات kernel التالية:
- https://android-review.googlesource.com/#/c/kernel/common/+/158491/
- تصحيحات kernel 4.4، تصحيحات kernel 4.9، وما إلى ذلك
يوضّح المثال التالي الإعدادات ذات الصلة ببرنامج dm-verity لنظام التشغيل بصفتها الجذر في سطر تعليمات برمجية kernel:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="1 vroot none ro 1,0 5159992 verity 1 PARTUUID=00000016-0000-0000-0000-000000000000 PARTUUID=00000016-0000-0000-0000-000000000000 4096 4096 644999 644999 sha1 d80b4a8be3b58a8ab86fad1b498640892d4843a2 8d08feed2f55c418fb63447fec0d32b1b107e42c 10 restart_on_corruption ignore_zero_blocks use_fec_from_device PARTUUID=00000016-0000-0000-0000-000000000000 fec_roots 2 fec_blocks 650080 fec_start 650080"
استخدام المجلدات الجذر الخاصة بالأجهزة
باستخدام ميزة "النظام بصفتها الجذر"، بعد إعادة تحميل صورة النظام العامة
(GSI) على الجهاز (وقبل إجراء اختبارات
مجموعة اختبارات المورّد)، سيتم حذف أي مجلدات جذر خاصة بالجهاز تمت إضافتها باستخدام BOARD_ROOT_EXTRA_FOLDERS
لأنّه تم استبدال محتوى الدليل الجذر بالكامل
بـ GSI للنظام بصفتها الجذر. قد تؤدي إزالة هذه المجلدات إلى عدم التمكّن من التمهيد للجهاز
في حال توفّر اعتماد على المجلدات الجذر الخاصة بالجهاز
(على سبيل المثال، يتم استخدامها كنقاط ربط).
لتجنُّب هذه المشكلة، لا تستخدِم BOARD_ROOT_EXTRA_FOLDERS
لإضافة مجلدات جذر خاصة بالأجهزة. إذا كنت بحاجة إلى تحديد نقاط تثبيت
خاصة بالجهاز، استخدِم /mnt/vendor/<mount point>
(تمت إضافتها في
قوائم التغييرات هذه). يمكن تحديد نقاط الربط الخاصة بالمورّد
مباشرةً في كلّ من شجرة جهاز fstab
(لربط مرحلة
الأولى) وملف /vendor/etc/fstab.{ro.hardware}
بدون
إعداد إضافي (لأنّ fs_mgr
ينشئها ضمن
/mnt/vendor/*
تلقائيًا).