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. Winscope kullanıcı arayüzünü izleme dosyasıyla kullanarak, geçişleri yeniden oynatarak, adım adım ilerleyerek ve hata ayıklama yaparak her animasyon karesi için bu hizmetlerin durumunu ekran kaydı ile veya ekran kaydı olmadan inceleyebilirsiniz.

Desteklenen izler

Winscope, çeşitli izleri veya sistem hizmeti durumlarının sıralarını toplayıp görsel olarak temsil etme olanağı sunar. Bu izlemeleri, düşük yükü yüksek ayrıntı düzeyine kadar belirli kullanım alanlarına uyacak şekilde yapılandırabilirsiniz. Winscope aşağıdaki izlemeleri destekler:

  • EventLog: EventLog kullanarak sistem teşhis etkinliği 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) ardışık düzenindeki etkinlikleri izler.
  • Giriş: Giriş etkinliği ardışık düzeninin çeşitli bölümlerinden giriş etkinliklerini izleyin.
  • ProtoLog: Sistem hizmetlerinden ve istemci işlemlerinde çalışan sistem hizmetlerinin kodundan ProtoLog mesajları toplayın.
  • Ekran kaydı: İzlerle birlikte ekran kaydı alın.
  • Kabuk geçişleri: Pencere ve etkinlik geçişi sistem ayrıntılarını kaydedin.
  • SurfaceFlinger: Yüzeylerle (katmanlar) ilgili konum, arabellek ve kompozisyon gibi bilgileri içeren SurfaceFlinger izlerini toplayın.
  • İşlemler: Bileşim için SurfaceControl kullanarak SurfaceFlinger tarafından alınan atomik değişiklikler grubunu izleyin.
  • ViewCapture: Sistem pencerelerindeki tüm görünümlerin (ör. sistem kullanıcı arayüzü ve başlatıcı) ViewCapture'ı destekleyen çeşitli özelliklerini yakalar.
  • Pencere Yöneticisi: Giriş ve odak etkinlikleri, ekran yönü, geçişler, animasyonlar, konumlandırma ve dönüşümler dahil olmak üzere pencerelerle ilgili ayrıntılar içeren Pencere Yöneticisi durumlarını izler.

Desteklenen dökümü

Winscope, kullanıcı tarafından tanımlanan belirli anlarda cihazın durumunun anlık görüntüleri olan durum dökümlerini toplayabilir ve görüntüleyebilir. Cihaz kullanımı sırasında sürekli olarak toplanan ve performansı etkileyebilen izlemelerin aksine, dökümler yalnızca kullanıcı tarafından tanımlanan bu anlarda alınır. Böylece performans ve ayrıntı düzeyinden ödün verilmez. Bu sayede, cihazın belirli zamanlardaki durumunu daha odaklanmış ve verimli bir şekilde analiz edebilirsiniz. Winscope aşağıdaki dökümleri destekler:

  • Pencere Yöneticisi: Tek bir Pencere Yöneticisi durumunu dökümü.
  • SurfaceFlinger: Tek bir SurfaceFlinger anlık görüntüsünü dökümü.
  • Ekran görüntüsü: Dökümlerin yanı sıra bir ekran görüntüsü toplayın.

Kaynaklar

Winscope'u oluşturma ve çalıştırma hakkında bilgi edinmek için Winscope'u çalıştırma başlıklı makaleyi inceleyin.

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

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

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

Örnekler

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

Titreşim testi hatası

Bu örnekte, Winscope'un titreşim testi hatasıyla ilgili hata ayıklama işleminde nasıl kullanılacağı gösterilmektedir.

