بازیابی و بارگذاری نمایه‌ها

چه نمایه برنامه‌محور ضبط کنید چه نمایه راه‌انداز، ProfilingManager فایل تکمیل‌شده را در دستگاه ذخیره می‌کند و ProfilingResult را به فراخوان ثبت‌شده شما ارسال می‌کند. برای دریافت مسیر نمایه ذخیره‌شده، ProfilingResult.getResultFilePath را فراخوانی کنید:

بازیابی نمایه‌ها از دستگاه

این بخش توضیح می‌دهد که ProfilingManager نمایه‌ها را در کجای دستگاه ذخیره می‌کند، پاک‌سازی خودکار فایل چگونه کار می‌کند، و چگونه می‌توان فایل‌ها را به‌صورت محلی بااستفاده از adb استخراج کرد.

مکان‌های فایل و قالب‌های نام‌گذاری

ProfilingManager نمایه‌های ویرایش‌شده را در فهرست راهنمای فضای ذخیره‌سازی مختص برنامه در /data/user/0/<app>/files/profiling/ ذخیره می‌کند. قالب نام فایل به نحوه ضبط نمایه بستگی دارد:

  • نمایه‌های برنامه‌محور:

    profile_<tag>_<datetime>_uid-<uid>.<profile-type-ext>
    

    اگر هنگام درخواست نمایه، برچسبی ارائه نشده باشد، <tag>_ حذف می‌شود: profile_<datetime>_uid-<uid>.<profile-type-ext>.

  • نمایه‌های مبتنی بر راه‌انداز:

    profile_trigger-type-<trigger_type>_<datetime>_uid-<uid>.<profile-type-ext>
    

مکان:

  • <app> نام بسته برنامه شما است.
  • <tag> حداکثر ۲۰ نویسه الفباعددی اول (و خط تیره) از برچسب ارائه‌شده توسط تماس‌گیرنده است که با setTag پیکربندی شده یا به requestProfiling ارسال شده است، به حروف کوچک تبدیل شده و هر نویسه‌ای خارج از a-z، 0-9، و - حذف شده است.
  • <trigger_type> کد ثابت عدد صحیح برای راه‌انداز از ProfilingTrigger است. همیشه ProfilingResult.getTriggerType را در کد فراخوانی کنید و نام فایل را تجزیه نکنید.
  • <datetime> تاریخ و زمان ثبت نمایه است (yyyy-MM-dd-HH-mm-ss-SSS).
  • <uid> شناسه کاربر Linux برنامه شما است (در نسخه‌های اخیر واحد Profiling گنجانده شده است).
  • <profile-type-ext> پسوند فایل برای نوع نمایه ضبط‌شده است:
    • .perfetto-trace برای ردیابی‌های سیستم
    • .perfetto-java-heap-dump برای رونوشت‌های پشته جاوا
    • ‫.perfetto-heap-profile برای تحلیل‌های پشته
    • ‫.perfetto-stack-sample برای تحلیل‌های نمونه‌گیری پشته

فضای ذخیره‌سازی درون‌دستگاهی و پاک‌سازی

برای اینکه فضای ذخیره‌سازی دستگاهتان فوراً آزاد شود، هر فایل نمایه را در کارگر بارگذاری‌تان بلافاصله پس‌از بارگذاری موفق حذف کنید (چون پاک‌سازی خودکار فقط زمانی اجرا می‌شود که ProfilingManager نتایج را به برنامه‌تان تحویل دهد، درغیراین‌صورت اگر برنامه‌تان پس‌از پایان کمپین ثبت فراخوانی‌های برگشتی را متوقف کند، فایل‌های بارگذاری‌نشده ممکن است در دیسک باقی بمانند). به‌عنوان جایگزین در نسخه‌های اخیر ماژول Profiling، ProfilingManager همچنین به‌طور خودکار فایل‌های تحویل‌شده در دایرکتوری فضای ذخیره‌سازی مختص برنامه شما را که قدیمی‌تر از ۵ روز هستند، هنگام تحویل نتایج جدید حذف می‌کند.

بارگذاری نمایه‌ها در تولید با WorkManager

ازآنجایی‌که اندازه فایل‌های نمایه می‌تواند چند مگابایت باشد، بارگذاری‌های تولید را برای زمانی زمان‌بندی کنید که دستگاه در پس‌زمینه به شبکه نامحدود (Wi-Fi) متصل است، درحال شارژ است، و از آن استفاده نمی‌شود.

قبل‌از بارگذاری، فایل نمایه را فشرده کنید (برای مثال، بااستفاده از GZIPOutputStream یا ZipOutputStream). نمایه‌های Perfetto protobuf و رونوشت‌های پشته Java به‌طور قابل‌توجهی فشرده می‌شوند و پهنای باند شبکه و هزینه‌های فضای ذخیره‌سازی پشتیبان را کاهش می‌دهند.

