Debug ANR

Memecahkan masalah ANR di game Unity Anda adalah proses yang sistematis:

Gambar 1. Langkah-langkah untuk memecahkan masalah ANR di game Unity.

Mengintegrasikan layanan pelaporan

Layanan pelaporan seperti Android vitals, Firebase Crashlytics, dan Backtrace (partner Unity bersertifikasi) menyediakan analisis dan logging error untuk game Anda dalam skala besar. Integrasikan SDK layanan pelaporan ke dalam game Anda pada awal siklus pengembangan. Analisis layanan pelaporan mana yang paling sesuai dengan kebutuhan dan anggaran game Anda.

Layanan pelaporan yang berbeda memiliki cara yang berbeda untuk menangkap ANR. Sertakan layanan pelaporan kedua untuk meningkatkan peluang mendapatkan data yang valid guna mendukung keputusan Anda dalam memperbaiki ANR.

Mengintegrasikan SDK pelaporan tidak memengaruhi performa game atau ukuran APK.

Menganalisis simbol

Analisis laporan dari layanan pelaporan Anda dan periksa apakah pelacakan tumpukan dalam format yang dapat dibaca manusia. Lihat Membuat simbolisasi error dan ANR Android untuk game Unity untuk mengetahui informasi selengkapnya.

Gambar 2. Crashlytics menampilkan ID build dan simbol libil2cpp.so yang tidak ada.

Cara memeriksa ID build simbol

Jika sistem pelaporan menampilkan ID build yang tidak ada, tetapi simbol build masih ada di penyimpanan mesin build, Anda dapat memeriksa ID build simbol, lalu menguploadnya ke layanan pelaporan. Jika tidak, build baru diperlukan untuk mengupload file simbol.

Di Windows atau macOS:

  1. Buka folder simbol berdasarkan backend pembuatan skrip Anda (lihat Resolusi:)
    1. Gunakan perintah berikut (di Windows, gunakan Cygwin untuk menjalankan utilitas readelf)
    2. Penggunaan Grep bersifat opsional untuk memfilter output teks
    3. Cari ID Build
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Memeriksa kode game

Jika pelacakan tumpukan menampilkan fungsi di library libil2cpp.so, error terjadi dalam kode C#, yang dikonversi ke C++. Library libil2cpp.so tidak hanya memiliki kode game Anda, tetapi juga plugin dan paket.

Nama file C++ mengikuti nama assembly yang ditentukan dalam project Unity. Jika tidak, nama file akan memiliki nama Assembly-C# default. Misalnya, gambar 3 menampilkan error pada file Game.cpp (ditandai dengan warna biru), yang merupakan nama yang ditentukan dalam file Definisi Assembly. Logger adalah nama class (ditandai dengan warna merah) dalam skrip C#, diikuti dengan nama fungsi (ditandai dengan warna hijau). Terakhir adalah nama lengkap yang dihasilkan konverter IL2CPP (ditandai dengan warna oranye).

Gambar 3. Tumpukan panggilan project pengujian dari Backtrace.

