Crash Reporting w rozwoju mobilnym — co to jest, usługi i konfiguracja

Autor: IT Sectr Opublikowano: 2026-05-27 Czas czytania: 8 min

Crash Reporting — system zbierania, przetwarzania i analizy informacji o awariach aplikacji mobilnej, umożliwiający programistom wykrywanie i naprawianie błędów w środowisku produkcyjnym. Według danych Google Firebase, 2024, wdrożenie crash-reportingu skraca czas diagnostyki problemów z godzin do minut i zwiększa stabilność wydań o 35–50%. Bez takiego systemu programiści dowiadują się o crashu tylko z opinii użytkowników.

Najważniejsze

  • Crash Reporting — automatyczne zbieranie danych o awariach aplikacji z kontekstem środowiska i stosem wywołań
  • Firebase Crashlytics — najpopularniejszy serwis crash-reportingu, darmowy i zintegrowany z ekosystemem Google
  • Sentry — platforma open-source z rozszerzonymi możliwościami analizy i obsługą 80+ języków programowania
  • Stos wywołań — każdy raport crash zawiera pełny stos wywołań z numerami wierszy i nazwami metod
  • Raporty non-fatal — oprócz crash, systemy logują handled exceptions, dając pełny obraz błędów w aplikacji

Co to jest Crash Reporting?

Crash Reporting — to proces automatycznego zbierania informacji technicznych o awariach aplikacji i ich scentralizowanego przesyłania na serwer w celu analizy. W przeciwieństwie do logowania, crash-reporting rejestruje właśnie sytuacje awaryjne — moment, w którym aplikacja została przymusowo zakończona przez system lub OS.

Każdy raport crash zawiera trzy kluczowe komponenty: typ wyjątku (NullPointerException, SIGSEGV, NSInternalInconsistencyException), pełny stos wywołań z numerami wierszy oraz informacje o środowisku — wersję OS, model urządzenia, ilość wolnej pamięci. Według danych Sentry Engineering, 2024, właśnie połączenie tych trzech elementów pozwala odtworzyć i naprawić 85% krytycznych błędów.

Nowoczesne systemy crash-reportingu rozszerzają funkcjonalność poza zwykłe crash. Firebase Crashlytics automatycznie grupuje powtarzające się awarie w issues, Sentry śledzi regresje między wydaniami, a Bugsnag pokazuje ścieżkę użytkownika do błędu. Wszystkie trzy serwisy obsługują iOS, Android, React Native i Flutter.

Według danych Google I/O 2024, aplikacje bez crash-reportingu spędzają na diagnostyce jednego krytycznego błędu średnio 3–5 dni roboczych, podczas gdy z Crashlytics — 15–30 minut. Oszczędność czasu wynosi ponad 90% dla każdego incydentu.

Jak działa system zbierania raportów crash

Architektura systemu crash-reportingu składa się z trzech warstw: kliencki SDK zainstalowany w aplikacji, serwerowy API do odbierania i przetwarzania raportów oraz webowy dashboard do analizy. Kliencki SDK przechwytuje nieobsłużone wyjątki, serializuje je do JSON i wysyła na serwer przy następnym uruchomieniu aplikacji.

Wysyłanie raportu crash odbywa się asynchronicznie po restarcie aplikacji. To kluczowy moment: w momencie crash aplikacja nie może zagwarantować pomyślnego wysłania danych przez sieć. SDK zapisuje raport w lokalnym magazynie, a przy następnym uruchomieniu wysyła go w tle. Według danych Firebase Engineering, 2024, takie podejście zapewnia dostarczenie 99.7% raportów crash.

Dla wyjątków non-fatal (handled exceptions wewnątrz try-catch) SDK wysyła raport natychmiast, ponieważ aplikacja kontynuuje działanie. Raporty non-fatal zawierają te same dane co crash, ale nie przerywają sesji użytkownika. Jest to szczególnie przydatne do śledzenia błędów zapytań API, walidacji danych i logiki biznesowej.

Grupowanie crash — algorytm serwerowy, który łączy identyczne crash na podstawie hasha z ostatnich 5–10 ramek stosu. Pozwala to programiście widzieć nie 1000 pojedynczych raportów, ale jedno issue z 1000 wystąpień, obejmujących różne urządzenia i wersje OS.

Firebase Crashlytics: integracja i możliwości

Firebase Crashlytics — najpopularniejszy serwis crash-reportingu dla aplikacji mobilnych, używany w ponad 3 milionach projektów na całym świecie. Darmowy pakiet obejmuje nieograniczoną liczbę raportów, integrację z Google Analytics i automatyczne grupowanie crash.

