|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Crashlytics" |
| 4 | +date: 2019-03-04 |
| 5 | +categories: ["Firebase"] |
| 6 | +image: firebase/crashlytics |
| 7 | +github: firebase/tree/master/crashlytics |
| 8 | +description: "Firebase" |
| 9 | +version: Crashlytics 2.9 |
| 10 | +keywords: "firebase, crashlytics, crash, android, programowanie, programming" |
| 11 | +--- |
| 12 | + |
| 13 | +## Możliwości |
| 14 | +`Firebase Crashlytics` jest narzędziem raportującym awarie w aplikacji w czasie rzeczywistym, które pochodzą z urządzeń użytkowników na których zainstalowana jest aplikacja włączając w to urządzenia deweloperskie. Pomaga śledzić błędy oraz ustalać ich priorytety dzięki czemu możliwa jest weryfikacja i naprawa problemów związanych ze stabilnością co znacząco wpływa na utrzymanie jakości. Inteligentne grupowanie awarii wraz z informacjami o okolicznościach, które do nich doprowadziły pozwala zaoszczędzić czas w procesie diagnozy, zlokalizować błędny lub potencjalnie niebezpieczny fragment kodu oraz ustalić zakres użytkowników których awaria dotyczy. Crashlytics jest ogromnym wsparciem dla deweloperów w procesie utrzymania i rozwoju aplikacji. |
| 15 | + |
| 16 | +## Zgłaszanie |
| 17 | +Crashlytics automatycznie zbiera i wysyła raporty o występujących błędach i awariach do konsoli Firebase (np. gdy zostanie wyrzucony `fatal exception`) oraz umożliwia ręczne logowanie przechwyconych błędów za pomocą metody `logException`. Warto odnotować, że wyjątki nie są zgłaszane pojedynczo lecz grupowo co odbywa się na dedykowanym wątku w tle dzięki czemu wpływ na wydajność aplikacji jest minimalny. Crashlytics przechowuje informacje o 8 ostatnich wyjątkach. |
| 18 | + |
| 19 | +{% highlight kotlin %} |
| 20 | +buttonDivide.setOnClickListener { |
| 21 | + try { |
| 22 | + //mock exception |
| 23 | + val value = div(10, 0) |
| 24 | + //do more work |
| 25 | + } |
| 26 | + catch (e: Exception) { |
| 27 | + Crashlytics.logException(e) |
| 28 | + } |
| 29 | +} |
| 30 | + |
| 31 | +private fun div(a: Int, b: Int): Int { |
| 32 | + return a/b |
| 33 | +} |
| 34 | +{% endhighlight %} |
| 35 | + |
| 36 | +Ponadto pozwala na personalizację zgłaszanych informacji poprzez wypisywanie logów do konsoli oraz dodawanie niestandardowych kluczy pomagających uzyskać określony stan aplikacji prowadzący do awarii. |
| 37 | + |
| 38 | +{% highlight kotlin %} |
| 39 | +buttonThirdValue.setOnClickListener { |
| 40 | + val values = arrayListOf(1,2) //mock values |
| 41 | + try { |
| 42 | + //mock exception |
| 43 | + val value = getThirdValue(values) |
| 44 | + //do more work |
| 45 | + } |
| 46 | + catch (e: Exception) { |
| 47 | + Crashlytics.log("buttonThirdValue action error") //to logcat |
| 48 | + Crashlytics.setInt("array_size", values.size) |
| 49 | + Crashlytics.logException(e) //log to Firebase |
| 50 | + } |
| 51 | +} |
| 52 | + |
| 53 | +private fun getThirdValue(values: ArrayList<Int>): Int { |
| 54 | + return values[2] |
| 55 | +} |
| 56 | +{% endhighlight %} |
| 57 | + |
| 58 | +W diagnozie problemów często przydatna może być informacja identyfikująca użytkownika, który doświadczył awarii co możliwe jest poprzez ustawienie id metodą `setUserIdentifier`. |
| 59 | + |
| 60 | +## Debugowanie |
| 61 | +Aby sprawdzić poprawność konfiguracji Crashlytics z aplikacją nie trzeba czekać na pierwsze zgłoszenia wyjątków lecz można ręcznie wymuśić przesłanie zgłoszenia metodą `crash`. |
| 62 | + |
| 63 | +{% highlight kotlin %} |
| 64 | +Crashlytics.getInstance().crash(); |
| 65 | +{% endhighlight %} |
| 66 | + |
| 67 | +Dodatkowo w celu weryfikacji przesyłanych informacji warto włączyć tryb debugowania. |
| 68 | + |
| 69 | +{% highlight console %} |
| 70 | +//before running app |
| 71 | +adb shell setprop log.tag.Fabric DEBUG |
| 72 | +adb shell setprop log.tag.CrashlyticsCore DEBUG |
| 73 | +//for disable use INFO flag |
| 74 | + |
| 75 | +//view the logs |
| 76 | +adb logcat -s Fabric CrashlyticsCore |
| 77 | +{% endhighlight %} |
| 78 | + |
| 79 | +## Automatyczne raportowanie |
| 80 | +Zbieranie i wysyłanie raportów jest domyślnie włączone dla wszystkich użytkowników. Aby dać użytkownikom możliwość decydowania o przesyłanych informacjach należy wyłączyć automatyczne raportowanie dodając odpowiedni wpis `meta-data` do `AndroidManifest` oraz włączyć w kodzie nasłuchiwanie dla wybranych użytkowników. |
| 81 | + |
| 82 | +{% highlight xml %} |
| 83 | +//in AndroidManifest.xml |
| 84 | +<meta-data |
| 85 | + android:name="firebase_crashlytics_collection_enabled" |
| 86 | + android:value="false" /> |
| 87 | +{% endhighlight %} |
| 88 | + |
| 89 | +{% highlight kotlin %} |
| 90 | +//enable from one of app's Activity |
| 91 | +private fun enableCrashlytics() { |
| 92 | + val enable = true //mock value, get from some preferences |
| 93 | + if(enable) |
| 94 | + Fabric.with(this, Crashlytics()) |
| 95 | +} |
| 96 | +{% endhighlight %} |
0 commit comments