Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menulis dan Melihat Log dengan Logcat

Jendela Logcat di Android Studio menampilkan pesan sistem, seperti kapan pembersihan sampah memori dilakukan, dan pesan yang telah Anda tambahkan ke aplikasi dengan class Log. Jendela ini menampilkan pesan secara real time dan menyimpan histori sehingga Anda dapat melihat pesan yang lebih lama.

Untuk menampilkan informasi yang diminati saja, Anda dapat membuat filter, memodifikasi banyaknya informasi yang ditampilkan dalam pesan, menetapkan tingkat prioritas, menampilkan pesan yang dihasilkan oleh kode aplikasi saja, dan menelusuri log. Secara default, logcat menampilkan output log yang terkait dengan aplikasi yang baru saja dijalankan.

Saat aplikasi menampilkan pengecualian, logcat menampilkan pesan yang diikuti dengan pelacakan tumpukan terkait yang berisi link ke baris kode.

Mulai Android Studio 2.2, jendela Run juga menampilkan pesan log untuk aplikasi yang sedang berjalan. Perhatikan bahwa Anda dapat mengonfigurasi tampilan output logcat, tetapi tidak untuk jendela Run.

Melihat log aplikasi Anda

Untuk menampilkan pesan log sebuah aplikasi:

  1. Buat dan jalankan aplikasi Anda di perangkat.
  2. Klik View > Tool Windows > Logcat (atau klik Logcat di panel jendela alat).

Jendela Logcat menampilkan pesan log untuk aplikasi yang dipilih, seperti yang dipilih dari daftar drop-down di bagian atas jendela, sebagaimana ditunjukkan pada gambar 1.

Gambar 1. Jendela Logcat

Secara default, logcat hanya menampilkan pesan log untuk aplikasi yang sedang berjalan di perangkat. Untuk mengubah perilaku default ini, lihat cara memfilter pesan logcat.

Toolbar Logcat menyediakan tombol-tombol berikut:

  1. Clear logcat : Klik untuk menghapus log yang terlihat.
  2. Scroll to the end : Klik untuk melompat ke bagian bawah log dan melihat pesan log terbaru. Jika Anda kemudian mengklik sebuah baris dalam log, tampilan akan menjeda scroll pada titik itu.
  3. Up the stack trace dan Down the stack trace : Klik untuk menavigasi pelacakan tumpukan naik dan turun dalam log, yang akan memilih nama file berikutnya (dan melihat nomor baris terkaitnya di editor) yang muncul dalam pengecualian tercetak. Perilaku ini sama dengan ketika Anda mengklik nama file dalam log.
  4. Use soft wraps : Klik untuk mengaktifkan penggabungan baris dan mencegah scrolling horizontal (tetapi string yang tidak dapat dipecah tetap memerlukan scrolling horizontal).
  5. Print : Klik untuk mencetak pesan logcat. Setelah memilih preferensi cetak dalam dialog yang ditampilkan, Anda juga dapat memilih untuk menyimpannya ke PDF.
  6. Restart : Klik untuk menghapus log dan memulai ulang logcat. Tidak seperti tombol Clear logcat, tindakan ini akan memulihkan dan menampilkan pesan log sebelumnya, jadi sangat berguna jika Logcat menjadi tidak responsif dan Anda tidak ingin kehilangan pesan log.
  7. Logcat header : Klik untuk membuka dialog Configure Logcat Header, tempat Anda dapat menyesuaikan tampilan setiap pesan logcat, seperti apakah akan menampilkan tanggal dan waktu atau tidak.
  8. Tangkapan layar : Klik untuk mengambil screenshot.
  9. Rekaman layar : Klik untuk merekam video perangkat (selama maksimum 3 menit).

Menulis pesan log

Class Log memungkinkan Anda membuat pesan log yang ditampilkan di logcat. Biasanya, Anda harus menggunakan metode log berikut, yang diurutkan dari prioritas paling tinggi ke paling rendah (atau dari yang paling tidak verbose ke yang paling verbose):

Lihat deskripsi class Log untuk daftar opsi yang lebih lengkap.

Anda tidak boleh mengompilasi log verbose ke dalam aplikasi, kecuali selama pengembangan. Log debug dikompilasi tetapi dihilangkan pada waktu proses, sementara log error, peringatan, dan info selalu disimpan.

Untuk setiap metode log, parameter pertama harus berupa tag unik dan parameter kedua harus berupa pesan. Tag pesan log sistem adalah string singkat yang menunjukkan komponen sistem dari mana pesan berasal (misalnya ActivityManager ). Tag Anda dapat berupa string apa pun yang menurut Anda bermanfaat, seperti nama class saat ini.

Akan lebih baik jika Anda mendeklarasikan konstanta TAG dalam class Anda untuk digunakan pada parameter pertama. Misalnya, Anda dapat membuat pesan log informasi seperti berikut:

