Winscope'u kullanarak pencere geçişlerini izleme

Winscope, kullanıcıların animasyonlar ve geçişler sırasında ve sonrasında çeşitli sistem hizmetlerinin durumlarını kaydetmesine, yeniden 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. İzleme dosyasıyla birlikte Winscope UI'yı kullanarak geçişleri yeniden oynatarak, adım adım ilerleyerek ve hatalarını ayıklayarak bu hizmetlerin durumunu her animasyon karesi için ekran kaydıyla veya ekran kaydı olmadan inceleyebilirsiniz.

Desteklenen izler

Winscope, çeşitli izleri veya sistem hizmeti durumlarının sıralarını toplama ve görsel olarak temsil etme olanağı sağlar. Bu izleri, düşük ek yükten yüksek ayrıntı düzeyine kadar değişen belirli kullanım alanlarına uyacak şekilde yapılandırabilirsiniz. Aşağıdaki izler Winscope tarafından desteklenir:

  • EventLog: EventLog kullanarak sistem teşhis olay kaydını toplayın. Winscope'ta bu bilgiler yalnızca CUJ işaretlerini tanımlamak ve görüntülemek için kullanılır.
  • IME: IMS, IMMS ve IME istemcisi dahil olmak üzere Giriş Yöntemi Düzenleyici (IME) işlem hattındaki etkinlikleri izleyin.
  • Giriş: Giriş etkinliği işlem hattının çeşitli bölümlerindeki giriş etkinliklerini izleyin.
  • ProtoLog: Sistem hizmetlerinden ve istemci süreçlerinde çalışan sistem hizmetlerinin kodundan ProtoLog mesajlarını toplayın.
  • Ekran kaydı: İzlerle birlikte ekran kaydı toplayın.
  • Kabuk geçişleri: Pencere ve etkinlik geçişi sistem ayrıntılarını kaydeder.
  • SurfaceFlinger: Konum, arabellek ve kompozisyon gibi yüzeylerle (katmanlar) ilgili bilgileri içeren SurfaceFlinger izlerini toplayın.
  • İşlemler: Birleştirme için SurfaceControl kullanarak SurfaceFlinger tarafından alınan atomik değişiklikler kümesini izleyin.
  • ViewCapture: Sistem kullanıcı arayüzü ve başlatıcı gibi ViewCapture'ı destekleyen sistem Windows'daki tüm görünümlerin bir dizi özelliğini yakalayın.
  • Pencere Yöneticisi: Giriş ve odak etkinlikleri, ekran yönü, geçişler, animasyonlar, konumlandırma ve dönüştürmeler dahil olmak üzere pencerelerle ilgili ayrıntıları içeren Pencere Yöneticisi durumlarını izleyin.

Desteklenen dökümler

Winscope, kullanıcının tanımladığı belirli anlarda alınan cihaz durumunun anlık görüntüleri olan durum dökümlerini toplayıp görüntüleyebilir. Cihaz kullanımı sırasında sürekli olarak toplanan ve performansı etkileyebilen izlerin aksine, dökümler yalnızca kullanıcı tarafından tanımlanan bu anlarda alınır. Böylece performans ve ayrıntı düzeyinin etkilenmemesi sağlanır. Bu sayede, cihazın belirli zamanlardaki durumu daha odaklı ve verimli bir şekilde analiz edilebilir. Winscope tarafından desteklenen dökümler:

  • Pencere Yöneticisi: Tek bir Pencere Yöneticisi durumunu boşaltır.
  • SurfaceFlinger: Tek bir SurfaceFlinger anlık görüntüsünü boşaltır.
  • Ekran görüntüsü: Dökümlerle birlikte ekran görüntüsü alın.

Kaynaklar

Winscope'u oluşturma ve çalıştırma hakkında bilgi için Run Winscope (Winscope'u Çalıştırma) başlıklı makaleye bakın.

İzleri toplama hakkında bilgi için İzleri yakalama başlıklı makaleyi inceleyin.

