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

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

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

Android Studio में लेआउट इंस्पेक्टर की मदद से, यह देखा जा सकता है कि कौनसे कंपोज़ेबल हैं कॉन्टेंट को फिर से लिखने में मदद मिलती है. यह दिखाता है कि Compose में कितनी बार किसी कॉम्पोनेंट को फिर से बनाया या छोड़ा गया.

लेआउट इंस्पेक्टर में कंपोज़िशन और स्किप की गिनती

कंपाइलर रिपोर्ट कंपोज़ करें

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

सेटअप

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