Android의 오류 보고

Firebase 오류 보고는 앱에 대해 상세한 오류 보고서를 만듭니다. 오류는 비슷한 스택 추적을 기반으로 문제로 그룹화되며 사용자에게 미치는 영향의 심각도에 따라 분류됩니다. 자동으로 수신되는 보고서 이외에도 커스텀 이벤트를 로깅하여 오류의 원인을 단계별로 포착할 수 있습니다.

오류 보고 설정

Android에서 오류 보고를 설정하는 방법은 다음과 같습니다.

  1. Android 프로젝트에서 Firebase를 설정하지 않았다면 지금 설정합니다.
  2. Firebase Console에서 Firebase 프로젝트에 대상 앱을 추가합니다.
  3. 앱 수준 build.gradle 파일에 오류 보고에 대한 종속 항목을 추가합니다.
    implementation 'com.google.firebase:firebase-crash:16.2.1'

첫 번째 오류 만들기

Firebase 오류 보고는 심각한 오류 또는 발견되지 않은 예외에 대해 자동으로 보고서를 생성합니다. 그러나 예외를 발견했지만 해당 예외를 보고하려는 경우에도 보고서를 생성할 수 있습니다. 이러한 오류를 보고하는 방법은 다음과 같습니다.

  1. 주요 활동에서 호출을 정적 report 메서드에 추가합니다.
    FirebaseCrash.report(new Exception("My first Android non-fatal error"));
  2. 앱을 실행합니다.
  3. adb logcat 또는 Android 스튜디오 로그에서 오류 보고가 사용 설정되었는지 확인하는 메시지를 찾습니다.
  4. Firebase Console의 오류 보고 섹션에서 오류를 확인합니다. 여기에 오류가 표시될 때까지 1~2분이 걸립니다.

커스텀 로그 만들기

오류 보고를 사용하여 오류 보고서 및 logcat(선택사항)에 커스텀 이벤트를 기록할 수 있습니다. 이벤트를 기록하면서 logcat에 출력하지 않으려면 다음 예시와 같이 문자열만 인수로 전달하면 됩니다.

FirebaseCrash.log("Activity created");

logcat에 출력하려면 로그 수준 및 태그를 함께 제공해야 합니다.

ProGuard 라벨 해독

ProGuard는 ProGuard 난독화 기호를 원래 이름에 매핑하는 mapping.txt 파일을 생성합니다. ProGuard를 사용 설정한 경우 매핑 파일을 업로드하면 오류 보고 인터페이스에서 해독된 스택 추적을 볼 수 있습니다.

테스트를 위해 다음과 같이 ProGuard를 디버그 빌드 유형으로 구성하고 ./gradlew assembleDebug 명령어를 사용하여 빌드할 수 있습니다.

debug {
   minifyEnabled true
   proguardFiles getDefaultProguardFile('proguard-android.txt'),
     'proguard-rules.pro'
}

Gradle로 ProGuard 매핑 파일 업로드

오류 보고 플러그인에서 만든 Gradle 작업을 사용하여 ProGuard 매핑 파일을 Firebase에 업로드하면 Firebase Console에서 해독된 스택 추적을 볼 수 있습니다.