Periksa kode game Anda dengan melakukan hal berikut:

  • Periksa project C# untuk menemukan kode yang mencurigakan. Biasanya, pengecualian yang tidak tertangani C# tidak menyebabkan ANR atau error aplikasi. Meski demikian, pastikan kode berjalan dengan benar dalam situasi yang berbeda. Periksa apakah kode menggunakan modul mesin pihak ketiga, dan analisis apakah rilis terbaru menyebabkan error. Selain itu, tinjau apakah Anda baru-baru ini mengupdate Unity atau apakah error hanya terjadi pada perangkat tertentu.
  • Ekspor game sebagai project Android Studio. Dengan akses lengkap ke kode sumber C# yang dikonversi dari game, Anda dapat menemukan fungsi yang menyebabkan ANR. Kode C++ terlihat sangat berbeda dari kode C# Anda, dan konversi kode jarang mengalami masalah. Jika Anda menemukan sesuatu, ajukan tiket dukungan ke Unity.
  • Tinjau kode sumber game dan pastikan logika apa pun yang berjalan di callback OnApplicationFocus() dan OnApplicationPause() dibersihkan dengan benar.
    • Mesin Unity memiliki waktu tunggu untuk menjeda eksekusinya; beban kerja yang berlebihan pada callback ini dapat menyebabkan ANR.
    • Tambahkan log atau breadcrumb ke bagian kode untuk meningkatkan analisis data Anda.
  • Gunakan Unity Profiler untuk menyelidiki performa game's. Membuat profil aplikasi Anda juga dapat menjadi cara yang bagus untuk membantu mengidentifikasi bottleneck yang mungkin menyebabkan ANR.
  • Cara yang bagus untuk mengidentifikasi operasi I/O yang panjang di thread utama adalah dengan menggunakan mode ketat.
  • Analisis histori Android Vitals atau layanan pelaporan lainnya dan periksa versi rilis game yang paling sering mengalami error. Tinjau kode sumber Anda dalam histori kontrol versi dan bandingkan perubahan kode antar-rilis. Jika Anda menemukan sesuatu yang mencurigakan, lakukan eksperimen dengan setiap perubahan atau potensi perbaikan secara terpisah.
  • Periksa histori pelaporan ANR Google Play untuk perangkat dan versi Android yang paling banyak menerima ANR. Jika perangkat atau versi sudah tidak berlaku, kemungkinan Anda dapat mengabaikannya dengan aman jika tindakan tersebut tidak memengaruhi profitabilitas game. Pelajari data dengan cermat karena grup pengguna tertentu tidak akan dapat lagi memainkan game Anda. Untuk mengetahui informasi selengkapnya, lihat Dasbor distribusi.
  • Tinjau kode sumber game untuk memastikan Anda tidak memanggil kode apa pun yang dapat menyebabkan masalah, misalnya, finish dapat merusak jika tidak digunakan dengan benar. Lihat panduan developer Android untuk mempelajari pengembangan Android lebih lanjut.
  • Setelah meninjau data dan mengekspor build game ke Android Studio, Anda akan berurusan dengan kode C dan C++, sehingga dapat memanfaatkan sepenuhnya alat di luar solusi standar Unity, seperti Android Memory Profiler, Android CPU Profiler, dan perfetto.

Kode mesin Unity

Untuk mengetahui apakah ANR terjadi di sisi mesin Unity, periksa libUnity.so atau libMain.so dalam pelacakan tumpukan. Jika Anda menemukannya, lakukan langkah-langkah berikut:

  • Pertama, telusuri saluran komunitas (Forum Unity, Diskusi Unity, Stackoverflow).
  • Jika Anda tidak menemukan apa pun, ajukan bug untuk menyelesaikan masalah. Berikan pelacakan tumpukan yang disimbolkan agar engineer mesin dapat lebih memahami dan menyelesaikan error.
  • Periksa apakah Unity LTS terbaru telah melakukan peningkatan terkait masalah Anda. Jika ya, upgrade game Anda untuk menggunakan versi tersebut. (Solusi ini mungkin hanya dapat dilakukan untuk beberapa developer.)
  • Jika kode Anda menggunakan Activity kustom, bukan default, tinjau kode Java untuk memastikan aktivitas tidak menyebabkan masalah apa pun.

SDK pihak ketiga

  • Pastikan semua library pihak ketiga sudah yang terbaru dan tidak memiliki laporan error atau ANR untuk versi Android terbaru.
  • Buka Forum Unity untuk melihat apakah error telah diselesaikan dalam versi yang lebih baru atau apakah solusi telah disediakan oleh Unity atau anggota komunitas.
  • Tinjau laporan ANR Google Play dan pastikan error belum diidentifikasi oleh Google. Google mengetahui beberapa ANR dan aktif berupaya memperbaikinya.

Library sistem

Library sistem biasanya berada di luar kontrol developer, tetapi tidak mewakili persentase ANR yang signifikan. Selain menghubungi developer library atau menambahkan log untuk mempersempit masalah, ANR library sistem sulit diselesaikan.

Alasan keluar

ApplicationExitInfo adalah Android API untuk memahami penyebab ANR. Jika game Anda menggunakan Unity 6 atau yang lebih baru Anda dapat memanggil ApplicationExitInfo secara langsung. Untuk versi Unity yang lebih lama, Anda harus menerapkan plugin sendiri untuk mengaktifkan panggilan ApplicationExitInfo dari Unity.

Crashlytics juga menggunakan ApplicationExitInfo; namun, penerapan Anda sendiri memberi Anda kontrol yang lebih baik dan memungkinkan Anda menyertakan informasi yang lebih relevan.