Android NDK 오류 보고서 받기

Android 앱에 네이티브 라이브러리가 포함되어 있는 경우 Firebase Crashlytics에서 앱의 빌드 구성을 소규모 업데이트하여 네이티브 코드에 대한 전체 스택 트레이스와 상세한 오류 보고서를 사용할 수 있습니다. 이 가이드에서는 Firebase Crashlytics SDK를 사용하여 오류 보고를 구성하는 방법을 설명합니다.

시작하기 전에

시작하려면 Firebase Crashlytics SDK로 Crashlytics를 설정하세요.

1단계: Gradle 구성 업데이트

앱 수준 build.gradle에서 Crashlytics NDK 런타임 종속 항목을 추가합니다.

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
    // ...

    // Add the Crashlytics NDK dependency (if you have the
    // Firebase Crashlytics dependency, replace it).
    implementation 'com.google.firebase:firebase-crashlytics:17.2.1'
    implementation 'com.google.firebase:firebase-crashlytics-ndk:17.2.1'
}

// …
android {
    // ...
    buildTypes {
        release {
            // Add this extension
            firebaseCrashlytics {
                // Enable processing and uploading of native symbols to Crashlytics
                // servers. By default, this is disabled to improve build speeds.
                // This flag must be enabled to see properly-symbolicated native
                // stack traces in the Crashlytics dashboard.
                nativeSymbolUploadEnabled true
            }
        }
    }
}

2단계: 네이티브 기호 업로드 사용 설정

NDK 비정상 종료로부터 읽기 가능한 스택 트레이스를 생성하려면 Crashlytics에서 네이티브 바이너리의 기호에 대해 파악해야 합니다. Gradle 플러그인에는 이 과정을 자동화하는 uploadCrashlyticsSymbolFileBUILD_VARIANT 태스크가 포함되어 있습니다. 이 태스크에 액세스하려면 nativeSymbolUploadEnabled가 true로 설정되었는지 확인합니다.

스택 트레이스에 나타나는 메서드 이름의 경우 NDK 라이브러리를 빌드할 때마다 uploadCrashlyticsSymbolFileBUILD_VARIANT 태스크를 명시적으로 호출해야 합니다. 예를 들면 다음과 같습니다.

>./gradlew app:assembleBUILD_VARIANT\
           app:uploadCrashlyticsSymbolFileBUILD_VARIANT

3단계(선택사항): 외부 종속 항목 기호 업로드

기호 업로드 태스크에서는 CMake와 같은 표준 NDK 빌드 도구를 사용하여 Gradle 빌드의 일부로 네이티브 라이브러리를 빌드한다고 가정합니다. 외부에서 빌드한 네이티브 라이브러리가 있거나 Gradle 내에서 맞춤설정된 NDK 빌드 프로세스를 사용하고 있는 경우 삭제 및 삭제되지 않은 라이브러리의 경로를 명시적으로 지정해야 할 수 있습니다. 이를 위해 firebaseCrashlytics 확장 프로그램은 strippedNativeLibsDirunstrippedNativeLibsDir 속성을 제공합니다.

// …
android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                strippedNativeLibsDir ‘path/to/stripped/parent/dir’
                unstrippedNativeLibsDir ‘path/to/unstripped/parent/dir’
            }
        }
    }
}

이 플러그인은 라이브러리가 지정된 디렉터리의 아키텍처별 하위 디렉터리에 있고 해당 디렉터리의 동일한 경로에 해당하는 삭제/삭제되지 않은 라이브러리 쌍이 있다고 가정합니다. 예를 들면 다음과 같습니다.

strippedNativeLibsDir/
 +- x86/
      |
      +- libfoo.so
      +- libbar.so
 +- arm64/
      |
      +- libfoo.so
      +- libbar.so

unstrippedNativeLibsDir/
 +- x86/
      |
      +- libfoo.so
      +- libbar.so
 +- arm64/
      |
      +- libfoo.so
      +- libbar.so

빌드 시스템이 위의 구조/이름 지정 스키마를 준수하지 않은 경우 uploadCrashlyticsSymbolFileBUILD_VARIANT 태스크를 호출하기 전에 로컬 디스크에 이 구조를 수동으로 만듭니다.

4단계(선택사항): NDK 오류 보고서 맞춤설정

C++ 코드에 crashlytics.h 헤더를 포함하여 로그, 커스텀 키, 사용자 ID와 같은 NDK 오류 보고서에 메타데이터를 추가할 수도 있습니다. crashlytics.hFirebase Android SDK GitHub 저장소에 헤더 전용 C++ 라이브러리로 제공됩니다. NDK C++ API 사용에 대한 안내는 헤더 파일의 설명을 참조하세요.

5단계: 오류 보고서 확인하기

Crashlytics에서 앱을 빌드하고 기호를 업로드하고 네이티브 충돌을 강제 적용하여 NDK 비정상 종료를 제대로 보고하는지 확인합니다. 비정상 종료가 발생하면 Crashlytics에서 보고서를 보낼 수 있도록 앱을 다시 시작해야 합니다. 그러면 몇 분 내로 Firebase Console에 오류가 표시됩니다.

문제해결