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