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:24.4.0' // Add the Firebase Crashlytics dependency. implementation 'com.google.firebase:firebase-crashlytics:19.4.4' }
project/build.gradle
buildscript { repositories { // ... // Add Google's Maven repository. google() } dependencies { // ... classpath 'com.google.gms:google-services:4.4.3' // Add the Fabric Crashlytics plugin. classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.4' } } 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 เพื่ออัปโหลดบันทึกข้อขัดข้องไปยัง Crashlyics
ขั้นตอนที่ 2: บันทึกรหัสการตอบกลับโฆษณา
หากคุณโหลดโฆษณาหลายรายการและแสดงโฆษณาเหล่านั้นในเวลาที่ต่างกัน คุณควร
บันทึกรหัสการตอบกลับของโฆษณาแต่ละรายการด้วยคีย์แยกต่างหาก เช่น คู่มือนี้ใช้ตัวอย่างที่มีโฆษณาแบนเนอร์เพียงรายการเดียว ดังนั้นเราจึงบันทึกรหัสการตอบกลับของโฆษณาเป็นคีย์
banner_ad_response_id
ในข้อมูลโค้ดต่อไปนี้ คุณสร้างคู่คีย์ / ค่าที่กำหนดเองหลายคู่ใน Firebase Crashlytics สำหรับโฆษณาประเภทต่างๆ
และเหตุการณ์โฆษณาได้ (ดูAdListener
สำหรับ
วงจรของโฆษณา) ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกที่กำหนดเองได้ที่ปรับแต่งรายงานข้อขัดข้องของ Firebase Crashlytics
เพิ่มโค้ดต่อไปนี้ลงใน MyActivity.java
โดยพื้นฐานแล้ว ฟังก์ชันนี้จะใช้ฟังก์ชัน
FirebaseCrashlytics.setCustomKey()
ในฟังก์ชันเรียกกลับ 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 ชั่วโมงจึงจะปรากฏในแดชบอร์ด