Firebase Crashlytics로 광고 응답 ID 로깅

Firebase Crashlytics는 앱의 안정성 문제를 쉽게 관리할 수 있는 간단한 실시간 비정상 종료 보고 도구입니다. Crashlytics는 비정상 종료를 지능적으로 그룹화하고 이러한 비정상 종료를 유발하는 상황을 강조하여 보여주므로 문제 해결 시간이 절약됩니다.

이 가이드에서는 광고 응답 ID를 로깅할 수 있도록 Crashlytics를 Android 스튜디오 프로젝트에 통합하는 방법을 설명합니다. 나중에 앱의 비정상 종료 문제를 해결할 때 광고 응답 ID를 찾아 AdMob 에서 광고 심사 센터를 사용하여 광고를 찾고 차단할 수 있습니다.

1단계: Android 애플리케이션에 Firebase 추가

  1. 클린 앱에서 Firebase로 로깅하려면 GitHub에서 Android 저장소용 Google 모바일 광고 SDK 예를 다운로드하거나 클론하세요. 이 가이드에서는 특히 배너 예를 사용합니다.

    이미 앱이 있는 경우 앱의 패키지 이름으로 다른 단계를 진행할 수 있습니다. 저장소의 다른 예에도 동일한 단계를 약간 수정하여 적용할 수 있습니다.

  2. Firebase Crashlytics를 사용하려면 Firebase 프로젝트를 만들고 거기에 앱을 추가해야 합니다. Firebase 프로젝트를 아직 만들지 않았다면 만듭니다. 앱에 앱을 등록해야 합니다.

    1. Firebase Console의 Crashlytics 페이지에서 Crashlytics 설정을 클릭합니다.

    2. 표시되는 화면에서 아니요 > 새 Firebase 앱 설정을 클릭합니다.

  3. 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()
    
           // ...
        }
    }
    
  4. 앱을 빌드하고 실행하여 Crashlytics가 올바르게 구성되었는지 확인합니다. 성공하면 Crashlytics 대시보드에 액세스할 수 있습니다.

(선택사항): 설정 테스트

비정상 종료 버튼을 추가하면 버튼을 누를 때마다 앱 비정상 종료가 강제로 발생하도록 할 수 있습니다.

다음은 ActivityonCreate() 메서드에 비정상 종료 버튼을 추가하는 방법을 보여주는 예입니다.

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시간이 걸릴 수 있습니다.