Winscope kullanarak pencere geçişlerini izle

Winscope, kullanıcıların animasyonlar ve geçişler sırasında ve sonrasında birkaç sistem hizmetinin durumunu kaydetmesine, tekrar oynatmasına ve analiz etmesine olanak tanıyan bir web aracıdır. Winscope, ilgili tüm sistem hizmeti durumlarını bir izleme dosyasına kaydeder. Winscope kullanıcı arayüzünü izleme dosyasıyla kullanarak, geçişleri oynatarak, adımlayarak ve hata ayıklayarak her animasyon karesi için bu hizmetlerin durumunu ekran kaydı ile veya ekran kaydı olmadan inceleyebilirsiniz.

Winscope'a yüklenebilir izlemeler oluşturan sistem hizmetleri şunlardır:

  • SurfaceFlinger
  • Pencere Yöneticisi
  • WMShell
  • IME
  • Roketatar

Winscope izleme görüntüleyiciyi çalıştırma

Winscope izleme, platformdaki hizmetlerin bir parçasıdır. Bu bölümde Winscope izleme görüntüleyiciyi indirmek, derlemek ve çalıştırmak için gereken adımlar özetlenmektedir.

Bilgisayarınızı Winscope izleyiciyi çalıştıracak şekilde ayarlamak için şu adımları uygulayın:

  1. Android kaynağını indirin.
  2. Winscope klasörüne gidin:

    cd development/tools/winscope
    
  3. Bağımlılıkları aşağıdakileri kullanarak yükleyin:

    npm install
    

    Kullanılabilir komutların listesini görmek için şu komutu çalıştırın: npm run

  4. Aşağıdakileri kullanarak tüm üretim ve test hedeflerini oluşturun:

    npm run build:prod
    
  5. Şunu kullanarak Winscope'u çalıştırın:

    npm run start
    

İzleri yakalama

Cihazda, Winscope veya Android Debug Bridge (adb) komutlarıyla izleri yakalayabilirsiniz.

Cihazdaki izleri yakalayın

Animasyon sorunlarıyla ilgili hata bildirirken veri toplamak için cihazda izleri yakalama Yapılandırma özelleştirilemediğinden tüm kullanıcı arayüzü izleri bu yöntemle kaydedilir.

Android cihazınızda:

  1. Geliştirici seçeneklerini etkinleştirin.
  2. Geliştirici Seçenekleri altında Sistem İzleme'yi seçin.
  3. Winscope izlerini topla'yı etkinleştirin.
  4. Çeşitli bölümünde:
    1. Hata raporlarına kayıt ekle seçeneğini etkinleştirin.
    2. Hızlı Ayar kutusunu göster'i etkinleştirin.
  5. Hatayı yeniden oluşturmanız gereken yere gidin.
  6. Kaydı başlatmak için Hızlı Ayarlar'ı açıp İzleme kaydet'i seçin:

    hızlı_ayar_winscope

    Şekil 1. Kayıt İzleme bulunan hızlı ayar menüsü.

  7. Hatayı yeniden oluşturmak için yalnızca gerekli adımları uygulayın.

  8. Kaydı durdurmak için Hızlı Ayarlar'ı açıp İzleme işlemini durdur'u seçin.

  9. Yakalanan günlüğü, listelenen seçeneklerden birini (ör. Gmail, Drive veya BetterBug) kullanarak paylaşın.

Winscope ile izleri yakalayın

Yerel geliştirme ve hata ayıklama için Winscope'u kullanarak izlemeler yakalayabilirsiniz. Winscope, USB veya kablosuz ağ üzerinden cihaz bağlantısını destekleyen adb'yi kullanır.

