Gelişmiş Crashlytics özelliklerini kullanarak Unity oyununun çökmelerini anlayın

1. Giriş

Bu codelab'de Crashlytics'in, çökmelere ve bunlara neden olabilecek koşullara ilişkin daha iyi görünürlük sağlayacak gelişmiş özelliklerini nasıl kullanacağınızı öğreneceksiniz.

MechaHamster: Firebase Edition ile Seviye Atlama adlı örnek oyuna yeni işlevler ekleyeceksiniz. Bu örnek oyun, klasik Firebase oyunu MechaHamster'ın, yerleşik Firebase işlevlerinin çoğunu ortadan kaldıran ve size Firebase'in yeni kullanımlarını yerine uygulama şansı veren yeni bir sürümüdür.

Oyuna bir hata ayıklama menüsü ekleyeceksiniz. Bu hata ayıklama menüsü, oluşturacağınız yöntemleri çağırır ve Crashlytics'in farklı işlevlerini kullanmanıza olanak tanır. Bu yöntemler, otomatik kilitlenme raporlarınıza özel anahtarlar, özel günlükler, önemli olmayan hatalar ve daha fazlasıyla nasıl açıklama ekleyeceğinizi gösterecektir.

Oyunu oluşturduktan sonra hata ayıklama menüsünü kullanacak ve sonuçları inceleyerek oyununuzun vahşi ortamda nasıl çalıştığına dair sağladığı benzersiz görünümü anlayacaksınız.

Ne öğreneceksin

  • Crashlytics tarafından otomatik olarak yakalanan hata türleri.
  • Kasıtlı olarak kaydedilebilecek ek hatalar.
  • Anlaşılmalarını kolaylaştırmak için bu hatalara daha fazla bilgi nasıl eklenir?

İhtiyacınız olan şey

  • Aşağıdakilerden biri veya her ikisiyle birliktelik (Minimum Önerilen Sürüm 2019+):
    • iOS Derleme Desteği
    • Android Derleme Desteği
  • (Yalnızca Android için) Firebase CLI (kilitlenme raporları için sembolleri yüklemek amacıyla kullanılır)

2. Geliştirme ortamınızı kurun

Aşağıdaki bölümlerde Firebase ile Seviye Atlama kodunun nasıl indirileceği ve Unity'de nasıl açılacağı açıklanmaktadır.

Bu Firebase ile Seviye Atlama örnek oyununun diğer birçok Firebase + Unity codelab'i tarafından kullanıldığını unutmayın; dolayısıyla bu bölümdeki görevleri zaten tamamlamış olabilirsiniz. Öyleyse doğrudan bu sayfadaki son adıma gidebilirsiniz: "Unity için Firebase SDK'ları ekleyin".

Kodu indirin

Bu codelab'in GitHub deposunu komut satırından kopyalayın:

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

Alternatif olarak, git yüklü değilse depoyu ZIP dosyası olarak indirebilirsiniz .

Unity editöründe Firebase ile Seviye Atlamayı açın

  1. Unity Hub'ı başlatın ve Projeler sekmesinde Aç'ın yanındaki açılır oka tıklayın.
  2. Diskten proje ekle'yi tıklayın.
  3. Kodu içeren dizine gidin ve ardından Tamam'a tıklayın.
  4. İstenirse kullanılacak Unity düzenleyici sürümünü ve hedef platformunuzu (Android veya iOS) seçin.
  5. Proje adına tıklayın, firebase ile seviye atlayın ve proje Unity editöründe açılacaktır.
  6. Editörünüz otomatik olarak açmazsa, Unity Editör'ün Proje sekmesindeki Varlıklar > Hamster'da MainGameScene açın.
    ff4ea3f3c0d29379.png

Unity'yi yükleme ve kullanma hakkında daha fazla bilgi için bkz. Unity'de Çalışmak .

3. Firebase'i Unity projenize ekleyin

Firebase projesi oluşturma

  1. Firebase konsolunda Proje ekle'yi tıklayın.
  2. Yeni bir proje oluşturmak için istediğiniz proje adını girin.
    Bu aynı zamanda proje kimliğini (proje adının altında görüntülenen) proje adına dayalı bir şeye ayarlayacaktır. İsteğe bağlı olarak proje kimliğini daha da özelleştirmek için düzenleme simgesine tıklayabilirsiniz.
  3. İstenirse Firebase şartlarını inceleyip kabul edin.
  4. Devam'ı tıklayın.
  5. Bu proje için Google Analytics'i etkinleştir seçeneğini seçin ve ardından Devam'ı tıklayın.
  6. Kullanmak için mevcut bir Google Analytics hesabını seçin veya yeni bir hesap oluşturmak için Yeni hesap oluştur'u seçin.
  7. Proje oluştur'u tıklayın.
  8. Proje oluşturulduğunda Devam'a tıklayın.

