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 (getHistoricalProcessExitReasons ) มีความน่าเชื่อถือมากกว่าแนวทางที่ใช้ SIGQUIT หรือ Watchdog API นี้
ใช้ได้เฉพาะในอุปกรณ์ Android 11 ขึ้นไปเท่านั้น
Why are some ANRs missing
their BuildId
s?
หาก ANR บางรายการไม่มี BuildId
ให้แก้ปัญหาโดยทำดังนี้
ตรวจสอบว่าคุณใช้ Android SDK ของ Crashlytics และ
Crashlytics เวอร์ชันปลั๊กอิน Gradle
หากคุณไม่เห็น BuildId
สำหรับ Android 11 และ ANR ของ Android 12 บางรายการ ให้ทำดังนี้
อาจเป็นไปได้ว่าคุณใช้ SDK ที่ล้าสมัย ปลั๊กอิน Gradle หรือทั้งคู่
หากต้องการรวบรวม 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
จำนวน 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 แฟล็กไม่ได้
ที่เกี่ยวข้องกับเครื่องมือเชนของคุณ) ลองเพิ่มสิ่งต่อไปนี้ลงในกระบวนการบิลด์
แทน:
-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 ที่เข้ากันไม่ได้กับ SDK ของ Firebase Crashlytics
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
ข้อยกเว้นนี้ไม่ได้ทำให้แอปของคุณขัดข้อง แต่จะป้องกันไม่ให้แอปส่งข้อขัดข้อง
รายงาน วิธีแก้ปัญหามีดังนี้
ตรวจสอบว่าคุณใช้ DexGuard 8.x เวอร์ชันล่าสุด เวอร์ชันล่าสุดมีกฎที่ SDK ของ Firebase Crashlytics กำหนด
หากไม่ต้องการเปลี่ยนเวอร์ชัน DexGuard ให้ลองเพิ่มรายการต่อไปนี้
บรรทัดกฎการสร้างความสับสน (ในไฟล์การกำหนดค่า DexGuard) ให้ทำดังนี้
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
เหตุใดฉันจึงเห็นข้อขัดข้องจากไฟล์ .kt
ที่มีป้ายกำกับเป็นปัญหา .java
เมื่อแอปใช้การปรับให้ยากต่อการอ่าน (Obfuscator) ที่ไม่เปิดเผยนามสกุลไฟล์
Crashlytics จะสร้างปัญหาแต่ละรายการกับนามสกุลไฟล์ .java
โดยค่าเริ่มต้น
โปรดตรวจสอบว่าแอปของคุณใช้การตั้งค่าต่อไปนี้เพื่อให้ Crashlytics สร้างปัญหาที่มีนามสกุลไฟล์ที่ถูกต้อง
ใช้ Android Gradle 4.2.0 ขึ้นไป
ใช้ R8 โดยเปิดการสร้างความสับสน ในการอัปเดตแอปเป็น 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 โดยเปิดการสร้างความสับสน
เนื่องจากตอนนี้ข้อขัดข้องใหม่จะมีนามสกุลไฟล์ที่ถูกต้องในลายเซ็นปัญหา คุณจึงอาจเห็นปัญหา .kt
ใหม่ซึ่งจริงๆ แล้วเป็นปัญหาที่มีป้ายกำกับ .java
อยู่แล้วซ้ำกัน ในคอนโซล Firebase เราจะพยายามระบุและแจ้งให้คุณทราบหากปัญหา .kt
ใหม่อาจซ้ำกับปัญหาที่ติดป้ายกํากับ .java
ที่มีอยู่
ใครดู เขียน และลบหมายเหตุเกี่ยวกับปัญหาได้บ้าง
หมายเหตุช่วยให้สมาชิกโปรเจ็กต์แสดงความคิดเห็นเกี่ยวกับปัญหาที่เฉพาะเจาะจงได้ พร้อมคำถาม สถานะ การอัปเดต ฯลฯ
เมื่อสมาชิกโครงการโพสต์หมายเหตุจะมีป้ายกำกับเป็นอีเมล
ของคุณได้ อีเมลนี้จะปรากฏพร้อมกับโน้ตของทุกโปรเจ็กต์
สมาชิกที่มีสิทธิ์ดูโน้ต
สิทธิ์เข้าถึงที่จําเป็นในการดู เขียน และลบโน้ตมีดังนี้
ใครสามารถดู เขียน และลบบันทึกเกี่ยวกับปัญหา
หมายเหตุช่วยให้สมาชิกโปรเจ็กต์แสดงความคิดเห็นเกี่ยวกับปัญหาที่เฉพาะเจาะจงได้ พร้อมคำถาม สถานะ การอัปเดต ฯลฯ
เมื่อสมาชิกโครงการโพสต์หมายเหตุจะมีป้ายกำกับเป็นอีเมล
ของคุณได้ อีเมลนี้จะปรากฏพร้อมกับโน้ตของทุกโปรเจ็กต์
สมาชิกที่มีสิทธิ์ดูโน้ต
สิทธิ์เข้าถึงที่จําเป็นในการดู เขียน และลบโน้ตมีดังนี้
การผสานรวม
แอปใช้ Google Mobile Ads SDK ด้วย แต่ไม่มีการขัดข้อง
หากโปรเจ็กต์ใช้ Crashlytics ร่วมกับ SDK ของ Google Mobile Ads ก็มีความเป็นไปได้ว่าเครื่องมือรายงานข้อขัดข้องจะรบกวนเมื่อลงทะเบียนตัวแฮนเดิลข้อยกเว้น ในการแก้ไขปัญหานี้ ให้ปิดการรายงานข้อขัดข้องใน
Mobile Ads 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 คุณสามารถปิดการถดถอยเหล่านั้นอีกครั้งเพื่อป้องกันไม่ให้เปิดขึ้นอีก