Gelişmiş Crashlytics özelliklerini kullanarak Unity oyunlarının kilitlenmelerini anlama

1. Giriş

Bu codelab'de, kilitlenmeleri ve bunlara yol açmış olabilecek koşulları daha iyi görebilmeniz için Crashlytics'in gelişmiş özelliklerini nasıl kullanacağınızı öğreneceksiniz.

Örnek bir oyun olan MechaHamster: Level Up with Firebase Edition'a yeni işlevler ekleyeceksiniz. Bu örnek oyun, klasik Firebase oyunu MechaHamster'ın yeni bir sürümüdür. Yerleşik Firebase işlevlerinin çoğunu kaldırarak bunların yerine yeni Firebase kullanımlarını kullanma şansını elde edersiniz.

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

Oyunu oluşturduktan sonra hata ayıklama menüsünü kullanacak ve oyununuzun nasıl çalışacağına dair sağladığı benzersiz görünümü anlamak için sonuçları inceleyeceksiniz.

Neler öğreneceksiniz?

  • Crashlytics tarafından otomatik olarak yakalanan hata türleri.
  • Bilinçli olarak kaydedilebilen ek hatalar.
  • Bu hataların daha kolay anlaşılması için bunlara nasıl daha fazla bilgi eklenir?

Gerekenler

  • Aşağıdakilerden en az birine sahip Unity (Önerilen Minimum Sürüm 2019 veya sonraki sürümler):
    • iOS Derleme Desteği
    • Android Derleme Desteği
  • (Yalnızca Android için) Firebase CLI (kilitlenme raporları için sembol yüklemek amacıyla kullanılır)

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

Aşağıdaki bölümlerde, Firebase ile Seviye Atla kodunu indirip Unity'de nasıl açacağınız açıklanmaktadır.

Bu Firebase ile Seviye Atlama örnek oyununun diğer Firebase ve Unity codelab'leri tarafından kullanıldığını, dolayısıyla bu bölümdeki görevleri tamamlamış olabileceğinizi unutmayın. Öyleyse doğrudan bu sayfadaki son adıma geçebilirsiniz: "Unity için Firebase SDK'larını ekleme".

Kodu indirme

Komut satırından bu codelab'in GitHub deposunu klonlayın:

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

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

Unity düzenleyicide Firebase ile Seviye Atla'yı açın

  1. Unity Hub'ı başlatın ve Projeler sekmesinde 'ın yanındaki açılır oku tıklayın.
  2. Add project from disk'i (Diskten proje ekle) tıklayın.
  3. Kodu içeren dizine gidin, ardından Tamam'ı tıklayın.
  4. İstenirse kullanılacak Unity Editor sürümünü ve hedef platformunuzu (Android veya iOS) seçin.
  5. level-up-with-firebase proje adını tıklayın. Proje Unity Editor'da açılır.
  6. Düzenleyiciniz öğeyi otomatik olarak açmazsa MainGameScene öğesini Öğeler > Unity Editor'ın Proje sekmesinde bulunan Hamster.
    ff4ea3f3c0d29379.png

Unity'yi yükleme ve kullanma hakkında daha fazla bilgi için Unity'de çalışma başlıklı makaleyi inceleyin.

3. Firebase'i Unity projenize ekleyin

Firebase projesi oluşturma

  1. Firebase konsolunda Proje ekle'yi tıklayın.
  2. Yeni proje oluşturmak için istediğiniz proje adını girin.
    Bu işlem ayrıca proje kimliğini (proje adının altında gösterilir) proje adına bağlı olarak bir değere ayarlar. İsteğe bağlı olarak proje kimliğindeki düzenle simgesini tıklayarak kimliği daha fazla özelleştirebilirsiniz.
  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 belirleyip 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. Create project (Proje oluştur) seçeneğini tıklayın.
  8. Proje oluşturulduktan sonra Continue (Devam) seçeneğini tıklayın.

