Pahami error pada game Unity menggunakan fitur Crashlytics tingkat lanjut

1. Perkenalan

Dalam codelab ini, Anda akan mempelajari cara menggunakan fitur lanjutan Crashlytics yang akan memberi Anda visibilitas lebih baik mengenai error dan keadaan yang mungkin menyebabkan error tersebut.

Anda akan menambahkan fungsi baru ke contoh game, MechaHamster: Naik Level dengan Firebase Edition . Contoh game ini adalah versi baru dari game Firebase klasik MechaHamster yang menghapus sebagian besar fungsi Firebase bawaannya, sehingga memberi Anda peluang untuk menerapkan penggunaan baru Firebase sebagai gantinya.

Anda akan menambahkan menu debug ke game. Menu debug ini memanggil metode yang akan Anda buat dan memungkinkan Anda menggunakan berbagai fungsi Crashlytics. Metode ini akan menunjukkan kepada Anda cara membuat anotasi laporan kerusakan otomatis dengan kunci khusus, log khusus, kesalahan nonfatal, dan banyak lagi.

Setelah membuat game, Anda akan menggunakan menu debug, dan memeriksa hasilnya untuk memahami tampilan unik yang diberikannya tentang cara game Anda berjalan di alam liar.

Apa yang akan Anda pelajari

  • Jenis kesalahan yang ditangkap secara otomatis oleh Crashlytics.
  • Kesalahan tambahan yang dapat dicatat dengan sengaja.
  • Bagaimana cara menambahkan lebih banyak informasi pada kesalahan ini agar lebih mudah dipahami.

Apa yang Anda perlukan

  • Unity (Rekomendasi Minimum Versi 2019+) dengan salah satu atau kedua hal berikut:
    • Dukungan Pembuatan iOS
    • Dukungan Pembuatan Android
  • (Khusus Android) Firebase CLI (digunakan untuk mengupload simbol laporan kerusakan)

2. Siapkan lingkungan pengembangan Anda

Bagian berikut menjelaskan cara mendownload Level Up dengan kode Firebase dan membukanya di Unity.

Perhatikan bahwa contoh game Naik Level dengan Firebase ini digunakan oleh beberapa codelab Firebase + Unity lainnya, jadi Anda mungkin sudah menyelesaikan tugas di bagian ini. Jika sudah, Anda bisa langsung menuju ke langkah terakhir di halaman ini: "Tambahkan Firebase SDK untuk Unity".

Unduh kodenya

Kloning repositori GitHub codelab ini dari baris perintah:

git clone https://github.com/firebase/level-up-with-firebase.git

Alternatifnya, jika Anda belum menginstal git, Anda dapat mengunduh repositori sebagai file ZIP .

Buka Level Up dengan Firebase di editor Unity

  1. Luncurkan Unity Hub dan, dari tab Projects , klik panah dropdown di sebelah Open .
  2. Klik Tambahkan proyek dari disk .
  3. Navigasikan ke direktori yang berisi kode tersebut, lalu klik OK .
  4. Jika diminta, pilih versi editor Unity yang akan digunakan dan platform target Anda (Android atau iOS).
  5. Klik pada nama proyek, level-up-with-firebase , dan proyek akan terbuka di editor Unity.
  6. Jika editor Anda tidak membukanya secara otomatis, buka MainGameScene di Assets > Hamster di tab Project pada Unity Editor.
    ff4ea3f3c0d29379.png

Untuk informasi selengkapnya tentang menginstal dan menggunakan Unity, lihat Bekerja di Unity .

3. Tambahkan Firebase ke proyek Unity Anda

Buat proyek Firebase

  1. Di Firebase console , klik Tambahkan proyek .
  2. Untuk membuat proyek baru, masukkan nama proyek yang diinginkan.
    Ini juga akan mengatur ID proyek (ditampilkan di bawah nama proyek) menjadi sesuatu berdasarkan nama proyek. Anda juga dapat mengklik ikon edit pada ID proyek untuk menyesuaikannya lebih lanjut.
  3. Jika diminta, tinjau dan setujui persyaratan Firebase .
  4. Klik Lanjutkan .
  5. Pilih opsi Aktifkan Google Analytics untuk proyek ini , lalu klik Lanjutkan .
  6. Pilih akun Google Analytics yang ada untuk digunakan atau pilih Buat akun baru untuk membuat akun baru.
  7. Klik Buat proyek .
  8. Ketika proyek telah dibuat, klik Lanjutkan .

