Firebase Crashlytics 시작하기


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

Crashlytics를 설정하려면 Firebase Console과 IDE 모두에서 태스크를 수행해야 합니다(예: Firebase 구성 파일 및 Crashlytics SDK 추가). 설정을 완료하려면 테스트 비정상 종료를 강제로 적용하여 첫 번째 비정상 종료 보고서를 Firebase로 전송해야 합니다.

시작하기 전에

  1. 아직 추가하지 않았다면 Unity 프로젝트에 Firebase를 추가합니다. Unity 프로젝트가 없는 경우 샘플 앱을 다운로드하면 됩니다.

  2. 권장: 비정상 종료, 심각하지 않은 문제 또는 ANR 이벤트로 이어지는 사용자 작업을 파악하기 위해 탐색경로 로그를 자동으로 가져오려면 Firebase 프로젝트에서 Google Analytics를 사용 설정해야 합니다.

    • 기존 Firebase 프로젝트에 Google Analytics가 사용 설정되어 있지 않은 경우 Firebase Console의 > 프로젝트 설정에 있는 통합에서 Google Analytics를 사용 설정할 수 있습니다.

    • 새 Firebase 프로젝트를 만드는 경우 프로젝트 생성 워크플로에서 Google Analytics를 사용 설정합니다.

1단계: 앱에 Crashlytics SDK 추가

Unity 프로젝트를 Firebase 프로젝트에 등록할 때 이미 Firebase Unity SDK를 다운로드하고 다음 단계에 설명된 패키지를 추가했을 수 있습니다.

  1. Firebase Unity SDK를 다운로드한 후 원하는 위치에 SDK 압축을 풉니다. Firebase Unity SDK는 플랫폼별로 제공되지 않습니다.

  2. Unity 프로젝트를 열고 Assets(애셋) > Import Package(패키지 가져오기) > Custom Package(커스텀 패키지)로 이동합니다.

  3. 압축을 푼 SDK에서 Crashlytics SDK(FirebaseCrashlytics.unitypackage)를 선택하여 가져옵니다.

    탐색경로 로그를 활용하려면 Google Analytics용 Firebase SDK도 앱에 추가합니다(FirebaseAnalytics.unitypackage). Firebase 프로젝트에서 Google 애널리틱스가 사용 설정되어 있는지 확인합니다.

  4. Unity 패키지 가져오기 창에서 가져오기를 클릭합니다.

2단계: Crashlytics 초기화

  1. 새 C# 스크립트를 만들어 장면의 GameObject에 추가합니다.

    1. 첫 번째 장면을 연 다음 이름이 CrashlyticsInitializer인 빈 GameObject를 만듭니다.

    2. 새 객체에 대해 검사기에서 구성요소 추가를 클릭합니다.

    3. CrashlyticsInit 스크립트를 선택하여 CrashlyticsInitializer 객체에 추가합니다.

  2. 스크립트의 Start 메서드에서 Crashlytics를 초기화합니다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    // Import Firebase and Crashlytics
    using Firebase;
    using Firebase.Crashlytics;
    
    public class CrashlyticsInit : MonoBehaviour {
        // Use this for initialization
        void Start () {
            // Initialize Firebase
            Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
                var dependencyStatus = task.Result;
                if (dependencyStatus == Firebase.DependencyStatus.Available)
                {
                    // Create and hold a reference to your FirebaseApp,
                    // where app is a Firebase.FirebaseApp property of your application class.
                    // Crashlytics will use the DefaultInstance, as well;
                    // this ensures that Crashlytics is initialized.
                    Firebase.FirebaseApp app = Firebase.FirebaseApp.DefaultInstance;
    
                    // When this property is set to true, Crashlytics will report all
                    // uncaught exceptions as fatal events. This is the recommended behavior.
                    Crashlytics.ReportUncaughtExceptionsAsFatal = true;
    
                    // Set a flag here for indicating that your project is ready to use Firebase.
                }
                else
                {
                    UnityEngine.Debug.LogError(System.String.Format(
                      "Could not resolve all Firebase dependencies: {0}",dependencyStatus));
                    // Firebase Unity SDK is not safe to use here.
                }
            });
        }
    
      // Update is called once per frame
      void Update()
        // ...
    }

3단계: (Android만 해당) 기호 업로드 설정

이 단계는 IL2CPP를 사용하는 Android 앱에만 필요합니다.

  • Unity의 Mono 스크립팅 백엔드를 사용하는 Android 앱에는 이 단계가 필요하지 않습니다.

  • Apple 플랫폼 앱의 경우 기호를 업로드하도록 Firebase Unity 편집기 플러그인이 Xcode 프로젝트를 자동으로 구성하므로 이 단계가 필요하지 않습니다.

Crashlytics의 Unity SDK 8.6.1 이상에는 NDK 비정상 종료 보고가 자동으로 포함되어 있어 Crashlytics에서 Android의 Unity IL2CPP 비정상 종료를 자동으로 보고할 수 있습니다. 그러나 Crashlytics 대시보드에서 네이티브 라이브러리 비정상 종료에 대한 기호화된 스택 트레이스를 보려면 Firebase CLI를 사용하여 빌드 시간에 기호 정보를 업로드해야 합니다.

기호 업로드를 설정하려면 안내에 따라 Firebase CLI를 설치하세요.

CLI를 이미 설치했다면 최신 버전으로 업데이트해야 합니다.

4단계: 프로젝트 빌드 및 기호 업로드

