مشکلات پایداری را تشخیص دهید

اگر مشکلات عملکردی را تجربه می کنید که ناشی از ترکیب مجدد غیرضروری یا بیش از حد است، باید پایداری برنامه خود را اشکال زدایی کنید. این راهنما چندین روش را برای انجام این کار شرح می دهد.

بازرس چیدمان

Layout Inspector در اندروید استودیو به شما امکان می‌دهد ببینید کدام یک از اجزای سازنده در برنامه شما دوباره ترکیب می‌شوند. تعداد دفعاتی که Compose یک کامپوننت را دوباره ساخته یا رد کرده است را نشان می دهد.

ترکیب مجدد و تعداد پرش در Layout Inspector

گزارش های کامپایلر را بنویسید

کامپایلر 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 به عنوان ناپایدار علامت گذاری می کند.