تحديد حجم القسم الفائق

من المهم تحديد حجم قسم super بشكل صحيح لضمان إمكانية تحديث الجهاز. يؤثر الحجم بشكل مباشر في عدد التحديثات التي يمكن للجهاز تلقّيها وعدد المستخدمين الذين يمكنهم تلقّي تلك التحديثات بنجاح.

هناك بعض المتغيّرات المهمة التي يجب أخذها في الاعتبار. الأول هو الحجم الأصلي، وهو حجم جميع الأقسام الديناميكية عند إعادة تحميل الجهاز لأول مرة. أما القيمة الثانية، فهي معدّل النمو، وهو النسبة المئوية لزيادة حجم نظام التشغيل على مدار مدة توفّر تحديثات للجهاز.

بالإضافة إلى ذلك، يمكن أن تستخدم أجهزة A/B التجريبية مساحة على /data أثناء التحديث، ويجب مراعاة هذا عند تحديد حجم super. إذا كانت هناك حاجة إلى مساحة كبيرة جدًا على /data، لن يتمكّن بعض المستخدمين (أو لن يوافقوا) على إجراء التحديث. ومع ذلك، إذا كان من المعروف أنّ معظم المستخدمين لديهم نسبة مئوية من المساحة الفارغة، يمكن للأجهزة طرح هذه المساحة من super بسهولة. أو يمكن للأجهزة ضمان عدم الحاجة إلى /data مطلقًا، وذلك ببساطة من خلال جعل super كبيرًا بما يكفي.

في ما يلي بعض النماذج للمساعدة في توجيه super تحديد حجم القسم استنادًا إلى هذه المتغيّرات.

الاعتماد على ‎ /data

يشجع اختبار A/B الافتراضي على تصغير super للسماح بزيادة حجم /data. وتُستخدَم بعض هذه المساحة أثناء التحديث. لفهم تأثير ذلك على إمكانية التحديث، من الضروري معرفة النسبة المئوية للأجهزة التي من المرجّح أن تتوفّر فيها هذه المساحة المجانية بمرور الوقت. يعتمد تحديد هذا العدد بشكل كبير على معدات الجهاز و سلوك المستخدمين على هذا الجهاز. في الأمثلة أدناه، يُشار إلى هذا الرقم باسم AllowedUserdataUse.

بدون ضغط

بدون الضغط، تحتاج عملية OTA الكاملة إلى لقطة شاشة بالحجم نفسه تقريبًا لنظام التشغيل، لذا يجب مراعاة ذلك عند تحديد حجم super:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  Super = Max(FinalDessertUpdate, FinalDessertSize * 2 - AllowedUserdataUse)

على سبيل المثال، لنفترض أنّ جهاز A/B الافتراضي يبلغ حجمه الأصلي 4 غيغابايت، وأنّ النمو المتوقّع هو %50، وأنّ جميع المستخدمين تقريبًا لديهم مساحة خالية تبلغ 1 غيغابايت (أو أنهم على استعداد لتوفير مساحة تبلغ 1 غيغابايت لإجراء تحديث). بالنسبة إلى هذا الجهاز، يمكن ضبط حجم super على النحو التالي:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  Super = Max(6GB, 6GB * 2 - 1GB) = Max(6GB, 11GB)

وبالتالي، يجب أن يتضمّن هذا الجهاز قسمًا بسعة 11 غيغابايت super.

مع الضغط

عند استخدام ميزة الضغط، تحتاج عملية التحديث عبر الهواء الكاملة إلى لقطة شاشة تبلغ نسبتها ‎70% تقريبًا من حجم نظام التشغيل:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  FinalOTASnapshotSize = FinalDessertSize * 0.7
  Super = Max(FinalDessertUpdate, FinalDessertSize + FinalOTASnapshotSize - AllowedUserdataUse)

على سبيل المثال، لنفترض أنّ هناك جهازًا تم ضبطه باستخدام ميزة "التصغير الافتراضي"، وحجمه الأصلي هو 4 غيغابايت، ومن المتوقّع أن يزداد حجمه بنسبة %50، علمًا بأنّ جميع المستخدمين تقريبًا لديهم مساحة خالية تبلغ 1 غيغابايت (أو أنهم على استعداد لإخلاء مساحة تصل إلى 1 غيغابايت لإجراء تحديث). بالنسبة إلى هذا الجهاز، يمكن ضبط حجم super على النحو التالي:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  FinalOTASnapshotSize = 6GB * 0.7 = 4.2GB
  Super = Max(6GB, 6GB + 4.2GB - 1GB) = Max(6GB, 9.2GB) = 9.2GB