Winscope web kullanıcı arayüzünü kullanarak izleri yükleme hakkında bilgi için İzleri yükleme bölümüne bakın.

İzleri analiz etme hakkında bilgi için İzleri analiz etme başlıklı makaleyi inceleyin.

Örnekler

Aşağıdaki örneklerde, titreme testi hatasının ve kullanıcı tarafından bildirilen bir hatanın nasıl ayıklanacağı açıklanmaktadır.

Titreşim testi hatası

Bu örnekte, titreme testi hatasını ayıklamak için Winscope'un nasıl kullanılacağı gösterilmektedir.

Test hatasını inceleme

Sorun türünü belirlemek ve test hatası mesajını incelemek için aşağıdaki adımları uygulayın.

  1. Test ve sınıf adını inceleyerek sorun türünü belirleyin.

    Test ve sınıf adı:

    FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
    

    Sorun türü:

    • CUJ, bir uygulamayı kilit ekranı bildiriminden başlatmayı ifade eder (OpenAppFromLockscreenNotificationColdTest).

    • Test, uygulamanın görünür olmasını (#appLayerBecomesVisible) bekler.

  2. Test hatası mesajını inceleyin. Bu mesajda, hata hakkında kapsamlı bilgiler yer alır. Örneğin:

    • Beklenen sonuç ile gerçekte görünen sonuç arasındaki karşılaştırma
    • Hatayı tam olarak ne zaman oluştuğunu belirlemeye yardımcı olan zaman damgaları
    • Hatayla ilişkili yapının veya dosyanın adı
    • Hatayı anlamak ve hata ayıklamak için gerekli ek bağlamsal bilgiler
    android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visible
    
    Where?
        Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns)
    
    What?
        Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#
        Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty]
    
    Other information
        Artifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zip
    
    Check the test run artifacts for trace files
    
        at android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150)
        at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32)
        at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42)
        at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79)
        at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43)
        at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33)
        at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35)
        at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29)
        at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36)
        at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59)
        at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89)
        at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51)
        at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)
    

    Bu çıkış örneğinde şunlar belirtilmektedir:

    • Sorun 2024-05-10T11:04:14.227572545 tarihinde ortaya çıkıyor.

    • NotificationActivity görünür olması bekleniyor ancak görünmüyor.

    • Hata ayıklama için izleri içeren yapıt dosyasının adı FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.

Hata ayıkla

