การบันทึกรหัสการตอบกลับโฆษณาด้วย Firebase Crashlytics

Firebase Crashlytics เป็นเครื่องมือรายงานข้อขัดข้องแบบเรียลไทม์ที่มีน้ำหนักเบา ซึ่งช่วยให้คุณจัดการปัญหาความเสถียรในแอปได้อย่างง่ายดาย Crashlytics ช่วยประหยัดเวลาในการแก้ปัญหาด้วยการจัดกลุ่มข้อขัดข้องอย่างชาญฉลาดและไฮไลต์สถานการณ์ที่ทําให้เกิดข้อขัดข้อง

คู่มือนี้จะอธิบายวิธีผสานรวม Crashlytics เข้ากับโปรเจ็กต์ Android Studio เพื่อให้คุณบันทึกรหัสการตอบสนองของโฆษณาได้ ต่อมา เมื่อแก้ปัญหาข้อขัดข้องในแอป คุณสามารถค้นหารหัสการตอบสนองของโฆษณาและใช้ศูนย์ตรวจสอบโฆษณาใน AdMob เพื่อค้นหาและบล็อกโฆษณา

ขั้นตอนที่ 1: เพิ่ม Firebase ลงในแอปพลิเคชัน Android

  1. หากต้องการลองบันทึกด้วย Firebase จากแอปที่สะอาด คุณดาวน์โหลดหรือโคลนตัวอย่าง Google Mobile Ads SDK สําหรับ Android จากที่เก็บใน GitHub ได้ คู่มือนี้ใช้ ตัวอย่างแบนเนอร์โดยเฉพาะ

    หากมีแอปอยู่แล้ว คุณควรดำเนินการขั้นตอนอื่นๆ ต่อได้โดยใช้ชื่อแพ็กเกจของแอป คุณยังใช้ขั้นตอนเดียวกันกับตัวอย่างอื่นๆ ในที่เก็บได้ด้วย โดยจะมีการปรับเปลี่ยนเล็กน้อย

  2. หากต้องการใช้ Firebase Crashlytics คุณต้องสร้างโปรเจ็กต์ Firebase แล้วเพิ่มแอปลงในโปรเจ็กต์ สร้างโปรเจ็กต์ Firebase หากยังไม่ได้สร้าง อย่าลืมลงทะเบียนแอปกับบริการนี้

    1. ในหน้า Crashlytics ของคอนโซล Firebase ให้คลิกตั้งค่า Crashlytics

    2. ในหน้าจอที่ปรากฏขึ้น ให้คลิกไม่ > ตั้งค่าแอป Firebase ใหม่

  3. ใน build.gradle ให้เพิ่ม Dependency สําหรับ Google Analytics, 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:23.5.0'
    
        // Add the Firebase Crashlytics dependency.
        implementation 'com.google.firebase:firebase-crashlytics:19.2.1'
    }
    

    project/build.gradle

    buildscript {
        repositories {
            // ...
            // Add Google's Maven repository.
            google()
        }
    
        dependencies {
            // ...
    
            classpath 'com.google.gms:google-services:4.4.2'
    
            // Add the Fabric Crashlytics plugin.
            classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2'
        }
    }
    
    allprojects {
        // ...
        repositories {
           // Check that Google's Maven repository is included (if not, add it).
           google()
    
           // ...
        }
    }
    
  4. บิลด์และเรียกใช้แอปเพื่อตรวจสอบว่าได้กําหนดค่า Crashlytics อย่างถูกต้อง เมื่อดำเนินการเสร็จเรียบร้อยแล้ว คุณจะเข้าถึงแดชบอร์ดของ Crashlytics ได้

(ไม่บังคับ): ทดสอบการตั้งค่า

การเพิ่มปุ่มข้อขัดข้องจะเป็นการบังคับให้แอปขัดข้องด้วยการกดปุ่มแต่ละครั้ง

ตัวอย่างต่อไปนี้แสดงวิธีเพิ่มปุ่มข้อขัดข้องในเมธอด onCreate() ของ Activity

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 Studio ให้สร้างและเรียกใช้แอปบนโปรแกรมจำลองหรืออุปกรณ์ที่เชื่อมต่อ หลังจากโหลดแอปแล้ว ให้คลิกปุ่มข้อขัดข้อง เปิดแอปอีกครั้งจากอุปกรณ์หรือ Android Studio เพื่ออัปโหลดบันทึกข้อขัดข้องไปยัง Crashlytics

ขั้นตอนที่ 2: บันทึกรหัสการตอบกลับโฆษณา

หากคุณโหลดโฆษณาหลายรายการและแสดงโฆษณาในเวลาที่ต่างกัน คุณควรบันทึกรหัสคำตอบของโฆษณาแต่ละรายการด้วยคีย์แยกกัน เช่น คู่มือนี้ใช้ตัวอย่างที่มีโฆษณาแบนเนอร์เพียงรายการเดียว เราจึงบันทึกรหัสการตอบกลับของโฆษณาเป็นคีย์ banner_ad_response_id ในสนิปเพลตต่อไปนี้ คุณสามารถสร้างคู่คีย์ / ค่าที่กําหนดเองหลายคู่ใน Firebase Crashlytics สําหรับโฆษณาประเภทต่างๆ และเหตุการณ์โฆษณา (ดูวงจรชีวิตของโฆษณาใน AdListener) ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกที่กำหนดเองได้ที่ปรับแต่งรายงานข้อขัดข้องของ Firebase Crashlytics

เพิ่มโค้ดต่อไปนี้ลงใน MyActivity.java โดยพื้นฐานแล้ว จะใช้ฟังก์ชัน FirebaseCrashlytics.setCustomKey() ในฟังก์ชัน Callback ของ onAdLoaded() เพื่อให้แน่ใจว่าโฆษณาโหลดแล้วก่อนที่จะพยายามเรียก getResponseInfo()

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))
}

ยินดีด้วย ตอนนี้คุณจะเห็น banner_ad_response_id ล่าสุดในส่วนสําคัญของเซสชันข้อขัดข้องในหน้าแดชบอร์ด Crashlytics โปรดทราบว่าระบบอาจใช้เวลาถึง 1 ชั่วโมงเพื่อให้คีย์บางรายการปรากฏในหน้าแดชบอร์ด