تفعيل ميزة "تحسين التطبيق" باستخدام 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 أيضًا على تحسين الموارد كجزء من مراحل التحسين. لمزيد من المعلومات، يُرجى الاطّلاع على تقليل حجم الموارد إلى الحدّ الأمثل.

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

لتفعيل تحسين التطبيق، اضبط isMinifyEnabled = true (لتحسين الرمز البرمجي) وisShrinkResources = true (لتحسين الموارد) في نص برمجة الإصدار على مستوى التطبيق كما هو موضّح في الرمز التالي. ننصحك بتفعيل كلا الإعدادَين دائمًا. ننصحك أيضًا بتفعيل تحسين التطبيق فقط في الإصدار النهائي من تطبيقك الذي تختبره قبل النشر، والذي يكون عادةً إصدارًا تجريبيًا، لأنّ عمليات التحسين تزيد من وقت إنشاء مشروعك ويمكن أن تصعّب عملية تصحيح الأخطاء بسبب الطريقة التي تعدّل بها الرمز البرمجي.

Kotlin

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

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

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

Groovy

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            minifyEnabled true

            // Enables resource shrinking.
            shrinkResources true

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

            ...
        }
    }
}

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

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

قبل تحسين عملية تصغير الموارد، كانت أداة Android Asset Packaging Tool (AAPT2) تنشئ قواعد الاحتفاظ التي تتعامل مع عملية تصغير الموارد بشكل منفصل عن الرمز البرمجي، ما يؤدي غالبًا إلى الاحتفاظ برموز برمجية أو موارد لا يمكن الوصول إليها وتشير إلى بعضها البعض.

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

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

لتفعيل مسار تقليل حجم الموارد المحسّن الجديد في إصدار من "مكوّن Android الإضافي لنظام Gradle" (AGP) قبل الإصدار 9.0.0، أضِف ما يلي إلى ملف gradle.properties في مشروعك:

android.r8.optimizedResourceShrinking=true

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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