Titremenin nedenini belirlemek için aşağıdaki adımları uygulayın:

  1. İzleme dosyalarını indirip Winscope'a yükleyin. Winscope, SurfaceFlinger otomatik olarak seçilmiş şekilde açılır:

    SurfaceFlinger görünümü içeren Winscope açılış sayfası

    1. şekil. SurfaceFlinger görünümü içeren Winscope açılış sayfası.

  2. Hata mesajındaki zaman damgasını kopyalayıp zaman damgası alanına yapıştırarak sorunun yaşandığı zaman damgasına gidin. İsterseniz zaman damgasını okunabilir biçimde (2024-05-10T11:04:14.227572545) kopyalayıp ilk alana yapıştırabilir veya zaman damgasını nanosaniye cinsinden (1715339054227572545ns) kopyalayıp ikinci alana yapıştırabilirsiniz.

    Zaman damgası iletişim kutusu

    Şekil 2. Zaman damgası iletişim kutusu.

  3. Önceki kareye gitmek için sol ok tuşuna basın. Bu durumda, NotificationActivity uygulaması videoda doğru şekilde gösterilir. Hem uygulama hem de başlangıç ekranı yüzeyleri görünür. Bu durum, 3D görünümdeki yeşil dikdörtgenler ve hiyerarşi öğelerindeki V çipiyle belirtilir.

    Uygulama ve açılış ekranı yüzey adları şunlardır:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    
    Splash Screen com.android.server.wm.flicker.testapp#3453
    

    Bu, ekran karardığında uygulamanın başlatılmakta olduğunu ve başlangıç ekranı hâlâ görünür olduğundan bu olayın uygulama başlatılırken gerçekleştiğini gösterir:

    Uygulama başlatıldığında

    3.Şekil Uygulama başlatıldığında.

  4. Titremenin meydana geldiği bir sonraki kareye geri dönmek için sağ ok tuşuna basın. Dikdörtgenler görünümünde, uygulama yerine NotificationShade ekranda gösterilir. Bu karede aşağıdaki yüzeyler gösterilir:

    • Ekran dekoru yer paylaşımları (üst ve alt)
    • Gezinme çubuğu
    • İşaretçi konumu (ekran kaydından)

      Alev Ampul etkinliği

      Şekil 4. Titreme etkinliği.

  5. Hiyerarşi görünümünde uygulama etkinliğini seçin. Bu seçeneği bulamıyorsanız Yalnızca V'yi göster'i devre dışı bırakın. Ardından, özellikler görünümünü inceleyin.

    Uygulama yüzeyinin adı:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    

    Uygulama özellikleri

    5.şekil Uygulama özellikleri.

    Uygulama etkinliği görünür ve opak olarak ayarlanmış olsa da Invisible due to: null visible region hatası nedeniyle yüzey gösterilmiyor. Bunun nedeni, kompozisyon sırasında önünde başka bir opak yüzeyin yerleştirilmiş olmasıdır. Bu hipotez, 3D görünümde NotificationShade dikdörtgeninin NotificationActivity dikdörtgeninin önünde olmasından ve görünür (yeşil) NotificationShade dikdörtgeninin seçilen katman olmasından kaynaklanmaktadır.

  6. Bu hipotezi doğrulamak için geçerli karede görünen NotificationShade yüzeyi seçin ve özelliklerini kontrol edin. İşaretler OPAQUE|ENABLE_BACKPRESSURE (0x102) olarak ayarlanır. NotificationShade yüzeyinin adı NotificationShade#3447. Ardından, sol oku kullanarak önceki kareye (titremeden önce) geri dönün ve NotificationShade yüzeyinin özelliklerini tekrar inceleyin. Yüzeyin OPAQUE yerine yalnızca ENABLE_BACKPRESSURE (0x100) işaretine sahip olduğunu unutmayın. Bu, NotificationShade'nın uygulama başlatılmadan önce tamamen opak hale geldiğini doğrular. NotificationShade, NotificationActivity öğesinin önünde olduğundan uygulama gösterilmez. NotificationShade siyah olduğundan ekran kısa süreliğine kararır ve bu da titremeye neden olur.

  7. Kodda NotificationShade öğesinin neden çok erken opak hale geldiğini belirleyin.

Kullanıcı tarafından bildirilen hata

Kullanıcılar tarafından bildirilen hatalar genellikle ayrıntılı bilgi içermediğinden hata ayıklama işlemi zor olabilir. Belirli zaman damgaları, öğe ayrıntıları ve ekran kayıtları sağlayan titreme testi hatalarının aksine, kullanıcı tarafından bildirilen hatalar genellikle yalnızca sorunun kısa bir açıklamasını içerir.

Vaka çalışmamızda, sağlanan tek bilgi Uygulama bölünmüş ekrandan yeniden açıldığında ekran titredi başlığı ve yaklaşık zaman damgasıdır: 18 Nisan 2024 15:51 GMT-04:00.

