अगर आपको परफ़ॉर्मेंस से जुड़ी समस्याएं आ रही हैं और ये ग़ैर-ज़रूरी या ज़्यादा बार कॉम्पोज़ करने की वजह से आ रही हैं, तो आपको अपने ऐप्लिकेशन को डीबग करना चाहिए. इस गाइड में, ऐसा करने के कई तरीके बताए गए हैं.
अपनाए हों.लेआउट इंस्पेक्टर
Android Studio में Layout Inspector की मदद से, यह देखा जा सकता है कि आपके ऐप्लिकेशन में कौनसे कॉम्पोज़ेबल फिर से कॉम्पोज़ किए जा रहे हैं. इससे यह भी पता चलता है कि 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
को अस्थिर के तौर पर मार्क करता है.