Integracja Crashlytics na Android

Podłączenie Crashlytics na Android jest minimalne: dodaj zależność w build.gradle i zainicjuj SDK w Application.onCreate. Crashlytics automatycznie ustawia własny Thread.setDefaultUncaughtExceptionHandler, przechwytując wszystkie nieobsłużone wyjątki.

kotlin
// build.gradle.kts
id("com.google.firebase.crashlytics") version "3.0.2"

// Application.kt
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseCrashlytics.getInstance()
            .setCustomKey("environment", "production")
    }

    fun logNonFatal(error: Throwable) {
        FirebaseCrashlytics.getInstance()
            .recordException(error)
    }
}

Kluczowa funkcja Crashlytics — custom keys i logs. Programista może dodać do 64 par klucz-wartość do każdego raportu crash: stan ekranu, wybrany abonament, poziom użytkownika. Dostępne jest również zapisywanie niestandardowych wiadomości log, które trafiają do raportu w porządku chronologicznym.

Velocity Alert — automatyczne wykrywanie regresji

Velocity Alert — funkcja Crashlytics, która śledzi gwałtowny wzrost liczby crash dla konkretnego issue. Jeśli po nowym wydaniu liczba awarii przekroczy wartość progową, zespół otrzymuje powiadomienie push i email na 5–15 minut przed masowymi skargami użytkowników.

Ustawienie progu zadziałania: 2x w ciągu 1 godziny dla krytycznych issues. Według danych Google, 2024, zespoły z włączonym Velocity Alert wypuszczają hotfix-y średnio o 40% szybciej niż zespoły polegające na ręcznym monitorowaniu dashboardu.

Integracja Crashlytics na iOS

Na iOS SDK Crashlytics integruje się przez CocoaPods lub Swift Package Manager. SDK przechwytuje zarówno wyjątki Objective-C (przez NSSetUncaughtExceptionHandler), jak i sygnały OS (SIGSEGV, SIGABRT) przez własny mach exception handler.

Według danych Apple Developer, 2024, Crashlytics dla iOS obsługuje do 98% wszystkich typów awarii, w tym niskopoziomowe błędy pamięci, które nie są przechwytywane przez standardowe mechanizmy. To czyni Crashlytics standardem de facto dla rozwoju na iOS.

Sentry i Bugsnag: alternatywne platformy

Sentry — platforma open-source do monitorowania błędów, obsługująca 80+ języków i frameworków. W przeciwieństwie do Crashlytics, Sentry jest skierowana do programistów backendu, ale oferuje pełny SDK dla iOS, Android, React Native i Flutter.

Kluczowa zaleta Sentry — Performance Monitoring w jednym dashboardzie. Programista widzi nie tylko crash, ale także transakcje, które do nich doprowadziły: wolne zapytania sieciowe, zawieszanie UI, długie operacje na bazie danych. Według danych Sentry, 2024, 40% crash ma poprzedzające problemy wydajnościowe, które pozostają niezauważone bez takiego podejścia.

Bugsnag wyróżnia się podejściem do grupowania błędów — zamiast stosu wywołań analizuje ścieżkę użytkownika (user journey). Każdy raport crash zawiera sekwencję ekranów i działań użytkownika, które doprowadziły do błędu. Jest to szczególnie przydatne w złożonych procesach biznesowych: składanie zamówienia, rejestracja, płatność.

Koszt usług jest zróżnicowany: Crashlytics jest darmowy w ramach Firebase, Sentry oferuje darmowy pakiet na 5000 zdarzeń miesięcznie, Bugsnag — od $29 miesięcznie. Wszystkie trzy platformy udostępniają SDK z otwartym kodem źródłowym. Wybór usługi zależy od wielkości zespołu, budżetu i wymagań dotyczących bezpieczeństwa danych.

Crash Reporting na iOS: cechy i NSException

Cecha iOS — wielowarstwowa architektura obsługi błędów. SDK crash-reportingu muszą przechwytywać wyjątki Objective-C (NSException), błędy Swift (Error), sygnały POSIX (SIGSEGV, SIGBUS) i mach-wyjątki. Każdy typ wymaga osobnego mechanizmu przechwytywania.

NSException — najprostszy typ do przechwycenia przez NSSetUncaughtExceptionHandler. Jednak według danych Apple, 2024, tylko 30% crash w nowoczesnych aplikacjach Swift to NSException. Pozostałe 70% to sygnały OS i błędy środowiska wykonawczego Swift, które wymagają mechanizmu mach exception handler.

