Crashlytics 대시보드에서 읽을 수 있는 비정상 종료 보고서 받기


기본적으로 Firebase Crashlytics는 Flutter 프로젝트를 자동으로 계측하여 비정상 종료 보고서를 가독화하고 사람이 읽을 수 있도록 하는 데 필요한 기호 파일을 업로드합니다.

그러나 프로젝트가 완전하게 구성되지 않는 경우가 발생할 수 있습니다. 이 가이드에서는 자동화가 수행하는 작업을 간략히 설명하고 프로젝트 설정을 디버그하기 위한 첫 번째 단계를 제공합니다.

Apple 플랫폼

dSYM 파일 업로드를 위한 구성 확인

Crashlytics Flutter 플러그인을 추가하고 flutterfire configure 명령어를 실행하면 필요한 dSYM 기호 파일을 찾아 Crashlytics에 업로드하는 실행 스크립트를 프로젝트의 Xcode 작업공간에 추가하려고 시도합니다. 이러한 파일이 없으면 Crashlytics 대시보드에 'dSYM 누락' 알림이 표시되고 누락된 파일이 업로드될 때까지 백엔드에서 예외를 보류합니다.

이 문제가 발생하면 먼저 실행 스크립트가 설치되어 있는지 확인하세요.

  1. 프로젝트의 iOS 디렉터리(FLUTTER_PROJECT_NAME/ios/Runner.xcworkspace)에서 Xcode 작업공간 파일을 찾아 엽니다.

  2. 제목이 [firebase_crashlytics] Crashlytics Upload Symbols인 실행 스크립트가 실행기 대상의 빌드 단계에 추가되었는지 확인합니다.

    실행 스크립트가 없는지 또는 실행 스크립트가 있는지에 따라 아래의 관련 섹션을 참조하세요.