Daftarkan aplikasi Anda ke Firebase

  1. Masih di Firebase console , dari tengah halaman ikhtisar proyek, klik ikon Unity untuk meluncurkan alur kerja penyiapan atau, jika Anda sudah menambahkan aplikasi ke proyek Firebase, klik Tambahkan aplikasi untuk menampilkan opsi platform.
  2. Pilih untuk mendaftarkan target build Apple (iOS) dan Android.
  3. Masukkan ID khusus platform proyek Unity Anda. Untuk codelab ini, masukkan kode berikut:
    • Untuk Apple (iOS) : Masukkan com.google.firebase.level-up di kolom ID paket iOS .
    • Untuk Android : Masukkan com.google.firebase.level_up di kolom nama paket Android .
  4. (Opsional) Masukkan nama panggilan khusus platform proyek Unity Anda.
  5. Klik Daftarkan aplikasi , lalu lanjutkan ke bagian Unduh file konfigurasi .

Tambahkan file konfigurasi Firebase

Setelah mengklik Daftarkan aplikasi , Anda akan diminta untuk mengunduh dua file konfigurasi (satu file konfigurasi untuk setiap target build). Proyek Unity Anda memerlukan metadata Firebase dalam file ini untuk terhubung dengan Firebase.

  1. Unduh kedua file konfigurasi yang tersedia:
    • Untuk Apple (iOS) : Unduh GoogleService-Info.plist .
    • Untuk Android : Unduh google-services.json .
  2. Buka jendela Project proyek Unity Anda, lalu pindahkan kedua file konfigurasi ke dalam folder Assets .
  3. Kembali ke Firebase console, di alur kerja penyiapan, klik Berikutnya dan lanjutkan ke Tambahkan Firebase SDK untuk Unity.

Tambahkan Firebase SDK untuk Unity

  1. Klik Unduh Firebase Unity SDK di Firebase console.
  2. Buka zip SDK di tempat yang nyaman.
  3. Di Proyek Unity terbuka Anda, navigasikan ke Assets > Import Package > Custom Package .
  4. Dalam dialog Impor paket , navigasikan ke direktori yang berisi SDK yang belum di-zip, pilih FirebaseAnalytics.unitypackage , lalu klik Open .
  5. Dari dialog Impor Paket Unity yang muncul, klik Impor .
  6. Ulangi langkah sebelumnya untuk mengimpor FirebaseCrashlytics.unitypackage .
  7. Kembali ke Firebase console dan, di alur kerja penyiapan, klik Berikutnya .

Untuk informasi lebih lanjut tentang menambahkan Firebase SDK ke proyek Unity, lihat Opsi instalasi Unity tambahan .

4. Siapkan Crashlytics di proyek Unity Anda

Untuk menggunakan Crashlytics di proyek Unity, Anda perlu melakukan beberapa langkah penyiapan lagi. Tentu saja, Anda harus menginisialisasi SDK. Namun, Anda juga harus mengupload simbol agar dapat melihat pelacakan tumpukan yang disimbolkan di Firebase console, dan Anda harus melakukan pengujian error secara paksa untuk memastikan bahwa Firebase menerima peristiwa error Anda.

Inisialisasi Crashlytics SDK

  1. Di Assets/Hamster/Scripts/MainGame.cs , tambahkan pernyataan using berikut:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    
    Modul pertama memungkinkan Anda menggunakan metode dari Crashlytics SDK dan modul kedua berisi beberapa ekstensi ke C# Tasks API . Tanpa keduanya using pernyataan kode berikut tidak akan berfungsi.
  2. Masih di MainGame.cs , tambahkan inisialisasi Firebase ke metode Start() yang ada dengan memanggil InitializeFirebaseAndStartGame() :
    void Start()
    {
      Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
      InitializeFirebaseAndStartGame();
    }
    
  3. Dan lagi, di MainGame.cs , temukan InitializeFirebaseAndStartGame() , deklarasikan variabel aplikasi, lalu timpa implementasi metode seperti ini:
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
      Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
      .ContinueWithOnMainThread(
        previousTask => 
        {
          var dependencyStatus = previousTask.Result;
          if (dependencyStatus == Firebase.DependencyStatus.Available) {
            // Create and hold a reference to your FirebaseApp,
            app = Firebase.FirebaseApp.DefaultInstance;
            // Set the recommended Crashlytics uncaught exception behavior.
            Crashlytics.ReportUncaughtExceptionsAsFatal = true;
            InitializeCommonDataAndStartGame();
          } else {
            UnityEngine.Debug.LogError(
              $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
              "Firebase Unity SDK is not safe to use here");
          }
        });
    }
    

Menempatkan logika inisialisasi di sini akan mencegah interaksi pemain sebelum dependensi Firebase diinisialisasi.

Manfaat dan dampak pelaporan pengecualian yang tidak tertangani sebagai fatal dibahas di FAQ Crashlytics .

Bangun proyek Anda dan unggah simbol