Uygulamanızı Firebase'e kaydedin

  1. Yine Firebase konsolunda, kurulum iş akışını başlatmak için projeye genel bakış sayfasının ortasından Unity simgesini tıklayın veya Firebase projenize daha önce 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 özgü kimliklerini girin. Bu codelab için aşağıdaki bilgileri girin:
  4. (İsteğe bağlı) Unity projenizin platforma özgü takma adlarını girin.
  5. Uygulamayı kaydet'i tıklayın, ardından Yapılandırma dosyasını indir bölümüne geçin.

Firebase yapılandırma dosyalarını ekleme

Uygulamayı kaydet'i tıkladıktan sonra iki yapılandırma dosyası (her derleme hedefi için bir yapılandırma dosyası) indirmeniz istenir. Unity projenizin bu dosyalardaki Firebase meta verileri ile Firebase'e bağlanması gerekir.

  1. Kullanılabilir iki yapılandırma dosyasını indirin:
    • Apple (iOS) için: GoogleService-Info.plist dosyasını 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ı Assets klasörüne taşıyın.
  3. Firebase konsolunda kurulum iş akışında İleri'yi tıklayın ve Unity için Firebase SDK'ları Ekleme bölümüne geçin.

Unity için Firebase SDK'ları ekleyin

  1. Firebase konsolunda Firebase Unity SDK'yı indir'i tıklayın.
  2. SDK'yı uygun bir yerde açın.
  3. Açık Unity Projenizde Assets (Öğeler) > Paketi İçe Aktar > Özel Paket.
  4. Paketi içe aktar iletişim kutusunda, sıkıştırılmış SDK'yı içeren dizine gidin, FirebaseAnalytics.unitypackage'yi seçin ve ardından 'ı tıklayın.
  5. Açılan Unity Paketini İçe Aktar iletişim kutusunda İçe Aktar'ı tıklayın.
  6. FirebaseCrashlytics.unitypackage dosyasını 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.

Unity projelerine Firebase SDK'ları ekleme hakkında daha fazla bilgi için Ek Unity yükleme seçenekleri bölümüne bakın.

4. Unity projenizde Crashlytics'i kurun

Crashlytics'i Unity projelerinde kullanmak için birkaç kurulum adımı daha uygulamanız gerekir. Tabii ki SDK'yı ilk kullanıma hazırlamanız gerekir. Ancak, Firebase konsolunda simgesel yığın izlemeler görebilmek için sembollerinizi yüklemeniz ve Firebase'in kilitlenme etkinliklerinizi aldığından emin olmak için bir test kilitlenmesini zorunlu kılmanız gerekir.

Crashlytics SDK'yı başlatın

  1. Assets/Hamster/Scripts/MainGame.cs alanına aşağıdaki using ifadelerini ekleyin:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    
    İlk modül Crashlytics SDK'sından yöntemleri kullanmanıza olanak tanır, ikinci modül ise C# Tasks API'ye yönelik bazı uzantılar içerir. Her iki using ifadesi olmadan aşağıdaki kod çalışmaz.
  2. Yine MainGame.cs ürününde, InitializeFirebaseAndStartGame() yöntemini çağırarak mevcut Start() yöntemine Firebase başlatma ekleyin:
    void Start()
    {
      Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
      InitializeFirebaseAndStartGame();
    }
    
  3. Tekrar MainGame.cs içinde InitializeFirebaseAndStartGame() öğesini bulun, bir uygulama değişkeni tanımlayın 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ığı buraya yerleştirildiğinde, Firebase bağımlılıkları başlatılmadan önce oyuncu etkileşimi engellenir.

İşlenmemiş istisnaları önemli olarak bildirmenin avantajları ve etkileri, Crashlytics ile İlgili SSS bölümünde ele alınmıştır.

Projenizi oluşturun ve semboller yükleyin

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

iOS+ (Apple platformu)

  1. Build Settings (Ayarları Derleme) iletişim kutusundan projenizi Xcode çalışma alanına aktarın.
  2. Uygulamanızı derleyin.
    Apple platformlarında Firebase Unity Editor eklentisi her derleme için Crashlytics ile uyumlu bir sembol dosyası oluşturup Firebase sunucularına yüklemek için Xcode projenizi otomatik olarak yapılandırır. Crashlytics kontrol panelinde simgeselleştirilmiş yığın izlemeleri görmek için bu simgeyle ilgili bilgiler gereklidir.