وبالتالي، من المفترض أن يتضمّن هذا الجهاز قسمًا بسعة 9.2 غيغابايت super.

بدون الاعتماد على ‎ /data

إذا كنت تريد أن تكون تحديثات البرامج التلقائية لا تتطلّب أبدًا مساحة لقطات على /data، يكون تحديد حجم super أمرًا بسيطًا.

بدون ضغط

بالنسبة إلى جهاز A/B الافتراضي بدون ضغط أو جهاز A/B العادي:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  Super = FinalDessertSize * 2

على سبيل المثال، لنفترض أنّ جهاز A/B الافتراضي حجمه الأصلي 4 غيغابايت ومن المتوقّع أن يزداد حجمه بنسبة %50. لضمان عدم استخدام هذا الجهاز /data مطلقًا للحصول على لقطات OTA، سيكون احتسابه على النحو التالي:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  Super = FinalDessertSize * 2 = 12GB

وبالتالي، يجب أن يتضمّن هذا الجهاز قسمًا بسعة 12 غيغابايت super.

مع الضغط

بالنسبة إلى جهاز A/B الافتراضي مع الضغط:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  FinalOTASnapshotSize = FinalDessertSize * 0.7
  Super = FinalDessertSize + FinalOTASnapshotSize

على سبيل المثال، لنفترض أنّ لديك جهازًا افتراضيًا لضغط A/B بحجم 4 غيغابايت عند الإعداد الأصلي ونمو متوقّع بنسبة %50. لضمان عدم استخدام هذا الجهاز /data مطلقًا لأخذ لقطات OTA، سيكون حساب المدة على النحو التالي:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  FinalOTASnapshotSize = 6GB * 0.7 = 4.2GB
  Super = 6GB + 4.2GB = 10.2GB

وبالتالي، يجب أن يتضمّن هذا الجهاز قسمًا بسعة 10.2 غيغابايت super.

المحاذير

قد يكون من المغري ملاحظة أنّه إذا كان حجم الإصدار الأصلي هو 4 غيغابايت، وكان حجم التحديث النهائي هو 5 غيغابايت، يجب أن يكون حجم super هو 9 غيغابايت بدلاً من 10 غيغابايت. ومع ذلك، إذا كان حجم التحديث الأول والأخير 5 غيغابايت، قد تكون المساحة في super غير كافية لإجراء التحديث النهائي. تفترض الصِيَغ أعلاه أنّه يمكن أن يحدث نمو القسم في أي وقت. قد تكون المساحة المطلوبة لتطبيق التحديث النهائي هي نفسها المطلوبة لتطبيق المحاولة الأولى للتحديث.

يُرجى العِلم أنّ نسب الضغط هي تقديرية. قد يتم ضغط صورة نظام التشغيل بشكل أفضل أو أسوأ حسب محتواها. في حال استخدام نظام ملفات مضغوط مثل EROFS، ينخفض العائد من ميزة التقليل المُضاف من اختبار A/B الافتراضي. في هذه الحالة، من الأفضل استخدام إحدى العلامات غير المضغوطة كدليل.

احتساب الحجم

للعثور على قيمة FinalDessertSize في الأمثلة أعلاه، أضِف أحجام كل القسمت الديناميكية معًا. صور الأقسام الديناميكية في نظام التشغيل AOSP هي:

  • system.img
  • vendor.img
  • product.img
  • system_ext.img
  • vendor_dlkm.img
  • system_dlkm.img

احرص على احتساب الحجم استنادًا إلى الصور غير المفكَّرة. عند إنشاء Android 12 أو إصدار أقدم، يتم تحليل الصور بشكلٍ متفرق تلقائيًا، ويمكن إلغاء تحليلها باستخدام simg2img.

من الممكن أيضًا احتساب أحجام الأقسام من حزمة OTA. يؤدي إجراء ذلك أيضًا إلى تقدير حجم لقطة A/B الافتراضية لكل قسم:

  python3 system/update_engine/scripts/payload_info.py path/to/ota-package.zip

أو يمكنك استخدام أداة تحليل OTA. لا تحمِّل هذه الأداة أي ملفات، بل تحلِّل حِزم OTA على الجهاز.

للعثور على قيمة ExpectedGrowth، استخدِم جهازًا تم طرحه سابقًا. استخدِم أقدم صورة super وأحدث صورة super لاحتساب معدّل النمو.