Kotlin

private const val TAG = "MyActivity"
...
Log.i(TAG, "MyClass.getView() — get item number $position")

Java

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);

Catatan: Nama tag yang lebih dari 23 karakter akan terpotong dalam output logcat.

Format pesan Logcat

Setiap pesan log Android memiliki tag dan prioritas yang terkait dengannya. Tag pesan log sistem adalah string singkat yang menunjukkan komponen sistem dari mana pesan berasal (misalnya, ActivityManager). Tag yang ditentukan pengguna dapat berupa string apa pun yang menurut Anda bermanfaat, seperti nama class saat ini (tag yang direkomendasikan). Anda menetapkan tag ini dalam panggilan metode Log, misalnya:

Kotlin

Log.d(tag, message)

Java

Log.d(tag, message);

Prioritasnya adalah salah satu dari nilai berikut:

  • V: Verbose (prioritas terendah)
  • D: Debug
  • I: Info
  • W: Warning
  • E: Error
  • A: Assert

Format pesan log adalah:

date time PID-TID/package priority/tag: message

Misalnya, pesan log berikut memiliki prioritas V dan tag AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

PID singkatan dari process identifier (ID proses) dan TID adalah singkatan dari thread identifier (ID thread); keduanya bisa sama jika hanya ada satu thread.

Menetapkan level log

Anda dapat mengontrol banyaknya pesan yang ditampilkan di logcat dengan menetapkan level log. Anda dapat menampilkan semua pesan, atau hanya pesan yang menunjukkan kondisi paling parah.

Ingat bahwa logcat terus mengumpulkan semua pesan terlepas dari setelan level log Anda. Setelan ini hanya menentukan apa yang ditampilkan oleh logcat.

Pada menu Log level, pilih salah satu nilai berikut:

  • Verbose: Menampilkan semua pesan log (default).
  • Debug: Menampilkan pesan log debug yang berguna selama pengembangan saja, serta level pesan yang lebih rendah dalam daftar ini.
  • Info: Menampilkan pesan log yang diharapkan untuk penggunaan reguler, serta level pesan yang lebih rendah dalam daftar ini.
  • Warn: Menampilkan kemungkinan masalah yang belum menjadi error, serta level pesan yang lebih rendah dalam daftar ini.
  • Error: Menampilkan masalah yang mengakibatkan error, serta level pesan yang lebih rendah dalam daftar ini.
  • Assert: Menampilkan masalah yang kejadiannya tidak pernah diharapkan oleh developer.

Menelusuri pesan logcat

Untuk menelusuri pesan yang saat ini ditampilkan di logcat:

  1. Atau, pilih Regex jika Anda ingin menggunakan pola penelusuran ekspresi reguler.
  2. Ketikkan rangkaian karakter dalam kolom penelusuran .

    Tampilan output logcat berubah sesuai penelusuran Anda.

  3. Tekan Enter untuk menyimpan string penelusuran di menu selama sesi.
  4. Untuk mengulangi penelusuran, pilih string dari menu penelusuran. Pilih atau batalkan pilih Regex sesuai yang diperlukan (setelan ini tidak diingat).

Memfilter pesan logcat

Salah satu cara untuk mengurangi output log ke tingkat yang mudah dikelola adalah dengan membatasinya menggunakan filter.

Catatan: Filter berlaku pada histori logcat lengkap, bukan hanya pada pesan yang saat ini ditampilkan di logcat. Pastikan opsi tampilan yang lain disetel dengan tepat sehingga Anda dapat melihat output filter yang ingin diperiksa.

Untuk menetapkan dan menerapkan filter:

  1. Pada menu filter, pilih sebuah opsi filter:
    • Show only selected application: Hanya menampilkan pesan yang dihasilkan oleh kode aplikasi (default). Logcat memfilter pesan log menggunakan PID aplikasi aktif.
    • No Filters: Filter tidak diterapkan. Logcat menampilkan semua pesan log dari perangkat, mana pun proses yang Anda pilih.
    • Edit Filter Configuration: Membuat atau memodifikasi filter kustom. Misalnya, Anda dapat membuat filter untuk menampilkan pesan log dari dua aplikasi secara bersamaan.

    Setelah menetapkan filter, Anda juga dapat memilihnya pada menu. Untuk menghapus filter dari menu, lakukan secara langsung.

  2. Jika Anda memilih Edit Filter Configuration, buat atau modifikasi filter:
    1. Tetapkan parameter filter dalam dialog Create New Logcat Filter:
      • Filter Name: Ketik nama filter yang ingin Anda tetapkan, atau pilih di panel kiri untuk memodifikasi filter yang ada. Nama hanya boleh berisi karakter huruf kecil, garis bawah, dan angka.
      • Log Tag: Opsional, menetapkan tag. Untuk informasi selengkapnya, lihat Format Pesan logcat.
      • Log Message: Opsional, menetapkan teks pesan log. Untuk informasi selengkapnya, lihat Format Pesan logcat.
      • Package Name: Opsional, menetapkan nama paket. Untuk informasi selengkapnya, lihat Format Pesan logcat.
      • PID: Opsional, menetapkan ID proses. Untuk informasi selengkapnya, lihat Format Pesan logcat.
      • Log Level: Opsional, memilih level log. Untuk informasi selengkapnya, lihat Menetapkan Level Log.
      • Regex: Pilih opsi ini untuk menggunakan sintaks ekspresi reguler untuk parameter tersebut.
    2. Klik + untuk menambahkan definisi filter ke panel kiri.

      Untuk menghapus filter, pilih filter di panel kiri dan klik -.

    3. Setelah selesai, klik OK.

