Melacak transisi jendela menggunakan Winscope

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.

  1. 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).

  2. 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:

  1. Download file rekaman aktivitas dan muat di Winscope. Winscope terbuka dengan SurfaceFlinger yang dipilih secara otomatis:

    Halaman landing Winscope dengan tampilan SurfaceFlinger

    Gambar 1. Halaman landing Winscope dengan tampilan SurfaceFlinger.

  2. 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.

    Dialog stempel waktu

    Gambar 2. Dialog stempel waktu.

  3. 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:

    Saat peluncuran aplikasi

    Gambar 3. Saat peluncuran aplikasi.

  4. 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)

      Aktivitas berkedip

      Gambar 4. Aktivitas berkedip.

  5. 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`
    

    Properti aplikasi

    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 panjang NotificationShade yang berada di depan persegi panjang NotificationActivity dalam tampilan 3D, dan NotificationShade yang terlihat (hijau) mungkin merupakan lapisan yang dipilih.

  6. Untuk memvalidasi hipotesis ini, pilih platform NotificationShade yang terlihat pada frame saat ini dan periksa propertinya. Flag ditetapkan ke OPAQUE|ENABLE_BACKPRESSURE (0x102). Nama platform NotificationShade adalah NotificationShade#3447. Selanjutnya, tekan panah kiri untuk kembali ke frame sebelumnya (sebelum berkedip) dan periksa properti platform NotificationShade lagi. Perhatikan bahwa bukan OPAQUE, platform hanya memiliki flag ENABLE_BACKPRESSURE (0x100). Hal ini mengonfirmasi bahwa NotificationShade menjadi buram sebelum peluncuran aplikasi selesai sepenuhnya. Karena NotificationShade berada di depan NotificationActivity, aplikasi tidak ditampilkan. NotificationShade hitam, sehingga layar menjadi hitam sebentar, yang menyebabkan kedipan.

  7. 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:

  1. Muat file rekaman aktivitas di Winscope. Winscope terbuka dengan SurfaceFlinger yang dipilih secara otomatis.

    Halaman landing Winscope dengan tampilan SurfaceFlinger

    Gambar 6. Halaman landing Winscope dengan tampilan SurfaceFlinger.

  2. Buka perkiraan stempel waktu yang dilaporkan oleh pengguna, dalam hal ini 3:50 PM GMT-04:00, dengan memasukkan 15:50:00 di kolom stempel waktu yang dapat dibaca manusia.

    Dialog stempel waktu

    Gambar 7. Dialog stempel waktu.

  3. 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 (ikon visibilitas) 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.

    Laporan pengguna

    Gambar 8. Laporan pengguna.

  4. 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:

    transisi

    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.

  5. 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.

    Layar sebelum berkedip

    Gambar 10. Layar sebelum peristiwa berkedip.

  6. Untuk melihat transisi berikutnya, klik linimasa secara langsung. Status SurfaceFlinger diwakili oleh deretan blok biru muda. Transisi diwakili oleh deretan blok merah muda.

    Akhir transisi pertama

    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.

  7. 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.

    akhir transisi kedua

    Gambar 12. Akhir transisi kedua.

    Selama transisi ini, pada 15:51:13.239, amati bahwa lapisan Splash Screen untuk aplikasi, kontak, dan alat pilih nomor, berada di sisi yang sama dari layar:

    layar pembuka

    Gambar 13. Layar pembuka.

  8. 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.

    tambahkan bookmark

    Gambar 14. Menambahkan bookmark.

  9. 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:

    layar terpisah akhir

    Gambar 15. Layar terpisah akhir.

  10. Klik tanda bookmark di linimasa untuk kembali ke frame dengan kedipan.

    linimasa bookmark

    Gambar 16. Bookmark linimasa.

    Kedua aplikasi berada di sebelah kanan, yang menunjukkan bahwa alat pilih berada di posisi yang salah.

  11. Klik layar pembuka dari dialer untuk melihat propertinya. Lihat khusus properti transformasinya di tampilan Properti yang diseleksi.

    Mengubah properti

    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.

  12. 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.

  13. Konfirmasi kapan transformasi pertama kali ditetapkan, dan ke nilai apa. Ciutkan properti yang diseleksi dengan mengklik ikon di samping judul:

    menciutkan properti yang diseleksi

    Gambar 18. Ciutkan properti yang diseleksi.

  14. 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:

    tampilkan perbedaan

    Gambar 19. Tampilkan perbedaan.

    Transformasi ditetapkan dari IDENTITY ke SCALE|TRANSLATE|ROT_270 dalam bingkai ini untuk transition-leash.

    Informasi ini menunjukkan bahwa kedipan terjadi saat transformasi diterapkan ke tali animasi aplikasi layar terpisah dari dialer.

    Identifikasi kedipan

    Gambar 20. Identifikasi kedipan.

  15. Identifikasi dalam kode alasan transformasi ini ditetapkan ke tali transisi layar terpisah.