تفعيل ميزة "تحسين التطبيق" باستخدام R8

لتقديم أفضل تجربة للمستخدم، عليك تحسين تطبيقك ليكون صغير الحجم وسريعًا قدر الإمكان. تعمل أداة تحسين التطبيقات، المعروفة باسم R8، على تبسيط تطبيقك من خلال إزالة الرموز والموارد غير المستخدَمة وإعادة كتابة الرموز لتحسين أداء وقت التشغيل وغير ذلك. بالنسبة إلى المستخدمين، يعني ذلك ما يلي:

  • بدء تشغيل أسرع
  • تقليل استخدام الذاكرة
  • تحسين أداء العرض ووقت التشغيل
  • عدد أقل من أخطاء ANR

نظرة عامة على تحسين R8

تستخدم أداة R8 عملية متعدّدة المراحل لتحسين تطبيقك من حيث الحجم والسرعة. تشمل العمليات الرئيسية ما يلي:

  • تقليل حجم الرموز (المعروف أيضًا باسم إزالة الرموز غير المستخدَمة): تحدّد أداة R8 الرموز التي لا يمكن الوصول إليها وتزيلها من تطبيقك ومن تبعيات المكتبة. من خلال تحليل نقاط الدخول إلى تطبيقك (مثل Activities أو Services المحدّدة في ملف البيان)، ينشئ R8 رسمًا بيانيًا للرمز البرمجي الذي تمت الإشارة إليه ويزيل أي رمز برمجي لم تتم الإشارة إليه.

  • التحسينات المنطقية: تعيد الأداة R8 كتابة الرموز البرمجية لتحسين كفاءة التنفيذ وتقليل النفقات العامة. تشمل التقنيات الرئيسية ما يلي:

    • تضمين التعليمات البرمجية للطريقة: يستبدل R8 موقع طلب إجراء بالنص الفعلي للطريقة التي تم استدعاؤها. يؤدي ذلك إلى إلغاء النفقات العامة لاستدعاء الدالة ويتيح لبرنامج R8 إجراء المزيد من عمليات التحسين.

    • دمج الصفوف: يجمع R8 مجموعات من الصفوف والواجهات في صف واحد. يؤدي ذلك إلى تقليل عدد الفئات في التطبيق، ما يقلّل من الضغط على الذاكرة ويحسّن سرعة بدء التشغيل.

  • إخفاء مفاتيح فك التشفير (يُعرف أيضًا باسم إزالة البيانات غير الضرورية): لتقليل حجم ملف DEX، يختصر R8 أسماء الفئات والحقول والطرق (على سبيل المثال، يمكن أن يصبح com.example.MyActivity a.b.a).

بدءًا من الإصدار 8.12.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android‏ (AGP)، يعمل R8 أيضًا على تحسين الموارد كجزء من مراحل التحسين. لمزيد من المعلومات، يُرجى الاطّلاع على تقليص الموارد إلى الحدّ الأمثل.

تفعيل التحسين

لتفعيل تحسين التطبيق، استخدِم لغة DSL المناسبة استنادًا إلى إصدار "المكوّن الإضافي لنظام Gradle المتوافق مع Android" (AGP) الخاص بمشروعك. ننصحك بتفعيل تحسين التطبيق فقط في الإصدار النهائي من تطبيقك الذي تختبره قبل النشر، وهو عادةً بنية الإصدار، لأنّ عمليات التحسين تزيد من مدّة التصميم لمشروعك ويمكن أن تصعّب عملية تصحيح الأخطاء بسبب الطريقة التي تعدّل بها الرمز البرمجي.

الإصدار 9.3 والإصدارات الأحدث من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"

لتفعيل تحسين التطبيق في الإصدار 9.3 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" والإصدارات الأحدث، اتّبِع الخطوات التالية:

  • اضبط enable = true في حزمة optimization في نص برمجة الإصدار على مستوى التطبيق.
  • أضِف قواعد الاحتفاظ إلى ملف باللاحقة .keep في مجموعة رموز المصدر src/<variant>/keepRules. على سبيل المثال، src/main/keepRules/custom-rules.keep.

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

أنيق

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

لغة DSL القديمة لإصدارات "المكوّن الإضافي لنظام Gradle المتوافق مع Android" الأقدم من 9.3

لتفعيل تحسين التطبيق، اضبط isMinifyEnabled = true (لتحسين الرموز البرمجية) وisShrinkResources = true (لتحسين الموارد) في نص برمجة الإصدار على مستوى التطبيق (release build). ننصحك بتفعيل كلا الإعدادَين دائمًا.

Legacy DSL (Kotlin)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

Legacy DSL (Groovy)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

تحسين أداء الأداة R8

تتعلّق مزايا الأداء التي توفّرها أداة R8 بشكل مباشر بمقدار قاعدة الرموز البرمجية التي يمكن لأداة R8 تحسينها. للاستفادة إلى أقصى حدّ من R8، اتّبِع أفضل الممارسات التالية:

للمساعدة في تحسين قواعد الاحتفاظ، استخدِم أداة تحليل إعدادات R8.

