Firebase Crashlytics는 앱의 안정성 문제를 쉽게 관리할 수 있는 간단한 실시간 비정상 종료 보고 도구입니다. Crashlytics는 비정상 종료를 지능적으로 그룹화하고 이러한 비정상 종료를 유발하는 상황을 강조하여 보여주므로 문제 해결 시간이 절약됩니다.
이 가이드에서는 광고 응답 ID를 로깅할 수 있도록 Crashlytics를 Android 스튜디오 프로젝트에 통합하는 방법을 설명합니다. 나중에 앱의 비정상 종료 문제를 해결할 때 광고 응답 ID를 찾아 AdMob 에서 광고 심사 센터를 사용하여 광고를 찾고 차단할 수 있습니다.
1단계: Android 애플리케이션에 Firebase 추가
클린 앱에서 Firebase로 로깅하려면 GitHub에서 Android 저장소용 Google 모바일 광고 SDK 예를 다운로드하거나 클론하세요. 이 가이드에서는 특히 배너 예를 사용합니다.
이미 앱이 있는 경우 앱의 패키지 이름으로 다른 단계를 진행할 수 있습니다. 저장소의 다른 예에도 동일한 단계를 약간 수정하여 적용할 수 있습니다.
Firebase Crashlytics를 사용하려면 Firebase 프로젝트를 만들고 거기에 앱을 추가해야 합니다. Firebase 프로젝트를 아직 만들지 않았다면 만듭니다. 앱에 앱을 등록해야 합니다.
Firebase Console의 Crashlytics 페이지에서 Crashlytics 설정을 클릭합니다.
표시되는 화면에서 아니요 > 새 Firebase 앱 설정을 클릭합니다.
build.gradle에 Google 애널리틱스, Fabric, Crashlytics의 종속 항목을 추가합니다.
app/build.gradle
apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' // Add the Fabric plugin apply plugin: 'io.fabric' dependencies { // ... // Add the Google Mobile Ads SDK implementation 'com.google.android.gms:play-services-ads:22.4.0' // Add the Firebase Crashlytics dependency. implementation 'com.google.firebase:firebase-crashlytics:18.4.1' }
project/build.gradle
buildscript { repositories { // ... // Add Google's Maven repository. google() } dependencies { // ... classpath 'com.google.gms:google-services:4.3.15' // Add the Fabric Crashlytics plugin. classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' } } allprojects { // ... repositories { // Check that Google's Maven repository is included (if not, add it). google() // ... } }
앱을 빌드하고 실행하여 Crashlytics가 올바르게 구성되었는지 확인합니다. 성공하면 Crashlytics 대시보드에 액세스할 수 있습니다.
(선택사항): 설정 테스트
비정상 종료 버튼을 추가하면 버튼을 누를 때마다 앱 비정상 종료가 강제로 발생하도록 할 수 있습니다.
다음은 Activity
의 onCreate()
메서드에 비정상 종료 버튼을 추가하는 방법을 보여주는 예입니다.
MainActivity (발췌)
Java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in // values/strings.xml. adView = findViewById(R.id.ad_view); // Start loading the ad in the background. adView.loadAd(new AdRequest.Builder().build()); // Add a crash button. Button crashButton = new Button(this); crashButton.setText("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)); }
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my) // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in // values/strings.xml. adView = findViewById(R.id.ad_view) // Start loading the ad in the background. adView.loadAd(AdRequest.Builder().build()) // Add a crash button. val crashButton = Button(this) crashButton.text = "Crash!" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) }
Android 스튜디오에서 에뮬레이터나 연결된 기기에 앱을 빌드하고 실행합니다. 앱이 로드된 후 비정상 종료 버튼을 클릭할 수 있습니다. 비정상 종료 로그가 Crashlyics에 업로드되도록 기기 또는 Android 스튜디오에서 앱을 다시 실행합니다.
2단계: 광고 응답 ID 로깅
여러 광고를 로드하여 서로 다른 시간에 게재하는 경우 별도의 키로
각 광고 응답 ID를 로깅하는 것이 좋습니다. 예를 들어 이 가이드에서는 배너 광고가
하나만 있는 예를 사용합니다. 따라서 광고 응답 ID를
다음 스니펫에 banner_ad_response_id
키로 기록합니다. 실제로 Firebase Crashlytics에서 다양한 광고 유형 및 광고 이벤트에 대해 여러 커스텀 키-값 쌍을 만들 수 있습니다 (광고 수명 주기는 AdListener
참고). 커스텀 로깅에 대한 자세한 내용은 Firebase Crashlytics 비정상 종료 보고서 맞춤설정을 참조하세요.
다음 코드를 MyActivity.java
에 추가합니다. 기본적으로는
getResponseInfo()
를 호출하기 전에
onAdLoaded()
콜백 함수의 FirebaseCrashlytics.setCustomKey()
함수를 사용하여 광고가 로드되었는지 확인합니다.
Java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in // values/strings.xml. adView = findViewById(R.id.ad_view); adView.setAdListener(new AdListener() { @Override public void onAdLoaded() { String adResponseId = adView.getResponseInfo().getResponseId(); FirebaseCrashlytics.getInstance().setCustomKey( "banner_ad_response_id", adResponseId); } }); // Start loading the ad in the background. adView.loadAd(new AdRequest.Builder().build()); // Add a crash button. Button crashButton = new Button(this); crashButton.setText("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)); }
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my) // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in // values/strings.xml. adView = findViewById(R.id.ad_view) adView.adListener = object : AdListener() { override fun onAdLoaded() { mAdView.responseInfo?.responseId?.let { adResponseId -> FirebaseCrashlytics.getInstance().setCustomKey( "banner_ad_response_id", adResponseId) } } } // Start loading the ad in the background. adView.loadAd(AdRequest.Builder().build()) // Add a crash button. val crashButton = Button(this) crashButton.text = "Crash!" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) }
수고하셨습니다 이제 Crashlytics 대시보드에 있는 비정상 종료 세션의 키 섹션에 최신 banner_ad_response_id
가 표시됩니다. 일부 키는
대시보드에 표시되는 데 최대 1시간이 걸릴 수 있습니다.