परफ़ॉर्मेंस से जुड़ी समस्या का पता लगाने के लिए, अक्सर ट्रैस सबसे अच्छा सोर्स होता है. इनकी मदद से, यह अनुमान लगाया जा सकता है कि समस्या क्या है और कहां से शुरू की जानी चाहिए.
Android पर ट्रैकिंग के दो लेवल काम करते हैं: सिस्टम ट्रैकिंग और तरीका ट्रैकिंग.
सिस्टम ट्रैकिंग सिर्फ़ उन हिस्सों को ट्रैक करती है जिन्हें खास तौर पर ट्रैक करने के लिए मार्क किया गया है. इसलिए, इसका ओवरहेड कम होता है और इससे आपके ऐप्लिकेशन की परफ़ॉर्मेंस पर काफ़ी असर नहीं पड़ता. सिस्टम ट्रैकिंग की मदद से, यह देखा जा सकता है कि आपके कोड के कुछ सेक्शन को चलने में कितना समय लग रहा है.
मेथड ट्रैकिंग की मदद से, आपके ऐप्लिकेशन में हर फ़ंक्शन कॉल को ट्रैक किया जाता है. यह बहुत महंगा होता है और इसलिए, आपके ऐप्लिकेशन की परफ़ॉर्मेंस पर काफ़ी असर पड़ता है. हालांकि, इससे आपको यह पूरी जानकारी मिलती है कि क्या हो रहा है, कौनसे फ़ंक्शन कॉल किए जा रहे हैं, और उन्हें कितनी बार कॉल किया जा रहा है.
डिफ़ॉल्ट रूप से, सिस्टम ट्रैस में अलग-अलग कंपोजेबल फ़ंक्शन शामिल नहीं होते. ये मेथड ट्रेस में उपलब्ध होते हैं.
फ़िलहाल, हम सिस्टम ट्रैसिंग की नई सुविधा को टेस्ट कर रहे हैं. इससे, सिस्टम ट्रैस में कॉम्पोज़ेबल फ़ंक्शन दिखाए जा सकेंगे. इससे आपको सिस्टम ट्रैकिंग से कम परेशानी होती है. साथ ही, कॉम्पोज़िशन में ज़्यादा जानकारी के साथ, ट्रैकिंग के तरीके की जानकारी मिलती है.
कॉम्पोज़िशन ट्रैकिंग के लिए सेट अप करना
अपने प्रोजेक्ट में रीकंपोज़िशन ट्रैकिंग आज़माने के लिए, आपको कम से कम इन वर्शन पर अपडेट करना होगा:
- Android Studio Flamingo
- Compose का यूज़र इंटरफ़ेस (यूआई): 1.3.0
- Compose कंपाइलर: 1.3.0
जिस डिवाइस या एमुलेटर पर ट्रैक चलाया जा रहा है उसमें कम से कम एपीआई लेवल 30 होना चाहिए.
इसके अलावा, आपको Compose रनटाइम ट्रैकिंग पर एक नई डिपेंडेंसी जोड़नी होगी:
implementation("androidx.compose.runtime:runtime-tracing:1.7.5")
अगर Compose BOM का इस्तेमाल किया जा रहा है, तो आपको वर्शन की जानकारी नहीं देनी होगी:
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
इस डिपेंडेंसी की मदद से, जब कोई ऐसा सिस्टम ट्रेस लिया जाता है जिसमें फिर से कॉम्पोज़ करने की सुविधा शामिल होती है, तो आपको कॉम्पोज़ किए जा सकने वाले फ़ंक्शन अपने-आप दिख सकते हैं.
सिस्टम ट्रेस करना
सिस्टम ट्रेस करने और फिर से कॉम्पोज़ करने की नई सुविधा को ऐक्शन में देखने के लिए, यह तरीका अपनाएं:
प्रोफ़ाइलर खोलें:
सीपीयू टाइमलाइन पर क्लिक करें
अपने ऐप्लिकेशन में उस यूज़र इंटरफ़ेस (यूआई) पर जाएं जिसे आपको ट्रैक करना है. इसके बाद, सिस्टम ट्रैक करें और रिकॉर्ड करें को चुनें
अपने ऐप्लिकेशन का इस्तेमाल करके, फिर से कॉम्पोज़ करने और रिकॉर्डिंग बंद करने के लिए. ट्रैक प्रोसेस होने और दिखने के बाद, आपको फिर से कॉम्पोज़ करने वाले ट्रैक में कॉम्पोज़ेबल दिखने चाहिए. ट्रेस को ज़ूम करने और पैन करने के लिए, कीबोर्ड और माउस का इस्तेमाल किया जा सकता है. अगर आपको ट्रेस पर जाने का तरीका नहीं पता है, तो ट्रेस रिकॉर्ड करना दस्तावेज़ देखें.
चार्ट में किसी कॉम्पोज़ेबल पर दो बार क्लिक करने से, आपको उसके सोर्स कोड पर ले जाया जाता है.
फ़ाइल और लाइन की संख्या के साथ-साथ, फ़्लेम चार्ट में कॉम्पोज़ेबल भी देखे जा सकते हैं:
सीमाएं
APK का साइज़
हमने इस सुविधा के ओवरहेड को कम से कम करने की कोशिश की है. हालांकि, Compose कंपाइलर की मदद से APK में एम्बेड की गई ट्रैकिंग स्ट्रिंग की वजह से, Compose ऐप्लिकेशन के APK का साइज़ बढ़ जाता है. अगर आपका ऐप्लिकेशन Compose का ज़्यादा इस्तेमाल नहीं कर रहा है, तो ऐप्लिकेशन का साइज़ ज़्यादा नहीं बढ़ेगा. हालांकि, अगर ऐप्लिकेशन में Compose का पूरा इस्तेमाल किया जा रहा है, तो ऐप्लिकेशन का साइज़ ज़्यादा बढ़ सकता है. इन ट्रैकिंग स्ट्रिंग को भी साफ़ तौर पर दिखाया जाता है, ताकि वे ट्रैकिंग टूल में दिख सकें, जैसा कि पहले दिखाया गया है. Compose कंपाइलर, उन्हें 1.3.0 वर्शन से शुरू होने वाले सभी ऐप्लिकेशन में इंजेक्ट करता है.
प्रोगार्ड का यह नियम जोड़कर, अपने प्रोडक्शन बिल्ड में ट्रैकिंग स्ट्रिंग हटाई जा सकती हैं:
-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
boolean isTraceInProgress();
void traceEventStart(int,int,int,java.lang.String);
void traceEventStart(int,java.lang.String);
void traceEventEnd();
}
आने वाले समय में इन फ़ंक्शन में बदलाव हो सकते हैं. हालांकि, किसी भी बदलाव के बारे में, Compose के रिलीज़ नोट में बताया जाएगा.
ध्यान दें कि APK के साइज़ में कुछ बदलाव करने के बावजूद, उन्हें शामिल रखने से यह पक्का होता है कि जिस APK की प्रोफ़ाइल बनाई जा रही है वह वही है जिसे ऐप्लिकेशन के उपयोगकर्ता चलाते हैं.
सटीक समय
परफ़ॉर्मेंस की जांच की तरह ही, सटीक प्रोफ़ाइलिंग के लिए, आपको प्रोफ़ाइल किए जा सकने वाले ऐप्लिकेशन के मुताबिक, ऐप्लिकेशन profileable
और non-debuggable
को बनाना होगा.
टर्मिनल से ट्रेस कैप्चर करना
टर्मिनल से कॉम्पोज़िशन ट्रेस कैप्चर किया जा सकता है. ऐसा करने के लिए, आपको वही चरण पूरे करने होंगे जो Android Studio आम तौर पर आपके लिए अपने-आप करता है.
डिपेंडेंसी जोड़ें
सबसे पहले, अपने ऐप्लिकेशन में अन्य डिपेंडेंसी जोड़ें.
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
रिकॉर्ड करने का निर्देश जनरेट करना
- Perfetto में रिकॉर्ड करने का निर्देश जनरेट करें.
नीचे दिए गए उदाहरण के मुताबिक,
track_event
डेटा सोर्स सेक्शन को मैन्युअल तरीके से जोड़ें:adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 63488 fill_policy: RING_BUFFER } buffers: { size_kb: 2048 fill_policy: RING_BUFFER } data_sources: { config { name: "track_event" } } duration_ms: 10000 flush_period_ms: 30000 incremental_state_config { clear_period_ms: 5000 } EOF
ट्रेस कैप्चर करना
- ऐप्लिकेशन लॉन्च करें और उस सेक्शन को तैयार करें जिसे आपको ट्रैक करना है.
ब्रॉडकास्ट जारी करके, ऐप्लिकेशन में ट्रैकिंग की सुविधा चालू करें.
# set app package variable, e.g. com.google.samples.apps.nowinandroid.debug # can be found through `adb shell ps -ef` or `adb shell cmd package list packages` package=<your app process> # issue a broadcast to enable tracing adb shell am broadcast \ -a androidx.tracing.perfetto.action.ENABLE_TRACING \ $package/androidx.tracing.perfetto.TracingReceiver
पहले से सेट किया गया रिकॉर्डिंग का निर्देश दें.
ट्रैक खोलना
adb pull <location>
डिवाइस से मिला ट्रेस (रिकॉर्ड कमांड में बताई गई जगह).Perfetto में खोलें.
Jetpack Macrobenchmark की मदद से ट्रैक कैप्चर करना
Jetpack Macrobenchmark की मदद से परफ़ॉर्मेंस को मेज़र किया जा सकता है. इससे नतीजों के तौर पर ट्रेस मिलते हैं. मैक्रोबेंचमार्क की मदद से कॉम्पोज़िशन ट्रैकिंग की सुविधा चालू करने के लिए, आपको ये काम करने होंगे:
Macrobenchmark टेस्ट मॉड्यूल में ये अतिरिक्त डिपेंडेंसी जोड़ें:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
बेंचमार्क चलाने से पहले,
androidx.benchmark.fullTracing.enable=true
इंस्ट्रूमेंटेशन आर्ग्युमेंट जोड़ें. Macrobenchmark इंस्ट्रूमेंटेशन आर्ग्युमेंट के बारे में ज़्यादा जानकारी के लिए, Macrobenchmark इंस्ट्रूमेंटेशन आर्ग्युमेंट देखें.
सुझाव
हमें इस सुविधा के बारे में आपके सुझाव, शिकायत या राय जानकर खुशी होगी. साथ ही, अगर आपको इसमें कोई गड़बड़ी मिलती है, तो हमें बताएं. इसके अलावा, अगर आपका कोई अनुरोध है, तो हमें बताएं. समस्या ट्रैकर की मदद से, हमें सुझाव, शिकायत या राय भेजी जा सकती है.