نحوه گرفتن پروفایل

این صفحه نحوه ثبت ردیابی سیستم با استفاده از API ProfilingManager را نشان می‌دهد.

وابستگی‌ها را اضافه کنید

برای بهترین تجربه با API ProfilingManager ، کتابخانه‌های Jetpack زیر را به فایل build.gradle.kts خود اضافه کنید.

کاتلین

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

گرووی

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

ردیابی سیستم را ثبت کنید

پس از افزودن وابستگی‌های مورد نیاز، از کد زیر برای ثبت ردیابی سیستم استفاده کنید. این مثال یک تنظیم اولیه را در یک Activity برای شروع و مدیریت یک جلسه پروفایلینگ نشان می‌دهد.

کاتلین

@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
}

جاوا

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 ایجاد کنید تا نخی را که نتایج پروفایلینگ را دریافت می‌کند، تعریف کند. پروفایلینگ در پس‌زمینه اتفاق می‌افتد. استفاده از یک اجراکننده نخ غیر UI به جلوگیری از خطاهای عدم پاسخگویی برنامه (ANR) در صورت اضافه کردن پردازش بیشتر به فراخوانی بعدی کمک می‌کند.

  2. مدیریت نتایج پروفایلینگ. یک شیء Consumer<ProfilingResult> ایجاد کنید. سیستم از این شیء برای ارسال نتایج پروفایلینگ از ProfilingManager به برنامه شما استفاده می‌کند.

  3. درخواست پروفایلینگ را بسازید. یک SystemTraceRequestBuilder برای تنظیم جلسه پروفایلینگ خود ایجاد کنید. این سازنده به شما امکان می‌دهد تنظیمات ردیابی ProfilingManager سفارشی کنید. سفارشی‌سازی سازنده اختیاری است؛ در غیر این صورت، سیستم از تنظیمات پیش‌فرض استفاده می‌کند.

    • یک برچسب تعریف کنید. از setTag() برای اضافه کردن یک برچسب به نام ردیابی استفاده کنید. این برچسب به شما در شناسایی ردیابی کمک می‌کند.
    • اختیاری: مدت زمان را تنظیم کنید. از setDurationMs() برای تعیین مدت زمان نمایش پروفایل بر حسب میلی‌ثانیه استفاده کنید. برای مثال، 60000 یک ردیابی 60 ثانیه‌ای تنظیم می‌کند. اگر CancellationSignal قبل از آن فعال نشود، ردیابی به طور خودکار پس از مدت زمان مشخص شده پایان می‌یابد.
    • یک سیاست بافر انتخاب کنید. از setBufferFillPolicy() برای تعریف نحوه ذخیره داده‌های ردیابی استفاده کنید. BufferFillPolicy.RING_BUFFER به این معنی است که وقتی بافر پر می‌شود، داده‌های جدید روی قدیمی‌ترین داده‌ها بازنویسی می‌شوند و سابقه‌ای مداوم از فعالیت‌های اخیر را نگه می‌دارند.
    • اندازه بافر را تنظیم کنید. از setBufferSizeKb() برای تعیین اندازه بافر برای ردیابی استفاده کنید که می‌توانید از آن برای کنترل اندازه فایل ردیابی خروجی استفاده کنید.
  4. اختیاری: مدیریت چرخه عمر جلسه. ایجاد یک CancellationSignal . این شیء به شما امکان می‌دهد جلسه پروفایلینگ را هر زمان که بخواهید متوقف کنید و کنترل دقیقی بر طول آن به شما می‌دهد.

  5. شروع و دریافت نتایج. وقتی requestProfiling() را فراخوانی می‌کنید، ProfilingManager یک جلسه پروفایلینگ را در پس‌زمینه آغاز می‌کند. پس از انجام پروفایلینگ، ProfilingResult به متد resultCallback#accept شما ارسال می‌کند. اگر پروفایلینگ با موفقیت به پایان برسد، ProfilingResult مسیری را که ردیابی در دستگاه شما ذخیره شده است از طریق ProfilingResult#getResultFilePath ارائه می‌دهد. می‌توانید این فایل را به صورت برنامه‌نویسی یا برای پروفایلینگ محلی، با اجرای adb pull <trace_path> از رایانه خود دریافت کنید.

  6. نقاط ردیابی سفارشی اضافه کنید. می‌توانید نقاط ردیابی سفارشی را در کد برنامه خود اضافه کنید. در مثال کد قبلی، یک برش ردیابی با نام MyApp:HeavyOperation با استفاده از Trace.beginSection() و Trace.endSection() اضافه شده است. این برش سفارشی در پروفایل تولید شده ظاهر می‌شود و عملیات خاص را در برنامه شما برجسته می‌کند.