Winscope'ta:

  1. Collect Traces (İzleri Topla) ekranında ADB Proxy'yi (ADB Proxy) tıklayın:

    capture_traces_winscope

    Şekil 2. Winscope'ta iz yakalama

  2. İzlemeleri doğrudan tarayıcınızdan yakalamak için Winscope ADB Connect proxy'yi başlatın.

  3. Aşağıdaki komutu çalıştırın:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Yakalama işlemini başlatmak için İz toplayın ekranında hedefleri ve yapılandırmayı seçip İzi başlat'ı tıklayın:

    collect_traces_winscope

    Şekil 3. Winscope'ta izleri toplayın.

  5. Kaydı durdurmak için İzleme işlemini sonlandır'ı tıklayın:

    end_trace_winscope

    Şekil 4. Winscope'ta izlemeyi sonlandır.

Araç, Winscope'un kullanıcı arayüzüne izleri yüklediğinde ekranda Getirme ve Ayrıştıran Proto Dosyalar mesajları görünür.

Winscope kullanarak durum dökümünü oluştur

Winscope'u kullanarak bir durum dökümü almak için Collect Traces (İzlenen Topla) ekranında Dump (Dump) sekmesini seçin ve ardından Dump state'i (Dump durumu) tıklayın:

dump-winscope

5. Şekil. Winscope'ta döküm durumu.

adb komutları aracılığıyla izlemeleri yakalama

Aşağıdaki izlerin her biri için adb shell komutlarını çalıştırmadan önce adb root komutunu çalıştırın. İzlemenin sonunda, izleme dosyaları /data/misc/wmtrace konumunda bulunur. Bir dosyayı veya dizini ve alt dizinlerini cihazdan kopyalamak için Bir cihaza ve cihazdan dosya kopyalama bölümüne bakın. Daha fazla bilgi için adb'ye bakın.

WindowManager izleri

WindowManager izlerini yakalamak için:

  • İzlemeyi etkinleştirme:

    adb shell wm tracing start
    
  • İzlemeyi devre dışı bırak:

    adb shell wm tracing stop
    
  • İzleme yakalaması çalıştırırken günlük verilerini dosyaya kaydedin:

    adb shell wm tracing save-for-bugreport
    
  • İzlemeyi kare başına bir kez günlüğe kaydetme:

    adb shell wm tracing frame
    
  • Her işlemi günlüğe kaydet:

    adb shell wm tracing transaction
    
  • Maksimum günlük boyutunu ayarlayın (KB cinsinden):

    adb shell wm tracing size
    
  • Yazdırma izleme durumu:

    adb shell wm tracing status
    
  • Günlük düzeyini critical (yalnızca bilgi azaltılmış görünür pencereler), trim (bilgi düzeyi azaltılmış tüm pencereler) veya all (tüm pencereler ve bilgiler) olarak ayarlayın:

    adb shell wm tracing level
    

ProtoGünlük

Aşağıdaki komutlar ProtoLog sistemi için kullanılır.

system_server sürecinde:

  • ProtoLog'u başlatın:

    adb shell cmd window logging start
    
  • ProtoLog'u durdurma:

    adb shell cmd window logging stop
    
  • Belirli günlük grupları için ProtoLog'u etkinleştir:

    adb shell cmd window logging enable [group...]
    
  • Belirtilen günlük grupları için ProtoLog'u devre dışı bırak:

    adb shell cmd window logging disable [group...]
    
  • Belirli günlük grupları için Logcat günlük kaydını etkinleştirin:

    adb shell cmd window logging enable-text [group...]
    
  • Belirtilen günlük grupları için Logcat günlük kaydını devre dışı bırakın:

    adb shell cmd window logging disable-text [group...]
    

WMShell'de:

  • ProtoLog'u başlatın:

    adb shell dumpsys activity service SystemUIService WMShell
    

Geçiş izleme

Geçiş izleme için aşağıdaki komutlar kullanılır:

system_server sürecinde:

  • İzleme başlatın:

    adb shell cmd window shell tracing start
    
  • İzlemeyi durdurma:

    adb shell cmd window shell tracing stop
    
  • WMShell'de iz başlatın:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • WMShell'de bir izlemeyi durdurma:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

