Winscope'u kullanarak pencere geçişlerini izleme

Winscope, animasyonlar ve geçişler sırasında ve sonrasında çeşitli sistem hizmetlerinin durumlarını kaydetmenize, yeniden oynatmanıza ve analiz etmenize olanak tanıyan bir web aracıdır. Winscope, ilgili tüm sisteme ait hizmet durumlarını bir izleme dosyasına kaydeder. Winscope kullanıcı arayüzünü izleme dosyasıyla birlikte 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 (yani sistem hizmeti durumlarının sıraları) 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. Winscope aşağıdaki izleri destekler:

  • 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 ardışık düzeninin ç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: Bileşim için SurfaceControl kullanılarak SurfaceFlinger tarafından alınan atomik değişiklikler grubunu izleyin.
  • ViewCapture: ViewCapture'ı destekleyen sistem Windows'daki tüm görünümlerin (ör. Sistem Kullanıcı Arayüzü ve Başlatıcı) çeşitli özelliklerini yakalayın.
  • Pencere Yöneticisi: İzleme Pencere Yöneticisi durumları; giriş ve odaklanma etkinlikleri, ekran yönü, geçişler, animasyonlar, konumlandırma ve dönüştürmeler dahil olmak üzere pencerelerle ilgili ayrıntıları içerir.

Desteklenen dökümler

Winscope, cihazın durumunun sizin tarafınızdan tanımlanan belirli anlarda alınan 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 bu kullanıcı tanımlı anlarda alınır. Böylece performans ve ayrıntı düzeyinin etkilenmediği doğrulanır. Bu sayede, cihazın belirli zamanlardaki durumu daha odaklı ve verimli bir şekilde analiz edilebilir. Winscope aşağıdaki dökümleri destekler:

  • 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 başlıklı makaleyi inceleyin.

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

Örnekler

Aşağıdaki örnekte, 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, Winscope'u kullanarak titreme testi hatasını ayıklama işlemi 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. Testin başarısızlığıyla ilgili kapsamlı bilgiler sağlayan test hatası mesajını inceleyin. Bu bilgiler arasında şunlar yer alır:

    • 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 hatalarını ayıklamak için gerekli 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 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ı

    Şekil 1. 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. 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 başlangıç 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 durumda olduğundan 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 meydana geldiği sonraki kareye geri gitmek için sağ ok tuşuna basın. Dikdörtgenler görünümünde, uygulamanın 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)

    Titreme 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 seçeneğinin işaretini kaldırı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

    Şekil 5. 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 oka basarak ö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ğuna dikkat edin. Bu, uygulama başlatma işlemi tamamen bitmeden önce NotificationShade öğesinin 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ı tarafından bildirilen hatalar genellikle ayrıntılı bilgi içermediğinden hata ayıklaması 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 titriyor 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ı

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

  2. İnsan tarafından 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şaretlediğinizde duvar kağıdı, ekran dekoru kaplaması, letterbox, başlatıcı, kişiler ve çevirici yüzeyleri görünür.

    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, Bilinmeyen ekran adlı ve ekran alanı yüzeyini temsil eden 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 bildirilmeyeceği için kaldırılır.

    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 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 Transitions (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 TRANSIT_FLAG_IS_RECENTS bulunur. Bu işaret, kullanıcının son kullanılanlar ekranına girdiğini gösterir.

  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 ilerleterek 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 o zaman 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

    Şekil 10. 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

    Şekil 11. İ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österilmektedir. 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. Çevirici solda, kişiler ise sağda yer alıyor:

    son bölünmüş ekran

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

  10. Titremenin olduğu kareye geri dönmek için zaman çizelgesinde yer işaretinin işaretini tıklayın.

    zaman çizelgesine yer işareti ekleme

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

    Her iki uygulama da sağda 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ünde dönüştürme özelliklerine bakın.

    Dönüştürme özellikleri

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

    Hesaplanan dönüşüm bu yüzeye uygulanır ancak bu düzeyde ayarlanmaz. Hesaplanan ve istenen sütunlar farklı değerlere sahip. Bu durum, dönüşümün bir üst yüzeyden devralındığını gösteriyor.

  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üşü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. Başlığın yanındaki simgeyi tıklayarak seçilmiş özellikleri daraltın:

    seçilmiş özellikleri daraltın

    Şekil 18. 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, dönüştürme işlemi, çevirici bölünmüş ekran uygulamasının animasyon tasmasına 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.