iOS+(Apple 플랫폼)

  1. Build Settings(빌드 설정) 대화상자에서 프로젝트를 Xcode 작업공간으로 내보냅니다.

  2. 앱을 빌드합니다.

    Apple 플랫폼의 경우 Crashlytics 호환 기호 파일을 생성한 후 각 빌드에 해당하는 Firebase 서버에 업로드하도록 Firebase Unity 편집기 플러그인이 Xcode 프로젝트를 자동으로 구성합니다.

Android

  1. 빌드 설정 대화상자에서 다음 중 하나를 실행합니다.

    • Android 스튜디오 프로젝트로 내보내 프로젝트를 빌드합니다.

    • Unity Editor에서 직접 APK를 빌드합니다.
      빌드하기 전에 빌드 설정 대화상자에서 CreateSYMBOL.zip 체크박스가 선택되어 있는지 확인합니다.

  2. 빌드가 완료되면 Crashlytics 호환 기호 파일을 생성하고 다음 Firebase CLI 명령어를 실행하여 Firebase 서버에 업로드합니다.

    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: CLI에서 생성된 기호 파일 경로

      • Android 스튜디오 프로젝트로 내보냄 - PATH/TO/SYMBOLSunityLibrary/symbols 디렉터리를 나타내며 Gradle 또는 Android 스튜디오를 통해 앱을 빌드한 후 내보낸 프로젝트 루트에 생성됩니다.

      • Unity 내에서 APK를 직접 빌드 - PATH/TO/SYMBOLS는 빌드가 완료될 때 프로젝트 루트 디렉터리에서 생성된 압축된 기호 파일의 경로입니다(예: myproject/myapp-1.0-v100.symbols.zip).

    기호 파일 생성 및 업로드에 Firebase CLI 명령어를 사용하기 위한 고급 옵션 보기

    플래그 설명
    --generator=csym

    기본 Breakpad 생성기 대신 기존 cSYM 기호 파일 생성기를 사용합니다.

    사용하지 않는 것이 좋습니다. 기본 Breakpad 기호 파일 생성기를 사용하는 것이 좋습니다.

    --generator=breakpad

    Breakpad 기호 파일 생성기를 사용합니다.

    기호 파일 생성의 기본값은 Breakpad입니다. 빌드 구성에 symbolGenerator { csym() }를 추가했고 대신 Breakpad를 사용하도록 재정의하려는 경우에만 이 플래그를 사용합니다.

    --dry-run

    기호 파일을 생성하지만 업로드하지 않습니다.

    이 플래그는 전송된 파일의 콘텐츠를 검사하려는 경우에 유용합니다.

    --debug 디버깅 정보를 추가로 제공합니다.

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

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

  1. 기존 GameObject를 찾은 후 다음 스크립트에 추가합니다. 이 스크립트는 앱을 실행하고 몇 초 후에 테스트 비정상 종료를 일으킵니다.

    using System;
    using UnityEngine;
    
    public class CrashlyticsTester : MonoBehaviour {
    
        int updatesBeforeException;
    
        // Use this for initialization
        void Start () {
          updatesBeforeException = 0;
        }
    
        // Update is called once per frame
        void Update()
        {
            // Call the exception-throwing method here so that it's run
            // every frame update
            throwExceptionEvery60Updates();
        }
    
        // A method that tests your Crashlytics implementation by throwing an
        // exception every 60 frame updates. You should see reports in the
        // Firebase console a few minutes after running your app with this method.
        void throwExceptionEvery60Updates()
        {
            if (updatesBeforeException > 0)
            {
                updatesBeforeException--;
            }
            else
            {
                // Set the counter to 60 updates
                updatesBeforeException = 60;
    
                // Throw an exception to test your Crashlytics implementation
                throw new System.Exception("test exception please ignore");
            }
        }
    }
    
  2. 앱을 빌드하고 빌드가 완료되면 기호 정보를 업로드합니다.

    • iOS+: Firebase Unity 편집기 플러그인이 기호 파일을 업로드하도록 Xcode 프로젝트를 자동으로 구성해 줍니다.

    • Android: IL2CPP를 사용하는 Android 앱의 경우 Firebase CLI crashlytics:symbols:upload 명령어를 실행하여 기호 파일을 업로드합니다.

  3. 앱을 실행합니다. 앱이 실행되면 기기 로그를 확인하고 CrashlyticsTester에서 예외가 트리거될 때까지 기다립니다.

    • iOS+: Xcode 하단 창에서 로그를 확인합니다.

    • Android: 터미널에서 adb logcat 명령어를 실행하여 로그를 확인합니다.

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

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


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

다음 단계

  • (권장) IL2CPP를 사용하는 Android 앱의 경우 GWP-ASan 보고서를 수집하여 네이티브 메모리 오류로 인한 비정상 종료 디버깅 지원을 받으세요. 이러한 메모리 관련 오류는 앱 보안 취약점의 주요 원인인 앱 내의 메모리 손상과 관련이 있을 수 있습니다. 이 디버깅 기능을 활용하려면 앱에서 Unity용 최신 Crashlytics SDK(v10.7.0 이상)를 사용하고 GWP-ASan을 명시적으로 사용 설정했는지 확인합니다(Android 앱 매니페스트 수정 필요).
  • Google Play와 통합하여 Crashlytics 대시보드에서 직접 Android 앱의 비정상 종료 보고서를 Google Play 트랙별로 필터링할 수 있도록 합니다. 이렇게 하면 특정 빌드에 대시보드를 더 집중할 수 있습니다.