Na tej stronie dowiesz się, jak zarejestrować ślad systemowy za pomocą interfejsu ProfilingManager
API.
Dodawanie zależności
Aby w pełni korzystać z interfejsu ProfilingManager
API, dodaj do pliku build.gradle.kts
te biblioteki Jetpack:
Kotlin
dependencies { implementation("androidx.tracing:tracing:1.3.0") implementation("androidx.core:core:1.16.0") }
Groovy
dependencies { implementation 'androidx.tracing:tracing:1.3.0' implementation 'androidx.core:core:1.16.0' }
Nagrywanie śledzenia systemu
Po dodaniu wymaganych zależności użyj tego kodu, aby zarejestrować ślad systemowy. Ten przykład pokazuje podstawową konfigurację w Activity
, która umożliwia rozpoczęcie sesji profilowania i zarządzanie nią.
Kotlin
@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()); } 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(); }
Przykładowy kod konfiguruje sesję profilowania i zarządza nią, wykonując te czynności:
Skonfiguruj wykonawcę. Utwórz
Executor
, aby zdefiniować wątek, który będzie otrzymywać wyniki profilowania. Profilowanie odbywa się w tle. Użycie wykonawcy wątku innego niż wątek interfejsu pomaga zapobiegać błędom typu „Aplikacja nie odpowiada” (ANR), jeśli później dodasz więcej przetwarzania do wywołania zwrotnego.Obsługa wyników profilowania. Utwórz obiekt
Consumer<ProfilingResult>
. System używa tego obiektu do wysyłania wyników profilowania zProfilingManager
z powrotem do aplikacji.Utwórz żądanie profilowania. Utwórz
SystemTraceRequestBuilder
, aby skonfigurować sesję profilowania. Ten kreator umożliwia dostosowywanieProfilingManager
ustawień śledzenia. Dostosowanie narzędzia do tworzenia jest opcjonalne. Jeśli tego nie zrobisz, system użyje ustawień domyślnych.- Zdefiniuj tag. Użyj ikony
setTag()
, aby dodać tag do nazwy śladu. Ten tag pomoże Ci zidentyfikować ślad. - Opcjonalnie: ustaw czas trwania. Użyj
setDurationMs()
, aby określić, jak długo ma trwać profilowanie (w milisekundach). Na przykład60000
ustawia śledzenie przez 60 sekund. Śledzenie kończy się automatycznie po określonym czasie, jeśli wcześniej nie zostanie wywołane zdarzenieCancellationSignal
. - Wybierz zasadę buforowania. Użyj
setBufferFillPolicy()
, aby określić sposób przechowywania danych śledzenia.BufferFillPolicy.RING_BUFFER
oznacza, że gdy bufor jest pełny, nowe dane zastępują najstarsze, dzięki czemu zachowywany jest ciągły zapis ostatnich działań. - Ustaw rozmiar bufora. Użyj
setBufferSizeKb()
, aby określić rozmiar bufora śledzenia, za pomocą którego możesz kontrolować rozmiar pliku wyjściowego śledzenia.
- Zdefiniuj tag. Użyj ikony
Opcjonalnie: zarządzaj cyklem życia sesji. Utwórz
CancellationSignal
. Ten obiekt umożliwia zatrzymanie sesji profilowania w dowolnym momencie, co pozwala precyzyjnie kontrolować jej długość.Rozpocznij i uzyskaj wyniki. Gdy zadzwonisz pod numer
requestProfiling()
,ProfilingManager
rozpocznie sesję profilowania w tle. Po zakończeniu profilowania wysyłaProfilingResult
do TwojejresultCallback#accept
. Jeśli profilowanie zakończy się pomyślnie,ProfilingResult
poda ścieżkę, w której ślad został zapisany na urządzeniu, za pomocąProfilingResult#getResultFilePath
. Ten plik możesz uzyskać programowo lub w przypadku profilowania lokalnego, uruchamiającadb pull <trace_path>
na komputerze.Dodaj niestandardowe punkty śledzenia. W kodzie aplikacji możesz dodawać niestandardowe punkty śledzenia. W poprzednim przykładzie kodu dodano wycinek śladu o nazwie
MyApp:HeavyOperation
za pomocą funkcjiTrace.beginSection()
iTrace.endSection()
. Ten niestandardowy wycinek pojawia się w wygenerowanym profilu, podkreślając określone operacje w aplikacji.