Android

  1. (her derleme için değil, yalnızca ilk kurulum sırasında) Derlemenizi oluşturun:
    1. Proje dizininizin kök dizininde Builds adlı yeni bir klasör (Assets dizininizin eşdüzey öğe olarak) ve ardından Android adlı bir alt klasör oluşturun.
    2. Dosya > Derleme Ayarları > Oynatıcı Ayarları > Yapılandırma'da, Komut Dosyası Arka Ucunu IL2CPP olarak ayarlayın.
      • IL2CPP genellikle yapıların daha küçük olmasına ve daha iyi performans göstermesine neden olur.
      • IL2CPP, aynı zamanda iOS'te kullanılabilen TEK seçenektir. Bunu seçmek, iki platformun daha iyi eşitlikte olmasını ve ikisi arasındaki hata ayıklama farklılıklarını (ikisini de derlemeyi seçerseniz) basitleştirir.
  2. Uygulamanızı oluşturun. Dosya > Build Settings (Ayarları Derleme) bölümünde aşağıdaki adımları tamamlayın:
    1. Simgeler.zip Oluştur'un işaretli olduğundan emin olun (veya açılır liste gösteriliyorsa Hata ayıklama'yı seçin).
    2. APK'nızı doğrudan Unity Editor'dan az önce oluşturduğunuz Builds/Android alt klasöründe oluşturun.
  3. Derlemeniz tamamlandıktan sonra Crashlytics ile uyumlu bir simge dosyası oluşturmanız ve bu dosyayı Firebase sunucularına yüklemeniz gerekir. Crashlytics kontrol panelinde yerel kitaplık kilitlenmelerine ilişkin simgeselleştirilmiş yığın izlemeleri (stack trace) görmek için bu simgeyle ilgili bilgiler gereklidir.

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

Kurulumu tamamlamak için test kilitlenmesini zorunlu kılın

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

  1. MainGameScene'de, Hierarchy düzenleyicisinde BlankObjectGameObject (Boş Nesne) öğesini bulun, aşağıdaki komut dosyasını buna ekleyin ve ardından sahneyi kaydedin. Bu komut dosyası, uygulamanızı çalıştırmanızdan birkaç saniye sonra testin kilitlenmesine 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. Derlemeniz tamamlandıktan sonra uygulamanızı derleyin ve simge bilgilerini yükleyin.
    • iOS: Firebase Unity Editor eklentisi, Xcode projenizi otomatik olarak simge dosyanızı yükleyecek şekilde 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 tarafından tetiklenmesini bekleyin.
    • iOS: Günlükleri, Xcode'un alt bölmesinde görüntüleyebilirsiniz.
    • 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. Bu sorunu, kontrol panelinin alt kısmındaki Sorunlar tablosunda görürsünüz. Codelab'in ilerleyen bölümlerinde, bu raporları nasıl inceleyebileceğiniz hakkında daha fazla bilgi edineceksiniz.
  5. Etkinliğin Crashlytics'e yüklendiğini onayladıktan sonra, eklediğiniz BlankObject GameObject öğesini 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ştirme ve anlama

Şu ana kadar Crashlytics'i Unity projenize eklediniz, kurulumu tamamladınız ve Crashlytics SDK'nın Firebase'e etkinlik yüklediğini onayladınız. Şimdi Unity projenizde daha gelişmiş Crashlytics işlevlerinin nasıl kullanılacağını gösteren bir menü oluşturacaksınız. Firebase ile Seviye Atlayın Unity projesinde, görünür hale getireceğiniz ve işlevselliği yazacağınız gizli bir Hata Ayıklama Menüsü bulunur.

Hata Ayıklama menüsünü etkinleştirme

Hata Ayıklama menüsüne erişme düğmesi Unity projenizde mevcuttur ancak şu anda etkin değil. MainMenu prefabinden erişmek için düğmeyi etkinleştirmeniz gerekir:

  1. Unity Editor'da MainMenu adlı prefabasyonu açın.4148538cbe9f36c5.png
  2. Prefabrik hiyerarşisinde DebugMenuButton adlı devre dışı bırakılmış alt nesneyi bulup seçin.816f8f9366280f6c.png
  3. DebugMenuButton ifadesini içeren metin alanının sol üst köşesindeki kutuyu işaretleyerek DebugMenuButton özelliğini etkinleştirin.8a8089d2b4886da2.png
  4. Prefabetik işlerden tasarruf edin.
  5. Oyunu düzenleyicide veya cihazınızda çalıştırın. Artık menüye erişilebilir.

