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.
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
).
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:
İzleme dosyalarını indirip Winscope'a yükleyin. Winscope, SurfaceFlinger otomatik olarak seçili olarak açılır:
Şekil 1. SurfaceFlinger görünümüne sahip Winscope açılış sayfası.
İ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.Şekil 2. Zaman damgası iletişim kutusu.
Ö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:
Şekil 3. Uygulama başlatıldığında.
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)
Şekil 4. Titreşim etkinliği.
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`
Ş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ümdeNotificationActivity
dikdörtgeninin önünde olmasından ve görünür (yeşil)NotificationShade
'ün seçili katman olmasından kaynaklanmaktadır.Bu hipotezi doğrulamak için mevcut karedeki görünür
NotificationShade
yüzeyi seçin ve özelliklerini kontrol edin. İşaretlerOPAQUE|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 veNotificationShade
yüzeyinin özelliklerini tekrar inceleyin. YüzeyinOPAQUE
yerine yalnızcaENABLE_BACKPRESSURE (0x100)
işaretine sahip olduğunu fark edin. Bu, uygulama lansmanı tamamen tamamlanmadan önceNotificationShade
'ü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.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:
İzleme dosyasını Winscope'a yükleyin. Winscope, SurfaceFlinger otomatik olarak seçili olarak açılır.
Şekil 6. SurfaceFlinger görünümüne sahip Winscope açılış sayfası.
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ına15:50:00
yazın.Şekil 7. Zaman damgası iletişim kutusu.
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 () 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.
Şekil 8. Kullanıcı raporu.
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:
Ş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.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.
Şekil 10. Titreşim etkinliğinden önceki ekran.
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.
Ş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.
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.
Ş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çinSplash Screen
katmanlarının ekranın aynı tarafında olduğunu gözlemleyin:Şekil 13. Başlangıç ekranları.
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.
Şekil 14. Yer işareti ekleyin.
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:Şekil 15. Son bölünmüş ekran.
Titreyen karenin bulunduğu zaman çizelgesindeki yer işaretinin bayrağını tıklayarak bu kareye geri dönebilirsiniz.
Şekil 16. Zaman çizelgesine yer işareti ekleme.
Her iki uygulama da sağ taraftadır. Bu, çeviricinin yanlış konumda olduğunu gösterir.
Ö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.
Ş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.
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.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:
Şekil 18. Seçilen mülkleri daraltın.
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:Şekil 19. Farkları göster.
Dönüşüm,
transition-leash
için bu karedeIDENTITY
'tenSCALE|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.
Şekil 20. Titremenin tanımlanması.
Kodda, bu dönüştürmenin neden bölünmüş ekran geçiş tasmasına ayarlandığını belirleyin.