Winscope adalah alat web yang memungkinkan pengguna merekam, memutar ulang, dan menganalisis status beberapa layanan sistem selama dan setelah animasi dan transisi. Winscope mencatat semua status layanan sistem yang relevan ke file rekaman aktivitas. Dengan menggunakan UI Winscope dengan file rekaman aktivitas, Anda dapat memeriksa status layanan ini untuk setiap frame animasi, dengan atau tanpa perekaman layar, dengan memutar ulang, melangkahi, dan men-debug transisi.
Pelacakan yang didukung
Winscope memberikan kemampuan untuk mengumpulkan dan merepresentasikan secara visual berbagai rekaman aktivitas atau urutan status layanan sistem. Anda dapat mengonfigurasi rekaman aktivitas ini agar sesuai dengan kasus penggunaan tertentu, mulai dari overhead rendah hingga panjang deskripsi tinggi. Rekaman aktivitas berikut didukung oleh Winscope:
- EventLog: Mengumpulkan data peristiwa diagnostik sistem menggunakan
EventLog
. Di Winscope, informasi ini hanya digunakan untuk mengidentifikasi dan menampilkan penanda CUJ. - IME: Melacak peristiwa dari pipeline Editor Metode Input (IME), termasuk IMS, IMMS, dan Klien IME.
- Input: Melacak peristiwa input dari berbagai bagian pipeline peristiwa input.
- ProtoLog: Mengumpulkan pesan ProtoLog dari layanan sistem dan kode layanan sistem yang berjalan dalam proses klien.
- Rekaman layar: Kumpulkan rekaman layar bersama dengan rekaman aktivitas.
- Transisi shell: Mencatat detail sistem transisi aktivitas dan jendela.
- SurfaceFlinger: Mengumpulkan trace SurfaceFlinger yang berisi informasi tentang platform (lapisan) seperti posisi, buffer, dan komposisi.
- Transaksi: Melacak kumpulan perubahan atom yang diterima oleh SurfaceFlinger
menggunakan
SurfaceControl
untuk komposisi. - ViewCapture: Merekam berbagai properti dari semua tampilan dari Windows sistem yang mendukung ViewCapture, seperti UI Sistem dan Peluncur.
- Pengelola Jendela: Melacak status Pengelola Jendela yang berisi detail terkait jendela, termasuk peristiwa input dan fokus, orientasi layar, transisi, animasi, pemosisian, dan transformasi.
Dump yang didukung
Winscope dapat mengumpulkan dan menampilkan dump status, yang merupakan snapshot status perangkat yang diambil pada momen tertentu yang ditentukan oleh pengguna. Tidak seperti rekaman aktivitas, yang terus dikumpulkan selama penggunaan perangkat dan dapat memengaruhi performa, dump hanya diambil pada momen yang ditentukan pengguna ini, sehingga memastikan bahwa performa dan panjangnya tidak terganggu. Hal ini memungkinkan analisis status perangkat yang lebih fokus dan efisien pada titik waktu tertentu. Dump berikut didukung oleh Winscope:
- Pengelola Jendela: Men-dump satu status Pengelola Jendela.
- SurfaceFlinger: Men-dump satu snapshot SurfaceFlinger.
- Screenshot: Mengumpulkan screenshot bersama dengan dump.
Referensi
Lihat Menjalankan Winscope untuk mengetahui informasi tentang cara mem-build dan menjalankan Winscope.
Lihat Mengambil rekaman aktivitas untuk mengetahui informasi tentang cara mengumpulkan rekaman aktivitas.
Lihat Memuat rekaman aktivitas untuk mengetahui informasi tentang cara memuat rekaman aktivitas menggunakan UI Web Winscope.
Lihat Menganalisis trace untuk mengetahui informasi tentang cara menganalisis trace.
Contoh
Contoh berikut menjelaskan cara men-debug kegagalan pengujian flicker dan bug yang dilaporkan pengguna.
Kegagalan pengujian kedipan
Contoh ini menunjukkan cara menggunakan Winscope untuk men-debug kegagalan pengujian kedipan.
Memeriksa kegagalan pengujian
Ikuti langkah-langkah berikut untuk menentukan jenis masalah dan memeriksa pesan kegagalan pengujian.
Tentukan jenis masalah dengan memeriksa nama pengujian dan class.
Nama pengujian dan kelas:
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
).
Periksa pesan kegagalan pengujian, yang memberikan informasi komprehensif tentang kegagalan, termasuk:
- Perbandingan antara hasil yang diharapkan dan hasil yang terlihat sebenarnya
- 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
.NotificationActivity
diharapkan terlihat, tetapi tidak.Nama file artefak yang berisi rekaman aktivitas untuk proses debug adalah
FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV
.
Debug
Ikuti langkah-langkah berikut untuk menentukan penyebab kedipan:
Download file rekaman aktivitas dan muat di Winscope. Winscope terbuka dengan SurfaceFlinger yang dipilih secara otomatis:
Gambar 1. Halaman landing Winscope dengan tampilan SurfaceFlinger.
Buka stempel waktu tempat masalah terjadi dengan menyalin dan menempelkan 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 bingkai sebelumnya. Dalam status ini, aplikasi NotificationActivity ditampilkan dengan benar dalam video, dan platform aplikasi dan layar pembuka terlihat, yang ditunjukkan oleh kotak hijau dalam tampilan 3D, dan chip V pada elemen hierarkinya.
Nama platform 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#3453
Hal ini menunjukkan bahwa aplikasi diluncurkan saat layar menjadi hitam dan peristiwa ini terjadi selama peluncuran aplikasi, karena layar peluncuran masih terlihat:
Gambar 3. Saat peluncuran aplikasi.
Tekan tombol panah kanan untuk kembali ke frame berikutnya, tempat kelip terjadi. Dalam tampilan persegi panjang,
NotificationShade
ditampilkan di layar, bukan aplikasi. Platform berikut ditampilkan dalam bingkai ini:- Overlay dekorasi layar (atas dan bawah)
- Menu navigasi
Lokasi pointer (dari perekaman layar)
Gambar 4. Aktivitas berkedip.
Pilih aktivitas aplikasi di tampilan hierarki. Jika Anda tidak dapat menemukannya, nonaktifkan Hanya tampilkan V. Kemudian, periksa tampilan properti.
Nama platform aplikasi adalah:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
Gambar 5. Properti aplikasi.
Meskipun aktivitas aplikasi disetel ke terlihat dan buram, platform tidak ditampilkan karena error
Invisible due to: null visible region
. Hal ini terjadi karena permukaan buram lain ditempatkan di depannya selama komposisi. Hipotesis ini berasal dari persegi panjangNotificationShade
yang berada di depan persegi panjangNotificationActivity
dalam tampilan 3D, danNotificationShade
yang terlihat (hijau) mungkin merupakan lapisan yang dipilih.Untuk memvalidasi hipotesis ini, pilih platform
NotificationShade
yang terlihat pada frame saat ini dan periksa propertinya. Flag ditetapkan keOPAQUE|ENABLE_BACKPRESSURE (0x102)
. Nama platformNotificationShade
adalahNotificationShade#3447
. Selanjutnya, tekan panah kiri untuk kembali ke frame sebelumnya (sebelum berkedip) dan periksa properti platformNotificationShade
lagi. Perhatikan bahwa bukanOPAQUE
, platform hanya memiliki flagENABLE_BACKPRESSURE (0x100)
. Hal ini mengonfirmasi bahwaNotificationShade
menjadi buram sebelum peluncuran aplikasi selesai sepenuhnya. KarenaNotificationShade
berada di depanNotificationActivity
, aplikasi tidak ditampilkan.NotificationShade
hitam, sehingga layar menjadi hitam sebentar, yang menyebabkan kedipan.Identifikasi dalam kode alasan
NotificationShade
menjadi buram terlalu awal.
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 perkiraan stempel waktu 18 April 2024 15.51 GMT-04.00.
Ikuti langkah-langkah berikut untuk men-debug bug yang dilaporkan pengguna:
Muat file rekaman aktivitas di Winscope. Winscope terbuka dengan SurfaceFlinger yang dipilih secara otomatis.
Gambar 6. Halaman landing Winscope dengan tampilan SurfaceFlinger.
Buka perkiraan stempel waktu yang dilaporkan oleh pengguna, dalam hal ini
3:50 PM GMT-04:00
, dengan memasukkan15:50:00
di kolom stempel waktu yang dapat dibaca manusia.Gambar 7. Dialog stempel waktu.
Gunakan tampilan rects untuk mengidentifikasi apa yang digambar di layar. Untuk tampilan yang lebih baik, gunakan penggeser Rotation untuk mengubah perspektif persegi panjang. Dengan menandai Tampilkan hanya V dan Datar di tampilan Hierarki, wallpaper, overlay dekorasi layar, letterbox, peluncur, kontak, dan platform 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
Telepon:
com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564
Selain platform yang terlihat (persegi panjang hijau), persegi panjang abu-abu, yang mewakili platform area tampilan, bernama Tampilan tidak dikenal, ditampilkan. Untuk meningkatkan visibilitas, klik (
) di samping platform
ScreenDecorHwcOverlay#64
untuk menyembunyikan persegi yang sesuai dan menampilkan platform di belakangnya. Kami menghapus overlay untuk analisis karena tidak terlihat oleh pengguna dan tidak akan dilaporkan sebagai animasi yang berkedip.Gambar 8. Laporan pengguna.
Setelah Anda mengidentifikasi platform yang terlibat dalam tampilan layar terpisah, gunakan rekaman aktivitas Transisi untuk melangkah melalui berbagai tindakan pengguna dan menemukan kedipan. Klik tab Transitions di Winscope untuk memvisualisasikan daftar transisi yang diputar:
Gambar 9. Transitions.
Transisi yang diputar 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 rects di tab Surface Flinger. Pastikan kebenaran status perangkat selama transisi dengan melangkahi transisi menggunakan tombol panah kanan dan mengamati persegi panjang.Peluncur muncul pada 15:50:57.278, tetapi animasi tidak dimulai pada saat itu. Wallpaper sudah terlihat karena tidak ada yang digambar di antara aplikasi layar terpisah (pemisah). Satu frame sebelumnya (15:50:57.212), wallpaper tidak terlihat, dan pemisah ditampilkan, yang merupakan tampilan layar terpisah saat tidak dianimasikan.
Gambar 10. Layar sebelum peristiwa berkedip.
Untuk melihat transisi berikutnya, klik linimasa secara langsung. Status SurfaceFlinger diwakili oleh deretan blok biru muda. Transisi diwakili oleh deretan blok 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 terang baris SurfaceFlinger menunjukkan posisi horizontalnya. Lakukan transisi dengan tombol panah kanan untuk melihat apakah terjadi kedipan. Pastikan perangkat terlihat benar untuk transisi ini.
Lewati transisi berikutnya karena durasinya sangat kecil, sehingga tidak mungkin berisi kedipan. Sebagai gantinya, klik linimasa di baris SurfaceFlinger pada posisi awal transisi yang lebih lama berikutnya, seperti yang ditunjukkan oleh kursor pada gambar berikut.
Gambar 12. Akhir transisi kedua.
Selama transisi ini, pada
15:51:13.239
, amati bahwa lapisanSplash Screen
untuk aplikasi, kontak, dan alat pilih nomor, berada di sisi yang sama dari layar:Gambar 13. Layar pembuka.
Jelaskan aplikasi mana yang berada di sisi yang salah. Tambahkan bookmark ke posisi saat ini dengan mengklik ikon tanda di samping kolom input ns, untuk membantu kembali ke frame ini nanti.
Gambar 14. Menambahkan bookmark.
Buka frame di akhir transisi dengan mengklik linimasa secara langsung, misalnya, ke
15:51:13.859
. Di sini, kedua aplikasi kini berada di posisi akhir, dengan alat pilih di sebelah kiri, dan kontak di kanan:Gambar 15. Layar terpisah akhir.
Klik tanda bookmark di linimasa untuk kembali ke frame dengan kedipan.
Gambar 16. Bookmark linimasa.
Kedua aplikasi berada di sebelah kanan, yang menunjukkan bahwa alat pilih berada di posisi yang salah.
Klik layar pembuka dari dialer untuk melihat propertinya. Lihat khusus properti transformasinya di tampilan Properti yang diseleksi.
Gambar 17. Mengubah properti.
Transformasi yang dihitung diterapkan ke platform ini, tetapi tidak ditetapkan sebagai level ini. Kolom yang dihitung dan diminta memiliki nilai yang berbeda, yang menunjukkan bahwa transformasi diwarisi dari platform induk.
Batalkan pilihan Flat di tampilan hierarki untuk menampilkan seluruh hierarki, dan buka node induk platform aplikasi hingga transformasi Calculated dan Requested sama, yang menunjukkan transformasi yang diminta di platform
Surface(name=Task=7934)/@0x1941191_transition-leash#40670
.Konfirmasi kapan transformasi pertama kali ditetapkan, dan ke nilai apa. Ciutkan properti yang diseleksi dengan mengklik ikon di samping judul:
Gambar 18. Ciutkan properti yang diseleksi.
Pilih Show diff di tampilan Proto Dump untuk menandai properti yang sedang diubah dalam frame ini. Ketik
transform
di kolom penelusuran teks untuk memfilter properti:Gambar 19. Tampilkan perbedaan.
Transformasi ditetapkan dari
IDENTITY
keSCALE|TRANSLATE|ROT_270
dalam bingkai ini untuktransition-leash
.Informasi ini menunjukkan bahwa kedipan terjadi saat transformasi diterapkan ke tali animasi aplikasi layar terpisah dari dialer.
Gambar 20. Identifikasi kedipan.
Identifikasi dalam kode alasan transformasi ini ditetapkan ke tali transisi layar terpisah.