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.