प्रोफ़ाइल कैप्चर करने का तरीका

इस पेज पर, ProfilingManager API का इस्तेमाल करके सिस्टम ट्रेस रिकॉर्ड करने का तरीका बताया गया है.

डिपेंडेंसी जोड़ें

ProfilingManager एपीआई का बेहतर तरीके से इस्तेमाल करने के लिए, अपनी build.gradle.kts फ़ाइल में यहां दी गई Jetpack लाइब्रेरी जोड़ें.

Kotlin

   dependencies {
       implementation("androidx.tracing:tracing:1.3.0")
       implementation("androidx.core:core:1.16.0")
   }
   

ग्रूवी

   dependencies {
       implementation 'androidx.tracing:tracing:1.3.0'
       implementation 'androidx.core:core:1.16.0'
   }
   

सिस्टम ट्रेस रिकॉर्ड करना

ज़रूरी डिपेंडेंसी जोड़ने के बाद, सिस्टम ट्रेस रिकॉर्ड करने के लिए यहां दिया गया कोड इस्तेमाल करें. इस उदाहरण में, प्रोफ़ाइलिंग सेशन शुरू करने और उसे मैनेज करने के लिए, Activity में बुनियादी सेटअप दिखाया गया है.

Kotlin

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
fun sampleRecordSystemTrace() {
    val mainExecutor: Executor =
        Dispatchers.IO.asExecutor() // Your choice of executor for the callback to occur on.
    val resultCallback = Consumer<ProfilingResult> { profilingResult ->
        if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) {
            Log.d(
                "ProfileTest",
                "Received profiling result file=" + profilingResult.resultFilePath
            )
        } else {
            Log.e(
                "ProfileTest",
                "Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage
            )
        }
    }
    val stopSignal = CancellationSignal()

    val requestBuilder = SystemTraceRequestBuilder()
    requestBuilder.setCancellationSignal(stopSignal)
    requestBuilder.setTag("FOO") // Caller supplied tag for identification
    requestBuilder.setDurationMs(60000)
    requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER)
    requestBuilder.setBufferSizeKb(20971520)
    requestProfiling(applicationContext, requestBuilder.build(), mainExecutor, resultCallback)

    // Wait some time for profiling to start.

    Trace.beginSection("MyApp:HeavyOperation")
    heavyOperation()
    Trace.endSection()

    // Once the interesting code section is profiled, stop profile
    stopSignal.cancel()
}

fun heavyOperation() {
    // Computations you want to profile
}

Java

void heavyOperation() {
  // Computations you want to profile
}

void sampleRecordSystemTrace() {
  Executor mainExecutor = Executors.newSingleThreadExecutor();
  Consumer<ProfilingResult> resultCallback =
      new Consumer<ProfilingResult>() {
        @Override
        public void accept(ProfilingResult profilingResult) {
          if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) {
            Log.d(
                "ProfileTest",
                "Received profiling result file=" + profilingResult.getResultFilePath());
          } else {
            Log.e(
                "ProfileTest",
                "Profiling failed errorcode="

                    + profilingResult.getErrorCode()
                    + " errormsg="
                    + profilingResult.getErrorMessage());
          }
        }
      };
  CancellationSignal stopSignal = new CancellationSignal();

  SystemTraceRequestBuilder requestBuilder = new SystemTraceRequestBuilder();
  requestBuilder.setCancellationSignal(stopSignal);
  requestBuilder.setTag("FOO");
  requestBuilder.setDurationMs(60000);
  requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER);
  requestBuilder.setBufferSizeKb(20971520);
  Profiling.requestProfiling(getApplicationContext(), requestBuilder.build(), mainExecutor,
      resultCallback);

  // Wait some time for profiling to start.

  Trace.beginSection("MyApp:HeavyOperation");
  heavyOperation();
  Trace.endSection();

  // Once the interesting code section is profiled, stop profile
  stopSignal.cancel();
}

