Pahami error game Unity menggunakan fitur Crashlytics lanjutan

1. Pengantar

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

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

Anda akan menambahkan menu debug ke game. Menu debug ini memanggil metode yang akan Anda buat dan memungkinkan Anda menjalankan fungsionalitas Crashlytics yang berbeda. Metode ini akan menunjukkan cara menganotasi laporan error otomatis dengan kunci kustom, log kustom, error nonfatal, dan lainnya.

Setelah membangun game, Anda akan menggunakan menu debug, dan memeriksa hasilnya untuk memahami tampilan unik yang diberikan oleh game Anda tentang cara game berjalan di luar sana.

Yang akan Anda pelajari

  • Jenis error yang secara otomatis ditangkap oleh Crashlytics.
  • Error tambahan yang dapat direkam dengan sengaja.
  • Cara menambahkan informasi lebih lanjut ke error ini agar lebih mudah dipahami.

Yang Anda butuhkan

  • Unity (Versi Minimum yang Direkomendasikan 2019 atau yang lebih baru) dengan salah satu atau kedua hal berikut:
    • Dukungan Build iOS
    • Dukungan Build Android
  • (Khusus Android) Firebase CLI (digunakan untuk mengupload simbol untuk laporan error)

2. Menyiapkan lingkungan pengembangan

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

Perhatikan bahwa game contoh Level Up dengan Firebase ini digunakan oleh beberapa codelab Firebase + Unity lainnya, jadi Anda mungkin sudah menyelesaikan tugas di bagian ini. Jika demikian, Anda dapat langsung melanjutkan ke langkah terakhir di halaman ini: "Menambahkan Firebase SDK untuk Unity".

Mendownload kode

Clone repositori GitHub codelab ini dari command line:

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

Atau, jika belum menginstal git, Anda dapat mendownload repositori sebagai file ZIP.

Buka Level Up dengan Firebase di editor Unity

  1. Luncurkan Unity Hub dan, dari tab Projects, klik panah drop-down di samping Open.
  2. Klik Add project from disk.
  3. Buka 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 nama project, level-up-with-firebase, dan project akan terbuka di editor Unity.
  6. Jika editor Anda tidak membukanya secara otomatis, buka MainGameScene di Assets > Hamster di tab Project di Unity Editor.
    ff4ea3f3c0d29379.pngS

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

3. Menambahkan Firebase ke project Unity

Membuat project Firebase

  1. Di Firebase console, klik Add project.
  2. Untuk membuat project baru, masukkan nama project yang diinginkan.
    Tindakan ini juga akan menetapkan project ID (yang ditampilkan di bawah nama project) ke sesuatu yang didasarkan pada nama project. Anda dapat mengklik ikon edit pada project ID untuk menyesuaikannya lebih lanjut.
  3. Jika diminta, tinjau dan setujui persyaratan Firebase.
  4. Klik Continue.
  5. Pilih opsi Enable Google Analytics for this project, lalu klik Continue.
  6. Pilih akun Google Analytics yang ada untuk digunakan atau pilih Create a new account untuk membuat akun baru.
  7. Klik Create project.
  8. Setelah project dibuat, klik Continue.

Mendaftarkan aplikasi ke Firebase

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

Menambahkan file konfigurasi Firebase

Setelah mengklik Register app, Anda akan diminta untuk mendownload dua file konfigurasi (satu file konfigurasi untuk setiap target build). Project Unity Anda memerlukan metadata Firebase dalam file ini agar dapat terhubung dengan Firebase.

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

Menambahkan Firebase SDK untuk Unity

  1. Klik Download Firebase Unity SDK di Firebase console.
  2. Ekstrak SDK di tempat yang mudah diakses.
  3. Pada Project Unity yang terbuka, buka Assets > Import Package > Custom Package.
  4. Dalam dialog Import package, buka direktori yang berisi SDK yang telah diekstrak, pilih FirebaseAnalytics.unitypackage, lalu klik Open.
  5. Dari dialog Import Unity Package yang muncul, klik Import.
  6. Ulangi langkah sebelumnya untuk mengimpor FirebaseCrashlytics.unitypackage.
  7. Kembali ke Firebase console, lalu klik Next di alur kerja penyiapan.

Untuk mengetahui informasi selengkapnya tentang menambahkan Firebase SDK ke project Unity, lihat Opsi penginstalan Unity tambahan.

4. Menyiapkan Crashlytics di project Unity Anda

