Deteksi jank UI

Android merender UI dengan membuat frame dari aplikasi Anda dan menampilkannya di layar. Jika aplikasi Anda mengalami rendering UI yang lambat, sistem akan dipaksa untuk melewati frame. Jika hal ini terjadi, pengguna akan mengalami kedipan berulang di layar, yang disebut sebagai jank.

Saat jank terjadi, biasanya karena beberapa deselerasi atau pemblokiran panggilan asinkron di UI thread (di kebanyakan aplikasi, thread tersebut adalah thread utama). Anda dapat menggunakan pelacakan sistem untuk mengidentifikasi letak masalahnya.

Mendeteksi jank di Android 12 dan yang lebih tinggi

Untuk perangkat yang menggunakan Android 12 (API level 31) atau yang lebih tinggi, rekaman aktivitas akan ditampilkan di jalur Janky frames pada panel Display di CPU Profiler.

Untuk mendeteksi jank,

  1. Di Android Studio, pilih View > Tool Windows > Profiler atau klik Profile di toolbar.

    Jika diminta oleh dialog Select Deployment Target, pilih perangkat tujuan deployment aplikasi untuk pembuatan profil. Jika Anda telah menyambungkan perangkat melalui USB, tetapi tidak melihatnya tercantum, pastikan Anda telah mengaktifkan proses debug USB.

  2. Klik di mana saja dalam linimasa CPU untuk membuka CPU Profiler.

  3. Pilih System Trace dari menu konfigurasi di CPU Profiler dan klik Record. Setelah selesai berinteraksi dengan aplikasi Anda, klik Stop.

  4. Anda akan melihat jalur Janky frames di bagian Display. Secara default, Profiler hanya menampilkan frame yang mengalami jank sebagai kandidat untuk diselidiki. Dalam setiap frame yang mengalami jank, bagian berwarna merah menandai durasi frame yang melebihi batas waktu renderingnya. Screenshot jalur Janky frames

  5. Setelah menemukan frame yang mengalami jank, klik frame tersebut; jika mau, Anda dapat menekan M untuk menyesuaikan zoom agar fokus pada frame yang dipilih. Peristiwa yang relevan ditandai dalam thread ini: thread utama, RenderThread dan GPU completion. Screenshot Profiler yang menampilkan Janky frames dan thread utama

  6. Jika ingin, Anda dapat melihat semua frame atau pengelompokan waktu rendering dengan mengalihkan kotak centang All Frames dan Lifecycle. Screenshot Profiler seperti di atas tetapi dengan kotak centang All Frames dan Lifecycle dicentang

Mendeteksi jank di Android 11

Untuk perangkat yang menggunakan Android 11 (API level 30), rekaman aktivitas ditampilkan di bagian Frame Lifecycle di CPU Profiler.

Bagian Frame Lifecycle dengan jalur berbeda

Bagian Frame Lifecycle berisi nama lapisan dan empat jalur. Setiap jalur mewakili satu tahap dalam pipeline rendering frame. Elemen Frame Lifecycle adalah sebagai berikut:

  1. Frame Lifecycle (Nama lapisan): Judul bagian berisi nama lapisan dalam tanda kurung. Lapisan adalah satu unit komposisi.
  2. Application: Jalur ini menunjukkan waktu dari saat buffer dikeluarkan dari antrean oleh aplikasi hingga saat diantrekan kembali. Peristiwa ini biasanya sesuai dengan peristiwa rekaman aktivitas di RenderThread.
  3. Wait for GPU: Jalur ini menunjukkan berapa lama buffer dimiliki oleh GPU. Ini adalah waktu dari saat buffer dikirim ke GPU hingga saat GPU selesai melakukan pekerjaan pada buffer. Ini tidak mengindikasikan bahwa GPU hanya melakukan pekerjaan pada buffer ini selama waktu tersebut. Untuk info mendetail tentang apa yang dikerjakan GPU selama waktu tertentu, sebaiknya gunakan Android GPU Inspector.
  4. Composition: Jalur ini menunjukkan waktu mulai dari saat SurfaceFlinger mengait ke buffer dan mengirimnya untuk komposisi, hingga saat buffer dikirim ke tampilan.
  5. Frames on display: Jalur ini menunjukkan berapa lama frame berada di layar.

Bagian Frame Lifecycle mengilustrasikan bagaimana buffer frame berpindah di antara berbagai tahap pipeline rendering. Frame diberi kode warna menurut nomor frame sehingga lebih mudah untuk melacak frame tertentu.

Android Studio juga menampilkan semua frame di rekaman aktivitas dalam format tabel di tab All Frames.

Tabel semua frame dalam rekaman aktivitas di tab All Frames

Kolom Frame #, Application, Wait for GPU, dan Composition menampilkan data yang sama dengan jalur di bagian Frame Lifecycle seperti di atas. Kolom Frame Duration menampilkan waktu dari awal Application hingga awal Frames on Display. Ini pada dasarnya adalah waktu yang diperlukan untuk merender frame secara menyeluruh.

Anda dapat mengurutkan tabel frame berdasarkan kolom mana pun untuk menemukan frame terpendek atau terpanjang dengan cepat. Tabel ini juga mendukung kontrol penomoran halaman yang membantu Anda menavigasi melalui ratusan frame.

