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)
- Firebase CLI'ı yükleme talimatlarını uygulayın.
KSA'yı zaten yüklediyseniz en son sürümüne güncellediğinizden emin olun.
- Firebase CLI'ı yükleme talimatlarını uygulayın.
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
- Unity Hub'ı başlatın ve Projeler sekmesinde Aç'ın yanındaki açılır oku tıklayın.
- Add project from disk'i (Diskten proje ekle) tıklayın.
- Kodu içeren dizine gidin, ardından Tamam'ı tıklayın.
- İstenirse kullanılacak Unity Editor sürümünü ve hedef platformunuzu (Android veya iOS) seçin.
- level-up-with-firebase proje adını tıklayın. Proje Unity Editor'da açılır.
- Düzenleyiciniz öğeyi otomatik olarak açmazsa
MainGameScene
öğesini Öğeler > Unity Editor'ın Proje sekmesinde bulunan Hamster.
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
- Firebase konsolunda Proje ekle'yi tıklayın.
- 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. - İstenirse Firebase şartlarını inceleyip kabul edin.
- Devam'ı tıklayın.
- Bu proje için Google Analytics'i etkinleştir seçeneğini belirleyip Devam'ı tıklayın.
- 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.
- Create project (Proje oluştur) seçeneğini tıklayın.
- Proje oluşturulduktan sonra Continue (Devam) seçeneğini tıklayın.
Uygulamanızı Firebase'e kaydedin
- 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.
- Hem Apple (iOS) hem de Android derleme hedeflerini kaydetmek için seçin.
- Unity projenizin platforma özgü kimliklerini girin. Bu codelab için aşağıdaki bilgileri girin:
- Apple (iOS) için: iOS paket kimliği alanına
com.google.firebase.level-up
girin. - Android için: Android paket adı alanına
com.google.firebase.level_up
yazın.
- Apple (iOS) için: iOS paket kimliği alanına
- (İsteğe bağlı) Unity projenizin platforma özgü takma adlarını girin.
- 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.
- 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.
- Unity projenizin Proje penceresini açın, ardından her iki yapılandırma dosyasını Assets klasörüne taşıyın.
- 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
- Firebase konsolunda Firebase Unity SDK'yı indir'i tıklayın.
- SDK'yı uygun bir yerde açın.
- Açık Unity Projenizde Assets (Öğeler) > Paketi İçe Aktar > Özel Paket.
- 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 Aç'ı tıklayın. - Açılan Unity Paketini İçe Aktar iletişim kutusunda İçe Aktar'ı tıklayın.
FirebaseCrashlytics.unitypackage
dosyasını içe aktarmak için önceki adımları tekrarlayın.- 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
Assets/Hamster/Scripts/MainGame.cs
alanına aşağıdakiusing
ifadelerini ekleyin: İ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 ikiusing Firebase.Crashlytics; using Firebase.Extensions;
using
ifadesi olmadan aşağıdaki kod çalışmaz.- Yine
MainGame.cs
ürününde,InitializeFirebaseAndStartGame()
yöntemini çağırarak mevcutStart()
yöntemine Firebase başlatma ekleyin:void Start() { Screen.SetResolution(Screen.width / 2, Screen.height / 2, true); InitializeFirebaseAndStartGame(); }
- Tekrar
MainGame.cs
içindeInitializeFirebaseAndStartGame()
öğ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)
- Build Settings (Ayarları Derleme) iletişim kutusundan projenizi Xcode çalışma alanına aktarın.
- 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
- (her derleme için değil, yalnızca ilk kurulum sırasında) Derlemenizi oluşturun:
- 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.
- 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.
- Uygulamanızı oluşturun. Dosya > Build Settings (Ayarları Derleme) bölümünde aşağıdaki adımları tamamlayın:
- Simgeler.zip Oluştur'un işaretli olduğundan emin olun (veya açılır liste gösteriliyorsa Hata ayıklama'yı seçin).
- APK'nızı doğrudan Unity Editor'dan az önce oluşturduğunuz Builds/Android alt klasöründe oluşturun.
- 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ğinizgoogle-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.
- MainGameScene'de, Hierarchy düzenleyicisinde BlankObject
GameObject
(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"); } } }
- 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.
- 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
.
- İ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.
- Etkinliğin Crashlytics'e yüklendiğini onayladıktan sonra, eklediğiniz BlankObject
GameObject
öğesini seçin, yalnızcaCrashlyticsTester
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:
- Unity Editor'da
MainMenu
adlı prefabasyonu açın. - Prefabrik hiyerarşisinde
DebugMenuButton
adlı devre dışı bırakılmış alt nesneyi bulup seçin. DebugMenuButton
ifadesini içeren metin alanının sol üst köşesindeki kutuyu işaretleyerekDebugMenuButton
özelliğini etkinleştirin.- Prefabetik işlerden tasarruf edin.
- 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:
- Oynatma modunda veya bağımsız olarak düzenleyiciden alınan Crashlytics bilgileri KAYDEDİLMEZ ya da Firebase'e YÜKLENMEYİN. Ayrıca, Firebase Masaüstü geliştirme iş akışı Crashlytics'i desteklemez.
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.
- Bunun gerçekten otomatik olduğunu göstermek için:
DebugMenu.cs
uygulamasını açın ve ardından aşağıdaki gibiCrashNow()
yönteminin üzerine yazın:void CrashNow() { TestCrash(); }
- Uygulamanızı oluşturun.
- (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>
- 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.
- Şimdi Kilitle düğmesine dokunun ve uygulamanızı yeniden başlatın.
- 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.
- 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.
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.
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.
Assets/Hamster/Scripts/States/DebugMenu.cs
içindekiusing
ifadelerine aşağıdakileri ekleyin:// Import Firebase using Firebase.Crashlytics;
- Yine
DebugMenu.cs
içinde, şu şekildeLogNonfatalError()
öğesinin üzerine yazın:void LogNonfatalError() { try { throw new System.Exception($"Test exception thrown in {nameof(LogNonfatalError)}"); } catch(System.Exception exception) { Crashlytics.LogException(exception); } }
- Uygulamanızı oluşturun.
- (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>
- Önemli Olmayan Hatayı Günle düğmesine dokunun, ardından uygulamanızı yeniden başlatın.
- Crashlytics kontrol paneline gidin. Bu codelab'in son adımında gördüğünüze benzer bir şey göreceksiniz.
- 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.
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.
Assets/Hamster/Scripts/States/DebugMenu.cs
içinde, şu şekildeLogStringsAndCrashNow()
öğ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(); }
- Uygulamanızı oluşturun.
- (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>
- Günlük Dizeleri ve Şimdi Kilitlendi düğmesine dokunun, ardından uygulamanızı yeniden başlatın.
- 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.
- Ancak, bir Etkinlik özeti içindeki Günlükler sekmesini tıklarsanız şuna benzer bir görünüm elde edersiniz:
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.
Assets/Hamster/Scripts/States/DebugMenu.cs
içinde, şu şekildeSetAndOverwriteCustomKeyThenCrash()
öğ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(); }
- Uygulamanızı oluşturun.
- (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>
- Özel Anahtar ve Kilitlenme Ayarla düğmesine dokunun, ardından uygulamanızı yeniden başlatın.
- 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.
- Ancak bu kez Etkinlik özeti'ndeki Anahtarlar sekmesini tıklayarak
Current Time
dahil anahtarların değerini görüntüleyebilirsiniz:
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.
Assets/Hamster/Scripts/States/DebugMenu.cs
içinde, şu şekildeSetLogsAndKeysBeforeANR()
öğ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); }
- Uygulamanızı oluşturun.
- Aşağıdaki Firebase CLI komutunu çalıştırarak sembollerinizi yükleyin:
firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
- Günlükleri ve Anahtarları Ayarla → ANR etiketli düğmeye dokunun, ardından uygulamanızı yeniden başlatın.
- 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:
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. - 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.
Buna karşın, "başlangıç" olarak listelenen son yöntemDoExtremeWork
'dır. Bu yöntem, ANR'nin bu yöntem sırasında oluştuğunu ve oyununDoExtremeWork
günlüğe kaydedilmeden kapandığını gösterir.
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.
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 ); }
- Oyununuzu derleyip dağıtın, ardından Hata Ayıklama Menüsü'ne girin.
- (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>
- 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
- Şimdi Kilitle düğmesine basın.
- Kilitlenme etkinliğini Firebase'e yüklemesi için oyununuzu yeniden başlatın.
- 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:
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.