يتيح لك "محلّل إعدادات R8" تنفيذ ما يلي:

  • تتبُّع الجودة العامة لإعدادات R8 وتحسينها من خلال مراقبة المقاييس المقدَّمة في تقرير "أداة تحليل إعدادات R8"
  • العثور على قواعد الحفاظ على البيانات الأوسع نطاقًا، أي تلك التي تمنع إجراء أكبر قدر من التحسين
  • وفهم التحسينات التي تمنعها لتعديلها.

تتوفّر أداة "تحليل إعدادات R8" في الإصدار 9.3.0-alpha05 من المكوّن الإضافي لنظام Gradle المتوافق مع Android أو الإصدار 9.3.7-dev من R8. لمزيد من المعلومات، يُرجى الاطّلاع على تحليل إعدادات R8.

تحسين عملية تقليص الموارد لإنشاء تطبيقات أصغر حجمًا

يقدّم الإصدار 8.12.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" ميزة "تقليص الموارد" المحسَّنة التي تهدف إلى دمج تحسين الموارد والرموز البرمجية لإنشاء تطبيقات أصغر حجمًا وأسرع. قبل تحسين عملية تقليص الموارد، كانت أداة تجميع الموارد في Android‏ (AAPT2) تنشئ قواعد الاحتفاظ التي تتعامل مع عملية تقليص الموارد بشكل منفصل عن الرمز البرمجي، ما يؤدي غالبًا إلى الاحتفاظ برموز برمجية أو موارد يتعذّر الوصول إليها وتشير إلى بعضها البعض.

باستخدام ميزة "تقليص الموارد المحسَّنة"، يتم التعامل مع الموارد كجزء من رمز البرنامج، ما يؤدي إلى إنشاء الرسم البياني للمراجع. عندما لا تتم الإشارة إلى مجموعة من الرموز أو الموارد، لا تتم حمايتها بموجب قاعدة الاحتفاظ، ويمكن إزالتها.

تفعيل ميزة "تقليص الموارد" المحسَّنة

لتفعيل مسار تصغير الموارد المحسَّن الجديد في الإصدار 8.12 أو 8.13 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"، أضِف ما يلي إلى ملف gradle.properties الخاص بمشروعك:

إذا كنت تستخدم الإصدار 9.0.0 من المكوّن الإضافي Android Gradle أو إصدارًا أحدث، لن تحتاج إلى ضبط android.r8.optimizedResourceShrinking=true. يتم تطبيق ميزة "تقليص الموارد" المحسَّنة تلقائيًا عند تفعيل isShrinkResources = true في إعدادات الإصدار.

التحقّق من إعدادات التحسين في R8 وضبطها

لتمكين R8 من استخدام إمكانات التحسين الكاملة، عليك إزالة السطر التالي من ملف gradle.properties الخاص بمشروعك، إذا كان متوفّرًا:

bash android.enableR8.fullMode=false # Remove this line from your codebase.

يُرجى العِلم أنّ تفعيل تحسين التطبيق يجعل من الصعب فهم تتبُّع تسلسل استدعاء الدوال البرمجية، خاصةً إذا أعاد R8 تسمية أسماء الفئات أو الطرق. للحصول على تتبُّع تسلسل استدعاء الدوال البرمجية يتوافق بشكل صحيح مع رمز المصدر، اطّلِع على استرداد تتبُّع تسلسل استدعاء الدوال البرمجية الأصلي.

في حال تفعيل R8، عليك أيضًا إنشاء ملفات شخصية لبدء التشغيل للحصول على أداء أفضل عند بدء التشغيل.

إذا فعّلت ميزة تحسين التطبيقات وتسبّبت في حدوث أخطاء، إليك بعض الاستراتيجيات لحلّها:

إذا كنت مهتمًا بتحسين سرعة الإنشاء، اطّلِع على ضبط طريقة تشغيل R8 للحصول على معلومات حول كيفية ضبط R8 استنادًا إلى بيئتك.

تغييرات في سلوك إصدارَي "المكوّن الإضافي لنظام Gradle المتوافق مع Android" وR8

يوضّح الجدول التالي الميزات الرئيسية التي تم طرحها في إصدارات مختلفة من المكوّن الإضافي لنظام Gradle المتوافق مع Android ‏ (AGP) ومترجم R8.

إصدار AGP الميزات التي تم طرحها
‫9.3 لغة DSL مبسطة: يتيح القسم الجديد `optimization {}` إعدادات أقل، ويتم تفعيل ميزة "تقليص الموارد" المحسَّنة دائمًا، ويمكن إيقاف قواعد الاحتفاظ التلقائية في Android.

مجموعة رموز المصدر`keepRules`: إذا كنت تستخدم لغة DSL الجديدة، عليك وضع قواعد الاحتفاظ في مجموعة رموز المصدر src/<variant>/keepRules، وذلك في ملفات تحمل اللاحقة .keep. تتوافق مجموعات المصادر أيضًا مع لغة DSL القديمة.

