Firebase Crashlytics 시작하기

이 빠른 시작에서는 Crashlytics Flutter 플러그인을 사용해 앱에 Firebase Crashlytics를 설정하여 Firebase Console에서 포괄적인 비정상 종료 보고서를 확인하는 방법을 설명합니다.

Crashlytics를 설정하려면 명령줄 도구와 IDE를 모두 사용해야 합니다. 설정을 완료하려면 테스트 예외를 강제로 발생시켜 첫 번째 비정상 종료 보고서를 Firebase로 전송해야 합니다.

시작하기 전에

  1. Flutter 프로젝트에 아직 Firebase를 구성하지 않은 경우 Firebase를 구성하고 초기화합니다.

  2. 권장: 비정상 종료가 발생하지 않은 사용자, 탐색경로 로그, 신속 알림과 같은 기능을 사용하려면 Firebase 프로젝트에서 Google 애널리틱스를 사용 설정해야 합니다.

    Crashlytics가 지원하는 모든 Android 및 Apple 플랫폼(watchOS 제외)은 Google 애널리틱스의 이러한 기능을 활용할 수 있습니다.

    Firebase 프로젝트에서 Google 애널리틱스가 사용 설정되어 있는지 확인합니다. >프로젝트 설정 >통합 탭으로 이동하여 Google 애널리틱스의 화면에 표시된 안내를 따릅니다.

1단계: Flutter 프로젝트에 Crashlytics 추가

  1. Flutter 프로젝트의 루트에서 다음 명령어를 실행하여 Crashlytics Flutter 플러그인을 설치합니다.

    flutter pub add firebase_crashlytics
    
  2. Flutter 프로젝트의 루트 디렉터리에서 다음 명령어를 실행합니다.

    flutterfire configure
    

    이 명령어를 실행하면 Flutter 앱의 Firebase 구성이 최신 상태로 유지되고 Android의 경우 필요한 Crashlytics Gradle 플러그인이 앱에 추가됩니다.

  3. 완료되면 Flutter 프로젝트를 다시 빌드합니다.

    flutter run
    
  4. (선택사항) Flutter 프로젝트에서 --split-debug-info 플래그(및 필요에 따라 --obfuscate 플래그)를 사용하는 경우 앱에 대한 읽을 수 있는 스택 트레이스를 표시하려면 추가 단계가 필요합니다.

    • Apple 플랫폼: 프로젝트에서 Flutter 기호(dSYM 파일)를 자동으로 생성하여 Crashlytics에 업로드할 수 있도록 프로젝트에서 권장 버전 구성(Flutter 3.12.0 이상 및 Crashlytics Flutter 플러그인 3.3.4 이상)을 사용하는지 확인합니다.

    • Android: Firebase CLI(v.11.9.0 이상)를 사용하여 Flutter 디버그 기호를 업로드합니다. 난독화된 코드 빌드에서 비정상 종료를 보고하기 전에 디버그 기호를 업로드해야 합니다.

      Flutter 프로젝트의 루트 디렉터리에서 다음 명령어를 실행합니다.

      firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/symbols
      • FIREBASE_APP_ID: 패키지 이름이 아닌 Firebase Android 앱 ID
        Firebase Android 앱 ID 예시: 1:567383003300:android:17104a2ced0c9b9b

      • PATH/TO/symbols: 애플리케이션을 빌드할 때 --split-debug-info 플래그에 전달하는 디렉터리와 동일한 디렉터리입니다.

2단계: 비정상 종료 핸들러 구성

FlutterError.onErrorFirebaseCrashlytics.instance.recordFlutterFatalError로 재정의하여 Flutter 프레임워크 내에서 발생하는 모든 오류를 자동으로 포착할 수 있습니다.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();

  // Pass all uncaught "fatal" errors from the framework to Crashlytics
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;

  runApp(MyApp());
}

Flutter 프레임워크에서 처리하지 않는 비동기 오류를 포착하려면 PlatformDispatcher.instance.onError를 사용합니다.

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

다른 유형의 오류를 처리하는 방법의 예는 비정상 종료 보고서 맞춤설정을 참고하세요.

3단계: 테스트 비정상 종료를 강제로 적용하여 설정 완료

Crashlytics 설정을 완료하고 Firebase Console의 Crashlytics 대시보드에서 초기 데이터를 확인하려면 테스트 비정상 종료를 강제로 적용해야 합니다.

  1. 테스트 예외를 강제로 발생시키는 데 사용할 수 있는 코드를 앱에 추가합니다.

    최상위 ZoneFirebaseCrashlytics.instance.recordError(error, stack, fatal: true)를 호출하는 오류 핸들러를 추가한 경우 다음 코드를 사용하여 누르면 테스트 예외를 발생시키는 버튼을 앱에 추가할 수 있습니다.

    TextButton(
        onPressed: () => throw Exception(),
        child: const Text("Throw Test Exception"),
    ),
    
  2. 앱을 빌드하고 실행합니다.

  3. 앱의 첫 번째 보고서를 전송하려면 테스트 예외를 강제로 발생시킵니다.

    1. 테스트 기기 또는 에뮬레이터에서 앱을 엽니다.

    2. 앱에서 위 코드를 사용하여 추가한 테스트 예외 버튼을 누릅니다.

  4. Firebase Console의 Crashlytics 대시보드로 이동하여 테스트 비정상 종료를 확인합니다.

    Console을 새로고침하고 5분 후에도 테스트 비정상 종료가 표시되지 않으면 디버그 로깅을 사용 설정하여 앱에서 비정상 종료 보고서를 전송하는지 확인합니다.


모든 작업이 완료되었습니다. 이제 Crashlytics에서 앱의 비정상 종료를 모니터링하고 Android에서는 심각하지 않은 오류와 ANR을 모니터링합니다. 모든 보고서와 통계를 확인하고 조사하려면 Crashlytics 대시보드로 이동하세요.

다음 단계