چه نمایه برنامهمحور ضبط کنید چه نمایه راهانداز،
ProfilingManager فایل تکمیلشده را در دستگاه ذخیره میکند و
ProfilingResult را به فراخوان ثبتشده شما ارسال میکند. برای دریافت مسیر نمایه ذخیرهشده،
ProfilingResult.getResultFilePath را فراخوانی کنید:
- درطول آزمایش محلی: بااستفاده از
adbفایل را به رایانهتان بکشید. - در تولید: مسیر را به کار
WorkManagerکه نمایه را فشرده و در سرور شما بارگذاری میکند ارسال کنید.
بازیابی نمایهها از دستگاه
این بخش توضیح میدهد که 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 مراجعه کنید.