Untuk menggunakan Crashlytics di project Unity, Anda harus melakukan beberapa langkah penyiapan lagi. Tentu saja, Anda harus melakukan inisialisasi SDK. Namun, Anda harus mengupload simbol agar dapat melihat pelacakan tumpukan tersimbolisasi di Firebase console, dan Anda harus memaksa error pengujian untuk memastikan bahwa Firebase mendapatkan peristiwa error.

Menginisialisasi 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 yang kedua berisi beberapa ekstensi ke C# Tasks API. Tanpa kedua pernyataan using, 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. Sekali lagi, dalam MainGame.cs, temukan InitializeFirebaseAndStartGame(), deklarasikan variabel aplikasi, lalu timpa implementasi metode seperti berikut:
    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 efek dari pelaporan pengecualian yang tidak tertangani sebagai fatal dibahas dalam FAQ Crashlytics.

Membangun project Anda dan mengupload simbol

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

iOS+ (platform Apple)

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

Android

  1. (hanya selama penyiapan awal, bukan untuk setiap build) Siapkan build Anda:
    1. Buat folder baru bernama Builds di root direktori project Anda (yaitu, sebagai seinduk direktori Assets Anda), lalu buat subfolder dengan nama Android.
    2. Di File > Build Settings > Player Settings > Configuration, setel Scripting Backend ke IL2CPP.
      • IL2CPP umumnya menyebabkan build menjadi lebih kecil dan memiliki performa yang lebih baik.
      • IL2CPP juga HANYA opsi yang tersedia di iOS dan memilihnya di sini memungkinkan kedua platform untuk memiliki paritas yang lebih baik dan membuat perbedaan proses debug di antara keduanya (jika Anda memilih untuk membangun keduanya) lebih sederhana.
  2. Build aplikasi Anda. Di File > Build Settings, selesaikan langkah-langkah berikut:
    1. Pastikan Createsymbol.zip dicentang (atau jika ada menu dropdown, pilih Debugging).
    2. Build APK langsung dari Unity Editor ke dalam subfolder Builds/Android yang baru saja Anda buat.
  3. Setelah build selesai, Anda harus membuat file simbol yang kompatibel dengan Crashlytics dan menguploadnya ke server Firebase. Informasi simbol ini diperlukan untuk melihat pelacakan tumpukan tersimbolisasi untuk error library native di dasbor Crashlytics.

    Buat dan upload 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). Temukan nilai ini di file google-services.json yang Anda download 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).

Memaksa error pengujian untuk menyelesaikan penyiapan

Untuk menyelesaikan penyiapan Crashlytics dan melihat data awal di dasbor Crashlytics pada Firebase console, Anda harus memaksa error pengujian.

  1. Di MainGameScene, temukan EmptyObject GameObject di editor Hierarchy, tambahkan skrip berikut ke dalamnya, lalu simpan scene. Skrip ini akan menyebabkan error pengujian 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 versi selesai.
    • iOS: Plugin Firebase Unity Editor otomatis mengonfigurasi project Xcode untuk mengupload file simbol.
    • Android: Jalankan perintah crashlytics:symbols:upload Firebase CLI untuk mengupload file simbol Anda.
  3. Jalankan aplikasi Anda. Setelah aplikasi berjalan, pantau 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. Buka dasbor Crashlytics untuk melihat pengecualian. Anda akan melihatnya dalam tabel Issues di bagian bawah dasbor. Selanjutnya di codelab, Anda akan mempelajari lebih lanjut cara mempelajari laporan ini.
  5. Setelah mengonfirmasi bahwa peristiwa tersebut diupload ke Crashlytics, pilih EmptyObject GameObject yang Anda lampirkan, hanya hapus komponen CrashlyticsTester, lalu simpan scene untuk memulihkannya ke kondisi aslinya.

5. Mengaktifkan dan memahami Menu Debug

Sejauh ini, Anda telah menambahkan Crashlytics ke project Unity, menyelesaikan penyiapan, dan memastikan bahwa Crashlytics SDK telah mengupload peristiwa ke Firebase. Sekarang Anda akan membuat menu di project Unity yang akan menunjukkan cara menggunakan fungsi Crashlytics yang lebih canggih dalam game Anda. Project Level Up with Firebase Unity sudah memiliki Menu Debug tersembunyi yang akan Anda buat terlihat dan tulis fungsinya.

Mengaktifkan Menu Debug

