На этой странице показано, как записать трассировку системы с помощью API ProfilingManager .
ProfilingManager также может записывать профили других типов. Этот процесс аналогичен записи трассировки системы. Ключевое отличие заключается в том, что в зависимости от необходимого типа профиля вы будете использовать конкретный конструктор из следующего списка:
- Дампы памяти: Запись производилась с помощью
JavaHeapDumpRequestBuilder, что полезно для обнаружения утечек памяти и оптимизации процессов. - Профили кучи: Записываются с помощью
HeapProfileRequestBuilder, что полезно для оптимизации использования памяти. - Профили стека вызовов: Записаны с помощью
StackSamplingRequestBuilder, которые полезны для понимания и анализа задержек.
Добавить зависимости
Для оптимальной работы с API ProfilingManager добавьте следующие библиотеки Jetpack в файл build.gradle.kts .
Котлин
dependencies { implementation("androidx.tracing:tracing:1.3.0") implementation("androidx.core:core:1.17.0") }
Классный
dependencies { implementation 'androidx.tracing:tracing:1.3.0' implementation 'androidx.core:core:1.17.0' }
Запись трассировки системы
После добавления необходимых зависимостей используйте следующий код для записи трассировки системы. В этом примере показана базовая настройка в рамках Activity для запуска и управления сеансом профилирования.
Котлин
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) fun sampleRecordSystemTrace() { val mainExecutor: Executor = Dispatchers.IO.asExecutor() // Your choice of executor for the callback to occur on. val resultCallback = Consumer<ProfilingResult> { profilingResult -> if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) { Log.d( "ProfileTest", "Received profiling result file=" + profilingResult.resultFilePath ) } else { Log.e( "ProfileTest", "Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage ) } } val stopSignal = CancellationSignal() val requestBuilder = SystemTraceRequestBuilder() requestBuilder.setCancellationSignal(stopSignal) requestBuilder.setTag("FOO") // Caller supplied tag for identification requestBuilder.setDurationMs(60000) requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER) requestBuilder.setBufferSizeKb(20971520) requestProfiling(applicationContext, requestBuilder.build(), mainExecutor, resultCallback) // Wait some time for profiling to start. Trace.beginSection("MyApp:HeavyOperation") heavyOperation() Trace.endSection() // Once the interesting code section is profiled, stop profile stopSignal.cancel() } fun heavyOperation() { // Computations you want to profile }
Java
void heavyOperation() { // Computations you want to profile } void sampleRecordSystemTrace() { Executor mainExecutor = Executors.newSingleThreadExecutor(); Consumer<ProfilingResult> resultCallback = new Consumer<ProfilingResult>() { @Override public void accept(ProfilingResult profilingResult) { if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) { Log.d( "ProfileTest", "Received profiling result file=" + profilingResult.getResultFilePath()); setupProfileUploadWorker(profilingResult.getResultFilePath()); } else { Log.e( "ProfileTest", "Profiling failed errorcode=" + profilingResult.getErrorCode() + " errormsg=" + profilingResult.getErrorMessage()); } } }; CancellationSignal stopSignal = new CancellationSignal(); SystemTraceRequestBuilder requestBuilder = new SystemTraceRequestBuilder(); requestBuilder.setCancellationSignal(stopSignal); requestBuilder.setTag("FOO"); requestBuilder.setDurationMs(60000); requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER); requestBuilder.setBufferSizeKb(20971520); Profiling.requestProfiling(getApplicationContext(), requestBuilder.build(), mainExecutor, resultCallback); // Wait some time for profiling to start. Trace.beginSection("MyApp:HeavyOperation"); heavyOperation(); Trace.endSection(); // Once the interesting code section is profiled, stop profile stopSignal.cancel(); }
В приведенном примере кода настройка и управление сессией профилирования осуществляется в несколько этапов:
Настройте исполнитель. Создайте
Executor, определяющий поток, который будет получать результаты профилирования. Профилирование происходит в фоновом режиме. Использование исполнителя, не относящегося к пользовательскому интерфейсу, помогает предотвратить ошибки «Приложение не отвечает» (ANR), если вы добавите дополнительную обработку в функцию обратного вызова позже.Обработайте результаты профилирования. Создайте объект
Consumer<ProfilingResult>. Система использует этот объект для отправки результатов профилирования изProfilingManagerобратно в ваше приложение.Создайте запрос на профилирование. Создайте объект
SystemTraceRequestBuilderдля настройки сеанса профилирования. Этот конструктор позволяет настраивать параметры трассировкиProfilingManager. Настройка конструктора необязательна; если вы этого не сделаете, система будет использовать настройки по умолчанию.- Определите тег. Используйте
setTag(), чтобы добавить тег к имени трассировки. Этот тег поможет вам идентифицировать трассировку. - Необязательно: задайте продолжительность. Используйте
setDurationMs(), чтобы указать, сколько миллисекунд нужно отследить в процессе профилирования. Например, значение60000задает 60-секундную трассировку. Трассировка автоматически завершается по истечении указанного времени, еслиCancellationSignalне срабатывает раньше. - Выберите политику буферизации. Используйте
setBufferFillPolicy()для определения способа хранения данных трассировки.BufferFillPolicy.RING_BUFFERозначает, что когда буфер заполнен, новые данные перезаписывают самые старые, обеспечивая непрерывную запись последней активности. - Задайте размер буфера. Используйте
setBufferSizeKb(), чтобы указать размер буфера для трассировки, который можно использовать для управления размером выходного файла трассировки.
- Определите тег. Используйте
Необязательно: Управление жизненным циклом сессии. Создайте объект
CancellationSignal. Этот объект позволяет остановить сессию профилирования в любой момент, обеспечивая точный контроль над ее продолжительностью.Запуск и получение результатов. При вызове
requestProfiling()ProfilingManagerзапускает сеанс профилирования в фоновом режиме. После завершения профилирования он отправляетProfilingResultв ваш методresultCallback#accept. Если профилирование завершилось успешно,ProfilingResultпредоставляет путь к файлу трассировки, сохраненному на вашем устройстве, черезProfilingResult#getResultFilePath. Вы можете получить этот файл программно или, для локального профилирования, выполнив командуadb pull <trace_path>на вашем компьютере.Добавление пользовательских точек трассировки. Вы можете добавить пользовательские точки трассировки в код вашего приложения. В предыдущем примере кода срез трассировки с именем
MyApp:HeavyOperationдобавлен с помощьюTrace.beginSection()иTrace.endSection(). Этот пользовательский срез отображается в сгенерированном профиле, выделяя определенные операции в вашем приложении.