Uygulamanızı Firebase'e kaydedin

  1. Halen Firebase konsolundayken , projeye genel bakış sayfasının ortasında, kurulum iş akışını başlatmak için Unity simgesini tıklayın veya Firebase projenize zaten bir uygulama eklediyseniz platform seçeneklerini görüntülemek için Uygulama ekle'yi tıklayın.
  2. Hem Apple (iOS) hem de Android derleme hedeflerini kaydetmek için seçin.
  3. Unity projenizin platforma özel kimlik(ler)ini girin. Bu codelab için aşağıdakileri girin:
  4. (İsteğe bağlı) Unity projenizin platforma özel takma adlarını girin.
  5. Uygulamayı kaydet öğesine tıklayın ve ardından Yapılandırma dosyasını indir bölümüne ilerleyin.

Firebase yapılandırma dosyalarını ekleyin

Uygulamayı kaydet seçeneğine tıkladıktan sonra, iki yapılandırma dosyasını (her derleme hedefi için bir yapılandırma dosyası) indirmeniz istenecektir. Unity projenizin Firebase'e bağlanabilmesi için bu dosyalardaki Firebase meta verilerine ihtiyacı var.

  1. Mevcut her iki yapılandırma dosyasını da indirin:
    • Apple (iOS) için : GoogleService-Info.plist'i indirin.
    • Android için : google-services.json dosyasını indirin.
  2. Unity projenizin Proje penceresini açın, ardından her iki yapılandırma dosyasını da Varlıklar klasörüne taşıyın.
  3. Firebase konsoluna geri döndüğünüzde, kurulum iş akışında İleri'ye tıklayın ve Unity için Firebase SDK'ları Ekle'ye ilerleyin.

Unity için Firebase SDK'ları ekleyin

  1. Firebase konsolunda Firebase Unity SDK'yı İndir'e tıklayın.
  2. SDK'yı uygun bir yerde açın.
  3. Açık Unity Projenizde Varlıklar > Paketi İçe Aktar > Özel Paket'e gidin.
  4. Paketi içe aktar iletişim kutusunda, sıkıştırılmış SDK'yı içeren dizine gidin, FirebaseAnalytics.unitypackage seçin ve ardından Aç öğesine tıklayın.
  5. Görüntülenen Unity Paketini İçe Aktar iletişim kutusunda İçe Aktar'ı tıklayın.
  6. FirebaseCrashlytics.unitypackage içe aktarmak için önceki adımları tekrarlayın.
  7. Firebase konsoluna dönün ve kurulum iş akışında İleri'yi tıklayın.

Firebase SDK'larını Unity projelerine ekleme hakkında daha fazla bilgi için Ek Unity yükleme seçeneklerine bakın.

4. Unity projenizde Crashlytics'i kurun

Crashlytics'i Unity projelerinde kullanmak için birkaç kurulum adımı daha uygulamanız gerekir. Elbette SDK'yı başlatmanız gerekecek. Ancak aynı zamanda, Firebase konsolunda sembolik yığın izlerini görebilmeniz için sembollerinizi yüklemeniz gerekir ve Firebase'in kilitlenme olaylarınızı aldığından emin olmak için bir test kilitlenmesini zorlamanız gerekir.

Crashlytics SDK'sını başlatın

  1. Assets/Hamster/Scripts/MainGame.cs aşağıdaki using ifadeleri ekleyin:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    
    İlk modül, Crashlytics SDK'daki yöntemleri kullanmanıza izin verir ve ikincisi , C# Görevler API'sine yönelik bazı uzantılar içerir. Her iki ifadeyi de using aşağıdaki kod çalışmaz.
  2. Halen MainGame.cs , InitializeFirebaseAndStartGame() :
    void Start()
    {
      Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
      InitializeFirebaseAndStartGame();
    }
    
    çağırarak Firebase başlatma işlemini mevcut Start() yöntemine ekleyin.
  3. Ve yine MainGame.cs , InitializeFirebaseAndStartGame() bulun, bir uygulama değişkeni bildirin ve ardından yöntemin uygulamasının üzerine şu şekilde yazın:
    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");
          }
        });
    }
    