Langkah-langkah untuk membuat dan mengunggah simbol berbeda untuk aplikasi iOS dan Android.

iOS+ (platform Apple)

  1. Dari dialog Build Settings , ekspor proyek Anda ke ruang kerja Xcode.
  2. Bangun aplikasi Anda.
    Untuk platform Apple, plugin Firebase Unity Editor secara otomatis mengonfigurasi proyek Xcode Anda untuk menghasilkan dan mengunggah file simbol yang kompatibel dengan Crashlytics ke server Firebase untuk setiap build. Informasi simbol ini diperlukan untuk melihat pelacakan tumpukan yang disimbolkan di dasbor Crashlytics.

Android

  1. (hanya selama penyiapan awal, bukan untuk setiap build) Siapkan build Anda:
    1. Buat folder baru bernama Builds di akar direktori proyek Anda (misalnya, sebagai saudara dari direktori Aset Anda), lalu buat subfolder bernama Android .
    2. Di File > Build Settings > Player Settings > Configuration , atur Scripting Backend ke IL2CPP.
      • IL2CPP umumnya menyebabkan build menjadi lebih kecil dan memiliki performa lebih baik.
      • IL2CPP juga merupakan SATU-SATUNYA opsi yang tersedia di iOS dan memilihnya di sini memungkinkan kedua platform memiliki keseimbangan yang lebih baik dan membuat perbedaan proses debug di antara keduanya (jika Anda memilih untuk membangun keduanya) menjadi lebih sederhana.
  2. Bangun aplikasi Anda. Di File > Build Settings , selesaikan hal berikut:
    1. Pastikan Buat simbol.zip dicentang (atau jika disajikan dengan dropdown, pilih Debugging ).
    2. Bangun APK Anda langsung dari Unity Editor ke dalam sub-folder Builds/Android yang baru saja Anda buat.
  3. Setelah build selesai, Anda perlu membuat file simbol yang kompatibel dengan Crashlytics dan menguploadnya ke server Firebase. Informasi simbol ini diperlukan untuk melihat pelacakan tumpukan yang disimbolkan untuk error perpustakaan asli di dasbor Crashlytics.

    Buat dan unggah file simbol ini dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
    • FIREBASE_APP_ID : ID Aplikasi Android Firebase Anda (bukan nama paket Anda). Temukan nilai ini di file google-services.json yang Anda unduh sebelumnya. Ini adalah nilai mobilesdk_app_id .
      Contoh ID Aplikasi Android Firebase: 1:567383003300:android:17104a2ced0c9b9b
    • PATH/TO/SYMBOLS : jalur file simbol zip yang dihasilkan di direktori Builds/Android saat build Anda selesai (misalnya: Builds/Android/myapp-1.0-v100.symbols.zip ).

Paksa uji mogok untuk menyelesaikan penyiapan

Untuk menyelesaikan penyiapan Crashlytics dan melihat data awal di dasbor Crashlytics pada Firebase console, Anda perlu melakukan uji error secara paksa.

  1. Di MainGameScene temukan BlankObject GameObject di editor Hierarchy , tambahkan skrip berikut ke dalamnya dan kemudian simpan adegan tersebut. Skrip ini akan menyebabkan pengujian mogok beberapa detik setelah Anda menjalankan aplikasi.
    using System;
    using UnityEngine;
    
    public class CrashlyticsTester : MonoBehaviour {
        // Update is called once per frame
        void Update()
        {
            // Tests your Crashlytics implementation by
            // throwing an exception every 60 frames.
            // You should see reports in the Firebase console
            // a few minutes after running your app with this method.
            if(Time.frameCount >0 && (Time.frameCount%60) == 0)
            {
                throw new System.Exception("Test exception; please ignore");
            }
        }
    }
    
  2. Bangun aplikasi Anda dan unggah informasi simbol setelah pembangunan Anda selesai.
    • iOS : Plugin Firebase Unity Editor secara otomatis mengonfigurasi proyek Xcode Anda untuk mengunggah file simbol Anda.
    • Android : Jalankan perintah Firebase CLI crashlytics:symbols:upload untuk mengunggah file simbol Anda.
  3. Jalankan aplikasi Anda. Setelah aplikasi Anda berjalan, perhatikan log perangkat dan tunggu hingga pengecualian dipicu dari CrashlyticsTester .
    • iOS : Lihat log di panel bawah Xcode.
    • Android : Lihat log dengan menjalankan perintah berikut di terminal: adb logcat .
  4. Kunjungi dasbor Crashlytics untuk melihat pengecualian! Anda akan melihatnya di tabel Masalah di bagian bawah dasbor. Nanti di codelab, Anda akan mempelajari lebih lanjut cara menjelajahi laporan ini.
  5. Setelah Anda mengonfirmasi bahwa acara telah diunggah ke Crashlytics, pilih GameObject Kosong yang Anda lampirkan, hapus hanya komponen CrashlyticsTester , lalu simpan adegan untuk memulihkannya ke kondisi aslinya.

