Android 앱에 기본 라이브러리 가 포함된 경우 앱의 빌드 구성을 약간 업데이트하여 Firebase Crashlytics의 기본 코드에 대한 전체 스택 추적 및 자세한 비정상 종료 보고서를 사용 설정할 수 있습니다.
이 가이드에서는 NDK용 Firebase Crashlytics SDK로 비정상 종료 보고를 구성하는 방법을 설명합니다.
Unity 프로젝트에서 Crashlytics를 시작하는 방법을 찾고 있다면 Unity 시작 가이드 를 확인하세요.
시작하기 전에
아직 추가하지 않았다면 Android 프로젝트에 Firebase 를 추가하세요. Android 앱이 없는 경우 샘플 앱 을 다운로드할 수 있습니다.
권장사항 : 비정상 종료 사용자, 탐색경로 로그, 속도 알림과 같은 기능을 사용하려면 Firebase 프로젝트에서 Google 애널리틱스를 사용 설정해야 합니다.
기존 Firebase 프로젝트에 Google 애널리틱스가 활성화되지 않은 경우 Firebase 콘솔의 통합 탭 에서 Google 애널리틱스를 활성화할 수 있습니다.
> 프로젝트 설정 의새 Firebase 프로젝트를 만드는 경우 프로젝트 생성 워크플로 중에 Google 애널리틱스를 활성화하세요.
1단계 : 앱에 NDK용 Crashlytics SDK 추가
모듈(앱 수준) Gradle 파일 (일반적으로<project>/<app-module>/build.gradle
)에서 Crashlytics NDK Android 라이브러리의 종속성을 추가합니다. Firebase Android BoM 을 사용하여 라이브러리 버전 관리를 제어하는 것이 좋습니다.Crashlytics 사용 환경을 최적화하려면 Firebase 프로젝트에서 Google 애널리틱스를 사용 설정하고 앱에 Google 애널리틱스용 Firebase SDK를 추가하는 것이 좋습니다.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.0') // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk' implementation 'com.google.firebase:firebase-analytics-ktx' }
Firebase Android BoM 을 사용하면 앱에서 항상 호환되는 버전의 Firebase Android 라이브러리를 사용합니다.
(대안) BoM을 사용 하지 않고 Firebase 라이브러리 종속성 추가
Firebase BoM을 사용하지 않기로 선택한 경우 종속성 줄에 각 Firebase 라이브러리 버전을 지정해야 합니다.
앱에서 여러 Firebase 라이브러리를 사용하는 경우 BoM을 사용하여 모든 버전이 호환되도록 라이브러리 버전을 관리하는 것이 좋습니다.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk:18.3.3' implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.0') // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk' implementation 'com.google.firebase:firebase-analytics' }
Firebase Android BoM 을 사용하면 앱에서 항상 호환되는 버전의 Firebase Android 라이브러리를 사용합니다.
(대안) BoM을 사용 하지 않고 Firebase 라이브러리 종속성 추가
Firebase BoM을 사용하지 않기로 선택한 경우 종속성 줄에 각 Firebase 라이브러리 버전을 지정해야 합니다.
앱에서 여러 Firebase 라이브러리를 사용하는 경우 BoM을 사용하여 모든 버전이 호환되도록 라이브러리 버전을 관리하는 것이 좋습니다.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk:18.3.3' implementation 'com.google.firebase:firebase-analytics:21.2.0' }
2단계 : 앱에 Crashlytics Gradle 플러그인 추가
루트 수준(프로젝트 수준) Gradle 파일(
<project>/build.gradle
)에서 Crashlytics Gradle 플러그인을 buildscript 종속 항목으로 추가합니다.buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' } }
모듈(앱 수준) Gradle 파일(일반적으로
<project>/<app-module>/build.gradle
)에서 Crashlytics Gradle 플러그인을 추가합니다.plugins { id 'com.android.application' // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' ... }
3단계 : 빌드에 firebaseCrashlytics
확장 프로그램 추가
모듈(앱 수준) Gradle 파일 (일반적으로 app/build.gradle
)에서 firebaseCrashlytics
확장 프로그램을 추가합니다.
Kotlin+KTX
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase 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 } } } }
Java
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase 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 } } } }
4단계 : 네이티브 기호 자동 업로드 설정
NDK 비정상 종료에서 읽을 수 있는 스택 추적을 생성하려면 Crashlytics가 기본 바이너리의 기호에 대해 알아야 합니다. Crashlytics Gradle 플러그인에는 이 프로세스를 자동화하는 uploadCrashlyticsSymbolFile BUILD_VARIANT
작업이 포함되어 있습니다.
자동화된 기호 업로드 작업에 액세스할 수 있도록 모듈(앱 수준) Gradle 파일에서
nativeSymbolUploadEnabled
가true
로 설정되어 있는지 확인하십시오.메서드 이름이 스택 추적에 표시되려면 각 NDK 라이브러리 빌드 후
uploadCrashlyticsSymbolFile BUILD_VARIANT
작업을 명시적으로 호출해야 합니다. 예를 들어:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
NDK용 Crashlytics SDK와 Crashlytics Gradle 플러그인은 모두 기본 공유 객체 내에 GNU 빌드 ID가 있어야 합니다.
각 바이너리에서
readelf -n
을 실행하여 이 ID의 존재를 확인할 수 있습니다. 빌드 ID가 없으면 빌드 시스템의 플래그에-Wl,--build-id
를 추가하여 문제를 해결하십시오.
5단계 : 테스트 충돌을 강제로 설정을 완료합니다.
Crashlytics 설정을 완료하고 Firebase 콘솔의 Crashlytics 대시보드에서 초기 데이터를 보려면 강제로 테스트 비정상 종료를 실행해야 합니다.
테스트 비정상 종료를 강제하는 데 사용할 수 있는 코드를 앱에 추가합니다.
앱의
MainActivity
에서 다음 코드를 사용하여 눌렀을 때 충돌을 일으키는 버튼을 앱에 추가할 수 있습니다. 버튼에는 "Test Crash"라는 라벨이 붙어 있습니다.Kotlin+KTX
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
앱을 빌드하고 실행합니다.
앱의 첫 번째 충돌 보고서를 보내려면 테스트 충돌을 강제 실행합니다.
테스트 장치 또는 에뮬레이터에서 앱을 엽니다.
앱에서 위의 코드를 사용하여 추가한 "Test Crash" 버튼을 누릅니다.
앱이 비정상 종료된 후 앱이 비정상 종료 보고서를 Firebase로 보낼 수 있도록 앱을 다시 시작하세요.
Firebase 콘솔의 Crashlytics 대시보드 로 이동하여 테스트 비정상 종료를 확인하세요.
콘솔을 새로 고쳤는데도 5분 후에도 테스트 충돌이 표시되지 않으면 디버그 로깅을 활성화 하여 앱이 충돌 보고서를 보내고 있는지 확인하십시오.
그리고 그게 다야! 이제 Crashlytics에서 앱의 비정상 종료를 모니터링하고 있으며 Crashlytics 대시보드에서 비정상 종료 보고서 및 통계를 보고 조사할 수 있습니다.
기호 업로드를 위한 대체 옵션
위 페이지의 기본 워크플로는 표준 Gradle 빌드에 적용할 수 있습니다. 그러나 일부 앱은 다른 구성 또는 도구(예: Gradle 이외의 빌드 프로세스)를 사용합니다. 이러한 상황에서 기호를 성공적으로 업로드하는 데 다음 옵션이 도움이 될 수 있습니다.
옵션 : 라이브러리 모듈 및 외부 종속성에 대한 기호 업로드
이 옵션은 다음 상황에서 유용할 수 있습니다.
- Gradle 내에서 맞춤설정된 NDK 빌드 프로세스를 사용하는 경우
- 네이티브 라이브러리가 라이브러리/기능 모듈에 내장되어 있거나 타사에서 제공하는 경우
- 자동 기호 업로드 작업 이 실패하거나 대시보드에 기호화되지 않은 충돌이 표시되는 경우
표준 Crashlytics 기호 업로드 작업은 CMake와 같은 표준 NDK 빌드 도구를 사용하여 앱 모듈의 Gradle 빌드의 일부로 네이티브 라이브러리를 빌드한다고 가정합니다.
그러나 Gradle 내에서 맞춤설정된 NDK 빌드 프로세스를 사용하거나 네이티브 라이브러리가 라이브러리/기능 모듈에 빌드되거나 타사에서 제공되는 경우 제거되지 않은 라이브러리의 경로를 명시적으로 지정해야 할 수 있습니다. 이를 위해 build.gradle
파일의 firebaseCrashlytics
확장 프로그램 내에 unstrippedNativeLibsDir
속성을 추가할 수 있습니다.
이 페이지 앞부분의 기본 워크플로에서 다음과 같은 초기 작업을 완료했는지 확인하세요.
자동 기호 업로드 작업이 기호 정보를 찾을 수 있도록 모듈(앱 수준)
build.gradle
파일에 다음을 추가합니다.// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Crashlytics 플러그인은 지정된 디렉토리에서 확장자가
.so
인 네이티브 라이브러리를 재귀적으로 검색합니다. 그런 다음 Crashlytics는 이러한 모든 라이브러리에서 디버깅 기호를 추출하여 Firebase 서버에 업로드합니다.unstrippedNativeLibsDir
속성에서 지정할 수 있는 항목은 다음과 같습니다.다음을 포함하여
org.gradle.api.Project#files(Object...)
에 허용되는 모든 인수:java.lang.String
,java.io.File
또는org.gradle.api.file.FileCollection
목록 또는
FileCollection
인스턴스를 제공하여 단일 빌드 플레이버에 대한 여러 디렉터리
마지막으로 Crashlytics 설정을 완료하고 Firebase 콘솔의 Crashlytics 대시보드에서 초기 데이터를 볼 수 있도록 강제로 테스트 비정상 종료를 실행합니다.
옵션 : Gradle이 아닌 빌드 또는 액세스할 수 없는 제거되지 않은 기본 라이브러리에 대한 기호 업로드
이 옵션은 다음 상황에서 유용할 수 있습니다.
Gradle 이외의 빌드 프로세스를 사용하는 경우
제거되지 않은 네이티브 라이브러리가 Gradle 빌드 중에 액세스할 수 없는 방식으로 제공되는 경우
이 옵션을 사용하려면 릴리스 빌드 또는 Firebase 콘솔에서 기호화된 스택 추적을 보려는 빌드를 만들 때 Firebase CLI 명령을 실행해야 합니다.
이 페이지 앞부분의 기본 워크플로에서 다음과 같은 초기 작업을 완료했는지 확인하세요.
이 옵션을 사용하면 Firebase CLI(아래의 다음 단계)를 대신 사용하여 기호 파일을 생성하고 업로드하므로
firebaseCrashlytics
확장 프로그램을 추가하거나 자동 기호 업로드를 설정할 필요가 없습니다.기호 업로드를 위한 환경 및 프로젝트 설정:
안내에 따라 Firebase CLI를 설치합니다 .
CLI를 이미 설치한 경우 최신 버전으로 업데이트해야 합니다 .
(Android API 레벨 30 이상을 사용하는 앱에만 해당) 앱의
AndroidManifest.xml
템플릿을 업데이트하여 포인터 태깅을 비활성화합니다.Android Player Settings > Publishing Settings > Build > Custom Main Manifest 상자를 선택합니다.
Assets/Plugins/Android/AndroidManifest.xml
에 있는 매니페스트 템플릿을 엽니다.애플리케이션 태그에 다음 특성을 추가합니다.
<application android:allowNativeHeapPointerTagging="false" ... />
프로젝트를 빌드합니다.
기호 정보를 업로드합니다.
빌드가 완료되면 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
다음은 Firebase 앱 ID를 찾는 두 가지 방법입니다.
google-services.json
파일에서 앱 ID는mobilesdk_app_id
값입니다. 또는Firebase 콘솔에서 프로젝트 설정 으로 이동합니다. 내 앱 카드까지 아래로 스크롤한 다음 원하는 Firebase 앱을 클릭하여 앱 ID를 찾습니다.
PATH/TO/SYMBOLS : CLI에서 생성한 심볼 파일의 경로
Android Studio 프로젝트로 내보내기 — PATH/TO/SYMBOLS 는 모든 디렉토리가 될 수 있습니다. Firebase CLI는 지정된 디렉토리에서 확장자가
.so
인 네이티브 라이브러리를 재귀적으로 검색합니다.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
추가 디버깅 정보 제공 마지막으로 Crashlytics 설정을 완료하고 Firebase 콘솔의 Crashlytics 대시보드에서 초기 데이터를 볼 수 있도록 강제로 테스트 비정상 종료를 실행합니다.
강제 종료의 일부로 앱을 빌드한 후 Firebase CLI
crashlytics:symbols:upload
명령을 실행하여 기호 파일을 업로드해야 합니다.
문제 해결
Firebase 콘솔과 logcat에 서로 다른 스택 추적이 표시되는 경우 문제 해결 가이드 를 참조하세요.
다음 단계
옵트인 보고, 로그, 키 및 치명적이지 않은 오류 추적을 추가 하여 충돌 보고서 설정을 사용자 정의하십시오 .
Crashlytics 대시보드에서 직접 Google Play 트랙별로 Android 앱의 충돌 보고서를 필터링할 수 있도록 Google Play와 통합 합니다. 이를 통해 대시보드를 특정 빌드에 더 집중할 수 있습니다.