اگر مشکلات عملکردی را تجربه می کنید که ناشی از ترکیب مجدد غیرضروری یا بیش از حد است، باید پایداری برنامه خود را اشکال زدایی کنید. این راهنما چندین روش را برای انجام این کار شرح می دهد.
بازرس چیدمان
Layout Inspector در اندروید استودیو به شما امکان میدهد ببینید کدام یک از اجزای سازنده در برنامه شما دوباره ترکیب میشوند. تعداد دفعاتی که Compose یک کامپوننت را دوباره ساخته یا رد کرده است را نشان می دهد.
گزارش های کامپایلر را بنویسید
کامپایلر Compose می تواند نتایج استنتاج پایداری خود را برای بازرسی به خروجی برساند. با استفاده از این خروجی، میتوانید تعیین کنید که کدام یک از کامپوزیشنهایتان قابل پرش هستند و کدامها نیستند. بخشهای فرعی زیر نحوه استفاده از این گزارشها را خلاصه میکند، اما برای اطلاعات دقیقتر به مستندات فنی مراجعه کنید.
راه اندازی
نوشتن گزارش های کامپایلر به طور پیش فرض فعال نیست. می توانید آنها را با یک پرچم کامپایلر فعال کنید. تنظیمات دقیق بسته به پروژه شما متفاوت است، اما برای پروژه هایی که از افزونه Compose compiler gradle استفاده می کنند، می توانید موارد زیر را در فایل build.gradle
هر ماژول اضافه کنید.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
گزارش های کامپایلر نوشتن اکنون هنگام ساخت پروژه شما تولید می شود.
خروجی نمونه
reportsDestination
سه فایل خروجی می دهد. نمونه های زیر خروجی های JetSnack هستند.
-
<modulename>-classes.txt
: گزارشی در مورد پایداری کلاس ها در این ماژول. نمونه . -
<modulename>-composables.txt
: گزارشی در مورد چگونگی راهاندازی مجدد و رد شدن اجزای سازنده در ماژول. نمونه . -
<modulename>-composables.csv
: نسخهCSV
گزارش composables که می توانید آن را به صفحه گسترده وارد کنید یا با استفاده از یک اسکریپت پردازش کنید. نمونه
گزارش اجزای سازنده
فایل 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
قابل رد شدن نیست. نوشتن هرگز در طول ترکیب مجدد از آن نمی گذرد. این اتفاق می افتد حتی اگر هیچ یک از پارامترهای آن تغییر نکرده باشد. دلیل این امر پارامتر 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
به عنوان ناپایدار علامت گذاری می کند.