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,
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.
Klik di mana saja dalam linimasa CPU untuk membuka CPU Profiler.
Pilih System Trace dari menu konfigurasi di CPU Profiler dan klik Record. Setelah selesai berinteraksi dengan aplikasi Anda, klik Stop.
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.
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.
Jika ingin, Anda dapat melihat semua frame atau pengelompokan waktu rendering dengan mengalihkan kotak centang All Frames dan Lifecycle.
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 berisi nama lapisan dan empat jalur. Setiap jalur mewakili satu tahap dalam pipeline rendering frame. Elemen Frame Lifecycle adalah sebagai berikut:
- Frame Lifecycle (Nama lapisan): Judul bagian berisi nama lapisan dalam tanda kurung. Lapisan adalah satu unit komposisi.
- 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
. - 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.
- Composition: Jalur ini menunjukkan waktu mulai dari saat SurfaceFlinger mengait ke buffer dan mengirimnya untuk komposisi, hingga saat buffer dikirim ke tampilan.
- 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.
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:
Urutkan tabel All Frames berdasarkan kolom Application dalam urutan menurun, sehingga frame yang memerlukan waktu terlama muncul terlebih dahulu.
Temukan frame yang berjalan paling lama dan pilih baris tabel. Tindakan ini akan memperbesar frame yang dipilih pada tampilan linimasa di sebelah kiri.
Cari thread yang relevan di 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.
- 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
, atau2
). BufferQueue dapat membantu Anda memahami status buffer gambar saat beralih antar-komponen grafis Android. Misalnya, nilai2
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.
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:
Lihat jalur Frames di Display. Frame merah adalah kandidat untuk diselidiki.
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 danRenderThread
.Pada gambar di atas,
Choreographer#doFrame
ditampilkan saat UI thread memanggilChoreographer
untuk mengoordinasikan animasi, tata letak tampilan, gambar, dan proses terkait.DrawFrames
ditampilkan saatRenderThread
membentuk dan mengeluarkan perintah menggambar yang sebenarnya ke GPU.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 peristiwainflate
, Anda dapat mengetahui secara tepat waktu yang diperlukan setiap komponen UI, seperti yang ditunjukkan di bawah ini.
Pelajari lebih lanjut
Untuk mempelajari cara mengurangi jank lebih lanjut, lihat Sumber umum jank.