Hata Ayıklama Menüsü için yöntem gövdelerini önizleme ve anlama

Bu codelab'in ilerleyen bölümlerinde, önceden yapılandırılmış bazı Crashlytics yöntemleri için yöntem gövdeleri yazacaksınız. Ancak Firebase ile Seviye Atlayın Unity projesinde yöntemler DebugMenu.cs tanımlı ve buradan çağrılır.

Bu yöntemlerden bazıları hem Crashlytics yöntemlerini çağırıp hem de hata bildirir ancak Crashlytics'in bu hataları yakalaması, önce bu yöntemlerin çağrılmasına bağlı değildir. Daha ziyade, hataların otomatik olarak yakalanmasından oluşturulan kilitlenme raporları, bu yöntemlerin eklediği bilgilerle geliştirilir.

DebugMenu.cs uygulamasını açıp aşağıdaki yöntemleri bulun:

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

  • CrashNow
  • LogNonfatalError
  • LogStringsAndCrashNow
  • SetAndOverwriteCustomKeyThenCrash
  • SetLogsAndKeysBeforeANR

Hata ayıklamaya yardımcı olması için Analytics etkinliklerini 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ı ele almaya nasıl yardımcı olduklarını öğreneceksiniz.

6. Geliştirme aşamasındaki kilitlenme raporlarının gönderilmesini sağlayın

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