오류 보고 플러그인을 구성하는 방법은 다음과 같습니다.

  1. 루트 수준 build.gradle 파일에 규칙을 추가하여 오류 보고 플러그인을 포함합니다.
        buildscript {
          repositories {
            jcenter()
            // ...
          }
    
          dependencies {
            // ...
            // For Android Studio 2.x, use firebase-plugins version 1.1.1
            classpath 'com.google.firebase:firebase-plugins:1.1.1'
            // For Android Studio 3.0, use firebase-plugins version 1.1.5
            //classpath 'com.google.firebase:firebase-plugins:1.1.5'
          }
        }
    
  2. 앱 프로젝트의 Gradle 파일(일반적으로 app/build.gradle)에 아래의 `ADD THIS` 밑에 표시된 줄을 추가하여 오류 보고 플러그인을 사용 설정합니다.
        apply plugin: 'com.android.application'
        // ADD THIS
        apply plugin: 'com.google.firebase.firebase-crash'
    
        android {
          // ...
        }
    
        dependencies {
          // ...
        }
    
  3. 다음으로 서비스 계정 및 비공개 키를 만듭니다.

    업로드를 인증하는 서비스 계정 키를 다운로드합니다. Firebase Console에서 프로젝트를 선택한 후 새 비공개 키 생성을 클릭합니다.

  4. 파일 경로를 $HOME/.gradle/gradle.properties로 설정하여 FirebaseServiceAccountFilePath라는 속성을 추가하거나 명령줄에서 -P 플래그를 사용하여 다른 경로를 지정합니다. 이후에 FirebaseServiceAccountFilePath 속성을 업데이트하여 다른 서비스 계정 파일로 작업을 실행할 수 있습니다.

    명령줄에서 -P 플래그로 다음과 같이 속성을 설정하여 매핑 파일의 경로를 지정할 수도 있습니다.

    ./gradlew -PFirebaseServiceAccountFilePath=/usr/ServiceAccount/MyApp-a287fsd34.json :app:firebaseUploadReleaseProguardMapping
  5. 프로젝트 디렉터리에서 gradlew 명령어를 실행하여 APK 빌드와 매핑 파일 업로드를 함께 실행할 수 있습니다. 예를 들면 다음과 같습니다.

    ./gradlew :app:firebaseUploadReleaseProguardMapping

    업로드 태스크의 정확한 이름은 빌드 변형 이름에 따라 다르며 다음과 같은 패턴을 따릅니다. firebaseUpload<VariantName>ProguardMapping 사용 가능한 업로드 태스크 이름의 전체 목록을 보려면 다음 gradlew 명령어를 실행하세요.

    ./gradlew :app:tasks

    firebaseUploadArchivedProguardMapping 태스크를 사용하여 ProGuard 매핑 파일을 업로드할 때 사용할 Gradle 속성을 지정할 수도 있습니다. 다음 예시와 같이 이 태스크를 사용하여 FirebaseCrashMappingFilePath, FirebaseCrashVersionCode, FirebaseCrashPackageName의 Gradle 속성을 지정할 수 있습니다.

    FirebaseCrashMappingFilePath=path/to/mapping/file
    FirebaseCrashVersionCode=2
    FirebaseCrashPackageName=example.package.name
    
    이 예시에서 프로젝트는 프로젝트의 모듈 폴더(일반적으로 app/)에 있는 기본 google-services.json 파일을 사용합니다. google-services.json 파일을 사용하지 않는 경우 FirebaseCrashApiKeyFirebaseCrashAppId에서 Gradle 속성을 지정해야 합니다.

여러 APK를 빌드하는 앱 작업

다중 APK 지원을 활용하는 애플리케이션에도 플러그인을 사용할 수 있습니다. 각 빌드 변형 작업에서는 해당 변형의 모든 APK에 사용할 매핑 파일을 업로드합니다.

예를 들어 다음 Gradle 예시와 같이 fullRelease라는 빌드 변형이 있고 app-full-armeabi-v7a-release.apk, app-full-armeabi-release.apk 등의 여러 APK를 사용하여 다양한 아키텍처를 지원하는 경우를 가정해 보겠습니다.

    productFlavors {
        full {
            applicationId "com.google.firebase.sample.testapp"
            versionName "1.0-full"
        }
    }

    splits {
        abi {
            enable true
            reset()
            include 'armeabi', 'armeabi-v7a'
            universalApk true
        }
    }

./gradlew :app:firebaseUploadReleaseProguardMapping 태스크를 실행하면 app-armeabi-v7a-release.apkapp-armeabi-release.apk의 ProGuard 매핑 파일이 서버로 업로드됩니다. Console에 해당 업로드에 대한 출력이 다음과 같이 표시됩니다.

Successfully uploaded proguard mapping file for app fullArmeabiRelease with versionCode: 1!
Successfully uploaded proguard mapping file for app fullArmeabi-v7aRelease with versionCode: 2!

ProGuard 매핑 파일 직접 업로드

또는 오류 보고로 이동하고 매핑 파일 탭을 선택하여 mapping.txt 파일을 Firebase Console에 직접 업로드할 수도 있습니다.

아래와 비슷한 형식의 파일 경로(앱별로 다름)에서 업로드할 파일을 찾을 수 있습니다.

<project root>/<module name>/build/outputs/mapping/<build type>/<appname>-proguard-mapping.txt

예를 들면 다음과 같습니다.

app/build/outputs/mapping/debug/app-proguard-mapping.txt

알려진 문제

Android 스튜디오 3.0을 사용하는 경우 오류 보고 플러그인 버전 1.1.0 또는 1.1.1을 사용하면 다음 오류가 발생하므로 앱의 루트 수준 build.gradle 파일에서 플러그인 버전 1.1.5를 대신 사용해야 합니다.

Cannot create tasks to upload ProGuard Mapping File.java.lang.IllegalStateException: Resolving configuration 'androidTestAnnotationProcessor' directly is not allowed

다음 단계