Tombol untuk mengakses Menu Debug ada di project Unity Anda, tetapi saat ini tidak diaktifkan. Anda harus mengaktifkan tombol untuk mengaksesnya dari prefab MainMenu:

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

Melihat pratinjau dan memahami isi metode untuk Menu Debug

Nanti dalam codelab ini, Anda akan menulis isi metode untuk beberapa metode Crashlytics debug yang telah dikonfigurasi sebelumnya. Namun, dalam project Unity Level Up with Firebase, metode ditentukan di 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. Laporan kerusakan yang dihasilkan dari penangkapan error secara otomatis akan ditingkatkan dengan informasi yang ditambahkan oleh metode tersebut.

Buka DebugMenu.cs, lalu temukan metode berikut:

Metode untuk membuat dan memberi anotasi masalah Crashlytics:

  • CrashNow
  • LogNonfatalError
  • LogStringsAndCrashNow
  • SetAndOverwriteCustomKeyThenCrash
  • SetLogsAndKeysBeforeANR

Metode untuk mencatat peristiwa Analytics ke dalam log untuk membantu dalam proses debug:

  • LogProgressEventWithStringLiterals
  • LogIntScoreWithBuiltInEventAndParams

Di 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 pengiriman laporan kerusakan dalam pengembangan

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

Untuk project Unity, peristiwa error dan pengecualian dalam game Anda langsung ditulis ke disk. Untuk pengecualian yang tidak tertangkap yang tidak menyebabkan error pada game (misalnya, pengecualian C# yang tidak tertangkap dalam logika game), Anda dapat meminta Crashlytics SDK melaporkannya sebagai peristiwa fatal dengan menetapkan properti Crashlytics.ReportUncaughtExceptionsAsFatal ke true tempat Anda melakukan inisialisasi Crashlytics di project Unity. Peristiwa ini dilaporkan ke Crashlytics secara real-time tanpa mengharuskan pengguna akhir memulai ulang game. Perhatikan bahwa masalah pada native code selalu dilaporkan sebagai peristiwa fatal dan dikirim saat pengguna akhir memulai ulang game.

Selain itu, perhatikan perbedaan kecil—tetapi signifikan—berikut ini antara cara lingkungan runtime yang berbeda mengirim informasi Crashlytics ke Firebase:

Simulator iOS:

  • Informasi Crashlytics dilaporkan jika dan hanya jika Anda melepaskan Xcode dari simulator. Jika Xcode dilampirkan, Xcode akan menangkap error di upstream, sehingga mencegah pengiriman informasi.

Perangkat fisik seluler (Android dan iOS):

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

Editor Unity:

Uji error yang membuat game Anda dengan satu sentuhan tombol di CrashNow()

Setelah Crashlytics disiapkan di game Anda, Crashlytics SDK otomatis mencatat error dan pengecualian yang tidak tertangkap, lalu menguploadnya ke Firebase untuk dianalisis. Laporan tersebut juga ditampilkan di dasbor 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) Upload simbol 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 di codelab ini untuk mengetahui cara melihat dan menafsirkan laporan error.

7. Memahami laporan masalah di Firebase console

Terkait melihat laporan error, ada sedikit hal yang perlu Anda ketahui tentang cara mendapatkan hasil maksimal dari laporan tersebut. 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. Scroll ke bawah ke tabel Issues di bagian bawah dasbor tempat Crashlytics mengelompokkan peristiwa yang semuanya memiliki penyebab utama yang sama ke dalam "masalah".
  3. Klik masalah baru yang tercantum pada tabel Masalah. Tindakan ini akan menampilkan Ringkasan peristiwa tentang masing-masing peristiwa yang dikirim ke Firebase.

    Anda akan melihat sesuatu seperti screenshot berikut. Perhatikan bagaimana Ringkasan peristiwa dengan jelas menampilkan stack trace panggilan yang menyebabkan error.40c96abe7f90c3aa.pngS

Metadata tambahan

Tab lain yang bermanfaat 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 contoh saat informasi di tab ini mungkin berguna:
Bayangkan game Anda menggunakan banyak shader untuk mendapatkan tampilan tertentu, tetapi tidak semua ponsel memiliki GPU yang mampu merender fitur ini. Informasi di tab Unity Metadata dapat memberi Anda gambaran yang lebih baik tentang hardware apa yang harus diuji oleh aplikasi Anda saat memutuskan fitur apa yang akan otomatis tersedia atau dinonaktifkan sepenuhnya.