Test hatasını inceleyin

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

  1. Testi 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 uygulamanın kilit ekranı bildiriminden (OpenAppFromLockscreenNotificationColdTest) başlatılmasını ifade eder.

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

  2. Aşağıdakiler de dahil olmak üzere hatayla ilgili kapsamlı bilgi sağlayan test hatası mesajını inceleyin:

    • Beklenen sonuç ile gerçekte görünen sonuç arasındaki karşılaştırma
    • Hatanın ne zaman gerçekleştiğini belirlemenize yardımcı olacak zaman damgaları
    • Hatayla ilişkili yapının veya dosyanın adı
    • Hatayı anlama ve hata ayıklamayla ilgili ek bağlam bilgileri
    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 gösterilmektedir:

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

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

    • Hata ayıklamayla ilgili izleme bilgilerini içeren yapı 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çili olarak açılır:

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

    Şekil 1. SurfaceFlinger görünümüne sahip Winscope açılış sayfası.

  2. İstisna mesajındaki zaman damgasını kopyalayıp zaman damgası alanına yapıştırarak sorunun oluştuğu zaman damgasına gidin. Zaman damgasını kullanıcı tarafından okunabilir biçimde (2024-05-10T11:04:14.227572545) kopyalayıp ilk alana veya 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 ve hem uygulama hem de başlangıç ekranı yüzeyleri görünür. Bu yüzeyler, 3D görünümdeki yeşil dikdörtgenler ve hiyerarşi öğelerindeki V çipi ile gösterilir.

    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 siyah olduğunda uygulamanın başlatılmakta olduğunu ve başlangıç ekranı hâlâ görünür olduğu için bu etkinliğin uygulama başlatılırken gerçekleştiğini gösterir:

    Uygulama başlatıldığında

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

  4. Titremenin gerçekleştiği sonraki kareye geri gitmek için sağ ok tuşuna basın. Dikdörtgen görünümünde, ekranda uygulama yerine NotificationShade gösterilir. Bu çerçevede aşağıdaki yüzeyler gösterilir:

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

      Titreşim etkinliği

      Şekil 4. Titreşim 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 seçeneğinin işaretini kaldırın. Ardından mülkler görünümünü inceleyin.

    Uygulama yüzeyi adı:

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

    Uygulama özellikleri

    Şekil 5. Uygulama mülkleri.

    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. Bu durum, kompozisyon sırasında nesnenin önüne opak bir yüzey yerleştirildiği için ortaya çıkar. Bu varsayım, NotificationShade dikdörtgeninin 3D görünümde NotificationActivity dikdörtgeninin önünde olmasından ve görünür (yeşil) NotificationShade'ün seçili katman olmasından kaynaklanmaktadır.

  6. Bu hipotezi doğrulamak için mevcut karedeki görünür 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, önceki kareye (titremeden önce) geri gitmek için sol ok tuşuna basın ve NotificationShade yüzeyinin özelliklerini tekrar inceleyin. Yüzeyin OPAQUE yerine yalnızca ENABLE_BACKPRESSURE (0x100) işaretine sahip olduğunu fark edin. Bu, uygulama lansmanı tamamen tamamlanmadan önce NotificationShade'ün opak hale geldiğini doğrular. NotificationShade, NotificationActivity önünde olduğu için uygulama gösterilmez. NotificationShade siyah olduğu için ekran kısa süreliğine kararıyor ve bu da titremeye neden oluyor.

  7. Kodda, NotificationShade'ün neden çok erken opak hale geldiğini belirleyin.

Kullanıcı tarafından bildirilen hata

Kullanıcı 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 titreşim testi hatalarının aksine, kullanıcı tarafından bildirilen hatalar genellikle yalnızca sorunun kısa bir açıklamasını içerir.

Örnek olayımızda, sağlanan tek bilgi Uygulama bölünmüş ekrandan yeniden açıldığında ekran titredi başlığı ve 18 Nisan 2024 15:51 (GMT-04:00) olan yaklaşık zaman damgası.

