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 rekaman layar, dengan memutar ulang, menelusuri, dan men-debug transisi.

Rekaman aktivitas 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 verbositas tinggi. Rekaman aktivitas berikut didukung oleh Winscope:

  • 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: 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 jendela dan aktivitas.
  • SurfaceFlinger: Mengumpulkan rekaman aktivitas SurfaceFlinger yang berisi informasi tentang permukaan (lapisan) seperti posisi, buffer, dan komposisi.
  • Transaksi: Lacak serangkaian perubahan atomik yang diterima oleh SurfaceFlinger menggunakan SurfaceControl untuk komposisi.
  • ViewCapture: Merekam berbagai properti dari semua tampilan dari sistem Windows yang mendukung ViewCapture, seperti UI Sistem dan Peluncur.
  • Pengelola Jendela: Merekam aktivitas 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 dikumpulkan secara terus-menerus selama penggunaan perangkat dan dapat memengaruhi performa, dump hanya diambil pada saat yang ditentukan pengguna ini, sehingga memastikan performa dan kejelasan tidak terganggu. Hal ini memungkinkan analisis status perangkat yang lebih terfokus dan efisien pada titik waktu tertentu. Dump berikut didukung oleh Winscope:

  • Pengelola Jendela: Buat dump status Pengelola Jendela tunggal.
  • SurfaceFlinger: Buat dump satu snapshot SurfaceFlinger.
  • Screenshot: Kumpulkan screenshot bersama dengan dump.

Referensi

Lihat Menjalankan Winscope untuk mengetahui informasi tentang membangun dan menjalankan Winscope.

Lihat Merekam aktivitas untuk mengetahui informasi tentang cara mengumpulkan rekaman aktivitas.

Lihat Memuat rekaman aktivitas untuk mendapatkan informasi tentang cara memuat rekaman aktivitas menggunakan UI Web Winscope.

Lihat Menganalisis rekaman aktivitas untuk mengetahui informasi tentang cara menganalisis rekaman aktivitas.

Contoh

Contoh berikut menjelaskan cara men-debug kegagalan pengujian kedipan dan bug yang dilaporkan pengguna.

Kegagalan uji kedipan

Contoh ini menunjukkan cara menggunakan Winscope untuk men-debug kegagalan pengujian kedipan.

Periksa 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 sebenarnya 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 ini terjadi di 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 mengetahui penyebab kedipan:

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

    Halaman landing Winscope dengan tampilan SurfaceFlinger

    Gambar 1. Halaman landing Winscope dengan tampilan SurfaceFlinger.

  2. Buka stempel waktu saat 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 permukaan aplikasi dan layar pembuka terlihat, yang ditunjukkan oleh persegi hijaunya dalam tampilan 3D, dan chip V pada elemen hierarkinya.

    Nama permukaan 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 sedang diluncurkan saat layar menjadi hitam dan bahwa peristiwa ini terjadi selama peluncuran aplikasi, karena layar pembuka masih terlihat:

    Saat peluncuran aplikasi

    Gambar 3. Saat peluncuran aplikasi.

  4. Tekan tombol panah kanan untuk kembali ke frame berikutnya, tempat kedipan terjadi. Di tampilan rects, NotificationShade ditampilkan di layar, bukan aplikasi. Permukaan berikut ditampilkan dalam frame ini:

    • Overlay dekorasi layar (atas dan bawah)
    • Menu navigasi
    • Lokasi pointer (dari rekaman layar)

      Aktivitas berkedip

      Gambar 4. Aktivitas berkedip.

  5. Pilih aktivitas aplikasi di tampilan hierarki. Jika Anda tidak dapat menemukannya, nonaktifkan Tampilkan hanya 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, permukaan 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 NotificationShade yang berada di depan persegi NotificationActivity dalam tampilan 3D, dan NotificationShade yang terlihat (hijau) berpotensi menjadi lapisan yang dipilih.

  6. Untuk memvalidasi hipotesis ini, pilih permukaan NotificationShade yang terlihat pada frame saat ini dan periksa propertinya. Flag ditetapkan ke OPAQUE|ENABLE_BACKPRESSURE (0x102). Nama permukaan NotificationShade adalah NotificationShade#3447. Selanjutnya, tekan panah kiri untuk kembali ke frame sebelumnya (sebelum kedipan) dan periksa properti permukaan NotificationShade lagi. Perhatikan bahwa alih-alih OPAQUE, platform hanya memiliki tanda 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 berwarna hitam, sehingga layar menjadi hitam sesaat, yang menyebabkan kedipan.

  7. Identifikasi dalam kode mengapa NotificationShade menjadi buram terlalu dini.

Bug yang dilaporkan pengguna