Programiści iOS powinni testować crash-reporting przez lokalne generowanie crash różnych typów: __builtin_trap() dla sygnałów, [NSException raise:...] dla wyjątków, fatalError() dla Swift. Tylko w ten sposób można upewnić się, że SDK pokrywa wszystkie typy awarii.

Crash Reporting na Android: ANR i native crashes

Android dodaje dwa specyficzne typy awarii, których nie ma na iOS: ANR (Application Not Responding) i native crash w kodzie C/C++. ANR występuje, gdy wątek UI jest zablokowany na ponad 5 sekund — system pokazuje okno „Aplikacja nie odpowiada” i proponuje jej zamknięcie.

Standardowy Thread.setDefaultUncaughtExceptionHandler nie przechwytuje ANR, ponieważ nie jest to wyjątek, a sygnał z ActivityManager. Do śledzenia ANR Crashlytics i Sentry używają wątku watchdog w tle, który sprawdza responsywność wątku UI co 5 sekund. Według danych Firebase, 2024, 15% wszystkich problemów na Android to ANR, a nie crash.

Native crash na Android występują w kodzie C/C++ uruchomionym przez JNI (Java Native Interface). Te awarie nie są wyjątkami Java i nie są przechwytywane przez Thread.setDefaultUncaughtExceptionHandler. Do ich obsługi używa się Google Breakpad lub Crashpad, które ustawiają handlery sigaction dla sygnałów SIGSEGV, SIGABRT, SIGBUS.

Według danych Google I/O 2024, liczba native crash rośnie wraz z rozpowszechnieniem silników gier (Unity, Unreal Engine) i bibliotek widzenia komputerowego (ML Kit, OpenCV). Programistom aplikacji hybrydowych zaleca się zawsze podłączać native crash-reporting.

Często zadawane pytania

Czym crash-reporting różni się od zwykłego logowania?

Crash-reporting rejestruje tylko sytuacje awaryjne z pełnym kontekstem — stos wywołań, stan pamięci, wersję OS. Logowanie zapisuje wszystkie zdarzenia aplikacji. Crash-reporting automatycznie wysyła dane na serwer, logowanie wymaga ręcznej analizy.

Który serwis crash-reportingu wybrać dla startupu?

Firebase Crashlytics — optymalny wybór dla startupów: darmowy, prosty w integracji, obsługuje iOS i Android. W miarę wzrostu projektu można dodać Sentry do performance monitoringu lub Bugsnag do analizy ścieżek użytkownika.

Czy można używać crash-reportingu w zamkniętych projektach enterprise?

Tak — Sentry oferuje wersję self-hosted, która jest wdrażana na własnych serwerach. Wszystkie dane pozostają wewnątrz infrastruktury firmy. Crashlytics i Bugsnag działają tylko jako usługi w chmurze na serwerach Google i SmartBear.

Jak crash-reporting wpływa na rozmiar aplikacji?

Minimalnie — SDK Crashlytics dodaje ~300 KB do rozmiaru APK/IPA. Sentry — ~500 KB. Oba serwisy obsługują obfuskację ProGuard/R8 dla Android i Bitcode dla iOS, co zmniejsza wpływ na końcowy rozmiar pliku binarnego.

Dlaczego raport crash może nie dotrzeć?

Główne przyczyny: przekroczenie czasu handlera (iOS 5 sek, Android 100 ms), brak sieci przy następnym uruchomieniu, uszkodzenie lokalnego magazynu. Crashlytics gwarantuje dostarczenie 99.7% raportów przy przestrzeganiu limitu czasu handlera.

Podsumowanie

  • Crash Reporting — obowiązkowy komponent aplikacji produkcyjnej, skracający diagnostykę błędów z dni do minut
  • Firebase Crashlytics — lider rynku z darmowym pakietem i automatycznym grupowaniem crash w issues
  • Sentry — alternatywa open-source z performance monitoringiem i wdrożeniem self-hosted
  • Crash-reporting na iOS wymaga przechwytywania NSException, sygnałów POSIX i mach-wyjątków dla pełnego pokrycia
  • Android ANR nie jest przechwytywany przez standardowy Thread.setDefaultUncaughtExceptionHandler — wymagany jest wątek watchdog
  • Native crash w kodzie JNI są obsługiwane przez Breakpad lub Crashpad z handlerami sigaction
  • Raporty non-fatal rozszerzają pokrycie na handled exceptions i logikę biznesową bez przerywania sesji użytkownika

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również