Unity projeleri için oyununuzdaki kilitlenme ve istisna etkinlikleri hemen diske yazılır. Oyununuzu kilitlenmeyen yakalanmamış istisnalar (örneğin, oyun mantığında yakalanmamış C# istisnaları) için, Unity projenizde Crashlytics'i ilk kullanıma hazırlarken Crashlytics.ReportUncaughtExceptionsAsFatal özelliğini true olarak ayarlayarak Crashlytics SDK'sının bunları önemli etkinlik olarak raporlamasını sağlayabilirsiniz. Bu etkinlikler, son kullanıcının oyunu yeniden başlatmasına gerek kalmadan gerçek zamanlı olarak Crashlytics'e raporlanır. Yerel kilitlenmelerin her zaman önemli etkinlikler olarak raporlandığını ve son kullanıcı oyunu yeniden başlattığında gönderildiğini unutmayın.

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

iOS simülasyon aracı:

  • Crashlytics bilgileri, yalnızca Xcode'u simülatörden çıkarırsanız raporlanır. Xcode eklenirse yayın öncesi hataları yakalayarak bilgi teslimini engeller.

Mobil fiziksel cihazlar (Android ve iOS):

  • Android'e özel: ANR'ler yalnızca Android 11 ve sonraki sürümlerde bildirilir. ANR'ler ve önemli olmayan etkinlikler bir sonraki çalıştırmada raporlanır.

Unity Düzenleyici:

CrashNow() uygulamasında bir düğmeye dokunarak oyununuzun kilitlenmesini test edin

Oyununuzda Crashlytics kurulduktan sonra, Crashlytics SDK'sı kilitlenmeleri ve yakalanmamış istisnaları otomatik olarak kaydedip analiz için Firebase'e yükler. Raporlar, Firebase konsolundaki Crashlytics kontrol panelinde gösterilir.

  1. Bunun gerçekten otomatik olduğunu göstermek için: DebugMenu.cs uygulamasını 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 simgelerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Kilitlenme raporunu nasıl görüntüleyip yorumlayacağınızı öğrenmek için Şimdi Kilitle düğmesine dokunun ve bu codelab'in sonraki adımına geçin.

7. Firebase konsolundaki sorun raporlarını anlama

Kilitlenme raporlarınızı görüntülemek söz konusu olduğunda, bu raporlardan en iyi şekilde nasıl yararlanacağınızla ilgili bilmeniz gereken biraz daha fazla bilgi vardır. Yazdığınız yöntemlerin her biri, farklı bilgi türlerinin Crashlytics raporlarına nasıl ekleneceğini gösterir.

  1. Şimdi Kilitle düğmesine dokunun ve uygulamanızı yeniden başlatın.
  2. Crashlytics kontrol paneline gidin. Kontrol panelinin alt kısmındaki Sorunlar tablosuna gidin. Burada Crashlytics, temel nedeni aynı olan etkinlikleri "sorunlar" halinde gruplandırır.
  3. Sorunlar tablosunda listelenen yeni sorunu tıklayın. Bunu yaptığınızda Firebase'e gönderilen her bir etkinlikle ilgili Etkinlik özeti gösterilir.

    Aşağıdaki ekran görüntüsüne benzer bir sonuç görürsünüz. Etkinlik özetinde, kilitlenmeye neden olan çağrının yığın izlemesini (stack trace) belirgin bir şekilde gösterdiğine dikkat edin.40c96abe7f90c3aa.png

Ek meta veriler

Faydalı bir diğer sekme de Unity Meta Verileri sekmesidir. Bu bölümde, etkinliğin gerçekleştiği cihazın özellikleri (ör. fiziksel özellikler, CPU modeli/özellikleri ve her tür GPU metriği) hakkında bilgi verilir.

Bu sekmedeki bilgilerin işinize yarayabileceği bir örneği aşağıda bulabilirsiniz:
Oyununuzda belirli bir görünümü elde etmek için gölgelendiricilerden yoğun bir şekilde yararlandığını ancak tüm telefonlarda bu özelliği oluşturabilecek GPU'lara sahip olmadığını düşünün. Unity Meta Verileri sekmesindeki bilgiler, hangi özelliklerin otomatik olarak kullanılabilir olacağına veya tamamen devre dışı bırakılacağına karar verirken uygulamanızın hangi donanımı test etmesi gerektiği hakkında size daha iyi bir fikir verebilir.

Sizin cihazınızda hiçbir zaman bir hata veya kilitlenme yaşanmamasına rağmen, Android cihazların doğada çok geniş bir yelpazeye yayılan çeşitliliği sayesinde belirli "önemli noktaların" daha iyi anlaşılmasına yardımcı olur. elde etmenize yardımcı olur.

41d8d7feaa87454d.png

8. İstisna bildirme, yakalama ve günlüğe kaydetme

Genellikle bir geliştirici olarak kodunuz bir çalışma zamanı istisnasını doğru şekilde yakalayıp işlese bile bunun hangi koşullar altında gerçekleştiğini bilmeniz önemlidir. Crashlytics.LogException, Firebase'e bir istisna etkinliği göndererek Firebase konsolunda daha ayrıntılı hata ayıklama işlemleri yapabilmeniz için tam olarak bu amaçla kullanılabilir.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs içindeki using ifadelerine aşağıdakileri ekleyin:
    // Import Firebase
    using Firebase.Crashlytics;
    
  2. Yine DebugMenu.cs içinde, şu şekilde LogNonfatalError() öğesinin üzerine 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 simgelerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  5. Önemli Olmayan Hatayı Günle düğmesine dokunun, ardından uygulamanızı yeniden başlatın.
  6. Crashlytics kontrol paneline gidin. Bu codelab'in son adımında gördüğünüze benzer bir şey göreceksiniz.
  7. Ancak bu kez Etkinlik türü filtresini Önemli olmayan hatalar ile kısıtlayarak yalnızca az önce günlüğe kaydettiğiniz ö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, hatta oturum başına yüzlerce, hatta binlerce kez çağrılan bir kod satırının neden aniden bir istisna veya kilitlenme oluşturabileceğini hiç denemediniz mi? IDE'deki kodun üzerinden geçip değerleri daha yakından incelemek iyi olabilir ancak bu durum kullanıcılarınızın yalnızca gözden kaçan küçük bir yüzdesinde meydana gelirse ne olur? Daha da kötüsü, ne yaparsanız yapın bu kilitlenmeyi tekrarlayamazsanız ne yaparsınız?

Böyle durumlarda belirli bir bağlamın olması çok büyük bir fark yaratabilir. Crashlytics.Log ile ihtiyacınız olan bağlamı yazın. Bu mesajları, ileride yaşanabilecek durumlar hakkında kendinize ipuçları veren ipuçları olarak düşünün.

Günlükler çeşitli şekillerde kullanılabilir. Ancak arama sırasının ve/veya yokluğunun son derece önemli bir bilgi parçası olduğu durumları kaydetmek için genellikle yararlıdır.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs içinde, şu şekilde LogStringsAndCrashNow() öğesinin üzerine 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 simgelerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Günlük Dizeleri ve Şimdi Kilitlendi düğmesine dokunun, ardından uygulamanızı yeniden başlatın.
  5. Crashlytics kontrol paneline geri dönün ve Sorunlar tablosunda listelenen en yeni sorunu tıklayın. Önceki sorunlara benzer bir durum tekrar görürsünüz.
    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 anahtar yazma ve üzerine yazma

Az sayıda değere veya yapılandırmaya ayarlanmış değişkenlere karşılık gelen bir kilitlenmeyi daha iyi anlamak istediğinizi varsayalım. Herhangi bir zamanda, incelediğiniz değişkenlerin ve olası değerlerin kombinasyonuna bağlı olarak filtre uygulamak iyi olabilir.

Crashlytics, rastgele dizeleri günlüğe kaydetmenin yanı sıra programınızın kilitlendiği sırada tam durumunu bilmenin faydalı olduğu başka bir hata ayıklama yöntemi sunar: özel anahtarlar.

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

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

  1. Assets/Hamster/Scripts/States/DebugMenu.cs içinde, şu şekilde SetAndOverwriteCustomKeyThenCrash() öğesinin üzerine 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 simgelerinizi yükleyin:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Özel Anahtar ve Kilitlenme Ayarla düğmesine dokunun, ardından uygulamanızı yeniden başlatın.
  5. Crashlytics kontrol paneline geri dönün ve Sorunlar tablosunda listelenen en yeni sorunu tıklayın. Önceki sorunlara benzer bir durum görürsünüz.
  6. Ancak bu kez Etkinlik özeti'ndeki Anahtarlar sekmesini tıklayarak Current Time dahil anahtarların değerini görüntüleyebilirsiniz:
    7dbe1eb00566af98.png

Neden özel günlükler yerine özel anahtarları kullanmak istersiniz?

  • Günlükler, sıralı verileri depolamak için iyidir ancak yalnızca en son değeri istiyorsanız özel anahtarlar daha iyidir.
  • Firebase konsolunda, Sorunlar tablo arama kutusundaki sorunları anahtar değerlerine göre kolayca filtreleyebilirsiniz.

Ancak 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 bir anahtar/değer çiftinin boyutu en fazla 1 KB olabilir.

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

Uygulama Yanıt Vermiyor (ANR) hatası, Android geliştiricileri için hata ayıklaması en zor sorun sınıflarından biridir. ANR'ler, bir uygulama 5 saniyeden uzun süre girişe yanıt vermezse ortaya çıkar. Böyle bir durumda uygulama donmuş veya çok yavaş çalışıyor demektir. Kullanıcılara bir iletişim kutusu gösterilir ve kullanıcılar "Bekleme"yi seçebilir. veya "Uygulamayı Kapat"ı seçin.

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'daki bulunabilirliğini etkileyebilir. Karmaşıklıkları ve genellikle farklı telefon modellerinde çok farklı davranışlara sahip çok iş parçacıklı koddan kaynaklandığı için, hata ayıklama sırasında ANR'leri yeniden oluşturmak çoğu zaman çok zor olsa da neredeyse imkansız değildir. Bu nedenle, bu hedeflere analitik ve tüm çıkarımlara dayalı bir yaklaşımla yaklaşmak genellikle en iyi yaklaşımdır.

Bu yöntemde, otomatik sorun günlük kaydını desteklemek ve bize daha fazla bilgi vermek için Crashlytics.LogException, Crashlytics.Log ve Crashlytics.SetCustomKey kombinasyonlarını kullanırız.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs içinde, şu şekilde SetLogsAndKeysBeforeANR() öğesinin üzerine 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, ardından uygulamanızı yeniden başlatın.
  5. Crashlytics kontrol paneline geri dönün ve Sorunlar tablosunda yeni sorunu tıklayarak Etkinlik özeti'ni görüntüleyin. Arama düzgün bir şekilde gerçekleştiyse aşağıdakine benzer bir sonuç görürsünüz:
    876c3cff7037bd07.png

    Gördüğünüz gibi Firebase, uygulamanızın ANR'yi tetiklemesinin ana nedeni olarak iş parçacığındaki meşgul bekleme süresini belirtmiştir.
  6. Etkinlik özeti'nin Günlükler sekmesindeki günlüklere bakarsanız tamamlanmış olarak kaydedilen son yöntemin DoSevereWork olduğunu görürsünüz.
    5a4bec1cf06f6984.png

    Buna karşın, "başlangıç" olarak listelenen son yöntem DoExtremeWork'dır. Bu yöntem, ANR'nin bu yöntem sırasında oluştuğunu ve oyunun DoExtremeWork günlüğe kaydedilmeden kapandığını gösterir.

    89d86d5f598ecf3a.png

Bunu neden yapmalıyım?

  • ANR'leri yeniden üretmek son derece zordur. Bu nedenle, kod alanı ve metrikler hakkında zengin bilgi edinmek, bu verilerden düşülen geliri hesaplamak için son derece önemlidir.
  • Özel anahtarlarda depolanan 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 tehlikesi altında olduğunu bilirsiniz. Bu tür alakalı mantıksal ve sayısal veriler, optimizasyon için kodunuzun en gerekli olduğu yeri gösterir.

12. Raporları daha da zenginleştirmek için Analytics etkinliklerini karıştırma

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

Bu codelab'de yazdığınız diğer yöntemlerin aksine, bu yöntemleri diğer yöntemlerle birlikte kullanmanız gerekir. Diğerlerinden birini çalıştırmadan önce bu yöntemleri (Hata Ayıklama Menüsü'nde ilgili düğmelerine basarak) istediğiniz sırayla çağırın. Ardından, belirli bir Crashlytics sorunundaki bilgileri incelediğinizde Analytics etkinliklerinin sıralı bir günlüğünü görürsünüz. Bu veriler, uygulamanızı nasıl kullandığınıza bağlı olarak bir oyunda program akışı veya kullanıcı girişi kombinasyonunu daha iyi anlamak için kullanılabilir.

  1. Assets/Hamster/Scripts/States/DebugMenu.cs ürününde, 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 derleyip dağıtın, ardından Hata Ayıklama Menüsü'ne girin.
  3. (Yalnızca Android) Aşağıdaki Firebase CLI komutunu çalıştırarak simgelerinizi 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 kez basın:
    • Günlük Dizesi Etkinliği
    • Giriş Etkinliğini Giriş Yap
  5. Şimdi Kilitle düğmesine basın.
  6. Kilitlenme etkinliğini Firebase'e yüklemesi için oyununuzu yeniden başlatın.
  7. Analytics etkinliklerinin rastgele sıralandığını günlüğe kaydedip oyununuzun, Crashlytics'in daha önce sahip olduğunuz gibi rapor oluşturduğu bir etkinlik oluşturmasını sağladığınızda, bu etkinlikler Crashlytics'in Etkinlik Özeti'nin Günlükler sekmesine şu şekilde eklenir:
    d3b16d78f76bfb04.png

13. Bundan sonra

Böylece, otomatik olarak oluşturulan kilitlenme raporlarınızı eklenebilecek daha iyi teorik bir temele sahip olacaksınız. Bu yeni bilgiler sayesinde mevcut durumu, geçmiş etkinliklerin kayıtlarını ve mevcut Google Analytics etkinliklerini kullanarak olayların sırasını ve bu sonucu sağlayan mantığı daha iyi anlayabilirsiniz.

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

Sonraki adımlar

Unity oyununuzu Remote Config ile kullanma codelab'ine geçin. Bu sayfada, Unity'de Remote Config ve A/B Testi'ni kullanma hakkında bilgi edineceksiniz.