การแก้ปัญหาและคำถามที่พบบ่อยเกี่ยวกับ Crashlytics
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
iOS+
Android
Flutter
Unity
หน้านี้จะให้ความช่วยเหลือในการแก้ปัญหาและตอบคำถามที่พบบ่อยเกี่ยวกับการใช้ Crashlytics หากไม่พบสิ่งที่ต้องการหรือต้องการความช่วยเหลือเพิ่มเติม โปรดติดต่อทีมสนับสนุน Firebase
การแก้ปัญหา/คำถามที่พบบ่อยทั่วไป
ไม่เห็นบันทึกเบรดครัมบ์
หากไม่เห็นบันทึกเส้นทาง
เราขอแนะนำให้ตรวจสอบการกำหนดค่าของแอปสำหรับ Google Analytics
โปรดตรวจสอบว่าคุณมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้
ไม่เห็นการแจ้งเตือนอัตราความเร็ว
หากไม่เห็นการแจ้งเตือนความเร็ว โปรดตรวจสอบว่าคุณใช้
Crashlytics SDK เวอร์ชัน 18.6.0 ขึ้นไป (หรือ Firebase BoM เวอร์ชัน 32.6.0 ขึ้นไป)
ไม่เห็นเมตริกแบบไม่มีข้อขัดข้อง (หรือเห็นเมตริกที่ไม่น่าเชื่อถือ)
หากไม่เห็นเมตริกที่ไม่มีข้อขัดข้อง (เช่น ผู้ใช้และเซสชันที่ไม่มีข้อขัดข้อง) หรือเห็นเมตริกที่ไม่น่าเชื่อถือ ให้ตรวจสอบสิ่งต่อไปนี้
เหตุใดจึงมีการรายงาน ANR สำหรับ Android 11 ขึ้นไปเท่านั้น
Crashlytics รองรับการรายงาน ANR สำหรับแอป Android จากอุปกรณ์ที่ใช้
Android 11 ขึ้นไป API พื้นฐานที่เราใช้เพื่อรวบรวม ANR
(getHistoricalProcessExitReasons )
มีความน่าเชื่อถือมากกว่าวิธีการที่ใช้ 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
s ในระหว่างกระบวนการสร้าง
โปรดทราบว่าเคล็ดลับในการแก้ปัญหาต่อไปนี้ใช้ได้กับทั้ง 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
ความแตกต่าง
ระหว่าง Stack Trace ของ NDK ในแดชบอร์ด Crashlytics กับ Logcat
LLVM และ GNU Toolchain มีค่าเริ่มต้นและการจัดการที่แตกต่างกันสำหรับส่วนแบบอ่านอย่างเดียวของไบนารีของแอป ซึ่งอาจสร้าง Stack Trace ที่ไม่สอดคล้องกันในFirebase คอนโซล หากต้องการลดปัญหานี้ ให้เพิ่มแฟล็ก Linker ต่อไปนี้
ลงในกระบวนการบิลด์
หากยังคงเห็นความไม่สอดคล้องกันของ Stack Trace (หรือหากไม่มีแฟล็กใดที่เกี่ยวข้องกับ Toolchain) ให้ลองเพิ่มสิ่งต่อไปนี้ลงในกระบวนการบิลด์แทน
-fno-omit-frame-pointer
ฉันจะใช้ไบนารีตัวสร้างไฟล์สัญลักษณ์ Breakpad ของตัวเองสำหรับ NDK ได้อย่างไร
Crashlytics ปลั๊กอินจะรวม
เครื่องมือสร้างไฟล์สัญลักษณ์ Breakpad ที่ปรับแต่งแล้ว
หากต้องการใช้ไบนารีของคุณเองเพื่อสร้างไฟล์สัญลักษณ์ Breakpad (เช่น หากต้องการสร้างไฟล์ปฏิบัติการแบบเนทีฟทั้งหมดในห่วงโซ่การสร้างจากแหล่งที่มา) ให้ใช้พร็อพเพอร์ตี้ส่วนขยาย symbolGeneratorBinary
ที่ไม่บังคับเพื่อระบุเส้นทางไปยังไฟล์ปฏิบัติการ
หมายเหตุ: ต้องใช้เครื่องมือสร้างไฟล์สัญลักษณ์ Breakpad เวอร์ชัน Linux สำหรับไบนารี Android
คุณระบุเส้นทางไปยังไบนารีของเครื่องมือสร้างไฟล์สัญลักษณ์ Breakpad ได้ 1 ใน 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
properties
คุณใช้พร็อพเพอร์ตี้ com.google.firebase.crashlytics.breakpadBinary
เพื่อระบุเส้นทางไปยังไฟล์ที่เรียกใช้งานได้
คุณอัปเดตไฟล์ Gradle Properties ด้วยตนเองหรืออัปเดตไฟล์
ผ่านบรรทัดคำสั่งได้ เช่น หากต้องการระบุเส้นทางผ่านบรรทัดคำสั่ง ให้ใช้คำสั่งต่อไปนี้
./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 รุ่นล่าสุด เวอร์ชันล่าสุด
มีกฎที่ 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
อีเมลนี้จะแสดงพร้อมกับหมายเหตุต่อสมาชิกโปรเจ็กต์ทั้งหมดที่มีสิทธิ์ดูหมายเหตุ
ต่อไปนี้จะอธิบายสิทธิ์เข้าถึงที่จำเป็นในการดู เขียน และลบ
โน้ต
การผสานรวม
แอปยังใช้ SDK Google Mobile Ads แต่ไม่พบข้อขัดข้อง
หากโปรเจ็กต์ใช้ Crashlytics ควบคู่กับ SDK ของ Google Mobile Ads
มีแนวโน้มที่เครื่องมือรายงานข้อขัดข้องจะรบกวนเมื่อ
ลงทะเบียนตัวแฮนเดิลข้อยกเว้น หากต้องการแก้ไขปัญหานี้ ให้ปิดการรายงานข้อขัดข้องใน SDK ของ Mobile Ads โดยเรียกใช้ disableSDKCrashReporting
ชุดข้อมูล BigQuery ของฉันอยู่ที่ไหน
หลังจากลิงก์ Crashlytics กับ BigQuery แล้ว ชุดข้อมูลใหม่ที่คุณสร้างจะอยู่ในสหรัฐอเมริกาโดยอัตโนมัติ ไม่ว่าโปรเจ็กต์ Firebase จะอยู่ที่ใด
Crashlytics รองรับ armeabi ไหม
Firebase Crashlytics NDK ไม่รองรับ ARMv5 (armeabi)
เราได้นำการรองรับ ABI นี้ออกแล้วตั้งแต่ NDK r17
ปัญหาเดิม
ปัญหาที่ถดถอยคืออะไร
ปัญหาเกิดการถดถอยเมื่อคุณปิดปัญหาไปก่อนหน้านี้ แต่
Crashlytics ได้รับรายงานใหม่ว่าปัญหาเกิดขึ้นอีกครั้ง
Crashlytics จะเปิดปัญหาที่ถดถอยเหล่านี้อีกครั้งโดยอัตโนมัติเพื่อให้คุณ
แก้ไขปัญหาตามความเหมาะสมกับแอปของคุณ
ต่อไปนี้คือสถานการณ์ตัวอย่างที่อธิบายวิธีที่ Crashlytics จัดหมวดหมู่ปัญหาเป็นรีเกรสชัน
เป็นครั้งแรกที่ Crashlytics ได้รับรายงานข้อขัดข้องเกี่ยวกับข้อขัดข้อง "ก"
Crashlytics จะเปิดปัญหาที่เกี่ยวข้องกับการขัดข้องนั้น (ปัญหา "ก")
คุณแก้ไขข้อบกพร่องนี้อย่างรวดเร็ว ปิดปัญหา "ก" แล้วเผยแพร่แอปเวอร์ชันใหม่
Crashlytics ได้รับรายงานอีกฉบับเกี่ยวกับปัญหา "ก" หลังจากที่คุณปิดปัญหาแล้ว
หากรายงานมาจากแอปเวอร์ชันที่ Crashlytics ทราบ
เมื่อคุณปิดปัญหา (หมายความว่าเวอร์ชันได้ส่งรายงานข้อขัดข้อง
สำหรับข้อขัดข้องใดๆ ) Crashlytics จะไม่ถือว่าปัญหา
ดังกล่าวเป็นปัญหาที่เกิดซ้ำ เราจะปิดปัญหาต่อไป
หากรายงานมาจากแอปเวอร์ชันที่ Crashlytics ไม่ทราบ
เกี่ยวกับ เมื่อคุณปิดปัญหา (หมายความว่าเวอร์ชันไม่เคย ส่งรายงานข้อขัดข้องใดๆ สำหรับข้อขัดข้องใดๆ เลย) Crashlytics จะถือว่าปัญหาเกิดซ้ำและจะเปิดปัญหาอีกครั้ง
หมายเหตุ: ก่อนเดือนกุมภาพันธ์ 2022 Crashlytics จัดประเภทปัญหาเป็นการ
ถดถอยเมื่อปัญหานั้นเกิดขึ้นอีกครั้งในแอปเวอร์ชันใดก็ได้ แม้ว่าจะเป็นแอป
เวอร์ชันที่เราทราบเมื่อคุณปิดปัญหาแล้วก็ตาม ซึ่งส่งผลให้Crashlytics ระบุการถดถอยไม่ถูกต้องในบางครั้ง ตอนนี้เราใช้
รูปแบบที่อธิบายไว้ข้างต้น
เมื่อเกิดปัญหาซ้ำ เราจะส่งการแจ้งเตือนการตรวจหาการเกิดซ้ำและเพิ่ม
สัญญาณการเกิดซ้ำลงในปัญหาเพื่อแจ้งให้คุณทราบว่า Crashlytics ได้
เปิดปัญหาอีกครั้ง หากไม่ต้องการให้ระบบเปิดปัญหาอีกครั้งเนื่องจาก
อัลกอริทึมการถดถอยของเรา ให้ "ปิดเสียง" ปัญหาแทนการปิด
เหตุใดฉันจึงเห็นปัญหาที่ถดถอย
สำหรับแอปเวอร์ชันเก่า
หากรายงานมาจากแอปเวอร์ชันเก่าที่ไม่เคยส่งรายงานข้อขัดข้องเลยเมื่อคุณปิดปัญหา Crashlytics จะถือว่าปัญหาดังกล่าวCrashlytics กลับมาเกิดซ้ำและจะเปิดปัญหาอีกครั้ง
สถานการณ์นี้อาจเกิดขึ้นในกรณีต่อไปนี้ คุณแก้ไขข้อบกพร่องและ
เผยแพร่แอปเวอร์ชันใหม่แล้ว แต่ยังมีผู้ใช้ที่ใช้แอปเวอร์ชันเก่า
ที่ไม่มีการแก้ไขข้อบกพร่อง หากเวอร์ชันเก่าเหล่านั้นไม่เคย ส่งรายงานข้อขัดข้องเลยเมื่อคุณปิดปัญหา และผู้ใช้เริ่มพบข้อบกพร่อง รายงานข้อขัดข้องเหล่านั้นจะทําให้เกิดปัญหาที่ถดถอย
หากไม่ต้องการให้ระบบเปิดปัญหาอีกครั้งเนื่องจากอัลกอริทึมการถดถอยของเรา ให้ "ปิดเสียง"
ปัญหาแทนการปิด
หมายเหตุ: ก่อนเดือนกุมภาพันธ์ 2022 Crashlytics จะจัดประเภทปัญหาเป็น
การถดถอยเมื่อปัญหานั้นเกิดขึ้นอีกครั้งในแอปเวอร์ชันใดก็ตาม แม้ว่าจะเป็นแอปเวอร์ชัน
ที่เราทราบเมื่อคุณปิดปัญหาแล้วก็ตาม ซึ่งส่งผลให้Crashlytics
บางครั้งระบุการถดถอยอย่างไม่ถูกต้อง ตอนนี้เราใช้รูปแบบ
ที่อธิบายไว้ข้างต้น หากเห็นการถดถอยที่ระบุไม่ถูกต้องจำนวนมากจากช่วงก่อนเดือนกุมภาพันธ์ 2022 คุณสามารถปิดปัญหาเหล่านั้นอีกครั้งเพื่อป้องกันไม่ให้มีการเปิดปัญหาซ้ำ