Melacak transisi jendela menggunakan Winscope

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

  1. 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).
  2. 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.
    • NotificationActivity diharapkan 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:

  1. Download file pelacakan 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 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.

    Dialog stempel waktu

    Gambar 2. Dialog stempel waktu.

  3. 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#3453
    

    Hal ini menunjukkan bahwa aplikasi diluncurkan saat layar menjadi hitam dan 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 flicker terjadi. Dalam tampilan rect, NotificationShade ditampilkan di layar, bukan aplikasi. Surface berikut ditampilkan dalam frame ini:

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

    Aktivitas berkedip

    Gambar 4. Aktivitas flicker.

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

    Properti aplikasi

    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 rect NotificationShade yang berada di depan rect NotificationActivity dalam tampilan 3D, dan NotificationShade yang terlihat (hijau) berpotensi menjadi lapisan yang dipilih.

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

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

  1. Muat file pelacakan 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 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 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 (ikon visibilitas) di samping surface ScreenDecorHwcOverlay#64 untuk 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.

    Laporan pengguna

    Gambar 8. Laporan pengguna.

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

    transisi

    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.

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

    Layar sebelum berkedip

    Gambar 10. Layar sebelum peristiwa flicker.

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

    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. Telusuri langkah demi langkah transisi dengan tombol panah kanan untuk melihat apakah flicker terjadi. Pastikan perangkat terlihat benar untuk transisi ini.

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

    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 tampilan yang sama:

    layar pembuka

    Gambar 13. Layar pembuka.

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

    menambahkan bookmark

    Gambar 14. Tambahkan bookmark.

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

    layar terpisah akhir

    Gambar 15. Layar terpisah akhir.

  10. Klik flag bookmark di linimasa untuk kembali ke frame dengan flicker.

    linimasa bookmark

    Gambar 16. Linimasa bookmark.

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

  11. Klik layar pembuka dialer untuk melihat propertinya. Lihat secara khusus properti transformasinya di tampilan Properties yang dikurasi.

    Properti transformasi

    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.

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

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

    menciutkan properti pilihan

    Gambar 18. Ciutkan properti yang dikurasi.

  14. Pilih Show diff di tampilan Proto Dump untuk menandai properti yang diubah dalam frame ini. Ketik transform ke dalam 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 flicker terjadi saat transformasi diterapkan ke leash animasi aplikasi layar terpisah dialer.

    Identifikasi kedipan

    Gambar 20. Identifikasi flicker.

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