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

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

بازرس چیدمان

«بازرس چیدمان» در Android Studio به شما امکان می‌دهد ببینید کدام عناصر ترکیبی در برنامه‌تان دوباره ترکیب می‌شوند. این ابزار تعداد دفعاتی را که Compose یک عنصر را دوباره ترکیب کرده یا از آن صرف‌نظر کرده است نمایش می‌دهد.

تعداد بازترکیب‌ها و پرش‌ها در «بازرس چیدمان»

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

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

راه‌اندازی

گزارش‌های کامپایلر Compose به‌طور پیش‌فرض فعال نیستند. می‌توانید آن‌ها را با پرچم گردآورنده فعال کنید. راه‌اندازی دقیق بسته به پروژه شما متفاوت است، اما برای پروژه‌هایی که از افزونه Compose compiler gradle استفاده می‌کنند، می‌توانید موارد زیر را در فایل 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 که می‌توانید آن را به صفحه‌گسترده وارد کنید یا بااستفاده از دستورگان پردازش کنید. نمونه

گزارش عناصر ترکیب‌شدنی

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