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.
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.
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:
İzleme dosyalarını indirip Winscope'a yükleyin. Winscope, SurfaceFlinger otomatik olarak seçilmiş şekilde açılır:
1. şekil. SurfaceFlinger görünümü içeren Winscope açılış sayfası.
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.Ş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. 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:
3.Şekil Uygulama başlatıldığında.
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)
Şekil 4. Titreme 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'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`
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ümdeNotificationShade
dikdörtgenininNotificationActivity
dikdörtgeninin önünde olmasından ve görünür (yeşil)NotificationShade
dikdörtgeninin seçilen katman olmasından kaynaklanmaktadır.Bu hipotezi doğrulamak için geçerli karede görünen
NotificationShade
yüzeyi seçin ve özelliklerini kontrol edin. İşaretlerOPAQUE|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 veNotificationShade
yüzeyinin özelliklerini tekrar inceleyin. YüzeyinOPAQUE
yerine yalnızcaENABLE_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.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:
İzleme dosyasını Winscope'a yükleyin. Winscope, SurfaceFlinger otomatik olarak seçilmiş şekilde açılır.
6.şekil SurfaceFlinger görünümü içeren Winscope açılış sayfası.
Okunabilir zaman damgası alanına
15:50:00
girerek kullanıcının bildirdiği yaklaşık zaman damgasına (bu örnekte3:50 PM GMT-04:00
) gidin.Şekil 7. Zaman damgası iletişim kutusu.
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 () 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.
Şekil 8. Kullanıcı raporu
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:
Ş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.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.
10.şekil Titreme olayından önceki ekran.
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.
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.
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.
Ş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ç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 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.
Şekil 14. Yer işareti ekle'yi tıklayın.
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:15.şekil Son bölünmüş ekran.
Zaman çizelgesinde yer işaretinin işaretini tıklayarak titremenin olduğu kareye geri dönün.
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.
Ç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.
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.
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.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:
18.şekil Seçilmiş özellikleri daraltın.
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:Şekil 19. Farkı göster.
Dönüşüm,
transition-leash
için bu karedeIDENTITY
ileSCALE|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.
Şekil 20. Titremenin tanımlanması.
Bu dönüşümün neden bölünmüş ekran geçişi olarak ayarlandığını kodda belirtin.