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

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

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

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

android { ... }

composeCompiler {
   enableStrongSkippingMode = true
}

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

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

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

وقت التخطّي

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

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

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

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

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

إضافة تعليقات توضيحية إلى الفئات كثابتة

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

تذكارات Lambda

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

أمثلة

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

ضع في اعتبارك الحالة التي يكون فيها lambda كما في المثال التالي:

@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 الجديدة على معلَمات لا تساوي المقطوعة الأخيرة. وينتج عن هذا إعادة التركيب.

تجنب المذكرة

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

val lambda = @DontMemoize {
    ...
}

حجم حزمة APK

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

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