Kullanıcı tarafından bildirilen bir hatada hata ayıklama yapmak için aşağıdaki adımları uygulayın:

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

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

    Şekil 6. SurfaceFlinger görünümüne sahip Winscope açılış sayfası.

  2. Kullanıcı tarafından bildirilen yaklaşık zaman damgasına (bu örnekte 3:50 PM GMT-04:00) gitmek için okunabilir zaman damgası alanına 15:50:00 yazın.

    Zaman damgası iletişim kutusu

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

  3. Ekranda nelerin çizildiğini belirlemek için dikdörtgen görünümünü kullanın. Daha iyi bir görünüm için dikdörtgenlerin perspektifini değiştirmek üzere Rotasyon kaydırma çubuğunu kullanın. Hiyerarşi görünümünde Yalnızca V göster ve Düz seçeneklerini işaretleyerek duvar kağıdı, ekran dekoru yer paylaşımı, posta kutusu, başlatıcı, kişiler ve numara çevirici yüzeyleri görünür hale getirebilirsiniz.

    Paket adları şunlardır:

    • 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

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

    Görünen yüzeylere (yeşil dikdörtgenler) ek olarak, ekran alanı yüzeyini temsil eden Bilinmeyen ekran adlı 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. Kullanıcı tarafından görülemediği ve titreyen animasyon olarak raporlanmadığı için analiz için yer paylaşımını kaldırırız.

    Kullanıcı raporu

    Şekil 8. Kullanıcı raporu.

  4. Bölünmüş ekran görünümünde hangi yüzeylerin yer aldığını belirledikten sonra, çeşitli kullanıcı işlemlerini adım adım takip etmek ve titremeyi bulmak için Geçişler izlemesini kullanın. Oynatılan geçişlerin listesini görselleştirmek için Winscope'ta Geçişler sekmesini tıklayın:

    geçişler

    Şekil 9. Geçişler.

    Bu karede oynatılan geçiş mavi renkle vurgulanır. Bu durumda, geçiş işaretleri TRANSIT_FLAG_IS_RECENTS içerir. Bu, kullanıcının son aramalar ekranına girdiğini gösterir.

  5. Gönderim Zamanı sütunundaki bağlantıyı (bu durumda 2024-04-18, 15:50:57.205) tıklayarak ilgili zaman noktasına gidin ve Surface Flinger sekmesindeki dikdörtgenleri doğrulayın. Sağ ok tuşuyla geçişi adım adım takip ederek ve dikdörtgenleri gözlemleyerek geçiş sırasında cihazın durumunun doğru olduğunu onaylayın.

    Başlatıcı 15:50:57.278'de görünür ancak animasyon o zaman başlamaz. Bölünmüş ekran uygulamaları (bölüm) arasında hiçbir şey çizilmediği için duvar kağıdı zaten görünür durumdadır. Bir kare önce (15:50:57.212), duvar kağıdı görünmez ve bölücü gösterilir. Animasyon olmadığında bölünmüş ekranın görünümü budur.

    Titremeden önceki ekran

    Şekil 10. Titreşim etkinliğinden önceki ekran.

  6. Sonraki geçişi kontrol etmek 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

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

    Sonraki geçişin başlangıç konumundaki SurfaceFlinger satırını tıklayın. Şekil 11'de imlecin dikey konumu ince mavi çizgiyle gösterilmiştir. SurfaceFlinger satırının açık mavi arka planı, yatay konumunu gösterir. Titreşim olup olmadığını görmek için sağ ok tuşuyla geçişi adım adım izleyin. Cihazın bu geçiş için doğru göründüğünden emin olun.

  7. Süresi çok kısa olduğu için titreşim içerme olasılığı düşük olan bir sonraki geçişi atlayın. Bunun yerine, aşağıdaki resimde imlecin gösterdiği gibi, SurfaceFlinger satırındaki zaman çizelgesinde bir sonraki daha uzun geçişin başlangıç konumunu 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, hem uygulamalar hem de kişiler ve numara ç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 belirtin. Daha sonra bu çerçeveye geri dönmek 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 ekleyin.

  9. Zaman çizelgesini doğrudan tıklayarak geçişin sonundaki bir kareye gidin (ör. 15:51:13.859). Burada iki uygulama artık nihai konumlarındadır. Sol tarafta numara çevirici, sağ tarafta ise kişiler yer alır:

    final split screen

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

  10. Titreyen karenin bulunduğu zaman çizelgesindeki yer işaretinin bayrağını tıklayarak bu kareye geri dönebilirsiniz.

    yer işareti zaman çizelgesi

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

    Her iki uygulama da sağ taraftadır. Bu, çeviricinin yanlış konumda olduğunu gösterir.

  11. Özelliklerini görüntülemek için çeviricinin açılış ekranını tıklayın. Özel olarak, özelleştirilmiş Özellikler görünümünde dönüşüm özelliklerine bakın.

    Dönüşüm özellikleri

    Şekil 17. Mülkleri dönüştürün.

    Hesaplanan dönüştürme işlemi bu yüzeye uygulanır ancak bu düzey olarak ayarlanmaz. Hesaplanan ve istenen sütunların farklı değerleri vardır. Bu, dönüştürmenin bir üst yüzeyden 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 Hesaplanmış hem de İstenen dönüştürme aynı olana kadar uygulama yüzeyinin üst düğümlerine gidin. Bu, dönüştürmenin Surface(name=Task=7934)/@0x1941191_transition-leash#40670 yüzeyinde istendiğini gösterir.

  13. Dönüşümün ilk ne zaman ve hangi değere ayarlandığını onaylayın. Başlığın yanındaki simgeyi tıklayarak seçili mülkleri daraltın:

    Seçilen özellikleri daraltma

    Şekil 18. Seçilen mülkleri 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. Mülkleri filtrelemek için metin arama alanına transform yazın:

    fark göster

    Şekil 19. Farkları göster.

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

    Bu bilgiler, titreşimin, dönüştürme işlemi, çevirici bölünmüş ekran uygulamasının animasyon tasmasına uygulandığında gerçekleştiğini gösterir.

    Titremenin tanımlanması

    Şekil 20. Titremenin tanımlanması.

  15. Kodda, bu dönüştürmenin neden bölünmüş ekran geçiş tasmasına ayarlandığını belirleyin.