Query ProfilingManager profiles

ProfilingManager profillerini sorgulamak, normal Perfetto profillerini sorgulamaya benzer. Bu nedenle, profilleri sorgulama hakkında bilgi edinmek için PerfettoSQL'i kullanmaya başlama başlıklı makaleyi inceleyin.

Normal Perfetto izleri ile ProfilingManager izleri arasındaki önemli fark, ProfilingManager izlerinin bir iz redaktöründen geçmesidir. Bu redaktör, gizlilik nedeniyle uygulamanızla ilgili olmayan diğer işlemler hakkındaki bilgileri kaldırır.

Perfetto standart kitaplığındaki bazı sorgular, düzeltilmiş izlerde kullanılamaz. Bunun nedeni, ProfilingManager yalnızca uygulamanızla ilgili profil oluşturma verilerini toplar, diğer işlemleri toplamaz. Bu nedenle, ProfilingManager ile kullanabileceğiniz sorgular, yerel Perfetto kullanılarak kaydedilen tam sistem profillerine yönelik sorgulara kıyasla daha küçüktür.

Sorgu alanı küçülse de Perfetto Standart Kitaplığı'ndaki birçok PerfettoSQL sorgusunu ve tablosunu olduğu gibi kullanabilirsiniz. Bu nedenle, bunları denemenizi öneririz.

Ayrıca, değişiklik yapmadan faydalı performans verileri sağlayan kullanıma hazır sorgular bulmak için Android İzlerini Analiz Etme başlıklı makaleyi incelemenizi öneririz.

ProfilingManager örnek sorguları

Sorgu sürecini basitleştirmek için bu bölümde ProfilingManager ile çalışan sorguların listesi verilmiştir. Bu sorguları doğrudan veya diğer sorguları oluşturmak için örnek olarak kullanabilirsiniz.

En çok kopyalanan dilimleri bulma

Bu sorgu, bir izdeki tekrarlanan dilimleri bulur ve bunları görünme sıklıklarına göre sıralayarak en çok kopyalananları önce gösterir.

Yinelenen işleri bulmak, izdeki gereksiz işleri bulmanın yaygın bir yoludur.

-- You only need to call this once in the session to create the function
DROP TABLE IF EXISTS find_duplicates;
CREATE PERFETTO FUNCTION find_duplicates(pattern STRING) RETURNS
TABLE(name STRING, count_slice LONG) AS SELECT name, COUNT(dur) as count_slice FROM slice WHERE name GLOB $pattern GROUP BY name HAVING COUNT(name) >= 2 ORDER BY count_slice DESC;

-- Subsequent calls can just use the function to find dupes
SELECT * FROM find_duplicates('*Text*')

Duraklama sorguları

Yavaş kareleri bulma

Bu sorgu, uygulamanızın kare oluşturmak için çok uzun süre beklediği kareleri bulur.Beklenen kare hızının 60 Hz (16,6 ms) olduğu varsayılır. Perfetto tablolarındaki dilim süreleri nanosaniye cinsinden depolandığı için dur değeri 16.660.000 olarak ayarlanır.

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;

Jank'e neden olan kareleri bulma

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';

Bu sorgu, uygulamanın bir kare oluşturması çok uzun sürdüğü için izde jank'ın meydana geldiği konumları bulmak için kullanışlıdır. Bu, kullanıcı arayüzü iş parçacığının çerçeve oluşturamadığı anlamına gelir. Aşırı durumlarda bu, ANR'den önce gerçekleşebilir.

En çok yinelenen nesneleri bulma

Daha karmaşık bellek analizleri yapmak için bellek dökümleri gibi bellek ile ilgili profilleri de sorgulayabilirsiniz.

INCLUDE PERFETTO MODULE android.memory.heap_graph.heap_graph_class_aggregation;

SELECT * FROM android_heap_graph_class_aggregation WHERE obj_count >= 2
ORDER BY obj_count DESC LIMIT 100

Bu sorgu, en çok yinelenen 100 nesneyi döndürür. Bu, birden çok kez oluşturulan nesneleri bulmanıza yardımcı olabilir. Bu nesneler, önbelleğe alma fırsatlarını ortaya çıkarabilir veya istenmeyen kopyaları belirleyebilir.

Sıfırdan başlatma gecikmesi

Ayrıca, yeni kurulan şirketler hakkında da sorgu yapabilirsiniz. Bu bölümde, bir izlemede baştan başlatma süresini tahmin etmek için daha ayrıntılı bir sorgu sağlanmaktadır.

-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;

-- This function generates a slice that starts at $startSlicePattern and finishes at the slice matched by $endSlicePattern. If $inclusive is true, then the end slice dur will be added, otherwise, the end slice start time will be used.
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
  (SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
  FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
  WHERE startToEndDur > 0)
GROUP BY name, ts;

-- Using these functions we can estimate cold startup time by generating a slice between bindApplication and first frame.
SELECT * from generate_start_to_end_slices('bindApplication','*Choreographer#doFrame [0-9]*', true)

Bu sorgu, başlangıç zamanını tanımlayan iki dilim arasındaki süreyi temsil eden bir dilim oluşturur: bindApplication (genellikle soğuk uygulama başlatmanın başında bulunur) ve ilk Choreographer#doFrame dilimi (oluşturulan ilk kare). Bu metrik, soğuk başlatma TTFF'sini (ilk kareye kadar geçen süre) etkili bir şekilde tahmin eder.