Firebase Crashlytics는 모바일 앱 크래시를 실시간으로 수집, 그룹화 및 분석하기 위한 Google 서비스입니다. SDK는 자동으로 처리되지 않은 예외, 네이티브 코드 크래시 및 ANR 신호를 가로채서 스택 트레이스, 기기 상태 및 로그가 포함된 상세 보고서를 생성합니다. Google, 2026에 따르면 Crashlytics는 전 세계 400만 개 이상의 앱에서 사용됩니다. 이 서비스는 프로젝트당 하루 50만 세션의 제한으로 무료로 제공됩니다.
핵심 요점
Firebase Crashlytics 는 Google이 2017년 Fabric 회사와 함께 인수한 모바일 앱 안정성 모니터링을 위한 무료 Google 서비스입니다. Crashlytics는 모든 앱 크래시에 대한 정보를 자동으로 수집하고, 스택 서명별로 동일한 크래시를 그룹화하며, 영향을 받은 사용자 수에 따라 우선순위를 지정하여 Firebase 콘솔에 표시합니다.
Crashlytics는 2011년 Fabric 플랫폼의 일부로 출시되어 iOS에서 크래시 리포팅의 사실상 표준이 되었습니다. 2017년 Google이 약 20억 달러(Fabric 전체)에 인수한 후 Crashlytics는 Firebase SDK에 통합되었습니다. 버전 18.0.0(2021)은 Kotlin Multiplatform 지원을 추가했고, 버전 19.0.0(2024)은 추가 설정 없이 Android에서 자동 ANR 수집을 도입했습니다. Google(2026)에 따르면 Crashlytics는 월간 100억 개 이상의 크래시를 처리합니다.
Crashlytics Firebase 프로젝트당 하루 50만 세션의 제한으로 무료로 제공됩니다. 대부분의 앱에 충분합니다 — according to Google (2026), 95% of projects do not exceed the limit. 초과 시 데이터 수집은 중단되지 않지만 보고서는 다음 날까지 업데이트가 중지됩니다. 트래픽이 많은 프로젝트의 경우 Spark 및 Blaze Firebase 요금제를 사용할 수 있으며 Crashlytics는 두 요금제에서 모두 무료로 유지되며 세션 제한은 별도로 계산됩니다.
Crashlytics의 수집 메커니즘은 플랫폼 및 런타임 수준에서 예외를 가로채는 것을 기반으로 합니다. Android에서 SDK는 처리되지 않은 모든 Kotlin 및 Java 예외를 포착하는 UncaughtExceptionHandler를 설치합니다. iOS에서 Crashlytics는 Objective-C/Swift용 NSSetUncaughtExceptionHandler와 네이티브 코드 크래시용 자체 Mach 예외 처리기를 사용합니다.
Crashlytics는 다섯 가지 유형의 크래시를 구분합니다: fatal(치명적 크래시), non-fatal(수동으로 전달된 비치명적 예외), ANR(Android — 앱이 응답하지 않음), signal(OS 신호 — SIGSEGV, SIGABRT) 및 OOM(iOS 메모리 부족). Each type is handled by a separate mechanism and displayed in the console with the corresponding label.
| 크래시 유형 | 플랫폼 | 트리거 |
|---|---|---|
| Fatal | Android, iOS | 처리되지 않은 예외 |
| Non-fatal | Android, iOS | Crashlytics.logException() 수동 호출 |
| ANR | Android | 5초 이상 응답 없음 |
| Signal | Android, iOS | OS 신호 (SEGV, ABRT, BUS) |
| OOM | iOS | 메모리 부족 |
각 Crashlytics 보고서에는 포괄적인 정보가 포함됩니다: 클래스 이름과 줄 번호가 포함된 전체 스택 트레이스, 앱 버전(versionName + versionCode), 기기 모델, OS 버전, 사용 가능한 메모리, 화면 방향 및 실행 후 시간. Firebase Analytics가 연결된 경우 보고서에는 크래시 전 마지막 50개 사용자 이벤트의 경로도 포함됩니다 — 이는 크래시 재현에 매우 중요합니다.
class CrashlyticsHelper {
fun logNonFatal(error: Throwable) {
FirebaseCrashlytics.getInstance()
.log("Non-fatal: user action = payment_failed")
FirebaseCrashlytics.getInstance()
.recordException(error)
}
fun setUserContext(userId: String) {
FirebaseCrashlytics.getInstance()
.setUserId(userId)
FirebaseCrashlytics.getInstance()
.setCustomKey("subscription", "premium")
}
}
Android 앱에 Crashlytics 연결하려면 build.gradle에 두 개의 종속성을 추가하고 Google Services 플러그인을 구성해야 합니다. SDK는 추가 코드 없이 Firebase 초기화 시 자동으로 크래시 리포팅을 활성화합니다. 올바른 작동을 위해서는 google-services 플러그인과 Firebase 콘솔의 google-services.json 파일도 필요합니다.
// build.gradle (프로젝트 수준)
plugins {
id "com.google.gms.google-services" version "4.4.0"
}
// build.gradle (앱 수준)
plugins {
id "com.google.firebase.crashlytics"
}
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-crashlytics-ktx")
implementation("com.google.firebase:firebase-analytics-ktx")
}
com.google.firebase.crashlytics 플러그인은 두 가지 작업을 수행합니다: 난독화된 스택 매핑을 위한 고유 빌드 ID 생성 및 Crashlytics SDK용 리소스를 자동으로 생성합니다. 플러그인이 없으면 크래시가 "unmapped"로 표시되어 소스 코드를 찾을 수 없이 난독화된 클래스 이름(a.b.c)만 보게 됩니다. 플러그인은 루트 build.gradle 및 앱 모듈의 build.gradle에 추가됩니다.
Crashlytics 통합을 테스트하려면 테스트 예외를 생성하는 특수 메서드 forceCrash()를 사용합니다. 이 메서드는 프로덕션 빌드에서 사용할 수 없습니다. 테스트 크래시 실행 후 보고서는 1-5분 내에 Firebase 콘솔에 나타납니다. 보고서가 나타나지 않으면 google-services.json이 앱 패키지와 일치하는지, AndroidManifest에 데이터 수집을 비활성화하는 플래그가 없는지 확인하세요.
Crashlytics 콘솔은 두 가지 보기 수준을 제공합니다: 크래시 유형별로 그룹화된 모든 크래시(Issues) 목록과 추적, 통계 및 사용자 정의 데이터가 포함된 각 Issue의 상세 보고서입니다. 각 Issue는 동일한 서명(동일한 예외 유형 및 일치하는 스택 트레이스)을 가진 모든 크래시를 결합합니다.
크래시 그룹화는 Crashlytics의 핵심 기능입니다. 수천 개의 개별 크래시를 표시하는 대신 서비스는 지문(스택 트레이스의 체크섬)을 기반으로 이를 Issues로 결합합니다. 하나의 Issue에는 1개에서 수백만 개의 크래시가 포함될 수 있습니다. 각 Issue는 치명적 발생 횟수, 고유 사용자 수, 크래시가 발생한 앱 버전 및 문제를 겪은 사용자의 비율을 표시합니다.
Google(2026)에 따르면 평균적으로 Issue의 20%가 모든 치명적 앱 크래시의 80%를 차지합니다(파레토 원칙). Crashlytics는 자동으로 심각도별로 Issues를 정렬하여 영향을 받는 사용자가 많을수록 우선순위가 높아집니다. 이를 통해 개발자가 가장 광범위한 문제를 먼저 해결할 수 있습니다.
Crashlytics는 각 앱 버전의 안정성을 별도로 추적합니다. 크래시 프리 사용자 차트는 각 버전에서 치명적 크래시를 겪지 않은 사용자의 비율을 보여줍니다. 업데이트 시 비율이 임계값(기본 99%) 아래로 떨어지면 Crashlytics가 이메일 및 Firebase 콘솔을 통해 알림을 보냅니다. 이를 통해 문제가 있는 버전을 신속하게 롤백하거나 핫픽스를 출시할 수 있습니다.
Crashlytics는 컨텍스트로 보고서를 풍부하게 하는 세 가지 메커니즘을 제공합니다: 구조화된 데이터용 사용자 정의 키, 텍스트 추적용 로그, 사용자 경로용 Analytics의 Breadcrumbs입니다. 세 가지 데이터 유형 모두 크래시 보고서에 첨부되어 상세 카드에서 볼 수 있습니다.
사용자 정의 키 are key-value pairs that are sent with each crash. Maximum 64 keys per app, each key is a string up to 1024 characters. 키는 앱 상태(구독 수준, 권한 부여 상태, 마지막 화면, VPN 활성화 여부)를 레이블링하는 데 유용합니다. 값은 덮어쓰여집니다 — 동일한 이름의 새 키가 이전 키를 대체합니다.
Custom Logs는 Crashlytics가 64KB 링 버퍼에 저장하는 텍스트 메시지입니다. 로그는 자동으로 다음 크래시에 첨부됩니다. 크래시가 발생하지 않으면 로그가 서버로 전송되지 않습니다(트래픽을 소비하지 않음). 로깅은 크래시 전 사용자 단계를 기록하는 데 사용됩니다: "payment_processing_started", "api_call_initiated", "response_received_200".
class PaymentViewModel {
fun processPayment(amount: Double) {
FirebaseCrashlytics.getInstance().log("Payment started: amount=$amount")
FirebaseCrashlytics.getInstance().setCustomKey("last_screen", "payment_screen")
FirebaseCrashlytics.getInstance().setCustomKey("subscription_tier", "basic")
try {
paymentGateway.charge(amount)
} catch (e: NetworkException) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
}
Firebase Analytics가 프로젝트에 연결된 경우 Crashlytics는 크래시 전 마지막 50개 분석 이벤트인 Breadcrumbs를 자동으로 수신합니다. 각 breadcrumb에는 이벤트 이름과 해당 매개변수가 포함됩니다. 이를 통해 크래시로 이어진 정확한 작업 순서를 재구성할 수 있습니다: 사용자가 화면을 열었음 → 항목을 추가했음 → 결제를 진행했음 → 크래시 발생. Breadcrumbs는 별도의 "Logs" 탭에 있는 Issue 카드에 표시됩니다.
Crashlytics는 컨텍스트와 Issue 처리 프로세스가 적절히 구성될 때 가장 효과적입니다. 크래시 관리 워크플로를 구현한 팀은 중요한 버그 수정 시간을 60% 단축합니다(Google 데이터, 2026).
모든 크래시가 동일하게 중요한 것은 아닙니다. 사용자 수와 빈도에 따른 우선순위 지정은 가장 중요한 문제에 집중하는 데 도움이 됩니다. 경험 법칙: 24시간 내에 0.1% 이상의 사용자에게 영향을 미치는 Issues를 수정합니다. 단일 발생 Issues(< 0.01%)는 다음 계획된 릴리스까지 연기할 수 있습니다. Crashlytics는 자동으로 회귀를 표시합니다 — 수정되었지만 새 버전에서 다시 나타난 Issues입니다.
Crashlytics API를 사용하면 REST API 또는 Firebase CLI를 통해 CI/CD 파이프라인에 크래시 보고서를 통합할 수 있습니다. 각 새 릴리스마다 크래시 프리 사용자 비율이 임계값을 초과하는지 자동으로 확인할 수 있습니다. 임계값을 초과하면 CI/CD가 롤아웃을 차단하고 팀에 알림을 보냅니다. Firebase CLI는 ProGuard/R8 매핑 파일 업로드를 위한 firebase crashlytics:builds:upload 명령을 지원합니다. 이 파일이 없으면 스택을 읽을 수 없습니다.
Google(2026)에 따르면 CI/CD에서 자동 크래시 프리 임계값 확인을 사용하는 앱은 프로덕션에 40% 더 적은 회귀를 출시합니다. 권장 임계값: 중요 릴리스의 경우 크래시 프리 사용자 >= 99.5%, 일반 릴리스의 경우 >= 99.0%.
자주 묻는 질문
Crashlytics is free up to 500 thousand sessions Firebase 프로젝트당 하루. When exceeded, reports stop updating until the next day, but data collection does not stop.
Crashlytics는 Analytics 없이도 작동하지만 Analytics를 사용하면 보고서에 Breadcrumbs(크래시 전 마지막 50개 사용자 이벤트)가 포함됩니다. 두 모듈을 모두 연결하는 것이 좋습니다.
그룹화는 지문(예외 유형 및 줄 번호를 포함한 스택 트레이스의 체크섬)을 통해 수행됩니다. 동일한 지문을 가진 크래시는 하나의 Issue로 그룹화됩니다.
설정을 확인하세요: google-services.json 파일, build.gradle의 crashlytics 플러그인, 콘솔에 버전 필터링이 없는지, 라이선스 계약에 동의한 빌드인지 확인합니다. 디버깅은 릴리스 빌드에서만 작동합니다.
네, 비치명적 예외에는 recordException()을 사용하세요. 이러한 보고서는 앱 작동을 중단시키지 않지만 발생 횟수 카운터 및 전체 스택 트레이스와 함께 콘솔에 표시됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.