Meskipun bug atau error mungkin tidak pernah terjadi di perangkat Anda, karena keragaman perangkat Android di dunia nyata, hal ini membantu untuk lebih memahami "hotspot" tertentu dari perangkat audiens Anda.

41d8d7feaa87454d.png

8. Menampilkan, menangkap, dan mencatat pengecualian

Sering kali, sebagai developer, meskipun kode Anda menangkap dan menangani pengecualian runtime dengan benar, sebaiknya perhatikan bahwa hal tersebut terjadi, dan dalam keadaan seperti apa. Crashlytics.LogException dapat digunakan untuk tujuan ini secara persis—untuk mengirim peristiwa pengecualian ke Firebase sehingga Anda dapat men-debug masalah lebih lanjut di Firebase console.

  1. Di Assets/Hamster/Scripts/States/DebugMenu.cs, tambahkan kode 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) Upload simbol dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  5. Ketuk tombol Log Error Non-fatal, lalu mulai ulang aplikasi Anda.
  6. Buka dasbor Crashlytics, dan Anda akan melihat sesuatu yang mirip dengan yang Anda lihat di langkah terakhir codelab ini.
  7. Namun, kali ini Anda dapat membatasi filter Jenis peristiwa ke Non-fatal sehingga Anda hanya melihat error non-fatal, seperti error yang baru saja Anda catat.
    a39ea8d9944cbbd9.pngS

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

Pernahkah Anda mencoba mencari tahu mengapa baris kode yang dipanggil dari beberapa jalur, ratusan bahkan ribuan kali per sesi, dapat tiba-tiba menghasilkan pengecualian atau error? Meskipun mungkin menyenangkan untuk menelusuri kode di IDE dan melihat nilai-nilainya dengan lebih dekat, bagaimana jika ini hanya terjadi di antara sebagian kecil pengguna Anda? Lebih buruk lagi, apa yang akan Anda lakukan jika Anda tidak dapat mereplikasi error ini, terlepas dari apa yang Anda lakukan?

Dalam situasi seperti ini, memiliki konteks yang cukup dapat menciptakan perbedaan besar. Dengan Crashlytics.Log, Anda memiliki kemampuan untuk menulis konteks yang Anda butuhkan. Pikirkan pesan-pesan ini sebagai petunjuk bagi diri Anda di masa mendatang tentang apa yang mungkin terjadi.

Meskipun log dapat digunakan dengan berbagai cara, log ini biasanya sangat membantu untuk merekam situasi ketika 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) Upload simbol dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Ketuk tombol Log Strings and 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.pngS
  6. Namun, jika mengklik tab Logs dalam Ringkasan peristiwa, Anda akan mendapatkan tampilan seperti ini:
    4e27aa407b7571cf.png

10. Menulis dan menimpa kunci kustom

Misalnya Anda ingin lebih memahami error terkait variabel yang disetel ke sejumlah kecil nilai atau konfigurasi. Sebaiknya Anda dapat memfilter pada waktu tertentu, berdasarkan kombinasi variabel dan kemungkinan nilai yang Anda lihat.

Selain melakukan logging string arbitrer, Crashlytics menawarkan bentuk proses debug lain jika ada baiknya mengetahui status persis program Anda saat error: kunci kustom.

Ini adalah pasangan nilai kunci yang dapat Anda tetapkan untuk sesi. Tidak seperti log yang terakumulasi dan sepenuhnya merupakan tambahan, kunci dapat ditimpa agar hanya mencerminkan status terbaru dari suatu variabel atau kondisi.

Selain menjadi buku besar dari status program yang terakhir dicatat, kunci ini kemudian dapat digunakan sebagai filter yang efektif 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) Upload simbol dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Ketuk tombol Setel Kunci Kustom dan Error, 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 Keys di Event summary sehingga Anda dapat melihat nilai kunci termasuk Current Time:
    7dbe1eb00566af98.png

Mengapa Anda ingin menggunakan kunci kustom, bukan log kustom?

  • Log dapat menyimpan data berurutan, tetapi kunci kustom akan lebih baik jika Anda hanya menginginkan nilai terbaru.
  • Di Firebase console, Anda dapat dengan mudah memfilter masalah berdasarkan nilai kunci di kotak penelusuran tabel Issues.

Namun, mirip dengan log, kunci kustom memiliki batas. Crashlytics mendukung maksimum 64 pasangan nilai kunci. Setelah Anda mencapai ambang batas ini, nilai tambahan tidak akan disimpan. Setiap pasangan nilai kunci dapat berukuran maksimal 1 KB.

