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

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

بازرس طرح‌بندی

Layout Inspector در اندروید استودیو به شما امکان می‌دهد ببینید کدام کامپوننت‌ها در برنامه شما در حال ترکیب مجدد هستند. این ابزار تعداد دفعاتی را که Compose یک کامپوننت را ترکیب مجدد کرده یا از آن صرف نظر کرده است، نمایش می‌دهد.

شمارش‌های ترکیب‌بندی مجدد و رد شدن در Layout Inspector

نوشتن گزارش‌های کامپایلر

کامپایلر Compose می‌تواند نتایج استنتاج پایداری خود را برای بررسی ارائه دهد. با استفاده از این خروجی، می‌توانید تعیین کنید که کدام یک از composable های شما قابل رد شدن هستند و کدام یک نیستند. بخش‌های بعدی نحوه استفاده از این گزارش‌ها را خلاصه می‌کنند، اما برای اطلاعات دقیق‌تر به مستندات فنی مراجعه کنید.

راه‌اندازی

گزارش‌های کامپایلر 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 : گزارشی در مورد میزان قابل شروع مجدد و قابل رد شدن composables در ماژول. نمونه .
  • <modulename>-composables.csv : یک نسخه CSV از گزارش composables که می‌توانید آن را به یک صفحه گسترده وارد کنید یا با استفاده از یک اسکریپت پردازش کنید. نمونه

گزارش ترکیبات

فایل composables.txt جزئیات هر تابع composable را برای ماژول داده شده، از جمله پایداری پارامترهای آنها و اینکه آیا قابل راه‌اندازی مجدد یا قابل رد شدن هستند، شرح می‌دهد. در زیر یک مثال فرضی از 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 را ناپایدار علامت‌گذاری می‌کند.