Bu sayfada, ProfilingManager
API kullanılarak sistem izinin nasıl kaydedileceği gösterilmektedir.
Bağımlılık ekleme
ProfilingManager
API'den en iyi şekilde yararlanmak için aşağıdaki Jetpack kitaplıklarını build.gradle.kts
dosyanıza ekleyin.
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' }
Sistem izi kaydetme
Gerekli bağımlılıkları ekledikten sonra sistem izi kaydetmek için aşağıdaki kodu kullanın. Bu örnekte, bir profilleme oturumunu başlatmak ve yönetmek için Activity
içindeki temel kurulum gösterilmektedir.
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(); }
Örnek kod, aşağıdaki adımları uygulayarak profilleme oturumunu kurar ve yönetir:
Yürütücüyü ayarlayın. Profil oluşturma sonuçlarını alacak iş parçacığını tanımlamak için
Executor
oluşturun. Profil oluşturma işlemi arka planda gerçekleşir. Kullanıcı arayüzü iş parçacığı yürütücüsü olmayan bir yürütücü kullanmak, geri çağırmaya daha sonra daha fazla işlem eklerseniz Uygulama Yanıt Vermiyor (ANR) hatalarını önlemeye yardımcı olur.Profil oluşturma sonuçlarını işleme
Consumer<ProfilingResult>
nesnesi oluşturun. Sistem, bu nesneyi kullanarakProfilingManager
profil oluşturma sonuçlarını uygulamanıza geri gönderir.Profillendirme isteğini oluşturun. Profil oluşturma oturumunuzu ayarlamak için
SystemTraceRequestBuilder
oluşturun. Bu oluşturucu, izleme ayarlarını özelleştirmenize olanak tanır.ProfilingManager
Oluşturucuyu özelleştirmek isteğe bağlıdır. Özelleştirmezseniz sistem varsayılan ayarları kullanır.- Bir etiket tanımlayın. İz adına etiket eklemek için
setTag()
simgesini kullanın. Bu etiket, izlemeyi tanımlamanıza yardımcı olur. - İsteğe bağlı: Süreyi ayarlayın. Milisaniye cinsinden ne kadar süreyle profil oluşturulacağını belirtmek için
setDurationMs()
kullanın. Örneğin,60000
60 saniyelik bir izleme ayarlar. Belirtilen süre içindeCancellationSignal
tetiklenmezse izleme otomatik olarak sona erer. - Bir arabellek politikası seçin. İzleme verilerinin nasıl depolandığını tanımlamak için
setBufferFillPolicy()
kullanın.BufferFillPolicy.RING_BUFFER
, arabellek dolduğunda yeni verilerin en eski verilerin üzerine yazıldığı ve son etkinliklerin sürekli olarak kaydedildiği anlamına gelir. - Arabellek boyutu ayarlayın. Çıkış izleme dosyasının boyutunu kontrol etmek için kullanabileceğiniz izleme için bir arabellek boyutu belirtmek üzere
setBufferSizeKb()
seçeneğini kullanın.
- Bir etiket tanımlayın. İz adına etiket eklemek için
İsteğe bağlı: Oturum yaşam döngüsünü yönetin.
CancellationSignal
oluşturun. Bu nesne, profil oluşturma oturumunu istediğiniz zaman durdurmanıza olanak tanıyarak süresi üzerinde hassas kontrol sahibi olmanızı sağlar.Başlatma ve sonuç alma
requestProfiling()
'ı aradığınızda,ProfilingManager
arka planda bir profilleme oturumu başlatır. Profil oluşturma işlemi tamamlandıktan sonraProfilingResult
,resultCallback#accept
yönteminize gönderilir. Profillendirme işlemi başarıyla tamamlanırsaProfilingResult
,ProfilingResult#getResultFilePath
aracılığıyla izlemenin cihazınıza kaydedildiği yolu sağlar. Bu dosyayı programatik olarak veya yerel profilleme için bilgisayarınızdanadb pull <trace_path>
komutunu çalıştırarak alabilirsiniz.Özel izleme noktaları ekleyin. Uygulamanızın koduna özel izleme noktaları ekleyebilirsiniz. Önceki kod örneğinde,
Trace.beginSection()
veTrace.endSection()
kullanılarakMyApp:HeavyOperation
adlı bir iz dilimi ekleniyor. Bu özel dilim, oluşturulan profilde görünerek uygulamanızdaki belirli işlemleri vurgular.