Jika Anda tidak melihat pesan log yang diinginkan, cobalah memilih No filters dan lakukan penelusuran pesan log tertentu.

Membaca pesan pembersihan sampah memori

Kadang-kadang, saat pembersihan sampah memori terjadi, peristiwa tersebut dicetak ke logcat.

Untuk detail lebih lanjut tentang memori aplikasi Anda, gunakan Memory Profiler.

Pesan log Dalvik

Pada Dalvik (tetapi tidak pada ART), setiap GC mencetak informasi berikut ke logcat:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

Contoh:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
Alasan GC
Apa yang memicu GC dan pembersihan sampah memori jenis apa itu. Alasan yang mungkin muncul meliputi:
GC_CONCURRENT
GC serentak yang mengosongkan memori saat heap Anda nyaris penuh.
GC_FOR_MALLOC
GC dipicu karena aplikasi Anda mencoba mengalokasikan memori saat heap telah penuh, sehingga sistem harus menghentikan aplikasi dan memperoleh kembali memori.
GC_HPROF_DUMP_HEAP
GC yang terjadi saat Anda meminta pembuatan file HPROF untuk menganalisis heap Anda.
GC_EXPLICIT
GC eksplisit, misalnya saat Anda memanggil gc() (yang seharusnya tidak Anda panggil dan sebagai gantinya mempercayai GC untuk dijalankan jika diperlukan).
GC_EXTERNAL_ALLOC
Ini hanya terjadi pada API level 10 dan yang lebih rendah (versi yang lebih baru mengalokasikan semuanya pada heap Dalvik). GC untuk memori yang dialokasikan secara eksternal (seperti data piksel yang disimpan dalam memori native atau buffer byte NIO).
Jumlah yang dibebaskan
Jumlah memori yang dapat diperoleh kembali dari GC ini.
Statistik heap
Persentase heap yang dibebaskan dan (jumlah objek aktif)/(total ukuran heap).
Statistik memori eksternal
Memori yang dialokasikan secara eksternal pada API level 10 dan yang lebih rendah (jumlah memori yang dialokasikan) / (batas terjadinya pembersihan sampah memori).
Waktu jeda
Heap yang lebih besar akan memiliki waktu jeda lebih banyak. Waktu jeda serentak menampilkan dua jeda: satu di awal pembersihan dan satu lagi menjelang akhir pembersihan.

Saat pesan log ini terkumpul, waspadai peningkatan statistik heap (nilai 3571K/9991K dalam contoh di atas). Jika nilai ini terus meningkat, Anda mungkin mengalami kebocoran memori.

Pesan log ART

Tidak seperti Dalvik, ART tidak mencatat log pesan untuk GC yang tidak diminta secara eksplisit. GC hanya dicetak jika dianggap lambat. Lebih tepatnya, GC dicetak hanya jika jeda GC melebihi 5 milidetik atau durasi GC melebihi 100 milidetik. Jika aplikasi tidak dalam kondisi jeda yang terasa (misalnya saat aplikasi berjalan di latar belakang, di mana pengguna tidak dapat merasakan jeda GC), maka tidak ada GC yang dianggap lambat. GC eksplisit selalu dicatat ke log.

ART menyertakan informasi berikut dalam pesan log pembersihan sampah memori:

I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects,
    Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

Contoh:

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects,
    21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms
