وضع التخطي القوي

يُعد "التخطي القوي" وضعًا متاحًا في البرنامج البرمجي لإنشاء الرسائل. عند تمكين هذا الإعداد، يغير سلوك برنامج التحويل البرمجي بطريقتين:

  • العناصر القابلة للإنشاء التي تتضمّن مَعلمات غير ثابتة تصبح قابلة للتخطّي
  • يتم تذكّر طائرات لامداس التي تم التقاط صور لها غير مستقرة.

تفعيل وضع التخطي القوي

لتفعيل التخطّي الفعّال في وحدة Gradle، يمكنك تضمين الخيار التالي في مجموعة composeCompiler من إعدادات Gradle:

composeCompiler {
   enableStrongSkipping = true
}

إمكانية تخطي قابلة للإنشاء

يعمل وضع التخطّي القوي على تخفيف بعض قواعد الثبات التي يتم تطبيقها عادةً بواسطة برنامج التجميع البرمجي Compose عندما يتعلق الأمر بدوال التخطّي والإنشاءات. بشكل افتراضي، تضع أداة التحويل البرمجي Compose علامة على الدالة القابلة للإنشاء كدالة قابلة للتخطي إذا كانت جميع وسيطاتها تحتوي على قيم ثابتة. ويغيّر وضع التخطّي القوي ذلك.

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

وقت التخطّي

لتحديد ما إذا كان يجب تخطّي عنصر قابل للإنشاء أثناء إعادة الإنشاء، يقارن Compose قيمة كل مَعلمة بقيمها السابقة. ويعتمد نوع المقارنة على ثبات المَعلمة.

  • تتم مقارنة المَعلمات غير الثابتة باستخدام تساوي المثيل (===).
  • تتم مقارنة المَعلمات الثابتة باستخدام تساوي العنصر (Object.equals()).

إذا استوفت جميع المعلمات هذه المتطلبات، يتخطى Compose العنصر القابل للإنشاء أثناء إعادة الإنشاء.

قد تحتاج إلى عنصر قابل للإنشاء لإيقاف التخطّي القوي. هذا يعني أنك قد ترغب في إنشاء عنصر قابل للإعادة تشغيل ولكن غير قابل للتخطي. في هذه الحالة، استخدِم تعليق @NonSkippableComposable التوضيحي.

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

إضافة تعليقات توضيحية إلى الفئات على أنّها ثابتة

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

تذكارات لامدا

يتيح وضع التخطّي القوي أيضًا تذكُّر علامات lambdas داخل العناصر القابلة للإنشاء. عند تفعيل التخطي القوي، سيتم تذكر كل lambda داخل دالة قابلة للإنشاء تلقائيًا.

أمثلة

لتحقيق تذكّر دالة lambdas داخل عناصر قابلة للإنشاء عند استخدام نص تخطي قوي، يدمج برنامج التجميع البرمجي دالة lambda مع طلب remember. وهي مرتبطة بالتقاطات لامدا.

بالنظر إلى حالة يوجد فيها لامدا كما في المثال التالي:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = {
        use(unstableObject)
        use(stableObject)
    }
}

عند تفعيل ميزة "التخطي القوي"، تحفظ أداة التحويل البرمجي كلمة lambda من خلال إحاطتها باستدعاء remember:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = remember(unstableObject, stableObject) {
        {
            use(unstableObject)
            use(stableObject)
        }
    }
}

تتبع المفاتيح قواعد المقارنة نفسها مثل الدوال القابلة للإنشاء. يقارن وقت التشغيل المفاتيح غير الثابتة باستخدام صيغة المثيل. يقارن بين المفاتيح الثابتة باستخدام مساواة الكائن.

الحفظ وإعادة الإنشاء

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

تجنُّب الحفظ

إذا كانت لديك دالة lambda لا تريد أن تحفظها، استخدِم التعليق التوضيحي @DontMemoize.

val lambda = @DontMemoize {
    ...
}

حجم ملفات APK

عند تجميعها، تؤدي العناصر القابلة للإنشاء القابلة للتخطي إلى إنشاء رمز برمجي أكبر من العناصر القابلة للإنشاء غير القابلة للتخطي. عند تفعيل ميزة التخطّي الفعّال، تصنّف أداة تجميع البيانات تقريبًا جميع العناصر القابلة للإنشاء على أنّها قابلة للتخطّي وتغطي جميع ملفات lambda في remember{...}. ولهذا السبب، يؤثر تفعيل وضع التخطّي القوي في حجم حزمة APK لتطبيقك بدرجة ضئيلة.

أدى تفعيل ميزة التخطّي الفعّال في تطبيق Now In Android إلى زيادة حجم حزمة APK بمقدار 4 كيلوبايت. يعتمد الفرق في الحجم إلى حد كبير على عدد العناصر القابلة للإنشاء التي كانت غير قابلة للتخطي سابقًا والتي كانت متوفّرة في التطبيق المحدّد، ولكن يجب أن تكون طفيفة نسبيًا.