Kullanıcı tarafından bildirilen bir hatayı ayıklamak için aşağıdaki adımları uygulayın:

  1. İzleme dosyasını Winscope'a yükleyin. Winscope, SurfaceFlinger otomatik olarak seçilmiş şekilde açılır.

    SurfaceFlinger görünümü içeren Winscope açılış sayfası

    6.şekil SurfaceFlinger görünümü içeren Winscope açılış sayfası.

  2. Okunabilir zaman damgası alanına 15:50:00 girerek kullanıcının bildirdiği yaklaşık zaman damgasına (bu örnekte 3:50 PM GMT-04:00) gidin.

    Zaman damgası iletişim kutusu

    Şekil 7. Zaman damgası iletişim kutusu.

  3. Ekranda ne çizildiğini belirlemek için dikdörtgenler görünümünü kullanın. Daha iyi bir görünüm için Döndürme kaydırma çubuğunu kullanarak dikdörtgenlerin perspektifini değiştirin. Hiyerarşi görünümünde Yalnızca V'yi göster ve Düz'ü işaretleyerek duvar kağıdı, ekran dekoru katmanı, letterbox, başlatıcı, kişiler ve çevirici yüzeyleri görünür hale gelir.

    Paket adları:

    • Başlatıcı: com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602

    • Kişiler: com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565

    • Çevirici: com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    Görünür yüzeylere (yeşil dikdörtgenler) ek olarak, ekran alanı yüzeyini temsil eden ve Bilinmeyen ekran olarak adlandırılan gri bir dikdörtgen gösterilir. Görünürlüğü artırmak için ScreenDecorHwcOverlay#64 yüzeyinin yanındaki (görünürlük simgesi) simgesini tıklayarak ilgili dikdörtgeni gizleyin ve arkasındaki yüzeyleri gösterin. Analiz için kullanılan yer paylaşımı, kullanıcı tarafından görünmediği ve titreyen animasyon olarak bildirilmediği için kaldırılır.

    Kullanıcı raporu

    Şekil 8. Kullanıcı raporu

  4. Bölünmüş ekran görünümüne dahil olan yüzeyleri belirledikten sonra, çeşitli kullanıcı işlemlerini adım adım incelemek ve titremeyi bulmak için Geçişler izini kullanın. Oynatılan geçişlerin listesini görselleştirmek için Winscope'taki Geçişler sekmesini tıklayın:

    geçişler

    Şekil 9. Geçişler.

    Bu kare sırasında oynatılan geçiş mavi renkle vurgulanır. Bu durumda, geçiş işaretleri arasında kullanıcının son kullanılanlar ekranına girdiğini belirten TRANSIT_FLAG_IS_RECENTS işareti yer alır.

  5. O ana gitmek ve Surface Flinger sekmesindeki dikdörtgenleri doğrulamak için Gönderme Zamanı sütunundaki bağlantıyı (bu örnekte 2024-04-18, 15:50:57.205) tıklayın. Geçişi doğru ok tuşuyla adım adım ilerleyerek ve dikdörtgenleri gözlemleyerek geçiş sırasında cihazın durumunun doğruluğunu onaylayın.

    Başlatıcı 15:50:57.278'de görünür ancak animasyon bu noktada başlamaz. Bölünmüş ekran uygulamaları arasında hiçbir şey çizilmediği için (ayırıcı) duvar kağıdı zaten görünür durumda. Bir kare önce (15:50:57.212) duvar kağıdı görünmüyor ve bölücü gösteriliyor. Bu, bölünmüş ekranın animasyon yapılmadığında nasıl göründüğünü gösteriyor.

    Titremeden önceki ekran

    10.şekil Titreme olayından önceki ekran.

  6. Sonraki geçişi incelemek için doğrudan zaman çizelgesini tıklayın. SurfaceFlinger durumları, açık mavi bloklardan oluşan bir satırla gösterilir. Geçişler, pembe bloklardan oluşan bir satırla gösterilir.

    İlk geçişin sonu

    11.Şekil İlk geçişin sonu.

    Bir sonraki geçişin başlangıç konumundaki SurfaceFlinger satırını tıklayın. Şekil 11'de imlecin dikey konumu ince mavi çizgiyle gösterilir. SurfaceFlinger satırının açık mavi arka planı, yatay konumunu gösterir. Titreşme olup olmadığını görmek için geçişi sağ ok tuşuyla adım adım inceleyin. Cihazın bu geçiş için doğru göründüğünü onaylayın.

  7. Süresi çok kısa olduğu için bir sonraki geçişi atlayın. Bu geçişte titreme olması olası değildir. Bunun yerine, aşağıdaki resimde imleçle gösterildiği gibi, SurfaceFlinger satırındaki zaman çizelgesini bir sonraki daha uzun geçişin başlangıç konumunda tıklayın.

    ikinci geçişin sonu

    Şekil 12. İkinci geçişin sonu.

    Bu geçiş sırasında 15:51:13.239 konumunda, her iki uygulama, kişiler ve çevirici için Splash Screen katmanlarının ekranın aynı tarafında olduğunu gözlemleyin:

    başlangıç ekranları

    Şekil 13. Başlangıç ekranları

  8. Hangi uygulamanın yanlış tarafta olduğunu netleştirin. Daha sonra bu kareye geri dönmenize yardımcı olması için ns giriş alanının yanındaki bayrak simgesini tıklayarak mevcut konumunuza yer işareti ekleyin.

    Yer işareti ekleme

    Şekil 14. Yer işareti ekle'yi tıklayın.

  9. Zaman çizelgesini doğrudan tıklayarak geçişin sonundaki bir kareye gidin (örneğin, 15:51:13.859). Burada iki uygulama, son konumlarında gösteriliyor. Telefon uygulaması solda, kişiler uygulaması ise sağda yer alıyor:

    son bölünmüş ekran

    15.şekil Son bölünmüş ekran.

  10. Zaman çizelgesinde yer işaretinin işaretini tıklayarak titremenin olduğu kareye geri dönün.

    yer işareti zaman çizelgesi

    16. şekil. Zaman çizelgesine yer işareti ekleme

    Her iki uygulama da sağ tarafta yer alıyor. Bu durum, çeviricinin yanlış konumda olduğunu gösterir.

  11. Çeviricinin özelliklerini görüntülemek için çeviricinin başlangıç ekranını tıklayın. Özellikle, seçilmiş Özellikler görünümündeki dönüştürme özelliklerine bakın.

    Dönüştürme özellikleri

    17. şekil. Dönüştürme özellikleri.

    Hesaplanan dönüşüm bu yüzeye uygulanır ancak bu düzey olarak ayarlanmaz. Hesaplanan ve istenen sütunların farklı değerlere sahip olması, dönüşümün bir üst öğeden devralındığını gösterir.

  12. Hiyerarşi ağacının tamamını göstermek için hiyerarşi görünümünde Düz'ün seçimini kaldırın ve hem Surface(name=Task=7934)/@0x1941191_transition-leash#40670 yüzeyinde Hesaplanmış hem de İstenen dönüşümler aynı olana kadar uygulama yüzeyinin üst düğümlerine gidin. Bu durumda, Surface(name=Task=7934)/@0x1941191_transition-leash#40670 yüzeyinde istenen dönüşüm gösterilir.

  13. Dönüşümün ilk olarak ne zaman ve hangi değere ayarlandığını onaylayın. Seçilmiş özellikleri, başlığın yanındaki simgeyi tıklayarak daraltın:

    seçilmiş özellikleri daraltın

    18.şekil Seçilmiş özellikleri daraltın.

  14. Bu karede değiştirilen özellikleri vurgulamak için Proto Dump görünümünde Farkı göster'i seçin. Özellikleri filtrelemek için metin arama alanına transform yazın:

    farkı göster

    Şekil 19. Farkı göster.

    Dönüşüm, transition-leash için bu karede IDENTITY ile SCALE|TRANSLATE|ROT_270 arasında ayarlanır.

    Bu bilgiler, çevirici bölünmüş ekran uygulamasının animasyon tasmasına dönüştürme uygulandığında titreme oluştuğunu gösteriyor.

    Titremenin tanımlanması

    Şekil 20. Titremenin tanımlanması.

  15. Bu dönüşümün neden bölünmüş ekran geçişi olarak ayarlandığını kodda belirtin.