Giriş Yöntemi Düzenleyici

Giriş Yöntemi Düzenleyici (IME) izleme için aşağıdaki komutlar kullanılır:

  • Giriş Yöntemi (IM) istemcileri, Giriş Yöntemi Hizmeti (IMS) ve Giriş Yöntemi Yönetim Hizmeti (IMMS) için IME izlemeyi başlatın:

    adb shell ime tracing start
    
  • IME istemcileri, IMS ve IMMS'yi izlemeye başlayın:

    adb shell ime tracing stop
    

SurfaceFlinger katmanları

SurfaceFlinger katman izleme, yakalama için Perfetto izini kullanır. Yapılandırma bilgileri için Trace yapılandırması bölümünü inceleyin.

Aşağıdaki SurfaceFlinger katman izleme yapılandırma örneğine bakın:

unique_session_name: "surfaceflinger_layers_active"
buffers: {
    size_kb: 63488
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.layers"
        surfaceflinger_layers_config: {
            mode: MODE_ACTIVE
            trace_flags: TRACE_FLAG_INPUT
            trace_flags: TRACE_FLAG_COMPOSITION
            trace_flags: TRACE_FLAG_HWC
            trace_flags: TRACE_FLAG_BUFFERS
            trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
        }
    }
}

SurfaceFlinger katmanları için izleme oluşturmak üzere aşağıdaki örnek komuta bakın:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

SurfaceFlinger işlemleri

SurfaceFlinger işlem izleme, yakalama için Perfetto izlemeyi kullanır. Yapılandırma bilgileri için İzleme yapılandırması başlıklı makaleyi inceleyin.

SurfaceFlinger etkin izleme için aşağıdaki Perfetto yapılandırması örneğine bakın:

unique_session_name: "surfaceflinger_transactions_active"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_ACTIVE
        }
    }
}
write_into_file: true
file_write_period_ms: 100

SurfaceFlinger sürekli izleme için Perfetto yapılandırması örneğine göz atın:

unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_CONTINUOUS
        }
    }
}

SurfaceFlinger işlemleri için izleme oluşturmak üzere aşağıdaki örnek komuta bakın:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

adb kullanarak durum dökümü oluşturma

Winscope, hata raporlarından WindowManager ve SurfaceFlinger durumlarının anlık görüntüsünü okur. Hata raporları, durumları proto klasöründe ayrı proto dosyaları olarak depolar. adb kullanarak durum dökümlerini oluşturmak için aşağıdaki komutları çalıştırın.

WindowManager için:

adb exec-out dumpsys window --proto > window_dump.winscope

SurfaceFlinger için:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

İzleri analiz et

Animasyon sorunlarına neden olan geçici ve geçersiz durumlarda hata ayıklama yapmak için Winscope farklı izleme dosyalarını toplar, kareler ve zaman çizelgeleri üzerinde arama ve görselleştirme sağlar ve protobuf mesajlarını tutarlı bir şekilde sunar. İzleri Winscope'ta analiz etmek, hatanın oluştuğu katmanı, çerçeveyi ve durumunu tam olarak tanımlamanıza yardımcı olur.

Winscope'u kullanma