قواعد المستهلك في Kotlin Multiplatform (KMP): لم يعُد KMP يتطلّب ضبط publish = true، ويتوافق مع مجموعة رموز المصدر src/<variant>/keepRules التي تتضمّن الامتداد .keep.

يُرجى العِلم أنّ لغة DSL القديمة لا تزال متاحة.
9.1 إعادة تجميع الصفوف تلقائيًا: يعيد R8 تجميع الصفوف (عن طريق نقلها إلى الحزمة بدون اسم، في المستوى الأعلى) لضغط DEX بشكل أكبر، ما يلغي الحاجة إلى تحديد الخيار -repackageclasses. للحصول على معلومات حول طريقة عمل هذه الميزة وكيفية إيقافها، يُرجى الاطّلاع على الخيارات العامة.
‫9.0 تقليص الموارد المحسَّن: يتم تفعيله تلقائيًا (يمكن التحكّم فيه باستخدام android.r8.optimizedResourceShrinking). تساعد ميزة تقليص الموارد المحسَّن في دمج تقليص الموارد مع مسار تحسين الرموز البرمجية، ما يؤدي إلى إنشاء تطبيقات أصغر حجمًا وأسرع. ومن خلال تحسين مراجع الرموز والموارد في الوقت نفسه، يمكن تحديد الموارد التي تتم الإشارة إليها حصريًا من الرموز غير المستخدَمة وإزالتها. ويُعدّ هذا تحسينًا كبيرًا مقارنةً بعمليات التحسين المنفصلة السابقة.

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

فلترة قواعد المكتبة: تم إيقاف إتاحة الخيارات العامة (مثل -dontobfuscate) في قواعد مستهلكي المكتبة، وستعمل التطبيقات على فلترتها. لمزيد من المعلومات، اطّلِع على إضافة خيارات عامة.

عمليات التحقّق من القيم الخالية في Kotlin: يتم تحسينها تلقائيًا (يمكن التحكّم فيها باستخدام -processkotlinnullchecks). قدّم هذا الإصدار أيضًا تحسينات كبيرة في سرعة الإنشاء. لمزيد من المعلومات، يمكنك الاطّلاع على الخيارات العامة للتحسين الإضافي.

تحسين حِزم معيّنة: يمكنك استخدام packageScope لتحسين حِزم معيّنة. هذه الميزة متاحة بشكل تجريبي. لمزيد من المعلومات، يُرجى الاطّلاع على تحسين الحِزم المحدّدة باستخدام packageScope.

التحسين تلقائيًا: تم إيقاف دعم getDefaultProguardFile("proguard-android.txt") نهائيًا لأنّه يتضمّن -dontoptimize الذي يجب تجنُّبه. استخدِم "proguard-android-optimize.txt" بدلاً من ذلك. إذا كنت بحاجة إلى إيقاف التحسين على مستوى تطبيقك، أضِف العلامة يدويًا إلى ملف Proguard.
8.12 تقليص الموارد المحسَّن: تمت إضافة دعم مبدئي (يتم التحكّم فيه باستخدام android.r8.optimizedResourceShrinking). تساعد ميزة تقليص الموارد المحسَّن في دمج تقليص الموارد مع مسار تحسين الرموز البرمجية. يجب تفعيلها يدويًا في هذا الإصدار من "مكوّن Android Gradle الإضافي".

إعادة تتبُّع Logcat: إتاحة إعادة التتبُّع التلقائي في نافذة Logcat في "استوديو Android".
8.6 تحسين عملية إعادة التتبُّع: تتضمّن إعادة تتبُّع اسم الملف ورقم السطر تلقائيًا لجميع مستويات minSdk (كان يتطلّب ذلك سابقًا الإصدار 26 من minSdk أو إصدارًا أحدث في الإصدار 8.2).

يساعد تحديث R8 في ضمان إمكانية قراءة تتبُّع تسلسل استدعاء الدوال البرمجية من الإصدارات التي تم تشويشها بسهولة ووضوح. يحسّن هذا الإصدار طريقة ربط أرقام الأسطر وملفات المصدر، ما يسهّل على أدوات مثل Logcat في "استوديو Android" إعادة تتبُّع الأعطال تلقائيًا إلى رمز المصدر الأصلي.
من نظام التشغيل Android الوضع الكامل تلقائيًا: يوفّر الوضع الكامل لأداة R8 تحسينًا أكثر فعالية. ويكون هذا الخيار مفعَّلاً تلقائيًا. يمكنك إيقاف هذه الميزة باستخدام android.enableR8.fullMode=false.
7 الوضع الكامل متاح: تم طرح هذه الميزة كخيار يمكن تفعيله باستخدام android.enableR8.fullMode=true. يطبّق الوضع الكامل تحسينات أكثر فعالية من خلال وضع افتراضات أكثر صرامة بشأن كيفية استخدام الرمز البرمجي للبحث عن الأخطاء وميزات ديناميكية أخرى. وعلى الرغم من أنّها تقلّل حجم التطبيق وتحسّن الأداء، قد تتطلّب قواعد إبقاء إضافية لمنع إزالة الرمز البرمجي الضروري.