Alasan GC
Apa yang memicu GC dan pembersihan sampah memori jenis apa itu. Alasan yang mungkin muncul meliputi:
Concurrent
GC serentak yang tidak menangguhkan thread aplikasi. GC ini berjalan di thread latar belakang dan tidak mencegah alokasi.
Alloc
GC ini dimulai karena aplikasi Anda mencoba mengalokasikan memori saat heap sudah penuh. Dalam kasus ini, pembersihan sampah memori terjadi di thread pengalokasi.
Explicit
Pembersihan sampah memori diminta secara eksplisit oleh aplikasi, misalnya dengan memanggil gc() atau gc(). Seperti pada Dalvik, praktik terbaik pada ART adalah dengan memercayai GC dan menghindari permintaan GC eksplisit, jika memungkinkan. GC eksplisit tidak dianjurkan karena memblokir thread pengalokasi dan memboroskan putaran CPU secara sia-sia. GC eksplisit juga dapat menyebabkan jank (aplikasi tersendat, bergetar, atau terhenti) jika GC itu menyebabkan tertundanya eksekusi thread lain.
NativeAlloc
Pembersihan sampah memori disebabkan oleh tekanan memori native dari alokasi native seperti objek alokasi Bitmap atau RenderScript.
CollectorTransition
Pembersihan sampah memori disebabkan oleh transisi heap; peristiwa ini disebabkan oleh berubahnya strategi GC pada waktu proses (misalnya saat aplikasi beralih antara status jeda yang terasa). Transisi pembersih sampah memori meliputi menyalin semua objek dari ruang yang didukung daftar-bebas ke ruang bump pointer (atau sebaliknya).

Ini hanya terjadi pada perangkat dengan RAM rendah sebelum Android 8.0 saat aplikasi mengubah status proses dari kondisi jeda yang terasa (misalnya saat aplikasi berjalan di latar depan, di mana pengguna dapat merasakan jeda GC) ke kondisi jeda yang tidak terasa (atau sebaliknya).

HomogeneousSpaceCompact
Pemadatan ruang homogen adalah pemadatan ruang daftar-bebas ke ruang daftar-bebas yang biasanya terjadi saat sebuah aplikasi dipindahkan ke kondisi jeda proses yang tidak terasa. Alasan utama melakukannya adalah untuk mengurangi penggunaan RAM dan mendefragmentasi heap.
DisableMovingGc
Ini bukan alasan GC yang sebenarnya, melainkan catatan bahwa pembersihan sampah memori diblokir karena adanya penggunaan GetPrimitiveArrayCritical. selagi pemadatan heap serentak sedang berlangsung. Secara umum, penggunaan GetPrimitiveArrayCritical sangat tidak dianjurkan karena membatasi pembersih sampah memori yang terus bergerak.
HeapTrim
Ini bukan alasan GC, melainkan catatan bahwa pembersihan sampah memori diblokir hingga pemangkasan heap selesai.
Nama GC
ART memiliki beragam GC yang dapat dijalankan.
Concurrent mark sweep (CMS)
Pembersih heap keseluruhan yang membersihkan semua ruang selain ruang image.
Concurrent partial mark sweep
Pembersih heap nyaris keseluruhan yang membersihkan semua ruang selain ruang gambar dan zygote.
Concurrent sticky mark sweep
Pembersih generasional yang hanya dapat membebaskan objek yang dialokasikan sejak GC terakhir. Pembersihan sampah memori ini dijalankan lebih sering dibandingkan mark sweep penuh atau sebagian karena prosesnya lebih cepat dan memiliki jeda lebih sedikit.
Marksweep + semispace
GC penyalin tidak serentak yang digunakan untuk transisi heap serta pemadatan ruang homogen (untuk mendefragment heap).
Objek yang dibebaskan
Jumlah objek yang diperoleh kembali melalui GC ini dari ruang objek yang tidak berukuran besar.
Ukuran yang dibebaskan
Jumlah byte yang diperoleh kembali melalui GC ini dari ruang objek yang tidak berukuran besar.
Objek besar yang dibebaskan
Jumlah objek dalam ruang objek besar yang diperoleh kembali melalui pembersihan sampah memori ini.
Ukuran objek besar yang dibebaskan
Jumlah byte dalam ruang objek besar yang diperoleh kembali melalui pembersihan sampah memori ini.
Statistik heap
Persentase yang dibebaskan dan (jumlah objek aktif)/(total ukuran heap).
Waktu jeda
Biasanya, waktu jeda berbanding lurus dengan jumlah referensi objek yang diubah selama GC berjalan. Saat ini, GC ART CMS hanya memiliki satu kali jeda, menjelang akhir GC. GC yang terus bergerak memiliki jeda panjang yang berlangsung hampir sepanjang durasi GC.

Jika Anda melihat GC yang banyak sekali pada logcat, waspadai kenaikan statistik heap (nilai 25MB/38MB dalam contoh di atas). Jika nilai ini terus meningkat dan tidak ada tanda-tanda berkurang, Anda mungkin mengalami kebocoran memori. Atau, jika Anda melihat GC karena alasan "Alloc", berarti Anda sudah beroperasi mendekati kapasitas heap dan akan menerima pengecualian OOM dalam waktu dekat.