İzleri yakaladığınızda, Winscope'ta izleri analiz edin:

  1. Sağdaki paneli kullanarak kayıtlı izlerinizi yükleyin. Yüklenen izleri kaldırabilir veya daha fazla iz yükleyebilirsiniz.

    yükleme_izleri_winscope

    Şekil 6. İzleri Winscope'a yükleyin.

  2. Yüklenen izleri görselleştirmek için İzlemeleri görüntüle'yi tıklayın. Her izine ait sekmeler, pencerenin üst panelinde görünür. Yüklenen dosya ilgili izleri içeriyorsa ekran kaydı izinin kayan bir görünümü ekrana yerleştirilir.

    view_traces_winscope

    7.Şekil Winscope'ta izleri görüntüleyin.

    Yüklediğiniz düzenle_adıizlemeyi yeniden adlandırmak ve indirmekindirme_izleme veya yeni bir iz yüklemek için pencerenin en üst panelindeki kullanıcı arayüzünü kullanın.

  3. Pencerenin alt panelindeki zaman kaydırma aracını kullanarak zaman içindeki izlerde gezinin. Zaman içinde gezinmek için Şekil 8'de gösterilen aşağıdaki özellikleri kullanın:

    • Belirli bir zamana veya tekrara gitmek için imleci (zaman kaydırma çubuğu) ya da zaman görüntüleme kutusundaki (sol alt köşe) sol ok_sol_zaman ve sağ ok_sağ_zaman okları veya klavyenizdeki sol ve sağ okları kullanın.
    • Zaman çizelgesinde seçili renk kodlu izleri görüntülemek için açılır menüyü (zaman kaydırma çubuğunun solunda) kullanın. Varsayılan olarak, izleme sekmeleri kullanılarak görüntülenen son üç iz zaman çizelgesinde gösterilir.
    • Yüklenen tüm izleri ayrıntılı olarak görmek için yakınlaştırma yakınlaştırma_zamanı veya uzaklaştırma yakınlaştırma_zamanı aracını (zaman kaydırma çubuğunun altında) kullanın ya da klavyenizde ekranı kaydırın. Yakınlaştırma düzeyini sıfırlamak için sıfırla düğmesini kullanın.
    • İz dağılımının zaman içindeki genişletilmiş görünümü için yukarı oku arrow_up_time (sağ alt köşe) tıklayın.

    time_nav_winscope

    8. Şekil. Winscope'ta zamanda gezinme.

    Genişletilmiş görünümde (Şekil 9), daha iyi inceleme için belirli zaman aralıklarını seçip yakınlaştırın:

    expand_time_winscope

    9. Şekil. Winscope'ta genişletilmiş zaman çizelgesi.

  4. İzleri incelemek için ekran kaydıyla cihaz durumunu görüntüleyebilirsiniz. Belirli bir izlemeyi incelemek için aracın üst panelindeki ilgili izleme sekmesini tıklayın.

    • Surface Flinger izlemesi için üç panelde, belirli bir dönemde izlemenin farklı görünümleri gösterilir (Şekil 10'da gösterildiği gibi): sf_izleme

      Şekil 10. Winscope'ta Surface Flinger izleme.

      • Katmanlar görünümü: Dikdörtgen yer paylaşımları hâlinde katmanların 3D görünümü. Aşağıdaki kullanıcı arayüzü öğeleri, dikdörtgenleri konum, boyut, dönüşüm ve z sıralamalarına göre grafik öğeleri oluşturacak şekilde ayarlar:

        • Döndürme kaydırma çubuğu (Katmanlar görünümünün sol üst kısmında), katmanlı dikdörtgenleri seçilen açılarda görüntülemek için döndürür.
        • Boşluk kaydırma çubuğu (Katmanlar görünümünün sağ üst kısmı), seçilen birleşik görünümü oluşturmak için katmanlar arasındaki boşluğu ayarlar.
        • Yakınlaştırma araçları (Katmanlar görünümünün sağ üst kısmında), daha iyi inceleme için katmanları yakınlaştırır yakınlaştırma_zamanı ve yakınlaştırma_zamanı uzaklaştırır.
        • Sıfırlama düğmesi Sf_sıfırla (Katmanlar görünümünün sağ üst kısmındadır), kamera ayarlarını orijinal görünüme geri yükler.
        • Daha iyi yakınlaştırma için dikdörtgenleri sürükleyin.
      • Hiyerarşi görünümü: Katmanların tam hiyerarşisi.

        • Yalnızca görünür (Hiyerarşi görünümünün sağ üst kısmı) seçildiğinde, ekrandaki öğeleri görselleştirmeye yardımcı olmak için görünmez katmanları hiyerarşiden gizler.
        • Düz (Hiyerarşi görünümünün sağ üst kısmında), seçildiğinde hiyerarşiyi düzleştirilmiş bir katman listesi olarak gösterir.
        • Farkı göster (Hiyerarşi görünümünün sol üst kısmı) yalnızca durum geçişi olduğunda seçilir. Seçildiğinde, araç mevcut durumu önceki durumla karşılaştırır. Yeni bir öğe yeşil, silinen bir öğe kırmızı renkle ve değiştirilmiş bir öğe mavi renkle vurgulanır.
      • Özellikler görünümü: Seçilen katmanın özellikleri. Özellikler görünümünün üst paneli yalnızca Görünürlük, Geometri ve Arabellek gibi temel özellikler hakkında bilgiler içerir. Özellikler görünümünün alt paneli, tüm özelliklerin bir Proto Dökümü'nü içerir.

        • Fark göster onay kutusu (Özellikler görünümünün sol üst kısmı), Hiyerarşi görünümünde olduğu gibi çalışır.
        • Varsayılanları göster (Özellikler görünümünün sol üst kısmı) seçildiğinde, Proto Dump'ta varsayılan proto değerleri gösterilir. Varsayılan olarak bu değerler Proto Dökümü'nde listelenmez. Varsayılan proto değerleri, proto alan tanımından alınır. Bir proto alanında boş olmayan bir varsayılan değer ayarlanmamışsa gösterilen varsayılan proto değerleri şu şekilde olur:
          • Dize: Boş
          • Sayılar: 0
          • Boole değerleri: Yanlış
          • Nesneler: Boş

      Üç görünüm ve ekran kaydı arasındaki seçim senkronize edilir. Başka bir deyişle, farklı bir zamana gittiğinizde tüm izler eşzamanlı olarak güncellenir. Bir katmanın özelliklerini görmek için katmanı Hiyerarşi görünümünde tıklayarak veya Özellikler görünümünde ilgili dikdörtgeni tıklayarak seçin. Mor dikdörtgen, bu katmana bir görüntüleme izinin eklendiğini gösterir. Mor bir katmanı çift tıkladığınızda kullanıcı arayüzü, ilgili görünüm izleme sekmesine geçiş yapar.

    • Window Manager izi için üç panel, Şekil 11'de gösterildiği gibi belirli bir dönemdeki izin farklı görünümlerini gösterir:

      • Pencere görünümü: Katmanların 3D görünümü.
      • Hiyerarşi görünümü: Katmanların tam hiyerarşisi.
      • Mülkler görünümü, tüm mülklerin Proto Dump'ını içerir.

      Üç görünüm ve ekran kaydı arasındaki seçim senkronize edilir. Başka bir deyişle, farklı bir zamana gittiğinizde tüm izler eşzamanlı olarak güncellenir.

      wm_izleme

      Şekil 11. Winscope'ta Windows Manager izlemesi.

    • İşlemler izleri için Yüzey Flinger ve Pencere Yöneticisi arasındaki işlemler, proto dökümünü gösteren bir mülk görünümü ile birlikte görüntülenen kimlikler, tür ve metin ile aranabilir tablo biçiminde sunulur. İki görünüm ve ekran kaydı arasındaki seçim senkronize edilir:

      transaction_trace

      Şekil 12. Winscope'ta işlem takibi.

    • ProtoLog izlemeleri için bilgiler, etiketlere, kaynak dosyalara ve metne göre aranabilir bir tablo biçiminde sunulur:

      protolog_izleme

      Şekil 13. Winscope'ta ProtoLog izleme.

    • Geçişler izlemeleri için, seçilen geçişin özellikleriyle birlikte kimlik, tür, gönderme zamanı, süre ve durumu içeren geçişlerin listesi gösterilir:

      transitions_trace

      Şekil 14. Winscope'ta geçiş izleme.