iOS+
Android
Flutter
Unity
หน้านี้ให้ความช่วยเหลือในการแก้ปัญหาและคำตอบสำหรับคำถามที่พบบ่อยเกี่ยวกับการใช้ Crashlytics หากไม่พบสิ่งที่ต้องการหรือต้องการความช่วยเหลือเพิ่มเติม โปรดติดต่อทีมสนับสนุน Firebase
การแก้ปัญหาทั่วไป/คำถามที่พบบ่อย
ไม่เห็นเมตริกและ/หรือการแจ้งเตือนอัตราความเร็วที่ไม่มีอุบัติเหตุ
หากไม่เห็นเมตริกที่ไม่พบข้อขัดข้อง (เช่น ผู้ใช้และเซสชันที่ไม่มีข้อขัดข้อง)
และ/หรือการแจ้งเตือนอัตราความเร็ว โปรดตรวจสอบว่าคุณกำลังใช้
Crashlytics SDK v18.6.0 ขึ้นไป (หรือ Firebase BoM v32.6.0+)
ไม่เห็นบันทึกเบรดครัมบ์
หากไม่เห็นบันทึกเบรดครัมบ์ เราขอแนะนำให้ตรวจสอบการกำหนดค่าของแอปสำหรับ Google Analytics
ตรวจสอบว่าคุณมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้
เหตุใดจึงมีการรายงาน ANR สำหรับ Android 11 ขึ้นไปเท่านั้น
Crashlytics รองรับการรายงาน ANR สำหรับแอป Android จากอุปกรณ์ที่ใช้ Android 11 ขึ้นไป API ที่สำคัญที่เราใช้เพื่อรวบรวม ANR
(getประวัติการเข้าชมProcessExitReasons )
มีความน่าเชื่อถือมากกว่าวิธีการที่ใช้ SIGQUIT หรือ Watchdog API นี้ใช้ได้เฉพาะในอุปกรณ์ Android 11 ขึ้นไปเท่านั้น
เหตุใด ANR บางรายการจึงไม่มี BuildId
หาก ANR บางรายการไม่มี BuildId
ให้แก้ปัญหาดังนี้
ตรวจสอบว่าคุณใช้ Crashlytics Android SDK และเวอร์ชันปลั๊กอิน Crashlytics Gradle เวอร์ชันล่าสุด
หากไม่มี BuildId
สำหรับ Android 11 และ ANR ของ Android 12 บางรายการ
อาจเป็นไปได้ว่าคุณกำลังใช้ SDK ที่ล้าสมัย, ปลั๊กอิน Gradle หรือทั้ง 2 อย่าง
หากต้องการรวบรวม BuildId
สำหรับ ANR เหล่านี้อย่างถูกต้อง คุณต้องใช้เวอร์ชันต่อไปนี้
Crashlytics Android SDK v18.3.5 ขึ้นไป (Firebase BoM v31.2.2 ขึ้นไป)
ปลั๊กอิน Crashlytics Gradle v2.9.4 ขึ้นไป
ตรวจสอบว่าคุณใช้ตำแหน่งที่ไม่ใช่มาตรฐานสำหรับคลังภาพที่แชร์หรือไม่
หากมีเพียง BuildId
รายการสำหรับไลบรารีที่แชร์ของแอปเท่านั้น อาจเป็นไปได้ว่าคุณไม่ได้ใช้ตำแหน่งเริ่มต้นแบบมาตรฐานสำหรับไลบรารีที่แชร์ ในกรณีนี้ Crashlytics อาจไม่พบ BuildId
ที่เชื่อมโยง เราขอแนะนำให้คุณพิจารณาใช้ตำแหน่งมาตรฐานสำหรับไลบรารีที่ใช้ร่วมกัน
ตรวจสอบว่าคุณไม่ได้ตัด BuildId
ออกระหว่างกระบวนการสร้าง
โปรดทราบว่าเคล็ดลับการแก้ปัญหาต่อไปนี้ใช้ได้กับทั้ง ANR และการขัดข้องของระบบ
ตรวจสอบว่ามี BuildId
อยู่หรือไม่โดยเรียกใช้ readelf -n
ในไบนารีของคุณ หากไม่มี BuildId
ให้เพิ่ม -Wl,--build-id
ในแฟล็กของระบบบิลด์
โปรดตรวจสอบว่าคุณไม่ได้ตัด BuildId
ออกโดยไม่ได้ตั้งใจเพื่อพยายามลดขนาด APK
หากคุณยังคงมีเวอร์ชันที่เป็นไลบรารีที่ตัดออกและยังไม่ได้ตัดออก โปรดตรวจสอบว่าได้ชี้ไปยังเวอร์ชันที่ถูกต้องในโค้ด
ความแตกต่างระหว่างรายงาน ANR ในหน้าแดชบอร์ด Crashlytics และ Google Play Console
จำนวน ANR ระหว่าง Google Play กับ Crashlytics อาจไม่ตรงกัน กรณีนี้เกิดขึ้นเนื่องจากความแตกต่างของกลไกในการรวบรวมและรายงานข้อมูล ANR Crashlytics จะรายงาน ANR เมื่อแอปเริ่มทำงานครั้งถัดไป ขณะที่ Android Vitals จะส่งข้อมูล ANR หลังจากเกิด ANR
นอกจากนี้ Crashlytics จะแสดงเฉพาะ ANR ที่เกิดขึ้นในอุปกรณ์ที่ใช้
Android 11 ขึ้นไป เมื่อเทียบกับ Google Play ที่แสดง ANR จากอุปกรณ์ที่
ยอมรับความยินยอมในการเก็บรวบรวมข้อมูลจากบริการ Google Play
ความแตกต่างระหว่างสแต็กเทรซ NDK ในหน้าแดชบอร์ด Crashlytics และ Logcat
เครื่องมือเชน LLVM และ GNU มีค่าเริ่มต้นและการจัดการที่แตกต่างกันสำหรับกลุ่มไบนารีของแอปแบบอ่านอย่างเดียว ซึ่งอาจสร้างสแต็กเทรซที่ไม่สอดคล้องกันในคอนโซล Firebase เพื่อขจัดปัญหานี้ ให้เพิ่มแฟล็ก Linker ต่อไปนี้ลงในกระบวนการบิลด์
หากยังเห็นสแต็กเทรซไม่สอดคล้องกัน (หรือทั้ง 2 แฟล็กไม่เกี่ยวข้องกับ Toolchain) ให้ลองเพิ่มค่าต่อไปนี้ลงในกระบวนการบิลด์แทน
-fno-omit-frame-pointer
ฉันจะใช้ไบนารีโปรแกรมสร้างไฟล์สัญลักษณ์ Breakpad ของตัวเองสำหรับ NDK ได้อย่างไร
ปลั๊กอิน Crashlytics จะรวมโปรแกรมสร้างไฟล์สัญลักษณ์ Breakpad ที่กำหนดเอง
หากคุณต้องการใช้ไบนารีของคุณเองเพื่อสร้างไฟล์สัญลักษณ์ Breakpad (เช่น หากคุณต้องการสร้างไฟล์สั่งการแบบเนทีฟทั้งหมดในเชนบิลด์จากแหล่งที่มา) ให้ใช้พร็อพเพอร์ตี้ส่วนขยาย symbolGeneratorBinary
(ไม่บังคับ) เพื่อระบุเส้นทางไปยังไฟล์ปฏิบัติการ
หมายเหตุ: ต้องมีโปรแกรมสร้างไฟล์สัญลักษณ์ Breakpad เวอร์ชัน Linux สำหรับไบนารีของ Android
คุณระบุเส้นทางไปยังไบนารีของโปรแกรมสร้างไฟล์สัญลักษณ์ Breakpad ได้ 2 วิธีดังนี้
ตัวเลือกที่ 1 : ระบุเส้นทางผ่านส่วนขยาย firebaseCrashlytics
ในไฟล์ build.gradle
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ build.gradle.kts
ระดับแอป
ปลั๊กอิน Gradle เวอร์ชัน 3.0.0 ขึ้นไป
android {
buildTypes {
release {
configure<CrashlyticsExtension> {
nativeSymbolUploadEnabled = true
// Add these optional fields to specify the path to the executable
symbolGeneratorType = "breakpad"
breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS ")
}
}
}
}
เวอร์ชันปลั๊กอินที่ต่ำกว่า
android {
// ...
buildTypes {
// ...
release {
// ...
firebaseCrashlytics {
// existing; required for either symbol file generator
nativeSymbolUploadEnabled true
// Add this optional new block to specify the path to the executable
symbolGenerator {
breakpad {
binary file("/PATH/TO/BREAKPAD/DUMP_SYMS ")
}
}
}
}
}
ตัวเลือกที่ 2 : ระบุเส้นทางผ่านบรรทัดพร็อพเพอร์ตี้ในไฟล์พร็อพเพอร์ตี้ Gradle
คุณใช้พร็อพเพอร์ตี้ com.google.firebase.crashlytics.breakpadBinary
เพื่อระบุเส้นทางไปยังไฟล์ปฏิบัติการได้
คุณอัปเดตไฟล์พร็อพเพอร์ตี้ Gradle ด้วยตัวเองหรืออัปเดตไฟล์ผ่านบรรทัดคำสั่งได้ เช่น หากต้องการระบุเส้นทางผ่านบรรทัดคำสั่ง ให้ใช้คำสั่งต่อไปนี้
./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \
-Pcom.google.firebase.crashlytics.breakpadBinary=/PATH/TO/BREAKPAD/DUMP_SYMS \
app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
ไม่เกิดข้อขัดข้องเมื่อใช้ Dexguard
หากเห็นข้อยกเว้นต่อไปนี้ อาจเป็นไปได้ว่าคุณกำลังใช้ DexGuard เวอร์ชันที่ใช้ร่วมกับ Firebase Crashlytics SDK ไม่ได้
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
ข้อยกเว้นนี้ไม่ได้ทำให้แอปของคุณขัดข้อง แต่จะป้องกันไม่ให้แอปส่งรายงานข้อขัดข้อง วิธีแก้ไขปัญหามีดังนี้
ตรวจสอบว่าคุณใช้ DexGuard 8.x รุ่นล่าสุด เวอร์ชันล่าสุดมีกฎที่ Firebase Crashlytics SDK กำหนด
หากไม่ต้องการเปลี่ยนเวอร์ชัน DexGuard ให้ลองเพิ่มบรรทัดต่อไปนี้ลงในกฎการปรับให้ยากต่อการอ่าน (Obfuscation) (ในไฟล์การกำหนดค่า DexGuard)
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
เหตุใดฉันจึงเห็นข้อขัดข้องจากไฟล์ .kt
ที่มีป้ายกำกับว่าเป็นปัญหา .java
เมื่อแอปใช้ Obfuscator ที่ไม่เปิดเผยนามสกุลไฟล์
Crashlytics จะสร้างปัญหาแต่ละรายการให้มีนามสกุลไฟล์ .java
โดยค่าเริ่มต้น
โปรดตรวจสอบว่าแอปใช้การตั้งค่าต่อไปนี้เพื่อให้ Crashlytics สร้างปัญหาเกี่ยวกับนามสกุลไฟล์ที่ถูกต้องได้
ใช้ Android Gradle 4.2.0 ขึ้นไป
ใช้ R8 โดยเปิดการปรับให้ยากต่อการอ่าน (Obfuscation) ไว้ ในการอัปเดตแอปเป็น R8 ให้ทำตามเอกสารประกอบ นี้
โปรดทราบว่าหลังจากอัปเดตการตั้งค่าตามที่อธิบายไว้ข้างต้น คุณอาจเริ่มเห็นปัญหา .kt
ใหม่ซึ่งซ้ำกับปัญหา .java
ที่มีอยู่ ดูข้อมูลเพิ่มเติมเกี่ยวกับกรณีนั้นๆ ได้ที่คำถามที่พบบ่อย
เหตุใดฉันจึงเห็นปัญหา .kt
รายการซึ่งซ้ำกับปัญหา .java
ที่มีอยู่
ตั้งแต่ช่วงกลางเดือนธันวาคม 2021 Crashlytics ได้ปรับปรุงการรองรับแอปพลิเคชันที่ใช้ Kotlin
ก่อนหน้านี้ Obfuscator ที่พร้อมใช้งานไม่ได้แสดงนามสกุลไฟล์ ดังนั้น Crashlytics สร้างปัญหาแต่ละรายการด้วยนามสกุลไฟล์ .java
โดยค่าเริ่มต้น
แต่ Android Gradle 4.2.0 เป็นต้นไป R8 รองรับนามสกุลไฟล์
การอัปเดตนี้ทำให้ Crashlytics สามารถระบุได้ว่าแต่ละคลาสที่ใช้ภายในแอปเขียนด้วย Kotlin หรือไม่ และรวมชื่อไฟล์ที่ถูกต้องไว้ในลายเซ็นของปัญหา ตอนนี้ระบบระบุแหล่งที่มาของข้อขัดข้องไปยังไฟล์ .kt
อย่างถูกต้องแล้ว (ตามความเหมาะสม)
หากแอปของคุณมีการตั้งค่าดังต่อไปนี้
แอปของคุณใช้ Android Gradle 4.2.0 ขึ้นไป
แอปของคุณใช้ R8 โดยเปิดการปรับให้ยากต่อการอ่าน (Obfuscation) ไว้
เนื่องจากตอนนี้ข้อขัดข้องใหม่มีนามสกุลไฟล์ที่ถูกต้องในลายเซ็นปัญหา คุณจึงอาจเห็นปัญหา .kt
ใหม่ที่เป็นเพียงปัญหาที่ซ้ำกันของปัญหาที่ติดป้ายกำกับ .java
ที่มีอยู่ ในคอนโซล Firebase เราจะพยายามระบุและแจ้งให้คุณทราบหากปัญหา .kt
ใหม่อาจซ้ำกับปัญหาที่มีป้ายกำกับ .java
ที่มีอยู่
ใครสามารถดู เขียน และลบบันทึกเกี่ยวกับปัญหา
โน้ตช่วยให้สมาชิกโปรเจ็กต์แสดงความคิดเห็นเกี่ยวกับปัญหาที่เจาะจงซึ่งมีคำถาม การอัปเดตสถานะ ฯลฯ ได้
เมื่อสมาชิกโปรเจ็กต์โพสต์โน้ต จะมีป้ายกำกับเป็นอีเมลบัญชี Google ของสมาชิก สมาชิกโปรเจ็กต์ทุกคนที่มีสิทธิ์เข้าถึงเพื่อดูโน้ตจะเห็นอีเมลนี้พร้อมกับโน้ต
ข้อมูลต่อไปนี้จะอธิบายถึงการเข้าถึงที่จำเป็นในการดู เขียน และลบโน้ต
ใครสามารถดู เขียน และลบบันทึกเกี่ยวกับปัญหา
โน้ตช่วยให้สมาชิกโปรเจ็กต์แสดงความคิดเห็นเกี่ยวกับปัญหาที่เจาะจงซึ่งมีคำถาม การอัปเดตสถานะ ฯลฯ ได้
เมื่อสมาชิกโปรเจ็กต์โพสต์โน้ต จะมีป้ายกำกับเป็นอีเมลบัญชี Google ของสมาชิก สมาชิกโปรเจ็กต์ทุกคนที่มีสิทธิ์เข้าถึงเพื่อดูโน้ตจะเห็นอีเมลนี้พร้อมกับโน้ต
ข้อมูลต่อไปนี้จะอธิบายถึงการเข้าถึงที่จำเป็นในการดู เขียน และลบโน้ต
การผสานรวม
แอปยังใช้ SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google ด้วยแต่ไม่ได้รับข้อขัดข้อง
หากโปรเจ็กต์ใช้ Crashlytics ควบคู่ไปกับ SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google อาจเป็นไปได้ว่าผู้รายงานข้อขัดข้องรบกวนขณะลงทะเบียนเครื่องจัดการข้อยกเว้น หากต้องการแก้ไขปัญหานี้ ให้ปิดการรายงานข้อขัดข้องใน SDK โฆษณาในอุปกรณ์เคลื่อนที่โดยโทรไปที่ disableSDKCrashReporting
ชุดข้อมูล BigQuery ของฉันอยู่ที่ไหน
หลังจากลิงก์ Crashlytics กับ BigQuery แล้ว ชุดข้อมูลใหม่ที่คุณสร้างจะอยู่ที่สหรัฐอเมริกาโดยอัตโนมัติ ไม่ว่าโปรเจ็กต์ Firebase จะอยู่ที่ใด
Crashlytics รองรับ armeabi ไหม
Firebase Crashlytics NDK ไม่รองรับ ARMv5 (armeabi)
การรองรับ ABI นี้ถูกนำออกตั้งแต่วันที่ NDK r17
ปัญหาเดิม
ปัญหาเดิมคืออะไร
เกิดปัญหาซ้ำแล้วซ้ำอีกเมื่อคุณปิดปัญหาดังกล่าวไปแล้วก่อนหน้านี้ แต่ Crashlytics ได้รับรายงานใหม่ว่าเกิดปัญหาขึ้นซ้ำอีก
Crashlytics จะเปิดปัญหาเดิมอีกครั้งโดยอัตโนมัติเพื่อให้คุณจัดการปัญหาเหล่านั้นตามความเหมาะสมสำหรับแอปได้
ต่อไปนี้คือสถานการณ์ตัวอย่างที่อธิบายว่า Crashlytics จัดหมวดหมู่ปัญหาเป็นการถดถอยได้อย่างไร
Crashlytics ได้รับรายงานข้อขัดข้องเกี่ยวกับข้อขัดข้อง "A" เป็นครั้งแรก Crashlytics เปิดปัญหาที่สอดคล้องกันสำหรับข้อขัดข้องดังกล่าว (ปัญหา "A")
คุณแก้ไขข้อบกพร่องนี้อย่างรวดเร็ว ปิดปัญหา "ก" แล้วเผยแพร่แอปเวอร์ชันใหม่
Crashlytics จะได้รับรายงานอีกฉบับเกี่ยวกับปัญหา "A" หลังจากที่คุณปิดปัญหาแล้ว
หากรายงานมาจากเวอร์ชันที่ Crashlytics รู้จัก เมื่อคุณปิดปัญหา (หมายความว่าเวอร์ชันดังกล่าวส่งรายงานข้อขัดข้องสำหรับข้อขัดข้องรายการใดก็ตาม เลย) Crashlytics จะไม่ถือว่าปัญหาเกิดปัญหาซ้ำ ปัญหานี้จะยังคงปิดอยู่
หากรายงานมาจากเวอร์ชันแอปที่ Crashlytics ไม่ ทราบ เมื่อคุณปิดปัญหา (หมายความว่าเวอร์ชันดังกล่าวไม่เคย ส่งรายงานข้อขัดข้องใดๆ สำหรับข้อขัดข้องใดๆ เลย)
Crashlytics จะถือว่าปัญหาเกิดปัญหาซ้ำและจะเปิดปัญหาอีกครั้ง
หมายเหตุ: ก่อนเดือนกุมภาพันธ์ 2022 Crashlytics ได้จัดประเภทปัญหาเป็นการถดถอยเมื่อเกิดปัญหานั้นซ้ำในแอปเวอร์ชันใดก็ได้ รวมถึงเวอร์ชันแอปที่เรารู้จักเมื่อคุณปิดปัญหาดังกล่าวไปแล้ว ซึ่งส่งผลให้บางครั้ง Crashlytics ระบุการถดถอยอย่างไม่ถูกต้อง ตอนนี้เราจะใช้ข้อตกลง
ที่อธิบายไว้ข้างต้น
เมื่อปัญหาเกิดการถดถอย เราจะส่งการแจ้งเตือนการตรวจหาการถดถอยและเพิ่มสัญญาณการถดถอยให้กับปัญหาเพื่อแจ้งให้ทราบว่า Crashlytics ได้เปิดปัญหาดังกล่าวอีกครั้งแล้ว หากไม่ต้องการให้ปัญหาเปิดขึ้นใหม่เนื่องจากอัลกอริทึมการถดถอย ให้ "ซ่อน" ปัญหานั้นแทนการปิด
เหตุใดฉันจึงเห็นปัญหาเดิม
สำหรับแอปเวอร์ชันเก่า
หากรายงานมาจากแอปเวอร์ชันเก่าที่ไม่เคยส่งรายงานข้อขัดข้องเลยเมื่อคุณปิดปัญหาแล้ว Crashlytics จะพิจารณาปัญหาที่เกิดซ้ำแล้วเปิดปัญหาอีกครั้ง
สถานการณ์นี้อาจเกิดขึ้นได้ในสถานการณ์ต่อไปนี้ คุณแก้ไขข้อบกพร่องและเผยแพร่แอปเวอร์ชันใหม่แล้ว แต่ยังมีผู้ใช้เวอร์ชันเก่าโดยไม่แก้ไขข้อบกพร่องดังกล่าว หากในเวอร์ชันเก่าเวอร์ชันใดเวอร์ชันหนึ่งไม่เคย ส่งรายงานข้อขัดข้องใดๆ เลยเมื่อคุณปิดปัญหา และผู้ใช้เหล่านั้นเริ่มพบข้อผิดพลาด รายงานข้อขัดข้องเหล่านั้นจะทำให้ปัญหาเกิดซ้ำ
หากคุณไม่ต้องการให้ปัญหาเปิดขึ้นอีกครั้งเนื่องจากอัลกอริทึมการถดถอยของเรา ให้ "ปิดเสียง" ปัญหาแทนการปิด
หมายเหตุ: ก่อนเดือนกุมภาพันธ์ 2022 Crashlytics ได้จัดประเภทปัญหาเป็นการถดถอยเมื่อเกิดปัญหานั้นซ้ำในแอปเวอร์ชันใดก็ตาม แม้แต่ในเวอร์ชันแอปที่เราทราบตอนที่คุณปิดปัญหาดังกล่าวไปแล้ว ซึ่งทำให้ Crashlytics
ระบุการถดถอยอย่างไม่ถูกต้องในบางครั้ง ตอนนี้เราจะใช้แบบแผน
ที่อธิบายไว้ข้างต้น หากพบว่าการถดถอยที่ระบุผิดพลาดหลายครั้งในช่วงก่อนเดือนกุมภาพันธ์ 2022 คุณสามารถปิดใหม่เพื่อไม่ให้กลับมาเปิดอีกครั้งได้