إذا كنت تواجه مشاكل في الأداء ناتجة عن إعادة إنشاء غير ضرورية أو مفرطة، عليك تصحيح أخطاء ثبات تطبيقك. يوضّح هذا الدليل عدة طرق لإجراء ذلك.
أداة فحص التنسيق
تتيح لك أداة Layout Inspector في "استوديو Android" معرفة العناصر القابلة للإنشاء التي تتم إعادة إنشائها في تطبيقك، كما تعرض عدد المرات التي أعاد فيها Compose إنشاء أحد المكوّنات أو تخطّاه.
إنشاء تقارير المترجم
يمكن لمترجم Compose عرض نتائج استنتاج الثبات لفحصها. باستخدام هذه النتيجة، يمكنك تحديد العناصر القابلة للإنشاء التي يمكن تخطّيها وتلك التي لا يمكن تخطّيها. تلخّص الأقسام الفرعية التالية كيفية استخدام هذه التقارير، ولكن للحصول على معلومات أكثر تفصيلاً، يمكنك الاطّلاع على المستندات الفنية.
ضبط إعدادات الميزة
لا يتم تفعيل تقارير برنامج التجميع في Compose تلقائيًا. يمكنك تفعيلها باستخدام علامة مترجم. يختلف الإعداد الدقيق حسب مشروعك، ولكن بالنسبة إلى المشاريع التي تستخدم المكوّن الإضافي لنظام Gradle الخاص بمترجم Compose، يمكنك إضافة ما يلي في ملف build.gradle
لكل وحدة.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
سيتم الآن إنشاء تقارير مترجم Compose عند إنشاء مشروعك.
مثال على الناتج
ينتج عن reportsDestination
ثلاثة ملفات. في ما يلي أمثلة على النتائج
من JetSnack.
-
<modulename>-classes.txt
: تقرير عن ثبات الفئات في هذا الوحدة. عيّنة -
<modulename>-composables.txt
: تقرير عن إمكانية إعادة تشغيل العناصر القابلة للإنشاء وإمكانية تخطّيها في الوحدة عيّنة <modulename>-composables.csv
:إصدارCSV
من تقرير العناصر القابلة للإنشاء يمكنك استيراده إلى جدول بيانات أو معالجته باستخدام نص برمجي. عيّنة
تقرير العناصر القابلة للإنشاء
يقدّم ملف composables.txt
تفاصيل كل دالة قابلة للإنشاء في الوحدة المحدّدة، بما في ذلك ثبات مَعلمات الدوال وما إذا كانت قابلة لإعادة التشغيل أو التخطّي. في ما يلي مثال افتراضي من
JetSnack:
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
stable snackCollection: SnackCollection
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
stable index: Int = @static 0
stable highlight: Boolean = @static true
)
يمكن إعادة تشغيل هذا العنصر SnackCollection
القابل للإنشاء بالكامل، ويمكن تخطّيه، كما أنّه ثابت. ويُفضّل استخدام هذا النوع بشكل عام، ولكنّه ليس إلزاميًا بالتأكيد.
من ناحية أخرى، لنلقِ نظرة على مثال آخر.
restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
stable index: Int
unstable snacks: List<Snack>
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
)
لا يمكن تخطّي العنصر القابل للإنشاء HighlightedSnacks
. لا تتخطّى Compose هذه الخطوة أبدًا
أثناء إعادة الإنشاء. ويحدث ذلك حتى إذا لم تتغيّر أيّ من مَعلماتها.
والسبب في ذلك هو المَعلمة unstable
، snacks
.
تقرير الصفوف
يحتوي الملف classes.txt
على تقرير مشابه بشأن الفئات في الوحدة النمطية المحدّدة. المقتطف التالي هو الناتج للفئة Snack
:
unstable class Snack {
stable val id: Long
stable val name: String
stable val imageUrl: String
stable val price: Long
stable val tagline: String
unstable val tags: Set<String>
<runtime stability> = Unstable
}
للعلم، إليك تعريف Snack
:
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
وضع برنامج التجميع Compose علامة على Snack
تشير إلى أنّها غير ثابتة. ويرجع ذلك إلى أنّ نوع المَعلمة tags
هو Set<String>
. هذا النوع غير قابل للتغيير، لأنّه ليس MutableSet
. ومع ذلك، فإنّ فئات التجميع العادية، مثل Set
وList
وMap
، هي في النهاية واجهات. وبالتالي، قد يظل التنفيذ الأساسي قابلاً للتغيير.
على سبيل المثال، يمكنك كتابة val set: Set<String> = mutableSetOf("foo")
. المتغيّر ثابت ونوعه المعلَن غير قابل للتغيير، ولكن تنفيذه لا يزال قابلاً للتغيير. لا يمكن لمترجم Compose التأكّد من عدم قابلية هذه الفئة للتغيير لأنّه يرى النوع المعلَن فقط. لذلك، يتم تصنيف الإصدار tags
على أنّه غير مستقر.