تصف هذه الصفحة التغييرات التي تمت إضافتها إلى AOSP لتقليل تغييرات الملفات غير الضرورية بين الإصدارات. يمكن لمستخدمي الأجهزة الذين يحافظون على أنظمة التصميم الخاصة بهم استخدام هذه المعلومات كدليل. لتقليل حجم التحديثات عبر شبكة غير سلكيّة (OTA).
من حين لآخر، تحتوي تحديثات Android عبر الهواء على ملفات تم تغييرها لا تتوافق مع التغييرات في الرموز البرمجية. إنها في الواقع تبني عناصر النظام. يمكن أن يحدث هذا عندما يتم إنشاء التعليمات البرمجية ذاتها مرات أو من أدلة مختلفة أو على أجهزة مختلفة ينتج عنها تغييرات كبيرة الملفات. وتزيد هذه الملفات الزائدة من حجم تصحيح OTA، وتجعل من الصعب تحديد الرمز الذي تم تغييره.
لجعل محتوى OTA أكثر شفافية، يتضمن AOSP تغييرات في نظام الإصدار تم تصميمها لتقليل حجم تصحيحات عبر الهواء. تم إجراء تغييرات غير ضرورية على الملفات بين الإصدارات وإزالتها، ولا يتم تضمين سوى الملفات المتعلقة بالتصحيح في تحديثات OTA. يتضمن AOSP أيضًا إنشاء أداة الاختلاف التي تعمل على تصفية الإصدارات الشائعة التغييرات لتوفير اختلافات أوضح لملف الإصدار، أداة ربط الحظر التي تساعدك في الحفاظ على حظر التخصيص متسقة.
يمكن لنظام التصميم إنشاء تصحيحات كبيرة غير ضرورية بعدة طرق. للتخفيف من ذلك، في في الإصدار Android 8.0 والإصدارات الأحدث، تم تطبيق ميزات جديدة لتقليل حجم الرمز البرمجي لكل حزمة. اختلاف الملف تشمل التحسينات التي تقلل من أحجام حزم التحديث عبر الهواء ما يلي:
-
استخدام خوارزمية ZSTD ذات الأغراض العامة للضغط بدون فقدان البيانات
الصور على تحديثات الأجهزة التي ليست A/B يمكن تخصيص ZSTD لمستوى أعلى
نسب الضغط عن طريق زيادة مستوى الضغط. يتم ضبط مستوى الضغط أثناء التحديث عبر الهواء
وقت الإنشاء ويمكن تعيينه عن طريق تمرير العلم
--vabc_compression_param=zstd,$COMPRESSION_LEVEL
-
زيادة حجم نافذة الضغط المستخدمة أثناء التحديث عبر الهواء. الحد الأقصى لحجم نافذة الضغط
يمكن ضبطها من خلال تخصيص مَعلمة الإصدار في ملف
.mk
الخاص بالجهاز. هذا النمط تم ضبط المتغيّر على أنّهPRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 262144
- استخدام أداة إعادة ضغط Puffin، وهي أداة تصحيح حتمية للانكماش عمليات البث التي تعالج وظيفتَي الضغط والتباين لإنشاء تحديثات A/B عبر الهواء.
-
يمكن أن تؤدي التغييرات في استخدام أداة إنشاء دلتا، مثل كيفية
bsdiff
لضغط التصحيحات. في نظام التشغيل Android 9 والإصدارات الأحدث، تختار أداةbsdiff
خوارزمية الضغط التي ستوفر أفضل نتائج الضغط للتصحيح. -
التحسينات على
update_engine
إلى تقليل استهلاك الذاكرة عند تطبيق رموز التصحيح لتحديثات أجهزة A/B.
تناقش الأقسام التالية المشكلات المختلفة التي تؤثر على أحجام تحديثات التحديث عبر الهواء وحلولها وأمثلة للتنفيذ في AOSP.
ترتيب الملفات
المشكلة: لا تضمن أنظمة الملفات ترتيب الملفات عند طلب قائمة
الملفات في دليل، على الرغم من أنها عادةً ما تكون هي نفسها في عملية الدفع نفسها. أدوات مثل
تعمل ميزة ls
على ترتيب النتائج تلقائيًا، ولكن يتم استخدام دالة حرف البدل في الطلبات مثل
حيث لا يتم الترتيب بين find
وmake
. قبل استخدام هذه الأدوات، يجب عليك فرز
المخرجات.
الحل: عند استخدام أدوات مثل find
make
باستخدام دالة حرف البدل، يُرجى ترتيب مخرجات هذه الأوامر قبل استخدام
معهم. عند استخدام $(wildcard)
أو $(shell find)
في
Android.mk
ملف، يمكنك ترتيبها أيضًا. وتقوم بعض الأدوات، مثل Java، بفرز المدخلات، لذلك
قبل فرز الملفات، تحقق من أن الأداة التي تستخدمها لم تقم بذلك بالفعل.
أمثلة: تم إصلاح العديد من الحالات في نظام الإصدار الأساسي باستخدام
ماكرو all-*-files-under
مدمج، والذي يتضمن
all-cpp-files-under
(نظرًا لانتشار العديد من التعريفات في ملفات Makefiles أخرى).
للتعرُّف على التفاصيل، يُرجى الرجوع إلى ما يلي:
- https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f
- https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410
- https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653
- https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c
إنشاء دليل
المشكلة: يمكن أن يؤدي تغيير الدليل الذي توجد به الأشياء إلى
الثنائية المختلفة. تُعد معظم المسارات في إصدار Android مسارات نسبية، لذا
ما مِن مشكلة في استخدام __FILE__
في لغة C/C++. ومع ذلك، فإن رموز تصحيح الأخطاء تقوم بترميز
تلقائيًا، ويتم إنشاء .note.gnu.build-id
من تجزئة
البرنامج الثنائي الذي تمت إزالته مسبقًا، حتى يتغير في حال تغيّرت رموز تصحيح الأخطاء.
الحل:أصبحت مسارات تصحيح الأخطاء نسبية إلى بروتوكول AOSP. للحصول على التفاصيل، راجع CL: https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02.
الطوابع الزمنية
المشكلة: تؤدي الطوابع الزمنية في ناتج الإصدار إلى تغييرات غير ضرورية في الملف. ومن المحتمَل أن يحدث ذلك في المواقع الجغرافية التالية:
__DATE__/__TIME__/__TIMESTAMP__
وحدة ماكرو في رمز C أو C++- الطوابع الزمنية المضمّنة في الأرشيفات التي تعتمد على ملفات ZIP.
الحلول/الأمثلة: لإزالة الطوابع الزمنية من نتائج الإصدار، استخدِم التعليمات الموضحة أدناه في __DATE__/__TIME__/__TIMESTAMP__ في لغة C/C++ و الطوابع الزمنية المضمّنة في الأرشيفات
__DATE__/__TIME__/__TIMESTAMP__ باللغة C/C++
تنتج وحدات الماكرو هذه دائمًا مخرجات مختلفة لعمليات إنشاء مختلفة، لذلك لا تستخدمها. هنا بعض الخيارات لإزالة وحدات الماكرو هذه:
- عليك إزالتها. على سبيل المثال، راجع https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f.
- لتحديد البرنامج الثنائي قيد التشغيل بشكل فريد، اطّلِع على معرّف الإصدار من عنوان ELF.
-
لمعرفة وقت إنشاء نظام التشغيل، يمكنك الاطّلاع على
ro.build.date
(يعمل هذا مع كل شيء باستثناء الإصدارات المتزايدة التي قد لا يتم تعديلها في هذا التاريخ). على سبيل المثال، راجع إلى https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84.
الطوابع الزمنية المضمّنة في الأرشيفات (zip، jar)
أصلح نظام Android 7.0 مشكلة الطوابع الزمنية المضمّنة في أرشيفات ZIP من خلال إضافة
-X
إلى جميع استخدامات الأمر zip
. أدى ذلك إلى إزالة المعرف الفريد/GID
والطابع الزمني الممتد لنظام Unix من ملف ZIP.
أداة جديدة، ziptime
(تتوفر في
/platform/build/+/main/tools/ziptime/
) إلى إعادة ضبط الطوابع الزمنية العادية في عناوين ملفات ZIP. للحصول على التفاصيل، يُرجى الرجوع إلى
ملفّ README
تحدد أداة signapk
طوابع زمنية لملفات APK قد تختلف حسب
المنطقة الزمنية للخادم. للحصول على التفاصيل، يُرجى الرجوع إلى CL.
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
تحدد أداة signapk
طوابع زمنية لملفات APK قد تختلف حسب
المنطقة الزمنية للخادم. للحصول على التفاصيل، يُرجى الرجوع إلى CL.
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
سلاسل الإصدار
المشكلة: غالبًا ما تم إلحاق BUILD_NUMBER
بسلاسل إصدار APK
إلى إصداراته الثابتة. وحتى إذا لم يحدث أي تغيير آخر في ملف APK، ونتيجةً لذلك، قد لا يتم إجراء أي تغييرات
ستكون مختلفة.
الحل: أزِل رقم الإصدار من سلسلة إصدار APK.
أمثلة:
- https://android.googlesource.com/platform/packages/apps/camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27
- https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c
تفعيل عملية احتساب صحة البيانات على الجهاز
في حال اختيار dm-verity على جهازك، فستلتقط أدوات OTA إعدادات الصحّة تلقائيًا تعمل على تفعيل احتساب الحقيقة على الجهاز فقط يسمح هذا الإجراء باحتساب وحدات الحقيقة على نظام Android بدلاً من تخزينها كوحدات بايت أولية في حزمة التحديث عبر الهواء. يمكن أن تستخدم وحدات الصحّة 16 ميغابايت تقريبًا لقسم 2 غيغابايت.
ومع ذلك، قد تستغرق الحوسبة على الجهاز وقتًا طويلاً. وعلى وجه التحديد، تشير
قد يستغرق رمز تصحيح الخطأ وقتًا طويلاً. على أجهزة Pixel، غالبًا ما يستغرق ذلك ما يصل إلى 10
دقيقة. وقد تستغرق هذه العملية وقتًا أطول على الأجهزة المنخفضة المواصفات. إذا أردت إيقاف ميزة "التحقق على الجهاز فقط"
العملية الحسابية، ومع ذلك يمكنك تفعيل dm-verity، فيمكنك إجراء ذلك من خلال
--disable_fec_computation
إلى أداة ota_from_target_files
عندما
إنشاء تحديث عبر الهواء. توقِف هذه العلامة حساب الدقة على الجهاز أثناء تحديثات التحديث عبر الهواء.
يقلل من وقت تثبيت التحديث عبر الهواء، ولكنه يزيد من حجم حزمة التحديث عبر الهواء. وإذا لم
على تفعيل dm-verity، لا يكون لتمرير هذه العلامة أي تأثير.
أدوات إنشاء متسقة
المشكلة: يجب أن تكون الأدوات التي تنشئ الملفات المثبتة متسقة (سمة محددة المدخلات دائمًا أن تنتج نفس الإخراج).
الحلول/الأمثلة: كان مطلوبًا إجراء تغييرات في أدوات التصميم التالية:
- منشئ ملف الإشعار: تم تغيير منشئ ملف Notifications لإنشاء مجموعات ملاحظة قابلة لإعادة الإنتاج. راجع CL: https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64.
- مجموعة أدوات تجميع محتوى Java لنظام التشغيل Android (Jack) تطلبت سلسلة أدوات Jack تحديثًا التعامل مع التغييرات العرضية في ترتيب الدالة الإنشائية التي تم إنشاؤها. الموصّلات الاستنتاجية تمت إضافة الدالة الإنشائية إلى سلسلة الأدوات: https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b.
- المحول البرمجي لـ AOT من خلال (dex2oat) تلقى البرنامج الثنائي لمجمِّع ART تحديثًا أضفنا خيارًا لإنشاء صورة حتمية: https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9.
-
ملف libpac.so (V8): كل تصميم ينشئ تصميمًا مختلفًا
/system/lib/libpac.so
لأن لقطة V8 تتغير حسب كل إصدار. تشير رسالة الأشكال البيانية هو إزالة اللقطة: https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29. - ملفات dexopt (.odex) للتطبيقات. ملفات ما قبل dexopt (.odex) يحتوي على مساحة متروكة غير مهيأة على أنظمة 64 بت. تم تصحيح هذا: https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029.
استخدام أداة اختلاف الإصدار
بالنسبة إلى الحالات التي يتعذّر فيها إزالة التغييرات المتعلّقة بالإصدار، يجب أن يتضمّن AOSP
وإنشاء أداة الاختلاف
target_files_diff.py
للاستخدام في مقارنة حزمتي ملفات. تنفذ هذه الأداة فرقًا تكراريًا بين اثنين
على الإصدارات، باستثناء التغييرات الشائعة في الملفات، مثل
- التغييرات المتوقّعة في نتائج الإصدار (على سبيل المثال، بسبب تغيير رقم الإصدار)
- التغييرات الناتجة عن مشاكل معروفة في نظام الإصدار الحالي
لاستخدام أداة اختلاف الإصدار، شغِّل الأمر التالي:
target_files_diff.py dir1 dir2
dir1
وdir2
هما دليلان أساسيان يحتويان على الهدف المستخرج.
الملفات لكل إصدار.
الحفاظ على اتساق تخصيص الحظر
وبالنسبة إلى ملف معين، على الرغم من أن محتواه يظل كما هو بين إصدارين، فإن الأجزاء الفعلية التي تحتفظ بالبيانات. ونتيجة لذلك، يجب أن تُجري أداة التحديث عمليات إدخال/إخراج غير ضرورية. لنقل العوائق لإجراء تحديث عبر الهواء.
عند إجراء تحديث عبر الهواء العادي A/B من خلال Virtual A/B، يمكن أن يؤدي إدخال/إخراج غير ضروري إلى زيادة كبيرة في مساحة التخزين المطلوبة لتخزين لقطة النسخ عند الكتابة. في تحديث غير A/B عبر الهواء، يؤدي تحريك الكتل البرمجية للحصول على يساهم تحديث التحديث عبر الهواء في وقت التحديث بسبب زيادة وحدات الإدخال والإخراج بسبب نقل الكتل.
لمعالجة هذه المشكلة، وسّعت Google في الإصدار 7.0 من نظام التشغيل Android أداة make_ext4fs
مع الحفاظ على اتساق توزيع الحظر في جميع الإصدارات تقبل أداة "make_ext4fs
"
علامة -d base_fs
اختيارية تحاول توزيع الملفات على الوحدات نفسها
عند إنشاء صورة ext4
يمكنك استخراج ملفات تعيين الكتل (مثل
ملف خريطة واحد (base_fs
)) من الملفات المستهدفة للإصدار السابق' ملف ZIP. لكل منها
ext4
، يوجد ملف .map
في
دليل IMAGES
(على سبيل المثال، يتجاوب IMAGES/system.map
مع
قسم system
). يمكن بعد ذلك تسجيل الوصول إلى هذه الملفات البالغ عددها base_fs
المحددة عبر PRODUCT_<partition>_BASE_FS_PATH
، كما في هذا المثال:
PRODUCT_SYSTEM_BASE_FS_PATH := path/to/base_fs_files/base_system.map PRODUCT_SYSTEM_EXT_BASE_FS_PATH := path/to/base_fs_files/base_system_ext.map PRODUCT_VENDOR_BASE_FS_PATH := path/to/base_fs_files/base_vendor.map PRODUCT_PRODUCT_BASE_FS_PATH := path/to/base_fs_files/base_product.map PRODUCT_ODM_BASE_FS_PATH := path/to/base_fs_files/base_odm.map
وعلى الرغم من أن هذا لا يساعد في تقليل الحجم الكلي لحزمة OTA، فإنه يحسن تحديث OTA الأداء عن طريق تقليل كمية وحدات الإدخال والإخراج. بالنسبة إلى تحديثات A/B الافتراضية، يقلل ذلك بشكل كبير مقدار مساحة التخزين اللازمة لتطبيق التحديث عبر الهواء.
تجنُّب تحديث التطبيقات
بالإضافة إلى تقليل اختلافات الإصدار، يمكنك تقليل أحجام تحديثات التحديث عبر الهواء من خلال استبعاد التحديثات للتطبيقات التي تحصل على تحديثات من خلال متاجر التطبيقات. غالبًا ما تشكّل حِزم APK جزءًا كبيرًا من أقسام مختلفة على الجهاز. بما في ذلك أحدث إصدارات التطبيقات التي يتم تحديثها حسب التطبيق المتاجر الفعلية في تحديث OTA قد يكون لها تأثير كبير في الحجم على حزم عبر الهواء، ولا توفر سوى القليل من المنفعة. بحلول الوقت الذي يتلقى فيه المستخدمون حزمة عبر الهواء، قد يكون لديهم التطبيق المحدَّث بالفعل، أو إلى إصدار أحدث، يتم استلامه مباشرةً من متاجر التطبيقات.