הגדרת עובד להעלאת פרופיל

‫ProfilingManager שומר את המעקבים באופן מקומי במכשיר. אפשר לאחזר את הקבצים האלה באמצעות ADB לצורך ניפוי באגים מקומי, אבל כדי לאסוף נתוני שדות צריך להעלות אותם לשרת.

קבצים של נתוני מעקב יכולים להיות גדולים (לעתים קרובות כמה מגה-בייט). כדי להימנע מפגיעה בחוויית שימוש או מצריכת חבילת הגלישה, כדאי לתזמן את ההעלאות כך שיתבצעו ברקע, ועדיף כשהמכשיר מחובר לרשת שימוש חופשי (Wi-Fi), בטעינה ובמצב בלי פעילות.

הגדרת משימת העלאה ב-WorkManager

ProfilingManager לא תלוי בענן; אתם יכולים להעלות עקבות לכל תשתית שתבחרו. בדוגמה הבאה אפשר לראות איך משתמשים ב-WorkManager כדי לתזמן עבודת העלאה שלא תפריע למשתמשים.

דוגמה לקוד להגדרת משימת העלאה

הנה דוגמה להגדרת משימה שלא מפריעה למשתמש להעלות עקבות לשרת.

הוספת יחסי תלות ב-WorkManager

בנוסף לתלות הקיימת ב-ProfilingManager, מוסיפים את ספריות Jetpack הבאות לקובץ build.gradle.kts. ‫WorkManager צריך אותן.

Kotlin

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

מגניב

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

קטע קוד

הקוד הזה מראה איך מגדירים משימה להעלאת עקבות. העבודה צריכה להיות מוגדרת כשהאפליקציה מקבלת את ProfilingResult. הקטע של יצירת הפרופיל לא מופיע כאן, אבל אפשר למצוא דוגמה במאמר תיעוד של מעקב אחר המערכת.

Kotlin

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())
}

Java

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)
      .build();
  workRequestBuilder.setConstraints(constraints);

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

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

הסבר על הקוד

הקוד מבצע את הפעולות הבאות:

  • הגדרת העובד: יוצרים מחלקה TraceUploadWorker שמרחיבה את Worker. מטמיעים את השיטה doWork() כדי לטפל בלוגיקה של העלאת הקובץ בפועל באמצעות ה-SDK או לקוח ה-HTTP המועדפים שלכם.

  • בקשת פרופיל: משתמשים ב-SystemTraceRequestBuilder כדי להגדיר את המעקב (משך, מדיניות מאגר) וב-Profiling.requestProfiling כדי להתחיל אותו.

  • תזמון העבודה:

    • יוצרים OneTimeWorkRequest לעובד.

    • הגדרת מגבלות: משתמשים ב-setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) וב-setRequiresCharging(true) כדי לוודא שההעלאה מתבצעת רק כשהמשתמש מחובר ל-Wi-Fi, המכשיר בטעינה ולא בשימוש פעיל. חשוב לעשות את זה כדי למנוע שיבושים בתהליך ההעלאה של המשתמש.

    • העברת נתונים: משתמשים ב-setInputData כדי להעביר את נתיב המעקב אל ה-Worker.

    • הוספה לתור: שולחים את הבקשה ל-WorkManager באמצעות הקריאה ל-WorkManager#enqueue.

השלבים הבאים

אחרי שמעלים את העקבות, אפשר לנתח אותם בנפרד או לבצע ניתוח של עקבות בכמות גדולה. הוראות להגדרת צינור עיבוד נתונים לניתוח שניתן להרחבה מפורטות במאמר פריסת Bigtrace ב-Kubernetes.