Başlatma mantığını buraya yerleştirmek, Firebase bağımlılıkları başlatılmadan önce oynatıcı etkileşimini engeller.

İşlenmeyen istisnaları ölümcül olarak bildirmenin yararları ve etkileri Crashlytics SSS bölümünde tartışılmıştır.

Projenizi oluşturun ve sembolleri yükleyin

Sembol oluşturma ve yükleme adımları iOS ve Android uygulamaları için farklıdır.

iOS+ (Apple platformu)

  1. Derleme Ayarları iletişim kutusundan projenizi bir Xcode çalışma alanına aktarın.
  2. Uygulamanızı oluşturun.
    Apple platformları için Firebase Unity Editor eklentisi, Xcode projenizi her yapı için Crashlytics uyumlu bir sembol dosyası oluşturacak ve Firebase sunucularına yükleyecek şekilde otomatik olarak yapılandırır. Bu sembol bilgileri, Crashlytics panosundaki sembolik yığın izlerini görmek için gereklidir.

Android

  1. (yalnızca ilk kurulum sırasında, her derleme için değil) Derlemenizi kurun:
    1. Proje dizininizin kökünde (yani Varlıklar dizininizin kardeşi olarak) Builds adında yeni bir klasör oluşturun ve ardından Android adında bir alt klasör oluşturun.
    2. Dosya > Derleme Ayarları > Oynatıcı Ayarları > Yapılandırma bölümünde Komut Dosyası Arka Ucu'nu IL2CPP olarak ayarlayın.
      • IL2CPP genellikle yapıların daha küçük olmasına ve daha iyi performansa sahip olmasına neden olur.
      • IL2CPP ayrıca iOS'ta kullanılabilen YALNIZCA seçenektir ve burada seçilmesi, iki platformun daha iyi bir eşitlik içinde olmasını ve ikisi arasındaki hata ayıklama farklarını (her ikisini de oluşturmayı seçerseniz) daha basit hale getirmesini sağlar.
  2. Uygulamanızı oluşturun. Dosya > Oluşturma Ayarları bölümünde aşağıdakileri tamamlayın:
    1. Semboller.zip oluştur seçeneğinin işaretli olduğundan emin olun (veya bir açılır menü sunulursa Hata Ayıklama öğesini seçin).
    2. APK'nızı doğrudan Unity Editor'dan az önce oluşturduğunuz Builds/Android alt klasörüne oluşturun.
  3. Derlemeniz bittiğinde Crashlytics uyumlu bir sembol dosyası oluşturmanız ve bunu Firebase sunucularına yüklemeniz gerekir. Bu sembol bilgileri, Crashlytics panosundaki yerel kitaplık çökmelerine ilişkin sembolik yığın izlerini görmek için gereklidir.

    Aşağıdaki Firebase CLI komutunu çalıştırarak bu semboller dosyasını oluşturun ve yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
    • FIREBASE_APP_ID : Firebase Android Uygulama Kimliğiniz (paket adınız değil). Bu değeri daha önce indirdiğiniz google-services.json dosyasında bulun. Bu mobilesdk_app_id değeridir.
      Örnek Firebase Android Uygulama Kimliği: 1:567383003300:android:17104a2ced0c9b9b
    • PATH/TO/SYMBOLS : derlemeniz tamamlandığında Builds/Android dizininde oluşturulan sıkıştırılmış sembol dosyasının yolu (örneğin: Builds/Android/myapp-1.0-v100.symbols.zip ).

Kurulumu tamamlamak için test çökmesini zorla

Crashlytics kurulumunu tamamlamak ve Firebase konsolunun Crashlytics kontrol panelinde ilk verileri görmek için test kilitlenmesini zorlamanız gerekir.

  1. MainGameScene'de Hierarchy düzenleyicisinde EmptyObject GameObject bulun, aşağıdaki betiği ona ekleyin ve ardından sahneyi kaydedin. Bu komut dosyası, uygulamanızı çalıştırdıktan birkaç saniye sonra testin çökmesine neden olur.
    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. Uygulamanızı oluşturun ve derlemeniz tamamlandıktan sonra sembol bilgilerini yükleyin.
    • iOS : Firebase Unity Editor eklentisi, Xcode projenizi sembol dosyanızı yükleyecek şekilde otomatik olarak yapılandırır.
    • Android : Sembol dosyanızı yüklemek için Firebase CLI crashlytics:symbols:upload komutunu çalıştırın.
  3. Uygulamanızı çalıştırın. Uygulamanız çalışmaya başladıktan sonra cihaz günlüğünü izleyin ve istisnanın CrashlyticsTester tetiklenmesini bekleyin.
    • iOS : Günlükleri Xcode'un alt bölmesinde görüntüleyin.
    • Android : Terminalde şu komutu çalıştırarak günlükleri görüntüleyin: adb logcat .
  4. İstisnayı görüntülemek için Crashlytics kontrol panelini ziyaret edin! Bunu kontrol panelinin altındaki Sorunlar tablosunda göreceksiniz. Codelab'in ilerleyen bölümlerinde bu raporları nasıl keşfedeceğiniz hakkında daha fazla bilgi edineceksiniz.
  5. Etkinliğin Crashlytics'e yüklendiğini onayladıktan sonra, onu eklediğiniz EmptyObject GameObject seçin, yalnızca CrashlyticsTester bileşenini kaldırın ve ardından sahneyi orijinal durumuna geri yüklemek için kaydedin.

