Winscope adalah alat web yang memungkinkan Anda merekam, memutar ulang, dan menganalisis status beberapa layanan sistem selama dan setelah animasi serta transisi. Winscope merekam semua status layanan sistem yang relevan ke file pelacakan. Dengan menggunakan UI Winscope dengan file pelacakan, Anda dapat memeriksa status layanan ini untuk setiap frame animasi, dengan atau tanpa rekaman layar, dengan memutar ulang, menelusuri langkah demi langkah, dan men-debug transisi.
Pelacakan yang didukung
Winscope memberikan kemampuan untuk mengumpulkan dan menampilkan secara visual berbagai pelacakan, yaitu urutan status layanan sistem. Anda dapat mengonfigurasi pelacakan ini agar sesuai dengan kasus penggunaan tertentu, mulai dari overhead rendah hingga verbositas tinggi. Winscope mendukung pelacakan berikut:
- EventLog: Kumpulkan catatan peristiwa diagnostik sistem menggunakan
EventLog. Di Winscope, informasi ini hanya digunakan untuk mengidentifikasi dan menampilkan tanda CUJ. - IME: Lacak peristiwa dari pipeline Editor Metode Input (IME), termasuk IMS, IMMS, dan Klien IME.
- Input: Lacak peristiwa input dari berbagai bagian pipeline peristiwa input.
- ProtoLog: Kumpulkan ProtoLog pesan dari layanan sistem dan kode layanan sistem yang berjalan dalam proses klien.
- Screen recording: Kumpulkan rekaman layar bersama dengan pelacakan.
- Shell transitions: Rekam detail sistem transisi jendela dan aktivitas.
- SurfaceFlinger: Kumpulkan pelacakan SurfaceFlinger yang berisi informasi tentang surface (lapisan) seperti posisi, buffer, dan komposisi.
- Transaksi: Lacak kumpulan perubahan atomik yang diterima oleh SurfaceFlinger
menggunakan
SurfaceControluntuk komposisi. - ViewCapture: Ambil berbagai properti dari semua tampilan dari Windows sistem yang mendukung ViewCapture, seperti UI Sistem dan Peluncur.
- Window Manager: Lacak Pengelola Jendela status yang berisi detail terkait jendela, termasuk peristiwa input dan fokus peristiwa, orientasi layar, transisi, animasi, posisi, dan transformasi.
Dump yang didukung
Winscope dapat mengumpulkan dan menampilkan dump status, yang merupakan snapshot status perangkat yang diambil pada momen tertentu yang Anda tentukan. Tidak seperti pelacakan, yang dikumpulkan secara terus-menerus selama penggunaan perangkat dan dapat memengaruhi performa, dump hanya diambil pada momen yang ditentukan pengguna ini, untuk memverifikasi bahwa performa dan verbositas tidak terganggu. Hal ini memungkinkan analisis status perangkat yang lebih terfokus dan efisien pada titik waktu tertentu. Winscope mendukung dump berikut:
- Window Manager: Dump satu status Pengelola Jendela.
- SurfaceFlinger: Dump satu snapshot SurfaceFlinger.
- Screenshot: Kumpulkan screenshot bersama dengan dump.
Resource
Lihat Menjalankan Winscope untuk mengetahui informasi tentang cara mem-build dan menjalankan Winscope.
Lihat Mengambil pelacakan untuk mengetahui informasi tentang cara mengumpulkan pelacakan.
Lihat Memuat pelacakan untuk mengetahui informasi tentang cara memuat pelacakan menggunakan UI Web Winscope.
Lihat Menganalisis pelacakan untuk mengetahui informasi tentang cara menganalisis pelacakan.
Contoh
Contoh berikut menjelaskan cara men-debug kegagalan uji flicker dan bug yang dilaporkan pengguna.
Kegagalan uji flicker
Contoh ini menunjukkan cara menggunakan Winscope untuk men-debug kegagalan uji flicker.
Memeriksa kegagalan uji
Ikuti langkah-langkah berikut untuk menentukan jenis masalah dan memeriksa pesan kegagalan uji.
Tentukan jenis masalah dengan memeriksa nama pengujian dan class.
Nama pengujian dan class:
FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]Jenis masalah:
- CUJ mengacu pada peluncuran aplikasi dari notifikasi layar kunci (
OpenAppFromLockscreenNotificationColdTest). - Pengujian mengharapkan aplikasi menjadi terlihat (
#appLayerBecomesVisible).
- CUJ mengacu pada peluncuran aplikasi dari notifikasi layar kunci (
Periksa pesan kegagalan uji, yang memberikan informasi komprehensif tentang kegagalan, termasuk:
- Perbandingan antara hasil yang diharapkan dan hasil sebenarnya yang terlihat
- Stempel waktu untuk membantu menentukan kapan kegagalan terjadi
- Nama artefak atau file yang terkait dengan kegagalan
- Informasi kontekstual tambahan yang relevan untuk memahami dan men-debug kegagalan
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)Contoh output ini menunjukkan hal berikut:
- Masalah terjadi pada
2024-05-10T11:04:14.227572545. NotificationActivitydiharapkan terlihat, tetapi tidak.- Nama file artefak yang berisi pelacakan untuk proses debug adalah
FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.
Debug
Ikuti langkah-langkah berikut untuk menentukan penyebab flicker:
Download file pelacakan dan muat di Winscope. Winscope terbuka dengan SurfaceFlinger yang dipilih secara otomatis:
Gambar 1. Halaman landing Winscope dengan tampilan SurfaceFlinger.
Buka stempel waktu saat masalah terjadi dengan menyalin dan menempel stempel waktu dari pesan pengecualian ke kolom stempel waktu. Anda dapat menyalin stempel waktu dalam format yang dapat dibaca manusia (
2024-05-10T11:04:14.227572545) dan menempelkannya ke kolom pertama, atau menyalin stempel waktu dalam nanodetik (1715339054227572545ns) dan menempelkannya ke kolom kedua.
Gambar 2. Dialog stempel waktu.
Tekan tombol panah kiri untuk membuka frame sebelumnya. Dalam status ini, aplikasi NotificationActivity ditampilkan dengan benar dalam video, dan surface aplikasi serta layar pembuka terlihat, yang ditunjukkan oleh rect hijau di tampilan 3D, dan chip V pada elemen hierarkinya.
Nama surface aplikasi dan layar pembuka adalah:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458` Splash Screen com.android.server.wm.flicker.testapp#3453Hal ini menunjukkan bahwa aplikasi diluncurkan saat layar menjadi hitam dan peristiwa ini terjadi selama peluncuran aplikasi, karena layar pembuka masih terlihat:
Gambar 3. Saat peluncuran aplikasi.
Tekan tombol panah kanan untuk kembali ke frame berikutnya, tempat flicker terjadi. Dalam tampilan rect,
NotificationShadeditampilkan di layar, bukan aplikasi. Surface berikut ditampilkan dalam frame ini:- Overlay dekorasi layar (atas dan bawah)
- Menu navigasi
- Lokasi pointer (dari rekaman layar)
Gambar 4. Aktivitas flicker.
Pilih aktivitas aplikasi dalam tampilan hierarki. Jika Anda tidak dapat menemukannya, nonaktifkan Show only V. Kemudian, periksa tampilan properti.
Nama surface aplikasi adalah:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
Gambar 5. Properti aplikasi.
Meskipun aktivitas aplikasi ditetapkan agar terlihat dan buram, surface tidak ditampilkan karena error
Invisible due to: null visible region. Hal ini terjadi karena surface buram lain ditempatkan di depannya selama komposisi. Hipotesis ini berasal dari rectNotificationShadeyang berada di depan rectNotificationActivitydalam tampilan 3D, danNotificationShadeyang terlihat (hijau) berpotensi menjadi lapisan yang dipilih.Untuk memvalidasi hipotesis ini, pilih surface
NotificationShadeyang terlihat pada frame saat ini dan periksa propertinya. Flag ditetapkan keOPAQUE|ENABLE_BACKPRESSURE (0x102). Nama surfaceNotificationShadeadalahNotificationShade#3447. Selanjutnya, tekan panah kiri untuk kembali ke frame sebelumnya (sebelum flicker) dan periksa kembali properti surfaceNotificationShade. Perhatikan bahwa, bukanOPAQUE, surface hanya memiliki flagENABLE_BACKPRESSURE (0x100). Hal ini mengonfirmasi bahwaNotificationShademenjadi buram sebelum peluncuran aplikasi selesai sepenuhnya. KarenaNotificationShadeberada di depanNotificationActivity, aplikasi tidak ditampilkan.NotificationShadeberwarna hitam, sehingga layar menjadi hitam sebentar, yang menyebabkan flicker.Identifikasi dalam kode mengapa
NotificationShademenjadi buram terlalu dini.
Bug yang dilaporkan pengguna
Bug yang dilaporkan pengguna dapat sulit di-debug karena sering kali tidak memiliki informasi mendetail. Tidak seperti kegagalan pengujian flicker, yang memberikan stempel waktu, detail elemen, dan rekaman layar tertentu, bug yang dilaporkan pengguna biasanya hanya menyertakan deskripsi singkat tentang masalah tersebut.
Dalam studi kasus kami, satu-satunya informasi yang diberikan adalah judul Layar berkedip saat membuka kembali aplikasi dari layar terpisah dan stempel waktu perkiraan 18 Apr 2024 15.51 GMT-04.00.
Ikuti langkah-langkah berikut untuk men-debug bug yang dilaporkan pengguna:
Muat file pelacakan di Winscope. Winscope terbuka dengan SurfaceFlinger yang dipilih secara otomatis.
Gambar 6. Halaman landing Winscope dengan tampilan SurfaceFlinger.
Buka stempel waktu perkiraan yang dilaporkan oleh pengguna, dalam hal ini
3:50 PM GMT-04:00, dengan memasukkan15:50:00di kolom stempel waktu yang dapat dibaca manusia.
Gambar 7. Dialog stempel waktu.
Gunakan tampilan rect untuk mengidentifikasi apa yang digambar di layar. Untuk tampilan yang lebih baik, gunakan penggeser Rotation untuk mengubah perspektif rect. Dengan menandai Show only V dan Flat di tampilan Hierarchy, wallpaper, overlay dekorasi layar, letterbox, peluncur, kontak, dan surface dialer akan terlihat.
Nama paketnya adalah:
- Peluncur:
com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602 - Kontak:
com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565 - Dialer:
com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564
Selain surface yang terlihat (rect hijau), rect abu-abu, yang mewakili surface area tampilan, bernama Unknown display, juga ditampilkan. Untuk meningkatkan visibilitas, klik (
)
di samping surface ScreenDecorHwcOverlay#64untuk menyembunyikan rect yang sesuai dan menampilkan surface di belakangnya. Kami menghapus overlay untuk analisis karena tidak terlihat oleh pengguna dan tidak akan dilaporkan sebagai animasi yang berkedip.
Gambar 8. Laporan pengguna.
- Peluncur:
Setelah Anda mengidentifikasi surface mana yang terlibat dalam tampilan layar terpisah, gunakan pelacakan Transisi untuk menelusuri langkah demi langkah berbagai tindakan pengguna dan menemukan flicker. Klik tab Transitions di Winscope untuk memvisualisasikan daftar transisi yang dimainkan:
Gambar 9. Transitions.
Transisi yang dimainkan selama frame ini ditandai dengan warna biru. Dalam hal ini, flag transisi mencakup
TRANSIT_FLAG_IS_RECENTS, yang menunjukkan bahwa pengguna memasuki layar terbaru.Klik link di kolom Dispatch Time (dalam hal ini
2024-04-18, 15:50:57.205) untuk membuka titik waktu tersebut dan memverifikasi rect di tab Surface Flinger. Konfirmasi kebenaran status perangkat selama transisi dengan menelusuri langkah demi langkah transisi menggunakan tombol panah kanan dan mengamati rect.Peluncur muncul pada 15.50.57.278, tetapi animasi tidak dimulai saat itu. Wallpaper sudah terlihat karena tidak ada yang digambar di antara aplikasi layar terpisah (pembatas). Satu frame sebelumnya (15.50.57.212), wallpaper tidak terlihat, dan pembatas ditampilkan, yang merupakan tampilan layar terpisah saat tidak dianimasikan.
Gambar 10. Layar sebelum peristiwa flicker.
Untuk melihat transisi berikutnya, klik linimasa secara langsung. Status SurfaceFlinger direpresentasikan oleh baris blok berwarna biru muda. Transisi direpresentasikan oleh baris blok berwarna merah muda.
Gambar 11. Akhir transisi pertama.
Klik baris SurfaceFlinger di posisi awal transisi berikutnya. Pada gambar 11, posisi vertikal kursor ditunjukkan oleh garis biru tipis. Latar belakang biru muda baris SurfaceFlinger menunjukkan posisi horizontalnya. Telusuri langkah demi langkah transisi dengan tombol panah kanan untuk melihat apakah flicker terjadi. Pastikan perangkat terlihat benar untuk transisi ini.
Lewati transisi berikutnya karena durasinya sangat kecil, sehingga kemungkinan tidak berisi flicker. Sebagai gantinya, klik linimasa di baris SurfaceFlinger pada posisi awal transisi berikutnya yang lebih panjang, seperti yang ditunjukkan oleh kursor pada gambar berikut.
Gambar 12. Akhir transisi kedua.
Selama transisi ini, pada
15:51:13.239, amati bahwa lapisanSplash Screenuntuk kedua aplikasi, kontak, dan dialer, berada di sisi tampilan yang sama:
Gambar 13. Layar pembuka.
Jelaskan aplikasi mana yang berada di sisi yang salah. Tambahkan bookmark ke posisi Anda saat ini dengan mengklik ikon flag di samping kolom input ns , untuk membantu kembali ke frame ini nanti.
Gambar 14. Tambahkan bookmark.
Buka frame di akhir transisi dengan mengklik linimasa secara langsung, misalnya, ke
15:51:13.859. Di sini, kedua aplikasi sekarang berada di posisi akhir, dengan dialer di sebelah kiri, dan kontak di sebelah kanan:
Gambar 15. Layar terpisah akhir.
Klik flag bookmark di linimasa untuk kembali ke frame dengan flicker.
Gambar 16. Linimasa bookmark.
Kedua aplikasi berada di sebelah kanan, yang menunjukkan bahwa dialer berada di posisi yang salah.
Klik layar pembuka dialer untuk melihat propertinya. Lihat secara khusus properti transformasinya di tampilan Properties yang dikurasi.
Gambar 17. Properti transformasi.
Transformasi yang dihitung diterapkan ke surface ini, tetapi tidak ditetapkan di tingkat ini. Kolom yang dihitung dan yang diminta memiliki nilai yang berbeda, yang menunjukkan bahwa transformasi diwarisi dari surface induk.
Batalkan pilihan Flat di tampilan hierarki untuk menampilkan seluruh struktur hierarki, dan buka node induk surface aplikasi hingga transformasi Calculated dan Requested sama, yang menunjukkan transformasi yang diminta di surface
Surface(name=Task=7934)/@0x1941191_transition-leash#40670.Konfirmasi kapan transformasi pertama kali ditetapkan, dan ke nilai apa. Ciutkan properti yang dikurasi dengan mengklik ikon di samping judul:
Gambar 18. Ciutkan properti yang dikurasi.
Pilih Show diff di tampilan Proto Dump untuk menandai properti yang diubah dalam frame ini. Ketik
transformke dalam kolom penelusuran teks untuk memfilter properti:
Gambar 19. Tampilkan perbedaan.
Transformasi ditetapkan dari
IDENTITYkeSCALE|TRANSLATE|ROT_270dalam frame ini untuktransition-leash.Informasi ini menunjukkan bahwa flicker terjadi saat transformasi diterapkan ke leash animasi aplikasi layar terpisah dialer.
Gambar 20. Identifikasi flicker.
Identifikasi dalam kode mengapa transformasi ini ditetapkan ke leash transisi layar terpisah.