5. Mengaktifkan dan memahami Menu Debug

Sejauh ini, Anda telah menambahkan Crashlytics ke proyek Unity, menyelesaikan penyiapan, dan mengonfirmasi bahwa Crashlytics SDK sedang mengupload peristiwa ke Firebase. Sekarang Anda akan membuat menu di proyek Unity yang akan menunjukkan cara menggunakan fungsionalitas Crashlytics yang lebih canggih di game Anda. Proyek Naik Level dengan Firebase Unity sudah memiliki Menu Debug tersembunyi yang dapat Anda tampilkan dan tuliskan fungsinya.

Aktifkan Menu Debug

Tombol untuk mengakses Menu Debug ada di proyek Unity Anda, namun saat ini tidak diaktifkan. Anda harus mengaktifkan tombol untuk mengaksesnya dari cetakan MainMenu :

  1. Di Unity Editor, buka prefab bernama MainMenu . 4148538cbe9f36c5.png
  2. Dalam hierarki prefab, temukan subobjek yang dinonaktifkan bernama DebugMenuButton , lalu pilih subobjek tersebut. 816f8f9366280f6c.png
  3. Aktifkan DebugMenuButton dengan mencentang kotak di sudut kiri atas di sebelah kiri kolom teks yang berisi DebugMenuButton . 8a8089d2b4886da2.png
  4. Simpan cetakannya.
  5. Jalankan game di editor atau di perangkat Anda. Menu sekarang seharusnya dapat diakses.

Pratinjau dan pahami isi metode untuk Menu Debug

Nanti di codelab ini, Anda akan menulis isi metode untuk beberapa metode debug Crashlytics yang telah dikonfigurasi sebelumnya. Namun, dalam proyek Level Up with Firebase Unity, metode ditentukan dan dipanggil dari DebugMenu.cs .

Meskipun beberapa metode ini akan memanggil metode Crashlytics dan menampilkan error, kemampuan Crashlytics untuk menangkap error ini tidak bergantung pada pemanggilan metode tersebut terlebih dahulu. Sebaliknya, laporan kerusakan yang dihasilkan dari penangkapan kesalahan secara otomatis akan ditingkatkan dengan informasi yang ditambahkan dengan metode ini.

Buka DebugMenu.cs , lalu temukan metode berikut:

Metode untuk membuat dan memberi anotasi pada masalah Crashlytics:

  • CrashNow
  • LogNonfatalError
  • LogStringsAndCrashNow
  • SetAndOverwriteCustomKeyThenCrash
  • SetLogsAndKeysBeforeANR

Metode pencatatan log peristiwa Analytics untuk membantu proses debug:

  • LogProgressEventWithStringLiterals
  • LogIntScoreWithBuiltInEventAndParams

Pada langkah selanjutnya dalam codelab ini, Anda akan menerapkan metode ini dan mempelajari bagaimana metode tersebut membantu mengatasi situasi tertentu yang dapat terjadi dalam pengembangan game.

6. Memastikan penyampaian laporan kerusakan dalam pengembangan

Sebelum Anda mulai menerapkan metode debug ini dan melihat pengaruhnya terhadap laporan kerusakan, pastikan Anda memahami cara peristiwa dilaporkan ke Crashlytics.