यह सैंपल कोड, प्रोफ़ाइलिंग सेशन को सेट अप और मैनेज करता है. इसके लिए, यह इन चरणों को पूरा करता है:

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

  2. प्रोफ़ाइलिंग के नतीजों को मैनेज करना. Consumer<ProfilingResult> ऑब्जेक्ट बनाएं. सिस्टम इस ऑब्जेक्ट का इस्तेमाल करके, ProfilingManager से मिले प्रोफ़ाइलिंग के नतीजों को आपके ऐप्लिकेशन पर वापस भेजता है.

  3. प्रोफ़ाइलिंग का अनुरोध तैयार करें. प्रोफ़ाइलिंग सेशन सेट अप करने के लिए, SystemTraceRequestBuilder बनाएं. इस बिल्डर की मदद से, ProfilingManager ट्रेस की सेटिंग को अपनी पसंद के मुताबिक बनाया जा सकता है. बिल्डर को पसंद के मुताबिक बनाना ज़रूरी नहीं है. अगर ऐसा नहीं किया जाता है, तो सिस्टम डिफ़ॉल्ट सेटिंग का इस्तेमाल करता है.

    • टैग तय करें. ट्रेस के नाम में टैग जोड़ने के लिए, setTag() का इस्तेमाल करें. इस टैग से, आपको ट्रेस की पहचान करने में मदद मिलती है.
    • ज़रूरी नहीं: अवधि सेट करें. setDurationMs() का इस्तेमाल करके, यह तय करें कि प्रोफ़ाइलिंग कितने समय तक करनी है. यह समय मिलीसेकंड में होना चाहिए. उदाहरण के लिए, 60000 60 सेकंड का ट्रेस सेट करता है. अगर तय की गई अवधि से पहले CancellationSignal ट्रिगर नहीं होता है, तो ट्रेसिंग अपने-आप बंद हो जाती है.
    • बफ़र नीति चुनें. setBufferFillPolicy() का इस्तेमाल करके यह तय करें कि ट्रेस डेटा को कैसे सेव किया जाए. BufferFillPolicy.RING_BUFFER का मतलब है कि बफ़र पूरा होने पर, नया डेटा सबसे पुराने डेटा को ओवरराइट कर देता है. इससे हाल की गतिविधि का रिकॉर्ड लगातार बना रहता है.
    • बफ़र साइज़ सेट करें. setBufferSizeKb() का इस्तेमाल करके, ट्रेसिंग के लिए बफ़र साइज़ तय करें. इसका इस्तेमाल करके, आउटपुट ट्रेस फ़ाइल के साइज़ को कंट्रोल किया जा सकता है.
  4. ज़रूरी नहीं: सेशन का लाइफ़साइकल मैनेज करें. CancellationSignal बनाएं. इस ऑब्जेक्ट की मदद से, प्रोफ़ाइलिंग सेशन को किसी भी समय रोका जा सकता है. इससे आपको सेशन की अवधि पर सटीक कंट्रोल मिलता है.

  5. शुरू करें और नतीजे पाएं. requestProfiling() पर कॉल करने पर, ProfilingManager बैकग्राउंड में प्रोफ़ाइलिंग सेशन शुरू करता है. प्रोफ़ाइलिंग हो जाने के बाद, यह आपके resultCallback#accept तरीके को ProfilingResult भेजता है. प्रोफ़ाइलिंग पूरी होने के बाद, ProfilingResult, ProfilingResult#getResultFilePath के ज़रिए आपके डिवाइस पर उस पाथ की जानकारी देता है जहां ट्रेस सेव किया गया था. इस फ़ाइल को प्रोग्राम के ज़रिए या लोकल प्रोफ़ाइलिंग के लिए, अपने कंप्यूटर पर adb pull <trace_path> चलाकर पाया जा सकता है.

  6. कस्टम ट्रेस पॉइंट जोड़ें. अपने ऐप्लिकेशन के कोड में कस्टम ट्रेस पॉइंट जोड़े जा सकते हैं. कोड के पिछले उदाहरण में, Trace.beginSection() और Trace.endSection() का इस्तेमाल करके, MyApp:HeavyOperation नाम का एक ट्रेस स्लाइस जोड़ा गया है. यह कस्टम स्लाइस, जनरेट की गई प्रोफ़ाइल में दिखता है. इससे आपके ऐप्लिकेशन में की गई खास कार्रवाइयों के बारे में हाइलाइट किया जाता है.