이 실행 스크립트가 없는 경우 직접 추가할 수 있습니다.

  1. Apple 앱의 Firebase 앱 ID를 찾습니다. 이 ID는 서로 다른 두 위치에서 확인할 수 있습니다.

    • Firebase Console에서 > 프로젝트 설정으로 이동합니다. 내 앱 카드까지 아래로 스크롤한 다음 Firebase Apple 앱을 클릭하여 앱 ID를 포함하는 앱 정보를 확인합니다.

    • Flutter 프로젝트의 최상위 디렉터리에서 firebase_options.dart 파일을 찾습니다. Apple 앱의 Firebase 앱 ID는 GOOGLE_APP_ID로 라벨이 지정되어 있습니다.

  2. > New Run Script Phase(새 실행 스크립트 단계)를 클릭합니다.

    이 새로운 Run Script(실행 스크립트) 단계가 프로젝트의 마지막 빌드 단계인지 확인합니다. 그렇지 않으면 Crashlytics가 dSYM을 제대로 처리할 수 없습니다.

  3. 새로운 Run Script(실행 스크립트) 섹션을 펼칩니다.

  4. Shell(셸) 라벨 아래에 있는 스크립트 필드에 다음 실행 스크립트를 추가합니다.

    이러한 스크립트는 dSYM 파일을 처리하고 파일을 Crashlytics에 업로드합니다.

    $PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai FIREBASE_APP_ID -- $DWARF_DSYM_FOLDER_PATH/App.framework.dSYM
    $PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai FIREBASE_APP_ID -- $DWARF_DSYM_FOLDER_PATH/App.framework.dSYM 
    • FIREBASE_APP_ID: Firebase Apple 앱 ID(Apple 번들 ID 아님)
      Firebase Apple 앱 ID 예시: 1:1234567890:ios:321abc456def7890

    Firebase 앱 ID를 찾는 방법에는 2가지가 있습니다.

    • GoogleService-Info.plist 파일에서 GOOGLE_APP_ID 값이 앱 ID입니다.

    • Firebase Console에서 프로젝트 설정으로 이동합니다. 내 앱 카드까지 아래로 스크롤한 다음 원하는 Firebase 앱을 클릭하여 앱 ID를 찾습니다.

  5. Input Files(입력 파일) 섹션에서 다음 파일 위치의 경로를 추가합니다.

    ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
    ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}
    ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist
    $(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist
    $(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)

    Xcode는 지정된 위치에서 이러한 입력 파일을 찾아 실행 스크립트에 빌드 파일을 사용할 수 있는지 확인합니다. 또한 사용자 스크립트 샌드박스를 사용 설정하면 Xcode는 실행 스크립트가 입력 파일에 지정된 파일에 액세스하는 것만 허용합니다.

    • 프로젝트의 dSYM 파일 위치를 제공하면 Crashlytics에서 dSYM을 처리할 수 있습니다.
    • 앱의 빌드된 GoogleService-Info.plist 파일 위치를 제공하면 Crashlytics에서 dSYM을 Firebase 앱과 연결할 수 있습니다.
    • 앱의 실행 파일 위치를 제공하면 실행 스크립트가 동일한 dSYM의 중복 업로드를 방지할 수 있습니다. 앱 바이너리는 업로드되지 않습니다.

실행 스크립트가 있는 경우 dSYM 문제 해결을 위한 Apple 전용 가이드를 참조하세요. 설명한 프로세스를 통해 dSYM 파일을 업로드하려면 다음 추가 단계를 수행해야 합니다.

  1. Apple 앱의 Firebase 앱 ID를 찾습니다. 이 ID는 서로 다른 두 위치에서 확인할 수 있습니다.

    • Firebase Console에서 > 프로젝트 설정으로 이동합니다. 내 앱 카드까지 아래로 스크롤한 다음 Firebase Apple 앱을 클릭하여 앱 ID를 포함하는 앱 정보를 확인합니다.

    • Flutter 프로젝트의 최상위 디렉터리에서 firebase_options.dart 파일을 찾습니다. Apple 앱의 Firebase 앱 ID는 GOOGLE_APP_ID로 라벨이 지정되어 있습니다.

  2. upload-symbols 스크립트를 실행할 때 -gsp /path/to/GoogleService-Info.plist 대신 -ai FIREBASE_APPLE_APP_ID를 사용합니다.

Flutter 및 Crashlytics의 버전 구성 확인(--split-debug-info 플래그를 사용하는 경우)

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

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

Android

종속 항목 구성 확인

flutterfire configure 명령어는 프로젝트의 Gradle 빌드 파일에 필요한 종속 항목을 추가하려고 시도합니다. 이러한 종속 항목이 없이 난독화가 사용 설정되어 있으면 Firebase Console의 비정상 종료 보고서가 난독화될 수 있습니다.

프로젝트 수준 build.gradle 및 앱 수준 build.gradle에 다음 줄이 있는지 확인합니다.

  • project-level 빌드 파일(android/build.gradle)에서 다음 줄을 확인합니다.

    dependencies {
    // ... other dependencies
    
    classpath 'com.google.gms:google-services:4.3.5'
    classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
    }
  • app-level 빌드 파일(android/app/build.gradle)에서 다음 줄을 확인합니다.

    // ... other imports
    
    android {
    // ... your android config
    }
    
    dependencies {
    // ... your dependencies
    }
    
    // This section must appear at the bottom of the file
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'com.google.firebase.crashlytics'

Flutter 기호를 업로드하기 위해 CLI를 사용하고 있는지 확인(--split-debug-info 플래그를 사용하는 경우)

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

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

    Firebase 앱 ID를 찾는 방법에는 2가지가 있습니다.

    • google-services.json 파일에서 mobilesdk_app_id 값이 앱 ID입니다.

    • Firebase Console에서 프로젝트 설정으로 이동합니다. 내 앱 카드까지 아래로 스크롤한 다음 원하는 Firebase 앱을 클릭하여 앱 ID를 찾습니다.

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

문제가 지속되면 난독화된 보고서 문제 해결을 위한 Android 전용 가이드를 참고하세요.