11. (Khusus Android) Menggunakan kunci dan log kustom untuk memahami dan mendiagnosis ANR

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

ANR adalah pengalaman pengguna yang buruk dan (seperti yang disebutkan dalam link ANR di atas) dapat memengaruhi visibilitas aplikasi Anda di Google Play Store. Karena kompleksitasnya, dan karena error tersebut sering disebabkan oleh kode multi-thread dengan perilaku yang sangat berbeda pada model ponsel yang berbeda, reproduksi ANR saat proses debug sering kali sangat sulit, atau bahkan nyaris mustahil. Dengan demikian, mendekati mereka secara analitis dan deduktif biasanya merupakan pendekatan terbaik.

Dalam metode ini, kita akan menggunakan kombinasi Crashlytics.LogException, Crashlytics.Log, dan Crashlytics.SetCustomKey untuk melengkapi logging masalah otomatis dan memberi kita lebih banyak informasi.

  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 Tetapkan Log dan Kunci → ANR, lalu mulai ulang aplikasi Anda.
  5. Kembali ke dasbor Crashlytics, lalu klik masalah baru di tabel Masalah untuk melihat Ringkasan acara. Jika panggilan dilakukan dengan benar, Anda akan melihat sesuatu seperti ini:
    876c3cff7037bd07.png

    Seperti yang dapat Anda lihat, Firebase menunjukkan waktu tunggu yang sibuk di thread sebagai alasan utama aplikasi Anda memicu ANR.
  6. Jika Anda melihat log di tab Logs pada Ringkasan peristiwa, Anda akan melihat bahwa metode terakhir yang dicatat sebagai selesai adalah DoSevereWork.
    5a4bec1cf06f6984.png

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

    89d86d5f598ecf3a.png

Apa manfaatnya?

  • Mereproduksi ANR sangat sulit, sehingga bisa mendapatkan informasi yang lengkap tentang metrik dan area kode sangat penting untuk menemukannya secara deduktif.
  • Dengan informasi yang tersimpan di kunci kustom, Anda kini mengetahui thread asinkron mana yang memerlukan waktu paling lama untuk dijalankan, dan thread mana yang berisiko memicu ANR. Data logis dan numerik terkait semacam ini akan menunjukkan kepada Anda di bagian mana kode Anda paling diperlukan untuk dioptimalkan.

12. Menyelaraskan peristiwa Analytics untuk lebih memperkaya laporan

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

Tidak seperti metode lain yang telah Anda tulis dalam codelab ini, Anda harus menggunakan metode ini bersamaan dengan yang lain. Panggil metode ini (dengan menekan tombol yang sesuai di Menu Debug) dalam urutan arbitrer apa pun yang Anda inginkan sebelum menjalankan salah satunya. Kemudian, saat 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 yang ada dari metode berikut:
    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. Build dan deploy game Anda, lalu masuk ke Menu Debug.
  3. (Khusus Android) Upload simbol dengan menjalankan perintah Firebase CLI berikut:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Tekan minimal satu tombol berikut satu atau beberapa kali untuk memanggil fungsi di atas:
    • Peristiwa String Log
    • Peristiwa Login
  5. Tekan tombol Crash Now.
  6. Mulai ulang game Anda agar dapat mengupload peristiwa error ke Firebase.
  7. Saat Anda mencatat berbagai urutan peristiwa Analytics ke dalam log, lalu game Anda menghasilkan peristiwa yang digunakan Crashlytics untuk membuat laporan (seperti yang baru Anda lakukan), peristiwa tersebut akan ditambahkan ke tab Logs di Ringkasan Peristiwa Crashlytics seperti ini:
    d3b16d78f76bfb04.png

13. Rencana ke depan

Dengan demikian, Anda harus memiliki dasar teoretis yang lebih baik untuk melengkapi laporan error yang dihasilkan secara otomatis. Informasi baru ini memungkinkan Anda menggunakan status saat ini, catatan peristiwa terdahulu, dan peristiwa Google Analytics yang ada untuk menguraikan urutan peristiwa dan logika yang mengarah ke hasilnya dengan lebih baik.

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

Langkah Berikutnya

Lanjutkan ke codelab Instrumentasikan game Unity Anda dengan Remote Config, di mana Anda akan belajar cara menggunakan Remote Config dan A/B Testing di Unity.