PerfettoSQL ile profilleri sorgulama

PerfettoSQL ve Perfetto Standart Kitaplığı'ndaki modülleri kullanarak ProfilingManager profillerini sorgulayabilirsiniz. ProfilingManager, yalnızca uygulamanızın işlem verilerini içerecek şekilde sistem izlerini çıkardığından diğer işlemlere bağlı olan sistem genelindeki standart kitaplık sorguları desteklenmez. Ancak uygulama kapsamlı sorguların ve standart kitaplık modüllerinin çoğu değişiklik yapılmadan çalışır. Kullanıma hazır diğer sorgular için Android İzlerini Analiz Etme başlıklı makaleyi inceleyin.

ProfilingManager örnek sorguları

Aşağıdaki örnek sorguları doğrudan veya kendi PerfettoSQL analiziniz için şablon olarak kullanın.

En çok kopyalanan dilimleri bulma

Tekrarlanan dilimler genellikle gereksiz çalışmalara işaret eder. İşlev söz dizimi hakkında ayrıntılı bilgi için PerfettoSQL'de işlevleri tanımlama başlıklı makaleyi inceleyin. Aşağıdaki sorgu, GLOB kalıbıyla eşleşen dilimleri bulan ve bunları sıklığa göre sıralayan yeniden kullanılabilir bir PerfettoSQL işlevi tanımlar:

-- You only need to call this once in the session to create or update the function
CREATE OR REPLACE 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*')

Takılma sorguları

Sistem izlemede yavaş veya kesintili kareleri belirlemek için aşağıdaki sorguları kullanın.

Yavaş kareleri bulma

Bu sorgu, oluşturulması 16,6 ms'den (60 Hz) uzun süren kareleri bulur. Perfetto, dilim sürelerini nanosaniye cinsinden depoladığı için dur, 16660000 ile karşılaştırılır:

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

Takılmaya neden olan kareleri bulma

Bu sorgu, cihazın yenileme hızına göre uygulamanın oluşturma zaman sınırını kaçırdığı kareleri bulmak için kare zaman çizelgesi modülünü kullanır:

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

En çok kopyalanan nesneleri bulma

Java yığın dökümünde bu sorgu, istenmeyen kopyaları veya önbelleğe alma fırsatlarını tespit etmenize yardımcı olmak için iki veya daha fazla örneği olan en iyi 100 sınıfı döndürür:

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

Sıfırdan başlatma gecikmesi

Bu sorgu, bindApplication ile ilk Choreographer#doFrame dilimi arasındaki süreyi ölçerek ilk kareye kadar geçen sıfırdan başlatma süresini (TTFF) tahmin eder:

-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE PERFETTO 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)