Untuk mendeteksi dan menyelidiki jank di Android 11, ikuti langkah-langkah berikut:

  1. Urutkan tabel All Frames berdasarkan kolom Application dalam urutan menurun, sehingga frame yang memerlukan waktu terlama muncul terlebih dahulu.

    Kolom Application diurutkan dalam urutan menurun

  2. Temukan frame yang berjalan paling lama dan pilih baris tabel. Tindakan ini akan memperbesar frame yang dipilih pada tampilan linimasa di sebelah kiri.

    Tampilan linimasa di samping tabel Frames

  3. Cari thread yang relevan di bagian Frame Lifecycle dan Threads.

    Bagian Frame Lifecycle dan Threads

Mendeteksi jank di Android 10 dan yang lebih rendah

Untuk perangkat yang menggunakan Android 10 (API level 29) dan yang lebih rendah, informasi pipeline grafis OS yang relevan ditampilkan di satu bagian pada pelacakan sistem CPU Profiler yang bernama Display.

Jendela UI tampilan

  • Frames: Bagian ini menunjukkan UI thread dan peristiwa rekaman aktivitas RenderThread di aplikasi Anda. Peristiwa yang lebih lama dari 16 md diberi warna merah untuk menandai potensi frame yang mengalami jank karena melampaui batas waktu untuk merender pada 60 frame per detik (fps).
  • SurfaceFlinger: Bagian ini ditampilkan saat SurfaceFlinger memproses buffer frame. SurfaceFlinger adalah proses sistem yang bertanggung jawab untuk mengirim buffer yang akan ditampilkan.
  • VSYNC: Bagian ini menampilkan VSYNC, sinyal yang menyinkronkan pipeline tampilan. Jalur ini menampilkan sinyal aplikasi VSYNC, yang menunjukkan kapan aplikasi Anda terlambat dimulai. Hal ini biasanya terjadi karena UI thread sedang sibuk. Ini menyebabkan kedipan yang terlihat di layar selama animasi dan menambahkan latensi input tambahan hingga animasi atau scroll selesai. Hal ini sangat penting untuk melihat tampilan kecepatan refresh tinggi, karena dapat terjadi lebih sering dari 60 kali per detik atau pada kecepatan variabel.
  • BufferQueue: Bagian ini menampilkan jumlah buffer frame yang dimasukkan ke dalam antrean dan menunggu SurfaceFlinger digunakan. Untuk aplikasi yang di-deploy ke perangkat yang menjalankan Android 9 (API level 28) atau yang lebih tinggi, jalur ini menunjukkan jumlah buffer platform aplikasi BufferQueue (0, 1, atau 2). BufferQueue dapat membantu Anda memahami status buffer gambar saat beralih antar-komponen grafis Android. Misalnya, nilai 2 berarti aplikasi saat ini memiliki tiga buffer, yang menghasilkan latensi input tambahan.

Bagian Display memberikan sinyal yang berguna untuk mendeteksi potensi jank— misalnya, saat UI thread atau RenderThread memerlukan waktu lebih dari 16 md. Untuk menyelidiki detail pasti tentang penyebab jank, Anda dapat memeriksa bagian Threads, yang menampilkan thread yang relevan dengan rendering UI.

Bagian Threads pada Display

Pada gambar di atas, bagian Threads menampilkan UI thread (java.com.google.samples.apps.iosched), RenderThread, dan thread GPU completion. Ini adalah thread yang relevan dengan rendering UI dan dapat berkontribusi untuk jank.

Untuk mendeteksi jank di Android 10 atau yang lebih rendah, ikuti langkah berikut:

  1. Lihat jalur Frames di Display. Frame merah adalah kandidat untuk diselidiki.

    Bagian Frames pada Display

  2. Setelah menemukan frame yang berpotensi mengalami jank, perbesar dengan menekan W atau men-scroll roda mouse sambil menahan Control (Command di macOS). Lanjutkan memperbesar hingga Anda mulai melihat peristiwa perekaman aktivitas di UI thread dan RenderThread.

    Peristiwa rekaman aktivitas di UI thread dan RenderThread

    Pada gambar di atas, Choreographer#doFrame ditampilkan saat UI thread memanggil Choreographer untuk mengoordinasikan animasi, tata letak tampilan, gambar, dan proses terkait. DrawFrames ditampilkan saat RenderThread membentuk dan mengeluarkan perintah menggambar yang sebenarnya ke GPU.

  3. Jika melihat peristiwa rekaman aktivitas yang sangat panjang, Anda dapat memperbesar lebih lanjut dan mencari tahu hal-hal yang mungkin menyebabkan rendering lambat. Gambar di atas menunjukkan inflate dalam UI thread, yang berarti aplikasi menghabiskan waktu untuk meng-inflate tata letak. Saat memperbesar salah satu peristiwa inflate, Anda dapat mengetahui secara tepat waktu yang diperlukan setiap komponen UI, seperti yang ditunjukkan di bawah ini.

    Menu yang menunjukkan durasi tepat komponen UI

Pelajari lebih lanjut

Untuk mempelajari cara mengurangi jank lebih lanjut, lihat Sumber umum jank.