Untuk proyek Unity, kejadian crash dan pengecualian dalam game Anda segera ditulis ke disk. Untuk pengecualian yang tidak tertangkap yang tidak membuat game Anda mogok (misalnya, pengecualian C# yang tidak tertangkap dalam logika game), Anda dapat meminta Crashlytics SDK melaporkannya sebagai peristiwa fatal dengan menyetel properti Crashlytics.ReportUncaughtExceptionsAsFatal ke true saat Anda menginisialisasi Crashlytics di proyek Unity Anda . Peristiwa ini dilaporkan ke Crashlytics secara real-time tanpa pengguna akhir perlu memulai ulang game. Perhatikan bahwa kerusakan asli selalu dilaporkan sebagai peristiwa fatal dan dikirimkan saat pengguna akhir memulai ulang game.

Selain itu, perhatikan perbedaan kecil—namun signifikan— berikut antara cara berbagai lingkungan runtime mengirimkan informasi Crashlytics ke Firebase:

simulator iOS:

  • Informasi Crashlytics dilaporkan jika dan hanya jika Anda melepaskan Xcode dari simulator. Jika Xcode terpasang, ia menangkap kesalahan di bagian hulu, mencegah pengiriman informasi.

Perangkat fisik seluler (Android dan iOS):

  • Khusus Android: ANR hanya dilaporkan di Android 11+. ANR dan peristiwa non-fatal dilaporkan pada proses berikutnya.

Editor Persatuan:

Uji crash game Anda dengan satu sentuhan tombol di CrashNow()

Setelah Crashlytics disiapkan di game Anda, Crashlytics SDK secara otomatis mencatat error dan pengecualian yang tidak tertangkap, lalu menguploadnya ke Firebase untuk dianalisis. Dan laporannya ditampilkan di dashboard Crashlytics di Firebase console.

  1. Untuk menunjukkan bahwa ini memang otomatis: buka DebugMenu.cs , lalu timpa metode CrashNow() sebagai berikut:
    void CrashNow()
    {
        TestCrash();
    }
    
  2. Bangun aplikasi Anda.
  3. (Khusus Android) Unggah simbol Anda dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Ketuk tombol Crash Now , dan lanjutkan ke langkah berikutnya dalam codelab ini untuk mengetahui cara melihat dan menafsirkan laporan kerusakan.

7. Memahami laporan masalah di Firebase console

Saat melihat laporan kerusakan, ada sedikit hal lagi yang perlu Anda ketahui tentang cara memanfaatkan laporan tersebut secara maksimal. Setiap metode yang Anda tulis akan menunjukkan cara menambahkan berbagai jenis informasi ke laporan Crashlytics.

  1. Ketuk tombol Crash Now , lalu mulai ulang aplikasi Anda.
  2. Buka dasbor Crashlytics . Gulir ke bawah ke tabel Masalah di bagian bawah dasbor tempat Crashlytics mengelompokkan peristiwa yang semuanya memiliki akar penyebab yang sama ke dalam "masalah".
  3. Klik pada masalah baru yang tercantum dalam tabel Masalah . Melakukan hal ini akan menampilkan ringkasan Peristiwa tentang setiap peristiwa individual yang dikirim ke Firebase.

    Anda akan melihat sesuatu seperti screencap berikut. Perhatikan bagaimana ringkasan Peristiwa secara jelas menampilkan pelacakan tumpukan panggilan yang menyebabkan kerusakan. 40c96abe7f90c3aa.png

Metadata tambahan

Tab bermanfaat lainnya adalah tab Unity Metadata . Bagian ini memberi tahu Anda tentang atribut perangkat tempat peristiwa terjadi, termasuk fitur fisik, model/spesifikasi CPU, dan segala jenis metrik GPU.

Berikut ini contoh informasi di tab ini yang mungkin berguna:
Bayangkan game Anda banyak menggunakan shader untuk mendapatkan tampilan tertentu, namun tidak semua ponsel memiliki GPU yang mampu menampilkan fitur ini. Informasi di tab Unity Metadata dapat memberi Anda gambaran yang lebih baik tentang perangkat keras apa yang harus diuji oleh aplikasi Anda ketika memutuskan fitur apa yang secara otomatis akan tersedia atau dinonaktifkan sepenuhnya.

Meskipun bug atau kerusakan mungkin tidak pernah terjadi pada perangkat Anda , karena banyaknya keragaman perangkat Android di alam liar, ada baiknya untuk lebih memahami "hotspot" tertentu dari perangkat audiens Anda.

41d8d7feaa87454d.png

8. Melempar, menangkap, dan mencatat pengecualian

Seringkali, sebagai pengembang, meskipun kode Anda menangkap dan menangani pengecualian waktu proses dengan benar, ada baiknya untuk mencatat bahwa hal itu terjadi, dan dalam kondisi apa. Crashlytics.LogException dapat digunakan untuk tujuan ini—untuk mengirimkan peristiwa pengecualian ke Firebase sehingga Anda dapat melakukan debug lebih lanjut pada masalah tersebut di Firebase console.

  1. Di Assets/Hamster/Scripts/States/DebugMenu.cs , tambahkan pernyataan berikut ke pernyataan using :
    // Import Firebase
    using Firebase.Crashlytics;
    
  2. Masih di DebugMenu.cs , timpa LogNonfatalError() sebagai berikut:
    void LogNonfatalError()
    {
        try
        {
            throw new System.Exception($"Test exception thrown in {nameof(LogNonfatalError)}");
        }
        catch(System.Exception exception)
        {
            Crashlytics.LogException(exception);
        }
    }
    
  3. Bangun aplikasi Anda.
  4. (Khusus Android) Unggah simbol Anda dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  5. Ketuk tombol Catat Kesalahan Nonfatal , lalu mulai ulang aplikasi Anda.
  6. Buka dasbor Crashlytics , dan Anda akan melihat sesuatu yang serupa dengan yang Anda lihat di langkah terakhir codelab ini.
  7. Namun kali ini, batasi filter Jenis peristiwa ke Non-fatal sehingga Anda hanya melihat kesalahan non-fatal, seperti kesalahan yang baru saja Anda log in.
    a39ea8d9944cbbd9.png

9. Catat string ke Crashlytics untuk lebih memahami alur eksekusi program

Pernahkah Anda mencoba mencari tahu mengapa sebaris kode yang dipanggil dari berbagai jalur, ratusan bahkan ribuan kali per sesi, tiba-tiba dapat menghasilkan pengecualian atau kerusakan? Meskipun mungkin menyenangkan untuk menelusuri kode dalam IDE dan melihat nilainya lebih dekat, bagaimana jika ini hanya terjadi pada sebagian kecil pengguna Anda? Lebih buruk lagi, apa yang akan Anda lakukan jika Anda tidak dapat meniru kerusakan ini, apa pun yang Anda lakukan?

Dalam situasi seperti ini, memiliki konteks dapat membuat perbedaan besar. Dengan Crashlytics.Log , Anda memiliki kemampuan untuk menuliskan konteks yang Anda perlukan. Anggaplah pesan-pesan ini sebagai petunjuk bagi diri Anda di masa depan tentang apa yang mungkin terjadi.

Meskipun log dapat digunakan dalam berbagai cara, log biasanya paling berguna untuk mencatat situasi di mana urutan dan/atau tidak adanya panggilan merupakan informasi yang sangat penting.

  1. Di Assets/Hamster/Scripts/States/DebugMenu.cs , timpa LogStringsAndCrashNow() sebagai berikut:
    void LogStringsAndCrashNow()
    {
        Crashlytics.Log($"This is the first of two descriptive strings in {nameof(LogStringsAndCrashNow)}");
        const bool RUN_OPTIONAL_PATH = false;
        if(RUN_OPTIONAL_PATH)
        {
            Crashlytics.Log(" As it stands, this log should not appear in your records because it will never be called.");
        }
        else
        {
            Crashlytics.Log(" A log that will simply inform you which path of logic was taken. Akin to print debugging.");
        }
        Crashlytics.Log($"This is the second of two descriptive strings in {nameof(LogStringsAndCrashNow)}");
        TestCrash();
    }
    
  2. Bangun aplikasi Anda.
  3. (Khusus Android) Unggah simbol Anda dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Ketuk tombol Log Strings dan Crash Now , lalu mulai ulang aplikasi Anda.
  5. Kembali ke dasbor Crashlytics , dan klik masalah terbaru yang tercantum di tabel Masalah . Sekali lagi Anda akan melihat sesuatu yang mirip dengan masalah sebelumnya.
    7aabe103b8589cc7.png
  6. Namun, jika Anda mengeklik tab Log dalam ringkasan Peristiwa , Anda akan mendapatkan tampilan seperti ini:
    4e27aa407b7571cf.png

10. Tulis dan timpa kunci khusus

Katakanlah Anda ingin lebih memahami kerusakan yang terkait dengan variabel yang disetel ke sejumlah kecil nilai atau konfigurasi. Mungkin menyenangkan untuk bisa memfilter, berdasarkan kombinasi variabel dan kemungkinan nilai yang Anda lihat, pada waktu tertentu.

Selain mencatat string arbitrer, Crashlytics menawarkan bentuk proses debug lain yang bermanfaat untuk mengetahui status pasti program Anda saat program mogok: kunci khusus.

Ini adalah pasangan nilai kunci yang dapat Anda atur untuk suatu sesi. Tidak seperti log yang terakumulasi dan murni bersifat aditif, kunci dapat ditimpa untuk hanya mencerminkan status terkini dari suatu variabel atau kondisi.

Selain menjadi buku besar status terakhir program Anda yang tercatat, kunci ini kemudian dapat digunakan sebagai filter canggih untuk masalah Crashlytics.

  1. Di Assets/Hamster/Scripts/States/DebugMenu.cs , timpa SetAndOverwriteCustomKeyThenCrash() sebagai berikut:
    void SetAndOverwriteCustomKeyThenCrash()
    {
        const string CURRENT_TIME_KEY = "Current Time";
        System.TimeSpan currentTime = System.DateTime.Now.TimeOfDay;
        Crashlytics.SetCustomKey(
            CURRENT_TIME_KEY,
            DayDivision.GetPartOfDay(currentTime).ToString() // Values must be strings
            );
    
        // Time Passes
        currentTime += DayDivision.DURATION_THAT_ENSURES_PHASE_CHANGE;
    
        Crashlytics.SetCustomKey(
            CURRENT_TIME_KEY,
            DayDivision.GetPartOfDay(currentTime).ToString()
            );
        TestCrash();
    }
    
  2. Bangun aplikasi Anda.
  3. (Khusus Android) Unggah simbol Anda dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Ketuk tombol Set Custom Key and Crash , lalu mulai ulang aplikasi Anda.
  5. Kembali ke dasbor Crashlytics , dan klik masalah terbaru yang tercantum di tabel Masalah . Sekali lagi Anda akan melihat sesuatu yang mirip dengan masalah sebelumnya.
  6. Namun kali ini, klik tab Kunci di ringkasan Peristiwa sehingga Anda dapat melihat nilai kunci termasuk Current Time :
    7dbe1eb00566af98.png

Mengapa Anda ingin menggunakan kunci khusus dan bukan log khusus?

  • Log bagus dalam menyimpan data berurutan, namun kunci khusus lebih baik jika Anda hanya menginginkan nilai terbaru .
  • Di Firebase console, Anda dapat dengan mudah memfilter masalah berdasarkan nilai kunci di kotak pencarian tabel Masalah .

Mirip dengan log, kunci khusus juga memiliki batas. Crashlytics mendukung maksimal 64 pasangan nilai kunci. Setelah Anda mencapai ambang batas ini, nilai tambahan tidak disimpan. Setiap pasangan nilai kunci dapat berukuran hingga 1 KB.

11. (Khusus Android) Gunakan kunci dan log khusus untuk memahami dan mendiagnosis ANR

Salah satu jenis masalah yang paling sulit untuk di-debug bagi pengembang Android adalah kesalahan Aplikasi Tidak Merespons (ANR). ANR terjadi ketika aplikasi gagal merespons input selama lebih dari 5 detik. Jika ini terjadi, artinya aplikasi terhenti atau berjalan sangat lambat. Dialog ditampilkan kepada pengguna, dan mereka dapat memilih apakah akan "Tunggu" atau "Tutup Aplikasi".

ANR merupakan pengalaman pengguna yang buruk dan (seperti yang disebutkan dalam tautan ANR di atas) dapat memengaruhi kemampuan aplikasi Anda untuk ditemukan di Google Play Store. Karena kerumitannya, dan karena sering kali disebabkan oleh kode multithread dengan perilaku yang sangat berbeda pada model ponsel yang berbeda, mereproduksi ANR saat proses debug sering kali sangat sulit, bahkan hampir mustahil. Oleh karena itu, pendekatan analitis dan deduktif biasanya merupakan pendekatan terbaik.

Dalam metode ini, kami akan menggunakan kombinasi Crashlytics.LogException , Crashlytics.Log dan Crashlytics.SetCustomKey untuk melengkapi pencatatan masalah otomatis dan memberi kami informasi lebih lanjut.

  1. Di Assets/Hamster/Scripts/States/DebugMenu.cs , timpa SetLogsAndKeysBeforeANR() sebagai berikut:
    void SetLogsAndKeysBeforeANR()
    {
        System.Action<string,long> WaitAndRecord =
        (string methodName, long targetCallLength)=>
        {
            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
            const string CURRENT_FUNCTION = "Current Async Function";
    
            // Initialize key and start timing
            Crashlytics.SetCustomKey(CURRENT_FUNCTION, methodName);
            stopWatch.Start();
    
            // The actual (simulated) work being timed.
            BusyWaitSimulator.WaitOnSimulatedBlockingWork(targetCallLength);
    
            // Stop timing
            stopWatch.Stop();
    
            if(stopWatch.ElapsedMilliseconds>=BusyWaitSimulator.EXTREME_DURATION_MILLIS)
            {
              Crashlytics.Log($"'{methodName}' is long enough to cause an ANR.");
            }
            else if(stopWatch.ElapsedMilliseconds>=BusyWaitSimulator.SEVERE_DURATION_MILLIS)
            {
              Crashlytics.Log($"'{methodName}' is long enough it may cause an ANR");
            }
        };
    
        WaitAndRecord("DoSafeWork",1000L);
        WaitAndRecord("DoSevereWork",BusyWaitSimulator.SEVERE_DURATION_MILLIS);
        WaitAndRecord("DoExtremeWork",2*BusyWaitSimulator.EXTREME_DURATION_MILLIS);
    }
    
  2. Bangun aplikasi Anda.
  3. Upload simbol Anda dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Ketuk tombol berlabel Set Logs And Keys → ANR , lalu mulai ulang aplikasi Anda.
  5. Kembali ke dasbor Crashlytics , lalu klik masalah baru di tabel Masalah untuk melihat ringkasan Peristiwa . Jika panggilan tersambung dengan benar, Anda akan melihat sesuatu seperti ini:
    876c3cff7037bd07.png

    Seperti yang Anda lihat, Firebase menunjukkan kesibukan menunggu di thread sebagai alasan utama aplikasi Anda memicu ANR.
  6. Jika Anda melihat log di tab Log pada ringkasan Peristiwa , Anda akan melihat bahwa metode terakhir yang dicatat sebagai selesai adalah DoSevereWork .
    5a4bec1cf06f6984.png

    Sebaliknya, metode terakhir yang tercantum sebagai permulaan adalah DoExtremeWork , yang menunjukkan bahwa ANR terjadi selama metode ini, dan game ditutup sebelum dapat mencatat DoExtremeWork .

    89d86d5f598ecf3a.png

Kenapa melakukan ini?

  • Mereproduksi ANR sangatlah sulit, jadi mendapatkan banyak informasi tentang area kode dan metrik sangatlah penting untuk menemukannya secara deduktif.
  • Dengan informasi yang disimpan dalam kunci khusus, Anda kini mengetahui thread asinkron mana yang membutuhkan waktu paling lama untuk dijalankan, dan thread mana yang berisiko memicu ANR. Data logis dan numerik terkait semacam ini akan menunjukkan kepada Anda bagian mana dalam kode Anda yang paling perlu untuk dioptimalkan.

12. Menyelingi peristiwa Analytics untuk lebih memperkaya laporan

Metode berikut juga dapat dipanggil dari Menu Debug, namun alih-alih menimbulkan masalah, metode ini menggunakan Google Analytics sebagai sumber informasi lain untuk lebih memahami cara kerja game Anda.

Berbeda dengan metode lain yang Anda tulis dalam codelab ini, Anda harus menggunakan metode ini bersama dengan metode lainnya. Panggil metode ini (dengan menekan tombol yang sesuai di Menu Debug) dalam urutan apa pun yang Anda inginkan sebelum menjalankan salah satu metode lainnya. Kemudian, saat Anda memeriksa informasi dalam masalah Crashlytics tertentu, Anda akan melihat log peristiwa Analytics yang diurutkan. Data ini dapat digunakan dalam game untuk lebih memahami kombinasi alur program atau input pengguna, bergantung pada cara Anda menginstrumentasikan aplikasi Anda.

  1. Di Assets/Hamster/Scripts/States/DebugMenu.cs , timpa penerapan metode berikut yang sudah ada:
    public void LogProgressEventWithStringLiterals()
    {
          Firebase.Analytics.FirebaseAnalytics.LogEvent("progress", "percent", 0.4f);
    }
    
    public void LogIntScoreWithBuiltInEventAndParams()
    {
          Firebase.Analytics.FirebaseAnalytics
            .LogEvent(
              Firebase.Analytics.FirebaseAnalytics.EventPostScore,
              Firebase.Analytics.FirebaseAnalytics.ParameterScore,
              42
            );
    }
    
  2. Bangun dan terapkan game Anda, lalu masuk ke Menu Debug .
  3. (Khusus Android) Unggah simbol Anda dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Tekan setidaknya salah satu tombol berikut satu kali atau lebih untuk memanggil fungsi di atas:
    • Peristiwa Log String
    • Masuk Acara Int
  5. Tekan tombol Hancurkan Sekarang .
  6. Mulai ulang game Anda untuk mengupload peristiwa error ke Firebase.
  7. Saat Anda mencatat berbagai rangkaian peristiwa Analytics dan kemudian membuat game Anda menghasilkan peristiwa yang laporannya dibuat oleh Crashlytics (seperti yang baru saja Anda lakukan), peristiwa tersebut akan ditambahkan ke tab Log pada Ringkasan Peristiwa Crashlytics seperti ini:
    d3b16d78f76bfb04.png

13. Ke depan

Dan dengan itu, Anda harus memiliki landasan teori yang lebih baik untuk melengkapi laporan kerusakan yang dibuat secara otomatis. Informasi baru ini memungkinkan Anda menggunakan status saat ini, catatan peristiwa masa lalu, dan peristiwa Google Analytics yang ada untuk mengelompokkan urutan peristiwa dan logika yang mengarah pada hasilnya dengan lebih baik.

Jika aplikasi Anda menargetkan Android 11 (API level 30) atau lebih tinggi, pertimbangkan untuk menyertakan GWP-ASan , fitur pengalokasi memori asli yang berguna untuk men-debug error yang disebabkan oleh kesalahan memori asli seperti bug use-after-free dan heap-buffer-overflow . Untuk memanfaatkan fitur proses debug ini, aktifkan GWP-ASan secara eksplisit .

Langkah selanjutnya

Lanjutkan ke Instrumenkan game Unity Anda dengan codelab Remote Config , tempat Anda akan mempelajari cara menggunakan Remote Config dan Pengujian A/B di Unity.