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