Crash Reporting — un sistem de colectare, procesare și analiză a informațiilor despre căderile aplicației mobile, care permite dezvoltatorilor să detecteze și să remedieze erorile în mediul de producție. Conform Google Firebase, 2024, implementarea crash-reporting reduce timpul de diagnosticare a problemelor de la ore la minute și crește stabilitatea lansărilor cu 35–50%. Fără un astfel de sistem, dezvoltatorii află despre crash doar din recenziile utilizatorilor.
Principalele
Crash Reporting — este procesul de colectare automată a informațiilor tehnice despre căderile aplicației și transmiterea lor centralizată pe server pentru analiză. Spre deosebire de logare, crash-reporting înregistrează exact situațiile de avarie — momentul în care aplicația a fost terminată forțat de sistem sau de OS.
Fiecare raport crash conține trei componente cheie: tipul excepției (NullPointerException, SIGSEGV, NSInternalInconsistencyException), stiva completă de apeluri cu numerele liniilor și informații despre mediu — versiunea OS, modelul dispozitivului, cantitatea de memorie liberă. Conform Sentry Engineering, 2024, combinarea acestor trei elemente permite reproducerea și remedierea a 85% din erorile critice.
Sistemele moderne de crash-reporting extind funcționalitatea dincolo de crash-urile obișnuite. Firebase Crashlytics grupează automat căderile repetate în issues, Sentry urmărește regresiile între lansări, iar Bugsnag arată calea utilizatorului către eroare. Toate cele trei servicii suportă iOS, Android, React Native și Flutter.
Conform Google I/O 2024, aplicațiile fără crash-reporting petrec în medie 3–5 zile lucrătoare pentru diagnosticarea unei erori critice, în timp ce cu Crashlytics — 15–30 de minute. Economia de timp este de peste 90% pentru fiecare incident.
Arhitectura sistemului de crash-reporting este formată din trei straturi: SDK-ul client instalat în aplicație, API-ul server pentru primirea și procesarea rapoartelor și un dashboard web pentru analiză. SDK-ul client interceptează excepțiile neprocesate, le serializează în JSON și le trimite pe server la următoarea pornire a aplicației.
Trimiterea raportului de crash are loc asincron după repornirea aplicației. Acesta este un moment crucial: în momentul crash-ului, aplicația nu poate garanta trimiterea cu succes a datelor prin rețea. SDK-ul salvează raportul în stocarea locală, iar la următoarea pornire îl trimite pe un fir de fundal. Conform Firebase Engineering, 2024, această abordare asigură livrarea a 99.7% din rapoartele de crash.
Pentru excepțiile non-fatal (handled exceptions în interiorul try-catch), SDK-ul trimite raportul imediat, deoarece aplicația continuă să funcționeze. Rapoartele non-fatal conțin aceleași date ca și crash-urile, dar nu întrerup sesiunea utilizatorului. Acest lucru este util în special pentru urmărirea erorilor de cereri API, validarea datelor și logica de business.
Gruparea crash — un algoritm de server care combină crash-urile identice pe baza hash-ului ultimelor 5–10 cadre din stivă. Acest lucru permite dezvoltatorului să vadă nu 1000 de rapoarte individuale, ci un singur issue cu 1000 de apariții, care acoperă diferite dispozitive și versiuni de OS.
Firebase Crashlytics — cel mai popular serviciu de crash-reporting pentru aplicații mobile, folosit în peste 3 milioane de proiecte în întreaga lume. Planul gratuit include un număr nelimitat de rapoarte, integrare cu Google Analytics și gruparea automată a crash-urilor.
Conectarea Crashlytics pe Android este minimă: adăugați dependența în build.gradle și inițializați SDK-ul în Application.onCreate. Crashlytics setează automat propriul Thread.setDefaultUncaughtExceptionHandler, interceptând toate excepțiile neprocesate.
// 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)
}
}
Funcționalitatea cheie a Crashlytics — custom keys și logs. Dezvoltatorul poate adăuga până la 64 de perechi cheie-valoare la fiecare raport crash: starea ecranului, tariful selectat, nivelul utilizatorului. De asemenea, sunt disponibile înregistrări de mesaje log personalizate care ajung în raport în ordine cronologică.
Velocity Alert — o funcție Crashlytics care urmărește creșterea bruscă a numărului de crash-uri pentru un anumit issue. După o nouă lansare, dacă numărul de căderi depășește valoarea prag, echipa primește o notificare push și un email cu 5–15 minute înainte de reclamațiile în masă ale utilizatorilor.
Setarea pragului de declanțare: 2x în 1 oră pentru issues critice. Conform Google, 2024, echipele cu Velocity Alert activat lansează hotfix-uri în medie cu 40% mai rapid decât echipele care se bazează pe monitorizarea manuală a dashboard-ului.
Pe iOS, SDK-ul Crashlytics se integrează prin CocoaPods sau Swift Package Manager. SDK-ul interceptează atât excepțiile Objective-C (prin NSSetUncaughtExceptionHandler), cât și semnalele OS (SIGSEGV, SIGABRT) prin propriul mach exception handler.
Conform Apple Developer, 2024, Crashlytics pentru iOS procesează până la 98% din toate tipurile de căderi, inclusiv erorile de memorie de nivel scăzut care nu sunt interceptate de mecanismele standard. Acest lucru face din Crashlytics standardul de facto pentru dezvoltarea iOS.
Sentry — platformă open-source de monitorizare a erorilor, care suportă 80+ limbaje și framework-uri. Spre deosebire de Crashlytics, Sentry este orientată către dezvoltatorii backend, dar oferă SDK complet pentru iOS, Android, React Native și Flutter.
Avantajul cheie al Sentry — Performance Monitoring într-un singur dashboard. Dezvoltatorul vede nu doar crash-urile, ci și tranzacțiile care au dus la ele: cereri de rețea lente, înghețări UI, operații lungi cu baza de date. Conform Sentry, 2024, 40% dintre crash-uri au probleme de performanță premergătoare care rămân nedetectate fără o astfel de abordare.
Bugsnag se diferențiază prin abordarea sa de grupare a erorilor — în locul stivei de apeluri, analizează calea utilizatorului (user journey). Fiecare raport crash conține o secvență de ecrane și acțiuni ale utilizatorului care au dus la eroare. Acest lucru este util în special pentru procese de business complexe: plasarea unei comenzi, înregistrarea, plata.
Costul serviciilor variază: Crashlytics este gratuit în cadrul Firebase, Sentry oferă un plan gratuit pentru 5000 de evenimente pe lună, Bugsnag — de la $29 pe lună. Toate cele trei platforme oferă SDK-uri cu sursă deschisă. Alegerea serviciului depinde de mărimea echipei, buget și cerințele de securitate a datelor.
Caracteristica iOS — arhitectura multi-strat de gestionare a erorilor. SDK-urile de crash-reporting trebuie să intercepteze excepțiile Objective-C (NSException), erorile Swift (Error), semnalele POSIX (SIGSEGV, SIGBUS) și mach-excepțiile. Fiecare tip necesită un mecanism de interceptare separat.
NSException — cel mai simplu tip de interceptat prin NSSetUncaughtExceptionHandler. Cu toate acestea, conform Apple, 2024, doar 30% dintre crash-urile din aplicațiile Swift moderne sunt NSException. Restul de 70% sunt semnale OS și erori de runtime Swift, care necesită mecanismul mach exception handler.
Dezvoltatorii iOS ar trebui să testeze crash-reporting prin generarea locală de crash de diferite tipuri: __builtin_trap() pentru semnale, [NSException raise:...] pentru excepții, fatalError() pentru Swift. Numai astfel se poate asigura că SDK-ul acoperă toate tipurile de căderi.
Android adaugă două tipuri specifice de căderi care nu există pe iOS: ANR (Application Not Responding) și native crash în cod C/C++. ANR apare atunci când firul UI este blocat mai mult de 5 secunde — sistemul afișează dialogul „Aplicația nu răspunde” și oferă să o închidă.
Thread.setDefaultUncaughtExceptionHandler standard nu interceptează ANR, deoarece nu este o excepție, ci un semnal de la ActivityManager. Pentru monitorizarea ANR, Crashlytics și Sentry folosesc un fir watchdog de fundal care verifică receptivitatea firului UI la fiecare 5 secunde. Conform Firebase, 2024, 15% din toate problemele pe Android sunt ANR, nu crash-uri.
Native crash pe Android apar în codul C/C++ executat prin JNI (Java Native Interface). Aceste căderi nu sunt excepții Java și nu sunt interceptate de Thread.setDefaultUncaughtExceptionHandler. Pentru gestionarea lor se folosesc Google Breakpad sau Crashpad, care instalează handlere sigaction pentru semnalele SIGSEGV, SIGABRT, SIGBUS.
Conform Google I/O 2024, numărul de native crash-uri crește odată cu răspândirea motoarelor de jocuri (Unity, Unreal Engine) și a bibliotecilor de viziune computerizată (ML Kit, OpenCV). Dezvoltatorilor de aplicații hibride li se recomandă să conecteze întotdeauna native crash-reporting.
Întrebări frecvente
Crash-reporting înregistrează doar situațiile de avarie cu context complet — stiva de apeluri, starea memoriei, versiunea OS. Logarea înregistrează toate evenimentele aplicației. Crash-reporting trimite automat datele pe server, logarea necesită analiză manuală.
Firebase Crashlytics — alegerea optimă pentru startup-uri: gratuit, simplu de integrat, suportă iOS și Android. Pe măsură ce proiectul crește, se poate adăuga Sentry pentru performance monitoring sau Bugsnag pentru analiza căilor utilizatorului.
Da — Sentry oferă o versiune self-hosted care este implementată pe serverele proprii. Toate datele rămân în infrastructura companiei. Crashlytics și Bugsnag funcționează doar ca servicii cloud pe serverele Google și SmartBear.
Minim — SDK-ul Crashlytics adaugă ~300 KB la dimensiunea APK/IPA. Sentry — ~500 KB. Ambele servicii suportă ofuscarea ProGuard/R8 pentru Android și Bitcode pentru iOS, ceea ce reduce impactul asupra dimensiunii finale a fișierului binar.
Cauze principale: expirarea timpului handler-ului (iOS 5 sec, Android 100 ms), lipsa rețelei la pornirea ulterioară, deteriorarea stocării locale. Crashlytics garantează livrarea a 99.7% din rapoarte cu respectarea limitei de timp a handler-ului.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și