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.17.0") }
Groovy
dependencies { implementation 'androidx.tracing:tracing:1.3.0' implementation 'androidx.core:core:1.17.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 zProfilingManagerz powrotem do aplikacji.Utwórz żądanie profilowania. Utwórz
SystemTraceRequestBuilder, aby skonfigurować sesję profilowania. Ten kreator umożliwia dostosowywanieProfilingManagerustawień ś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ład60000ustawia ślad o długości 60 sekund. Śledzenie kończy się automatycznie po określonym czasie, jeśli przed jego upływem nie zostanie wywołane zdarzenieCancellationSignal. - Wybierz zasadę buforowania. Użyj parametru
setBufferFillPolicy(), aby określić sposób przechowywania danych śledzenia.BufferFillPolicy.RING_BUFFERoznacza, że gdy bufor jest pełny, nowe dane zastępują najstarsze dane, dzięki czemu zachowywany jest ciągły zapis ostatniej aktywności. - 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 daje precyzyjną kontrolę nad jej długością.Rozpocznij i uzyskaj wyniki. Gdy zadzwonisz pod numer
requestProfiling(),ProfilingManagerrozpocznie sesję profilowania w tle. Po zakończeniu profilowania wysyłaProfilingResultdo TwojejresultCallback#accept. Jeśli profilowanie zakończy się pomyślnie,ProfilingResultpoda ś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:HeavyOperationza pomocą funkcjiTrace.beginSection()iTrace.endSection(). Ten niestandardowy wycinek pojawia się w wygenerowanym profilu, podkreślając określone operacje w aplikacji.