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

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

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

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

کاتلین

   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 برای شروع و مدیریت یک جلسه پروفایل نشان می دهد.

کاتلین

@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 به جلوگیری از خطاهای Application Not Responding (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() اضافه شده است. این برش سفارشی در نمایه تولید شده ظاهر می شود و عملیات خاصی را در برنامه شما برجسته می کند.