5. Hata Ayıklama Menüsünü etkinleştirin ve anlayın

Şu ana kadar Crashlytics'i Unity projenize eklediniz, kurulumu tamamladınız ve Crashlytics SDK'nın etkinlikleri Firebase'e yüklediğini doğruladınız. Artık Unity projenizde, oyununuzda daha gelişmiş Crashlytics işlevlerini nasıl kullanacağınızı gösterecek bir menü oluşturacaksınız. Firebase Unity ile Seviye Atlama projesinde zaten görünür hale getireceğiniz ve işlevselliğini yazacağınız gizli bir Hata Ayıklama Menüsü bulunmaktadır.

Hata Ayıklama Menüsünü Etkinleştir

Hata Ayıklama Menüsüne erişim düğmesi Unity projenizde mevcuttur ancak şu anda etkin değildir. MainMenu hazır yapısından erişmek için düğmeyi etkinleştirmeniz gerekir:

  1. Unity Düzenleyicisinde MainMenu adlı hazır yapıyı açın. 4148538cbe9f36c5.png
  2. Prefabrik hiyerarşisinde, DebugMenuButton adlı devre dışı bırakılmış alt nesneyi bulun ve ardından onu seçin. 816f8f9366280f6c.png
  3. DebugMenuButton öğesini içeren metin alanının solundaki sol üst köşedeki kutuyu işaretleyerek DebugMenuButton öğesini etkinleştirin. 8a8089d2b4886da2.png
  4. Prefabrik'i kaydedin.
  5. Oyunu editörde veya cihazınızda çalıştırın. Menü artık erişilebilir olmalıdır.

Hata Ayıklama Menüsü için yöntem gövdelerini önizleyin ve anlayın

Bu codelab'in ilerleyen kısımlarında, önceden yapılandırılmış bazı Crashlytics hata ayıklama yöntemleri için yöntem gövdeleri yazacaksınız. Firebase Unity ile Seviye Atlama projesinde ise yöntemler DebugMenu.cs içinde tanımlanır ve buradan çağrılır.

Bu yöntemlerden bazıları hem Crashlytics yöntemlerini çağırıp hem de hata atsa da Crashlytics'in bu hataları yakalama yeteneği ilk önce bu yöntemlerin çağrılmasına bağlı değildir. Aksine, hataların otomatik olarak yakalanmasıyla oluşturulan kilitlenme raporları, bu yöntemlerle eklenen bilgilerle zenginleştirilecektir.

DebugMenu.cs dosyasını açın ve ardından aşağıdaki yöntemleri bulun:

Crashlytics sorunlarını oluşturma ve açıklama ekleme yöntemleri:

  • CrashNow
  • LogNonfatalError
  • LogStringsAndCrashNow
  • SetAndOverwriteCustomKeyThenCrash
  • SetLogsAndKeysBeforeANR

Hata ayıklamaya yardımcı olmak için Analytics olaylarını günlüğe kaydetme yöntemleri:

  • LogProgressEventWithStringLiterals
  • LogIntScoreWithBuiltInEventAndParams

Bu codelab'in sonraki adımlarında bu yöntemleri uygulayacak ve oyun geliştirmede ortaya çıkabilecek belirli durumların ele alınmasına nasıl yardımcı olduklarını öğreneceksiniz.

6. Geliştirme aşamasında kilitlenme raporlarının teslim edilmesini sağlayın

Bu hata ayıklama yöntemlerini uygulamaya başlamadan ve bunların kilitlenme raporlarını nasıl etkilediğini görmeden önce olayların Crashlytics'e nasıl raporlandığını anladığınızdan emin olun.

