הכלי ProfilingManager שומר את המעקבים באופן מקומי במכשיר. אפשר לאחזר את הקבצים האלה באמצעות ADB לצורך ניפוי באגים מקומי, אבל כדי לאסוף נתונים של שדות צריך להעלות אותם לשרת.
קבצים של נתוני מעקב יכולים להיות גדולים (לעתים קרובות כמה מגה-בייט). כדי לא לפגוע בחוויית המשתמש או לצרוך חבילת גלישה, כדאי לתזמן את ההעלאות כך שיתבצעו ברקע, ועדיף כשהמכשיר מחובר לרשת ללא הגבלה (Wi-Fi), בטעינה ובמצב לא פעיל.
הגדרת משימת העלאה ב-WorkManager
ProfilingManager לא תלוי בענן; אתם יכולים להעלות עקבות לכל תשתית שתבחרו. בדוגמה הבאה אפשר לראות איך משתמשים ב-WorkManager כדי לתזמן עבודת העלאה שלא תפריע למשתמשים.
דוגמה לקוד להגדרת משימת העלאה
הנה דוגמה להגדרת משימה שלא מפריעה למשתמש להעלות עקבות לשרת.
הוספת יחסי תלות של WorkManager
בנוסף לתלות הקיימת ב-ProfilingManager, מוסיפים את ספריות Jetpack האלה לקובץ build.gradle.kts. WorkManager צריך אותן.
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.11.1") }
Groovy
dependencies { implementation 'androidx.work:work-runtime:2.11.1' }
קטע קוד
בדוגמת הקוד הבאה מוצג איך להגדיר משימה להעלאת נתוני מעקב. העבודה צריכה להיות מוגדרת כשמתקבל 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.