Firebase Crashlytics เป็นเครื่องมือรายงานข้อขัดข้องแบบเรียลไทม์ที่มีน้ำหนักเบา ซึ่งช่วยให้คุณจัดการปัญหาความเสถียรในแอปได้อย่างง่ายดาย Crashlytics ช่วยประหยัดเวลาในการแก้ปัญหาด้วยการจัดกลุ่มข้อขัดข้องอย่างชาญฉลาดและไฮไลต์สถานการณ์ที่ทําให้เกิดข้อขัดข้อง
คู่มือนี้จะอธิบายวิธีผสานรวม Crashlytics เข้ากับโปรเจ็กต์ Android Studio เพื่อให้คุณบันทึกรหัสการตอบสนองของโฆษณาได้ ต่อมา เมื่อแก้ปัญหาข้อขัดข้องในแอป คุณสามารถค้นหารหัสการตอบสนองของโฆษณาและใช้ศูนย์ตรวจสอบโฆษณาใน AdMob เพื่อค้นหาและบล็อกโฆษณา
ขั้นตอนที่ 1: เพิ่ม Firebase ลงในแอปพลิเคชัน Android
หากต้องการลองบันทึกด้วย Firebase จากแอปที่สะอาด คุณดาวน์โหลดหรือโคลนตัวอย่าง Google Mobile Ads SDK สําหรับ Android จากที่เก็บใน GitHub ได้ คู่มือนี้ใช้ ตัวอย่างแบนเนอร์โดยเฉพาะ
หากมีแอปอยู่แล้ว คุณควรดำเนินการขั้นตอนอื่นๆ ต่อได้โดยใช้ชื่อแพ็กเกจของแอป คุณยังใช้ขั้นตอนเดียวกันกับตัวอย่างอื่นๆ ในที่เก็บได้ด้วย โดยจะมีการปรับเปลี่ยนเล็กน้อย
หากต้องการใช้ Firebase Crashlytics คุณต้องสร้างโปรเจ็กต์ Firebase แล้วเพิ่มแอปลงในโปรเจ็กต์ สร้างโปรเจ็กต์ Firebase หากยังไม่ได้สร้าง อย่าลืมลงทะเบียนแอปกับบริการนี้
ในหน้า Crashlytics ของคอนโซล Firebase ให้คลิกตั้งค่า Crashlytics
ในหน้าจอที่ปรากฏขึ้น ให้คลิกไม่ > ตั้งค่าแอป Firebase ใหม่
ใน 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() // ... } }
บิลด์และเรียกใช้แอปเพื่อตรวจสอบว่าได้กําหนดค่า 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 ชั่วโมงเพื่อให้คีย์บางรายการปรากฏในหน้าแดชบอร์ด