Unity projeleri için oyununuzdaki çökme ve istisna olayları anında diske yazılır. Oyununuzu çökertmeyen yakalanmamış istisnalar için (örneğin, oyun mantığındaki yakalanmamış C# istisnaları), Unity projenizde Crashlytics'i başlattığınız yerde Crashlytics.ReportUncaughtExceptionsAsFatal özelliğini true olarak ayarlayarak Crashlytics SDK'nın bunları ölümcül olaylar olarak raporlamasını sağlayabilirsiniz. . Bu olaylar, son kullanıcının oyunu yeniden başlatmasına gerek kalmadan Crashlytics'e gerçek zamanlı olarak bildirilir. Yerel çökmelerin her zaman ölümcül olaylar olarak rapor edildiğini ve son kullanıcı oyunu yeniden başlattığında birlikte gönderildiğini unutmayın.

Ayrıca, farklı çalışma zamanı ortamlarının Crashlytics bilgilerini Firebase'e gönderme şekli arasındaki aşağıdaki küçük ama önemli farklara da dikkat edin:

iOS simülatörü:

  • Crashlytics bilgileri yalnızca Xcode'u simülatörden çıkardığınızda raporlanır. Xcode eklenirse hataları yukarı yönde yakalayarak bilgi dağıtımını engeller.

Mobil fiziksel cihazlar (Android ve iOS):

  • Android'e özel: ANR'ler yalnızca Android 11+ sürümlerinde raporlanır. ANR'ler ve ölümcül olmayan olaylar bir sonraki çalıştırmada raporlanır.

Birlik Editörü:

CrashNow() 'da tek bir düğmeye dokunarak oyununuzu çökertmeyi test edin

Crashlytics oyununuzda kurulduktan sonra Crashlytics SDK, çökmeleri ve yakalanmayan istisnaları otomatik olarak kaydeder ve bunları analiz için Firebase'e yükler. Raporlar Firebase konsolundaki Crashlytics kontrol panelinde görüntülenir.

  1. Bunun gerçekten otomatik olduğunu göstermek için: DebugMenu.cs açın ve ardından aşağıdaki gibi CrashNow() yönteminin üzerine yazın:
    void CrashNow()
    {
        TestCrash();
    }
    
  2. Uygulamanızı oluşturun.
  3. (Yalnızca Android) Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Şimdi Kilitle düğmesine dokunun ve kilitlenme raporunu nasıl görüntüleyip yorumlayacağınızı öğrenmek için bu codelab'in bir sonraki adımına geçin.

7. Firebase konsolundaki sorun raporlarını anlayın

Kilitlenme raporlarınızı görüntülemeye gelince, onlardan en iyi şekilde nasıl yararlanabileceğiniz konusunda bilmeniz gereken biraz daha fazla şey var. Yazdığınız yöntemlerin her biri, Crashlytics raporlarına farklı türde bilgilerin nasıl ekleneceğini gösterecektir.

  1. Şimdi Kilitle düğmesine dokunun ve ardından uygulamanızı yeniden başlatın.
  2. Crashlytics kontrol paneline gidin. Crashlytics'in tümü aynı temel nedene sahip olayları "sorunlar" halinde gruplandırdığı kontrol panelinin altındaki Sorunlar tablosuna ilerleyin.
  3. Sorunlar tablosunda listelenen yeni sayıya tıklayın. Bunu yapmak, Firebase'e gönderilen her bir etkinlikle ilgili Etkinlik özetini görüntüler.

    Aşağıdaki ekran görüntüsüne benzer bir şey görmelisiniz. Etkinlik özetinin, çökmeye neden olan çağrının yığın izini nasıl belirgin bir şekilde sunduğuna dikkat edin. 40c96abe7f90c3aa.png

Ek meta veriler

Bir diğer yararlı sekme ise Unity Meta Verileri sekmesidir. Bu bölüm, fiziksel özellikler, CPU modeli/teknik özellikleri ve her türlü GPU ölçümleri dahil olmak üzere, olayın meydana geldiği cihazın özellikleri hakkında sizi bilgilendirir.

Bu sekmedeki bilgilerin yararlı olabileceği bir örneği burada bulabilirsiniz:
Oyununuzun belirli bir görünüm elde etmek için gölgelendiricileri yoğun şekilde kullandığını, ancak tüm telefonların bu özelliği sunabilecek GPU'lara sahip olmadığını düşünün. Unity Meta Verileri sekmesindeki bilgiler, hangi özelliklerin otomatik olarak kullanılabilir hale getirileceğine veya tamamen devre dışı bırakılacağına karar verirken uygulamanızın hangi donanımı test etmesi gerektiği konusunda size daha iyi bir fikir verebilir.

Cihazınızda hiçbir zaman bir hata veya çökme meydana gelmese de, Android cihazların çok çeşitli olması nedeniyle, hedef kitlenizin cihazlarının belirli "etkin noktalarını" daha iyi anlamanıza yardımcı olur.

41d8d7feaa87454d.png

8. Bir istisna atın, yakalayın ve günlüğe kaydedin

Çoğu zaman, bir geliştirici olarak, kodunuz bir çalışma zamanı istisnasını düzgün bir şekilde yakalayıp işlese bile, bunun hangi koşullar altında oluştuğunu not etmek iyi olur. Crashlytics.LogException tam da bu amaç için kullanılabilir; Firebase konsolunda sorunda daha fazla hata ayıklayabilmeniz için Firebase'e bir istisna olayı göndermek.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs , aşağıdakileri using ifadelerine ekleyin:
    // Import Firebase
    using Firebase.Crashlytics;
    
  2. Hala DebugMenu.cs LogNonfatalError() öğesinin üzerine şu şekilde yazın:
    void LogNonfatalError()
    {
        try
        {
            throw new System.Exception($"Test exception thrown in {nameof(LogNonfatalError)}");
        }
        catch(System.Exception exception)
        {
            Crashlytics.LogException(exception);
        }
    }
    
  3. Uygulamanızı oluşturun.
  4. (Yalnızca Android) Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  5. Önemli Olmayan Hatayı Günlüğe Kaydet düğmesine dokunun ve ardından uygulamanızı yeniden başlatın.
  6. Crashlytics kontrol paneline gittiğinizde bu codelab'in son adımında gördüklerinize benzer bir şey görmelisiniz.
  7. Ancak bu kez Etkinlik türü filtresini Ölümcül olmayanlarla sınırlayın, böylece yalnızca az önce kaydettiğiniz gibi önemli olmayan hataları görüntüleyebilirsiniz.
    a39ea8d9944cbbd9.png

9. Program yürütme akışını daha iyi anlamak için dizeleri Crashlytics'e kaydedin

Birden fazla yoldan (oturum başına binlerce olmasa da yüzlerce kez) çağrılan bir kod satırının neden aniden bir istisna veya çökme oluşturabileceğini hiç anlamaya çalıştınız mı? Bir IDE'de kodun üzerinden geçmek ve değerlere daha yakından bakmak güzel olsa da, bu durum kullanıcılarınızın yalnızca çok küçük bir yüzdesinde gerçekleşirse ne olur? Daha da kötüsü, ne yaparsanız yapın bu çöküşü tekrarlayamazsanız ne yapardınız?

Bu gibi durumlarda, bir bağlamın olması çok büyük fark yaratabilir. Crashlytics.Log ile ihtiyacınız olan bağlamı yazma olanağına sahipsiniz. Bu mesajları gelecekteki kendinize neler olabileceğine dair ipuçları olarak düşünün.

Günlükler sayısız şekilde kullanılabilse de, bunlar genellikle çağrıların sırasının ve/veya yokluğunun hayati önem taşıyan bir bilgi parçası olduğu durumların kaydedilmesi için faydalıdır.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs LogStringsAndCrashNow() işlevinin üzerine şu şekilde yazın:
    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. Uygulamanızı oluşturun.
  3. (Yalnızca Android) Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Günlük Dizeleri ve Şimdi Kilitle düğmesine dokunun ve ardından uygulamanızı yeniden başlatın.
  5. Crashlytics kontrol paneline geri dönün ve Sorunlar tablosunda listelenen en yeni soruna tıklayın. Yine önceki sayılara benzer bir şey görmelisiniz.
    7aabe103b8589cc7.png
  6. Ancak bir Etkinlik özeti içindeki Günlükler sekmesini tıklarsanız şuna benzer bir görünüm elde edersiniz:
    4e27aa407b7571cf.png

10. Özel bir anahtarı yazın ve üzerine yazın

Az sayıda değere veya konfigürasyona ayarlanmış değişkenlere karşılık gelen bir kilitlenmeyi daha iyi anlamak istediğinizi varsayalım. Herhangi bir zamanda, baktığınız değişkenlerin ve olası değerlerin birleşimine dayalı olarak filtreleme yapabilmek güzel olabilir.

Crashlytics, rastgele dizeleri günlüğe kaydetmenin yanı sıra, programınızın çöktüğü andaki tam durumunu bilmenin yararlı olduğu durumlarda başka bir hata ayıklama biçimi sunar: özel anahtarlar.

Bunlar bir oturum için ayarlayabileceğiniz anahtar/değer çiftleridir. Biriken ve tamamen eklemeli olan günlüklerin aksine, bir değişkenin veya koşulun yalnızca en son durumunu yansıtacak şekilde anahtarların üzerine yazılabilir.

Bu anahtarlar, programınızın son kaydedilen durumunun bir defteri olmasının yanı sıra, Crashlytics sorunları için güçlü filtreler olarak da kullanılabilir.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs , SetAndOverwriteCustomKeyThenCrash() öğesinin üzerine şu şekilde yazın:
    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. Uygulamanızı oluşturun.
  3. (Yalnızca Android) Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Özel Anahtarı Ayarla ve Kilitlenme düğmesine dokunun ve ardından uygulamanızı yeniden başlatın.
  5. Crashlytics kontrol paneline geri dönün ve Sorunlar tablosunda listelenen en yeni soruna tıklayın. Yine önceki sayılara benzer bir şey görmelisiniz.
  6. Ancak bu sefer Etkinlik özetindeki Anahtarlar sekmesini tıklayın, böylece Current Time de dahil olmak üzere anahtarların değerini görüntüleyebilirsiniz:
    7dbe1eb00566af98.png

Neden özel günlükler yerine özel anahtarlar kullanmak istiyorsunuz?

  • Günlükler sıralı verileri depolamak açısından iyidir ancak yalnızca en güncel değeri istiyorsanız özel anahtarlar daha iyidir.
  • Firebase konsolunda, Sorunlar tablosu arama kutusundaki anahtarların değerlerine göre sorunları kolayca filtreleyebilirsiniz.

Günlüklere benzer şekilde, özel anahtarların da bir sınırı vardır. Crashlytics maksimum 64 anahtar/değer çiftini destekler. Bu eşiğe ulaştığınızda ek değerler kaydedilmez. Her anahtar/değer çiftinin boyutu en fazla 1 KB olabilir.

11. (Yalnızca Android) Bir ANR'yi anlamak ve teşhis etmek için özel anahtarları ve günlükleri kullanın

Android geliştiricileri için hata ayıklaması en zor sorunlardan biri Yanıt Vermeyen Uygulama (ANR) hatasıdır. ANR'ler, bir uygulamanın girişe 5 saniyeden uzun süre yanıt vermemesi durumunda ortaya çıkar. Böyle bir durum, uygulamanın ya donduğu ya da çok yavaş çalıştığı anlamına gelir. Kullanıcılara bir iletişim kutusu gösterilir ve kullanıcılar "Beklemeyi" veya "Uygulamayı Kapatmayı" seçebilirler.

ANR'ler kötü bir kullanıcı deneyimidir ve (yukarıdaki ANR bağlantısında belirtildiği gibi) uygulamanızın Google Play Store'da keşfedilebilirliğini etkileyebilir. Karmaşıklıkları nedeniyle ve genellikle farklı telefon modellerinde oldukça farklı davranışlara sahip çok iş parçacıklı kodlardan kaynaklandıkları için, hata ayıklama sırasında ANR'leri yeniden oluşturmak neredeyse imkansız olmasa da genellikle çok zordur. Bu nedenle onlara analitik ve tümdengelimli yaklaşmak genellikle en iyi yaklaşımdır.

Bu yöntemde, otomatik sorun günlüğünü desteklemek ve bize daha fazla bilgi vermek için Crashlytics.LogException , Crashlytics.Log ve Crashlytics.SetCustomKey kombinasyonunu kullanacağız.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs SetLogsAndKeysBeforeANR() işlevinin üzerine şu şekilde yazın:
    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. Uygulamanızı oluşturun.
  3. Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Günlükleri ve Anahtarları Ayarla → ANR etiketli düğmeye dokunun ve ardından uygulamanızı yeniden başlatın.
  5. Crashlytics kontrol paneline geri dönün ve ardından Etkinlik özetini görüntülemek için Sorunlar tablosundaki yeni soruna tıklayın. Arama düzgün bir şekilde gerçekleştiyse şunun gibi bir şey görmelisiniz:
    876c3cff7037bd07.png

    Gördüğünüz gibi Firebase, uygulamanızın bir ANR'yi tetiklemesinin ana nedeni olarak ileti dizisindeki yoğun beklemeyi belirledi.
  6. Etkinlik özetinin Günlükler sekmesindeki günlüklere baktığınızda, tamamlanmış olarak kaydedilen son yöntemin DoSevereWork olduğunu göreceksiniz.
    5a4bec1cf06f6984.png

    Buna karşılık, başlangıç ​​olarak listelenen son yöntem DoExtremeWork ; bu, ANR'nin bu yöntem sırasında oluştuğunu ve oyunun DoExtremeWork günlüğe kaydedemeden kapandığını gösterir.

    89d86d5f598ecf3a.png

Bunu neden yapıyorsun?

  • ANR'leri yeniden oluşturmak inanılmaz derecede zordur; bu nedenle, kod alanı ve metrikler hakkında zengin bilgiler elde edebilmek, bunları tümdengelimli olarak bulmak için inanılmaz derecede önemlidir.
  • Özel anahtarlarda saklanan bilgiler sayesinde artık hangi eşzamansız iş parçacığının çalışmasının en uzun sürdüğünü ve hangilerinin ANR'leri tetikleme tehlikesiyle karşı karşıya olduğunu biliyorsunuz. Bu tür ilgili mantıksal ve sayısal veriler, kodunuzun neresinde optimizasyon yapılmasının en gerekli olduğunu size gösterecektir.

12. Raporları daha da zenginleştirmek için Analytics olaylarını serpiştirmek

Aşağıdaki yöntemler de Hata Ayıklama Menüsünden çağrılabilir, ancak kendileri sorun oluşturmak yerine, oyununuzun işleyişini daha iyi anlamak için Google Analytics'i başka bir bilgi kaynağı olarak kullanırlar.

Bu codelab'de yazdığınız diğer yöntemlerden farklı olarak bu yöntemleri diğerleriyle birlikte kullanmalısınız. Diğerlerinden birini çalıştırmadan önce bu yöntemleri (Hata Ayıklama Menüsünde ilgili düğmeye basarak) istediğiniz sırayla çağırın. Daha sonra, belirli Crashlytics sayısındaki bilgileri incelediğinizde, Analytics etkinliklerinin sıralı bir günlüğünü göreceksiniz. Bu veriler, uygulamanızı nasıl düzenlediğinize bağlı olarak bir program akışı veya kullanıcı girişi kombinasyonunu daha iyi anlamak için bir oyunda kullanılabilir.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs aşağıdaki yöntemlerin mevcut uygulamalarının üzerine yazın:
    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. Oyununuzu oluşturup dağıtın ve ardından Hata Ayıklama Menüsüne girin.
  3. (Yalnızca Android) Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Yukarıdaki işlevleri çağırmak için aşağıdaki düğmelerden en az birine bir veya daha fazla basın:
    • Günlük Dizesi Olayı
    • Giriş Etkinliği
  5. Şimdi Kilitle düğmesine basın.
  6. Kilitlenme olayını Firebase'e yüklemek için oyununuzu yeniden başlatın.
  7. Analytics olaylarının çeşitli rastgele dizilerini günlüğe kaydettiğinizde ve ardından oyununuzun Crashlytics'in rapor oluşturduğu bir etkinlik oluşturmasını sağladığınızda (az önce yaptığınız gibi), bunlar Crashlytics Etkinlik Özeti'nin Günlükler sekmesine şu şekilde eklenir:
    d3b16d78f76bfb04.png

13. İleriye gitmek

Ve bununla birlikte, otomatik olarak oluşturulan kilitlenme raporlarınızı desteklemek için daha iyi bir teorik temele sahip olmalısınız. Bu yeni bilgiler, olayların sırasını ve sonuca yol açan mantığı daha iyi ayrıştırmak için mevcut durumu, geçmiş olayların kayıtlarını ve mevcut Google Analytics olaylarını kullanmanıza olanak tanır.

Uygulamanız Android 11 (API düzeyi 30) veya üstünü hedefliyorsa, use-after-free ve heap-buffer-overflow hataları gibi yerel bellek hatalarının neden olduğu çökmelerde hata ayıklamak için yararlı bir yerel bellek ayırıcı özelliği olan GWP-ASan'ı eklemeyi düşünün. Bu hata ayıklama özelliğinden yararlanmak için GWP-ASan'ı açıkça etkinleştirin .

Sonraki adımlar

Unity'de Remote Config ve A/B Testinin kullanımı hakkında bilgi edineceğiniz Remote Config codelab ile Unity oyununuza geçin.