स्थिरता से जुड़ी समस्याओं का पता लगाना

अगर आपको परफ़ॉर्मेंस से जुड़ी समस्याएं आ रही हैं, जो ज़रूरत से ज़्यादा या बार-बार रीकंपोज़िशन की वजह से हो रही हैं, तो आपको अपने ऐप्लिकेशन की स्थिरता को डीबग करना चाहिए. इस गाइड में, ऐसा करने के कई तरीके बताए गए हैं.

में दिए गए निर्देशों का पालन किया हो.

लेआउट इंस्पेक्टर

Android Studio में मौजूद Layout Inspector की मदद से, यह देखा जा सकता है कि आपके ऐप्लिकेशन में कौनसे कंपोज़ेबल फिर से कंपोज़ हो रहे हैं. इससे यह भी पता चलता है कि Compose ने किसी कॉम्पोनेंट को कितनी बार फिर से कंपोज़ किया है या उसे स्किप किया है.

लेआउट इंस्पेक्टर में, लेआउट बदलने और स्किप करने की संख्या

कंपाइलर रिपोर्ट लिखना

Compose कंपाइलर, जांच के लिए स्थिरता के अनुमान के नतीजे दिखा सकता है. इस आउटपुट का इस्तेमाल करके, यह तय किया जा सकता है कि आपके कौनसे कंपोज़ेबल स्किप किए जा सकते हैं और कौनसे नहीं. यहां दिए गए सब-सेक्शन में, इन रिपोर्ट का इस्तेमाल करने के तरीके के बारे में खास जानकारी दी गई है. हालांकि, ज़्यादा जानकारी के लिए तकनीकी दस्तावेज़ देखें.

सेटअप

Compose कंपाइलर रिपोर्ट, डिफ़ॉल्ट रूप से चालू नहीं होती हैं. इन्हें कंपाइलर फ़्लैग की मदद से चालू किया जा सकता है. सेटअप आपके प्रोजेक्ट के हिसाब से अलग-अलग होता है. हालांकि, Compose कंपाइलर 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.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 को अस्थिर के तौर पर मार्क करता है.