Bug yang dilaporkan pengguna dapat sulit di-debug karena sering kali tidak memiliki informasi yang mendetail. Tidak seperti kegagalan uji kedipan, yang memberikan stempel waktu tertentu, detail elemen, dan rekaman layar, 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:

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

    Halaman landing Winscope dengan tampilan SurfaceFlinger

    Gambar 6. Halaman landing Winscope dengan tampilan SurfaceFlinger.

  2. Buka stempel waktu perkiraan 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 Rotasi untuk mengubah perspektif persegi. Dengan menandai Tampilkan hanya V dan Rata dalam 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

    • Aplikasi Telepon: com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    Selain permukaan yang terlihat (kotak hijau), kotak abu-abu, yang merepresentasikan permukaan area tampilan, bernama Unknown display, ditampilkan. Untuk meningkatkan visibilitas, klik (ikon visibilitas) di samping permukaan ScreenDecorHwcOverlay#64 untuk menyembunyikan rect yang sesuai dan menampilkan permukaan di belakangnya. Kami menghapus overlay untuk analisis karena tidak terlihat oleh pengguna dan tidak akan dilaporkan sebagai animasi berkedip.

    Laporan pengguna

    Gambar 8. Laporan pengguna.

  4. Setelah mengidentifikasi platform yang terlibat dalam tampilan layar terpisah, gunakan rekaman aktivitas Transisi untuk menelusuri berbagai tindakan pengguna dan menemukan kedipan. Klik tab Transisi di Winscope untuk memvisualisasikan daftar transisi yang diputar:

    transisi

    Gambar 9. Transitions.

    Transisi yang diputar selama frame ini ditandai dengan warna biru. Dalam kasus ini, tanda transisi mencakup TRANSIT_FLAG_IS_RECENTS, yang menunjukkan bahwa pengguna sedang memasuki layar terbaru.

  5. Klik link di kolom Waktu Pengiriman (dalam hal ini 2024-04-18, 15:50:57.205) untuk membuka titik waktu tersebut dan memverifikasi persegi di tab Surface Flinger. Konfirmasi kebenaran status perangkat selama transisi dengan menelusuri transisi menggunakan tombol panah kanan dan mengamati persegi.

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

  6. Untuk melihat transisi berikutnya, klik linimasa secara langsung. Status SurfaceFlinger diwakili oleh deretan blok biru muda. Transisi diwakili oleh baris 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 muda baris SurfaceFlinger menunjukkan posisi horizontalnya. Langkah-langkah transisi dengan tombol panah kanan untuk melihat apakah terjadi kedipan. Konfirmasi bahwa perangkat terlihat benar untuk transisi ini.

  7. Lewati transisi berikutnya karena durasinya sangat kecil, sehingga kemungkinan tidak berisi kedipan. Sebagai gantinya, klik linimasa di baris SurfaceFlinger pada posisi awal transisi yang lebih panjang 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 kedua aplikasi, kontak, dan dialer, berada di sisi yang sama dengan layar:

    layar pembuka

    Gambar 13. Layar pembuka.

  8. Perjelas aplikasi mana yang berada di sisi yang salah. Tambahkan penanda ke posisi saat ini dengan mengklik ikon bendera di samping kolom input ns, untuk membantu kembali ke frame ini nanti.

    menambahkan bookmark

    Gambar 14. Tambahkan bookmark.

  9. Buka frame di akhir transisi dengan mengklik langsung linimasa, misalnya, ke 15:51:13.859. Di sini, kedua aplikasi kini berada di posisi akhirnya, dengan aplikasi telepon di sebelah kiri, dan aplikasi kontak di sebelah 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. Linimasa bookmark.

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

  11. Klik layar pembuka aplikasi telepon untuk melihat propertinya. Lihat khususnya properti transformasinya di tampilan Properti yang dikurasi.

    Properti transformasi

    Gambar 17. Properti transformasi.

    Transformasi yang dihitung diterapkan ke platform ini, tetapi tidak ditetapkan sebagai tingkat ini. Kolom yang dihitung dan diminta memiliki nilai yang berbeda, yang menunjukkan bahwa transformasi diwarisi dari platform induk.

  12. Batalkan pilihan Flat dalam tampilan hierarki untuk menampilkan seluruh struktur hierarki, dan buka node induk permukaan aplikasi hingga transformasi Calculated dan Requested sama, yang menunjukkan transformasi yang diminta di permukaan Surface(name=Task=7934)/@0x1941191_transition-leash#40670.

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

    menciutkan properti pilihan

    Gambar 18. Ciutkan properti pilihan.

  14. Pilih Tampilkan perbedaan di tampilan Proto Dump untuk menandai properti yang 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 frame ini untuk transition-leash.

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

    Identifikasi kedipan

    Gambar 20. Identifikasi kedipan.

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