افزودن وابستگی‌های WorkManager

ProfilingManager مستقل از ابر است، بنابراین می‌توانید بارگذاری نمایه‌ها را در هر باطن بااستفاده از WorkManager زمان‌بندی کنید. کتابخانه WorkManager را به فایل build.gradle.kts خود اضافه کنید:

کاتلین

   dependencies {
       implementation("androidx.work:work-runtime:2.12.0")
   }
   

شیک

   dependencies {
       implementation 'androidx.work:work-runtime:2.12.0'
   }
   

زمان‌بندی کار بارگذاری

وقتی برنامه‌تان ProfilingResult دریافت می‌کند، کار بارگذاری را زمان‌بندی کنید. در مثال زیر، درخواست نمایه‌سازی اولیه حذف شده است؛ برای مشاهده نمونه درخواست کامل، به ضبط ردگیری سیستم مراجعه کنید.

کاتلین

class TraceUploadWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        // Perform your uploading work here
        Log.d("ProfileTest", "Uploading trace: " + inputData.getString("PROFILE_PATH"))

        return Result.success()
    }
}

fun setupProfileUploadWorker(profileFilepath: String?) {
    val workMgr = WorkManager.getInstance(applicationContext)
    val workRequestBuilder = OneTimeWorkRequest.Builder(TraceUploadWorker::class)

    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.UNMETERED)
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        .build()
    workRequestBuilder.setConstraints(constraints)

    val inputDataBuilder = Data.Builder()
    inputDataBuilder.putString("PROFILE_PATH", profileFilepath)
    workRequestBuilder.setInputData(inputDataBuilder.build())

    workMgr.enqueue(workRequestBuilder.build())
}

جاوا

public static class TraceUploadWorker extends Worker {

  public TraceUploadWorker(
      @androidx.annotation.NonNull Context context,
      @androidx.annotation.NonNull WorkerParameters workerParams) {
    super(context, workerParams);
  }

  @androidx.annotation.NonNull
  @Override
  public Result doWork() {
    // Perform your uploading work here
    Log.d("ProfileTest", "Uploading trace: " + getInputData().getString("PROFILE_PATH"));

    return Result.success();
  }
}

public void setupProfileUploadWorker(String profileFilepath) {
  WorkManager workMgr = WorkManager.getInstance(getApplicationContext());
  OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(
      TraceUploadWorker.class);

  Constraints constraints = new Constraints.Builder()
      .setRequiredNetworkType(NetworkType.UNMETERED)
      .setRequiresDeviceIdle(true)
      .setRequiresCharging(true)
      .build();
  workRequestBuilder.setConstraints(constraints);

  Data.Builder inputDataBuilder = new Data.Builder();
  inputDataBuilder.putString("PROFILE_PATH", profileFilepath);
  workRequestBuilder.setInputData(inputDataBuilder.build());

  workMgr.enqueue(workRequestBuilder.build());
}

گشت مجازی کد

مثال قبلی مراحل زیر را انجام می‌دهد:

  • تعریف کردن worker: کلاس TraceUploadWorker ایجاد کنید که Worker را گسترش دهد. doWork را پیاده‌سازی کنید تا تأیید کنید که فایل نمایه هنوز وجود دارد، آن را بااستفاده از کیت توسعه نرم‌افزار پس‌بک یا کارخواه HTTP فشرده و بارگذاری کنید، و پس‌از موفقیت‌آمیز بودن بارگذاری، فایل محلی را حذف کنید.
  • زمان‌بندی کار:
    • OneTimeWorkRequest برای کارمندتان ایجاد کنید.
    • تنظیم محدودیت‌ها: از setRequiredNetworkType(NetworkType.UNMETERED)، setRequiresDeviceIdle(true)، و setRequiresCharging(true) استفاده کنید تا بارگذاری فقط زمانی اجرا شود که دستگاه به Wi-Fi متصل است، درحال شارژ است، و غیرفعال است.
    • داده‌های مجوز: از setInputData برای ارسال مسیر نمایه از getResultFilePath به کارمند استفاده کنید.
    • Enqueue: ارسال درخواست به WorkManager با فراخوانی WorkManager.enqueue.

مراحل بعدی

پس‌از بازیابی یا بارگذاری نمایه‌ها، آن‌ها را در Perfetto UI تجسم کنید، نمایه‌های فردی را با PerfettoSQL پُرسمان کنید، ردیابی‌ها را به‌صورت انبوه تجزیه‌وتحلیل کنید، یا نمایه‌ها را با هوش مصنوعی تجزیه‌وتحلیل کنید. برای راهنمایی درباره راه‌اندازی خط لوله تجزیه‌وتحلیل سمت سرور مقیاس‌پذیر، به استقرار Bigtrace در Kubernetes مراجعه کنید.