หน้านี้จะให้ความช่วยเหลือในการแก้ปัญหาและตอบคำถามที่พบบ่อยเกี่ยวกับการใช้ Crashlytics หากไม่พบสิ่งที่ต้องการหรือต้องการความช่วยเหลือเพิ่มเติม โปรดติดต่อทีมสนับสนุน Firebase
ในหน้านี้ คุณจะเห็นข้อมูลเกี่ยวกับหัวข้อประเภทต่อไปนี้
การแก้ปัญหาทั่วไป รวมถึงคำถามเกี่ยวกับการ แสดงข้อมูลหรือการทำงานกับข้อมูลในคอนโซล Firebase และคำถาม เกี่ยวกับปัญหาที่กลับมาเกิดซ้ำ
การสนับสนุนเฉพาะแพลตฟอร์ม รวมถึงคำถามที่เจาะจง สำหรับแพลตฟอร์ม Apple Android และ Unity
การสนับสนุนเกี่ยวกับการผสานรวม รวมถึงคำถามเกี่ยวกับ BigQuery
การแก้ปัญหา/คำถามที่พบบ่อยทั่วไป
เห็นรูปแบบที่แตกต่างกัน (และบางครั้งก็เห็น "ตัวแปร") สำหรับปัญหาบางอย่างในตารางปัญหา
คุณอาจเห็นรูปแบบปัญหาที่แตกต่างกัน 2 รูปแบบซึ่งแสดงอยู่ในตารางปัญหา ในคอนโซล Firebase นอกจากนี้ คุณยังอาจเห็นฟีเจอร์ที่เรียกว่า "ตัวแปร" ในปัญหาบางอย่างด้วย โดยมีสาเหตุดังนี้
ในช่วงต้นปี 2023 เราได้เปิดตัวเครื่องมือวิเคราะห์ที่ได้รับการปรับปรุงสำหรับการจัดกลุ่มเหตุการณ์ รวมถึงการออกแบบที่อัปเดตแล้วและฟีเจอร์ขั้นสูงบางอย่างสำหรับปัญหาใหม่ๆ (เช่น ตัวแปร) ดูรายละเอียดทั้งหมดได้ที่บล็อกโพสต์ล่าสุด หรืออ่านไฮไลต์ด้านล่าง
Crashlytics จะวิเคราะห์เหตุการณ์ทั้งหมดจากแอป (เช่น ข้อขัดข้อง ข้อผิดพลาดที่ไม่ร้ายแรง และ ANR) และสร้างกลุ่มเหตุการณ์ที่เรียกว่าปัญหา ซึ่งเหตุการณ์ทั้งหมดในปัญหา มีจุดที่ทำให้เกิดข้อผิดพลาดร่วมกัน
ตอนนี้เครื่องมือวิเคราะห์ที่ปรับปรุงแล้วจะพิจารณาหลายแง่มุมของเหตุการณ์เพื่อจัดกลุ่มเหตุการณ์เป็นปัญหาเหล่านี้ ซึ่งรวมถึงเฟรมใน Stack Trace, ข้อความข้อยกเว้น, รหัสข้อผิดพลาด และลักษณะอื่นๆ ของแพลตฟอร์มหรือประเภทข้อผิดพลาด
อย่างไรก็ตาม ภายในกลุ่มเหตุการณ์นี้ สแต็กเทรซที่นำไปสู่ความล้มเหลว อาจแตกต่างกัน สแต็กเทรซที่แตกต่างกันอาจหมายถึงสาเหตุหลักที่แตกต่างกัน ตอนนี้เราจึงสร้างตัวแปรภายในปัญหาเพื่อแสดงความแตกต่างที่อาจเกิดขึ้นนี้ภายในปัญหา โดยแต่ละตัวแปรจะเป็นกลุ่มย่อยของเหตุการณ์ในปัญหา ที่มีจุดที่ล้มเหลวเหมือนกันและสแต็กเทรซที่คล้ายกัน เมื่อใช้ตัวแปร คุณจะแก้ไขข้อบกพร่องของ Stack Trace ที่พบบ่อยที่สุดภายในปัญหาและพิจารณาได้ว่า สาเหตุหลักที่แตกต่างกันทำให้เกิดความล้มเหลวหรือไม่
การปรับปรุงเหล่านี้จะช่วยให้คุณได้รับประสบการณ์การใช้งานดังนี้
ข้อมูลเมตาที่ปรับปรุงใหม่ซึ่งแสดงในแถวปัญหา
ตอนนี้คุณจะเข้าใจและคัดแยกปัญหาในแอปได้ง่ายขึ้นปัญหาที่ซ้ำกันน้อยลง
การเปลี่ยนแปลงหมายเลขบรรทัดจะไม่ทำให้เกิดปัญหาใหม่แก้ไขข้อบกพร่องของปัญหาที่ซับซ้อนซึ่งมีสาเหตุที่หลากหลายได้ง่ายขึ้น
ใช้ตัวแปรเพื่อแก้ไขข้อบกพร่องของ Stack Trace ที่พบบ่อยที่สุดภายในปัญหาการแจ้งเตือนและสัญญาณที่มีความหมายมากขึ้น
ปัญหาใหม่แสดงถึงข้อบกพร่องใหม่การค้นหาที่ทรงพลังยิ่งขึ้น
ปัญหาแต่ละรายการมีข้อมูลเมตาที่ค้นหาได้มากขึ้น เช่น ประเภทข้อยกเว้นและชื่อแพ็กเกจ
การเปิดตัวการปรับปรุงเหล่านี้มีดังนี้
เมื่อได้รับเหตุการณ์ใหม่จากแอปของคุณ เราจะตรวจสอบว่าเหตุการณ์ดังกล่าวตรงกับปัญหาที่มีอยู่หรือไม่
หากไม่มีรายการที่ตรงกัน เราจะใช้อัลกอริทึมการจัดกลุ่มเหตุการณ์ที่ชาญฉลาดขึ้นโดยอัตโนมัติกับเหตุการณ์นั้น และสร้างปัญหาใหม่ด้วยการออกแบบข้อมูลเมตาที่ปรับปรุงใหม่
นี่เป็นการอัปเดตครั้งใหญ่ครั้งแรกที่เราทําในการจัดกลุ่มเหตุการณ์ หากคุณมีความคิดเห็นหรือพบปัญหา โปรดแจ้งให้เราทราบโดย ส่งรายงาน
ไม่เห็นบันทึกเบรดครัมบ์
หากไม่เห็นบันทึกเส้นทาง (iOS+ | Android | Flutter | Unity) เราขอแนะนำให้ตรวจสอบการกำหนดค่าของแอปสำหรับ Google Analytics โปรดตรวจสอบว่าคุณมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้
คุณได้เปิดใช้ Google Analytics ในโปรเจ็กต์ Firebase แล้ว
คุณได้เปิดใช้การแชร์ข้อมูลสำหรับ Google Analytics ดูข้อมูลเพิ่มเติมเกี่ยวกับ การตั้งค่านี้ได้ที่ จัดการการตั้งค่าการแชร์ข้อมูล Analytics
คุณได้เพิ่ม Firebase SDK สำหรับ Google Analytics ลงในแอปแล้ว iOS+ | Android | Flutter | Unity
ต้องเพิ่ม SDK นี้นอกเหนือจาก SDK ของ Crashlyticsคุณใช้ Firebase SDK เวอร์ชันล่าสุดสําหรับผลิตภัณฑ์ทั้งหมดที่คุณใช้ในแอป (iOS+ | Android | Flutter | Unity)
สําหรับแพลตฟอร์ม Apple และแอป Android โปรดตรวจสอบว่าคุณใช้ Firebase SDK สําหรับ Google Analytics เวอร์ชันต่อไปนี้เป็นอย่างน้อย
iOS+ — v6.3.1+ (v8.9.0+ สําหรับ macOS และ tvOS) |Android — v17.2.3+ (BoM v24.7.1+)
ไม่เห็นการแจ้งเตือนอัตราความเร็ว
หากไม่เห็นการแจ้งเตือนความเร็ว โปรดตรวจสอบว่าคุณใช้
ไม่เห็นเมตริกแบบไม่มีข้อขัดข้อง (หรือเห็นเมตริกที่ไม่น่าเชื่อถือ)
หากไม่เห็นเมตริกที่ไม่มีข้อขัดข้อง (เช่น ผู้ใช้และเซสชันที่ไม่มีข้อขัดข้อง) หรือเห็นเมตริกที่ไม่น่าเชื่อถือ ให้ตรวจสอบสิ่งต่อไปนี้
ตรวจสอบว่าคุณใช้
ตรวจสอบว่าการตั้งค่าการเก็บรวบรวมข้อมูลไม่ส่งผลต่อคุณภาพของ เมตริกแบบไม่มีข้อขัดข้อง
หากคุณเปิดใช้การรายงานแบบเลือกใช้ โดยการปิดใช้การรายงานข้อขัดข้องอัตโนมัติ ระบบจะส่งข้อมูลข้อขัดข้องได้เฉพาะ ไปยัง Crashlytics จากผู้ใช้ที่เลือกใช้การเก็บรวบรวมข้อมูลอย่างชัดเจน ดังนั้น ความแม่นยำของเมตริกแบบไม่มีข้อขัดข้องจะได้รับผลกระทบเนื่องจาก Crashlytics มีข้อมูลข้อขัดข้องจากผู้ใช้ที่เลือกเข้าร่วมเหล่านี้เท่านั้น (ไม่ใช่ผู้ใช้ทั้งหมด) ซึ่งหมายความว่าเมตริกแบบไม่มีข้อขัดข้องอาจมีความน่าเชื่อถือน้อยลง และสะท้อนถึงความเสถียรโดยรวมของแอปได้น้อยลง
หากปิดใช้การเก็บรวบรวมข้อมูลอัตโนมัติ คุณจะใช้
sendUnsentReportsเพื่อส่งรายงานที่แคชไว้ในอุปกรณ์ไปยัง Crashlytics ได้ การใช้วิธีนี้จะส่งข้อมูลข้อขัดข้องไปยัง Crashlytics แต่จะไม่ส่งข้อมูลเซสชัน ซึ่งจะทําให้แผนภูมิคอนโซลแสดงค่าต่ำหรือ 0 สําหรับเมตริกที่ไม่มีข้อขัดข้อง
ระบบคำนวณจำนวนผู้ใช้ที่ไม่พบข้อขัดข้องอย่างไร
ใครดู เขียน และลบหมายเหตุในปัญหาได้บ้าง
หมายเหตุช่วยให้สมาชิกโปรเจ็กต์แสดงความคิดเห็นเกี่ยวกับปัญหาที่เฉพาะเจาะจงได้ด้วยคำถาม การอัปเดตสถานะ และอื่นๆ
เมื่อสมาชิกในโปรเจ็กต์โพสต์โน้ต ระบบจะติดป้ายกำกับด้วยอีเมลของบัญชี Google อีเมลนี้จะแสดงพร้อมกับหมายเหตุต่อสมาชิกโปรเจ็กต์ทั้งหมดที่มีสิทธิ์ดูหมายเหตุ
ต่อไปนี้จะอธิบายสิทธิ์เข้าถึงที่จำเป็นในการดู เขียน และลบ โน้ต
สมาชิกโปรเจ็กต์ที่มีบทบาทต่อไปนี้จะดูและลบโน้ตที่มีอยู่ และเขียนโน้ตใหม่ในปัญหาได้
สมาชิกโปรเจ็กต์ที่มีบทบาทต่อไปนี้จะดูหมายเหตุที่โพสต์ในปัญหาได้ แต่จะลบหรือเขียนหมายเหตุไม่ได้
- ผู้ดูโปรเจ็กต์ ผู้ดู Firebase ผู้ดูคุณภาพ หรือ ผู้ดู Crashlytics
ปัญหาที่ถดถอยคืออะไร
ปัญหาเกิดการถดถอยเมื่อคุณปิดปัญหาไปก่อนหน้านี้ แต่ Crashlytics ได้รับรายงานใหม่ว่าปัญหาเกิดขึ้นอีกครั้ง Crashlytics จะเปิดปัญหาที่ถดถอยเหล่านี้อีกครั้งโดยอัตโนมัติเพื่อให้คุณ แก้ไขปัญหาดังกล่าวได้ตามความเหมาะสมกับแอป
ต่อไปนี้คือสถานการณ์ตัวอย่างที่อธิบายวิธีที่ Crashlytics จัดหมวดหมู่ปัญหาเป็นรีเกรสชัน
- เป็นครั้งแรกที่ Crashlytics ได้รับรายงานข้อขัดข้องเกี่ยวกับข้อขัดข้อง "ก" Crashlytics จะเปิดปัญหาที่เกี่ยวข้องกับการขัดข้องนั้น (ปัญหา "ก")
- คุณแก้ไขข้อบกพร่องนี้อย่างรวดเร็ว ปิดปัญหา "ก" แล้วเผยแพร่แอปเวอร์ชันใหม่
- Crashlytics ได้รับรายงานอีกฉบับเกี่ยวกับปัญหา "ก" หลังจากที่คุณปิดปัญหาแล้ว
- หากรายงานมาจากแอปเวอร์ชันที่ Crashlytics ทราบ เมื่อคุณปิดปัญหา (หมายความว่าเวอร์ชันได้ส่งรายงานข้อขัดข้อง สำหรับข้อขัดข้องใดๆ) Crashlytics จะไม่ถือว่าปัญหา ดังกล่าวเป็นปัญหาที่เกิดซ้ำ เราจะปิดปัญหาดังกล่าวต่อไป
- หากรายงานมาจากแอปเวอร์ชันที่Crashlytics ไม่ ทราบเมื่อคุณปิดปัญหา (หมายความว่าเวอร์ชันไม่เคยส่งรายงานข้อขัดข้องใดๆ สำหรับข้อขัดข้องใดๆ เลย) Crashlyticsจะถือว่าปัญหาเกิดซ้ำและจะเปิดปัญหาอีกครั้ง
เมื่อเกิดปัญหาซ้ำ เราจะส่งการแจ้งเตือนการตรวจหาการเกิดปัญหาซ้ำและเพิ่ม สัญญาณการเกิดปัญหาซ้ำลงในปัญหาเพื่อแจ้งให้คุณทราบว่า Crashlytics ได้ เปิดปัญหาอีกครั้ง หากไม่ต้องการให้ปัญหาเปิดขึ้นอีกเนื่องจากอัลกอริทึมการถดถอยของเรา ให้ "ปิดเสียง" ปัญหาแทนการปิด
เหตุใดฉันจึงเห็นปัญหาที่ถดถอย สำหรับแอปเวอร์ชันเก่า
หากรายงานมาจากแอปเวอร์ชันเก่าที่ไม่เคยส่งรายงานข้อขัดข้องเลยเมื่อคุณปิดปัญหา Crashlytics จะถือว่าปัญหาดังกล่าวCrashlyticsกลับมาเกิดซ้ำและจะเปิดปัญหาอีกครั้ง
สถานการณ์นี้อาจเกิดขึ้นในกรณีต่อไปนี้ คุณแก้ไขข้อบกพร่องและ เผยแพร่แอปเวอร์ชันใหม่แล้ว แต่ยังมีผู้ใช้ที่ใช้แอปเวอร์ชันก่อนหน้า ที่ไม่มีการแก้ไขข้อบกพร่อง หากเวอร์ชันก่อนหน้าเหล่านั้นไม่เคยส่งรายงานข้อขัดข้องเลยเมื่อคุณปิดปัญหา และผู้ใช้เริ่มพบข้อบกพร่อง รายงานข้อขัดข้องเหล่านั้นจะทริกเกอร์ปัญหาที่ถดถอย
หากไม่ต้องการให้ระบบเปิดปัญหาอีกครั้งเนื่องจากอัลกอริทึมการถดถอยของเรา ให้ "ปิดเสียง" ปัญหาแทนการปิด
การสนับสนุนเฉพาะแพลตฟอร์ม
ส่วนต่อไปนี้ให้การสนับสนุนการแก้ปัญหาและคำถามที่พบบ่อยสำหรับแพลตฟอร์มที่เฉพาะเจาะจง iOS+ | Android | Unity
การรองรับแพลตฟอร์มของ Apple
ไม่มี dSYM/ไม่ได้อัปโหลด
หากต้องการอัปโหลด dSYM ของโปรเจ็กต์และรับเอาต์พุตแบบละเอียด ให้ตรวจสอบสิ่งต่อไปนี้
ตรวจสอบว่าเฟสการสร้างของโปรเจ็กต์มีสคริปต์การเรียกใช้ Crashlytics ซึ่งช่วยให้ Xcode อัปโหลด dSYM ของโปรเจ็กต์ได้ในเวลาสร้าง (อ่าน การเริ่มต้น Crashlytics เพื่อดูวิธีการเพิ่มสคริปต์) หลังจากอัปเดตโปรเจ็กต์แล้ว ให้บังคับให้เกิดข้อขัดข้องและยืนยันว่า ข้อขัดข้องปรากฏในแดชบอร์ด Crashlytics
หากเห็นการแจ้งเตือน "ไม่มี dSYM" ในFirebase คอนโซล ให้ตรวจสอบ Xcode เพื่อให้แน่ใจว่า สร้าง dSYM อย่างถูกต้อง สำหรับบิลด์
หาก Xcode สร้าง dSYM ได้อย่างถูกต้อง แต่คุณยังคงเห็น dSYM ที่ขาดหายไป อาจเป็นไปได้ว่าเครื่องมือสคริปต์ที่เรียกใช้ค้างอยู่ขณะอัปโหลด dSYM ในกรณีนี้ ให้ลองทำตามขั้นตอนต่อไปนี้
ตรวจสอบว่าคุณใช้ Crashlytics เวอร์ชันล่าสุดอยู่
อัปโหลดไฟล์ dSYM ที่ขาดหายไปด้วยตนเอง
- ตัวเลือกที่ 1: ใช้ตัวเลือก "ลากและวาง" ในคอนโซลในแท็บ dSYM เพื่ออัปโหลดไฟล์เก็บถาวรแบบ ZIP ที่มีไฟล์ dSYM ที่ขาดหายไป
- ตัวเลือกที่ 2: ใช้สคริปต์
upload-symbolsเพื่ออัปโหลดไฟล์ dSYM ที่ขาดหายไปสำหรับ UUID ที่ระบุในแท็บ dSYM
หากยังคงเห็น dSYM ที่ขาดหายไปหรือยังอัปโหลดไม่สำเร็จ โปรดติดต่อทีมสนับสนุน Firebase และอย่าลืมแนบไฟล์บันทึก
ข้อขัดข้องมีสัญลักษณ์ไม่ดี
หาก Stack Trace ดูเหมือนจะมีการสร้างสัญลักษณ์ไม่ดี ให้ตรวจสอบสิ่งต่อไปนี้
หากเฟรมจากคลังของแอปไม่มีการอ้างอิงถึงโค้ดของแอป ให้ตรวจสอบว่าไม่ได้ตั้งค่า
เป็นแฟล็กการคอมไพล์-fomit-frame-pointerหากเห็นเฟรม
(Missing)หลายเฟรมสำหรับไลบรารีของแอป ให้ตรวจสอบว่ามี dSYM ที่ไม่บังคับซึ่งระบุว่าขาดหายไป (สำหรับเวอร์ชันของแอปที่ได้รับผลกระทบ) ในแท็บ Crashlytics dSYM ของคอนโซล Firebase หรือไม่ หากเป็นเช่นนั้น ให้ทำตามขั้นตอนการแก้ปัญหา "การแจ้งเตือน dSYM ที่ขาดหายไป" ในคำถามที่พบบ่อยเกี่ยวกับ dSYM ขาดหายไป/ไม่ได้อัปโหลด ในหน้านี้ โปรดทราบว่าการอัปโหลด dSYM เหล่านี้จะไม่สร้างสัญลักษณ์สำหรับข้อขัดข้องที่เกิดขึ้นแล้ว แต่จะช่วยให้มั่นใจได้ว่าข้อขัดข้องในอนาคตจะได้รับการสร้างสัญลักษณ์
ฉันใช้ Crashlytics สำหรับ macOS หรือ tvOS ได้ไหม
ได้ คุณสามารถใช้ Crashlytics ในโปรเจ็กต์ macOS และ tvOS โปรดตรวจสอบว่าได้รวม Firebase SDK เวอร์ชัน 8.9.0 ขึ้นไปสำหรับ Google Analytics เพื่อให้ข้อขัดข้องมีสิทธิ์เข้าถึงเมตริกที่ Google Analytics รวบรวม (ผู้ใช้ที่ไม่มีข้อขัดข้อง, เวอร์ชันล่าสุด, การแจ้งเตือนความเร็ว และบันทึกเส้นทางการเข้าชม)
ฉันใช้ Crashlytics ในโปรเจ็กต์ Firebase ที่มีแอปหลายแอปในแพลตฟอร์ม Apple ต่างๆ ได้ไหม
ตอนนี้คุณสามารถรายงานข้อขัดข้องของแอปหลายแอปในโปรเจ็กต์ Firebase เดียวได้แล้ว แม้ว่าแอปจะสร้างขึ้นสำหรับแพลตฟอร์ม Apple ที่แตกต่างกัน (เช่น iOS, tvOS และ Mac Catalyst) ก่อนหน้านี้ คุณต้องแยกแอปออกเป็นโปรเจ็กต์ Firebase แต่ละโปรเจ็กต์หากแอปมี Bundle ID เดียวกัน
การสนับสนุน Android
ทำไมจึงมีการรายงาน 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ที่เชื่อมโยงไม่ได้ เราขอแนะนำให้คุณพิจารณาใช้ตำแหน่งมาตรฐาน สำหรับไลบรารีที่ใช้ร่วมกันตรวจสอบว่าคุณไม่ได้ลบ
BuildIds ในระหว่างกระบวนการสร้างโปรดทราบว่าเคล็ดลับในการแก้ปัญหาต่อไปนี้ใช้ได้กับทั้ง ANR และข้อขัดข้องที่เกิดในโค้ดเนทีฟ
ตรวจสอบว่ามี
BuildIdหรือไม่โดยเรียกใช้readelf -nในไบนารี หากไม่มีBuildIdให้เพิ่ม-Wl,--build-idลงในแฟล็กสำหรับ ระบบบิลด์ตรวจสอบว่าคุณไม่ได้ลบ
BuildIdโดยไม่ตั้งใจเพื่อลดขนาด APKหากคุณเก็บไลบรารีทั้งเวอร์ชันที่ Strip และเวอร์ชันที่ไม่ได้ Strip ไว้ ให้ตรวจสอบว่าได้ ชี้ไปยังเวอร์ชันที่ถูกต้องในโค้ด
ความแตกต่าง ระหว่างรายงาน 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 และยินยอมให้เก็บรวบรวมข้อมูล
เหตุใดฉันจึงเห็นข้อขัดข้อง
จากไฟล์ .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ปัญหาที่มีอยู่
ไม่พบข้อขัดข้องเมื่อใช้ 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
วิธีอัปเกรดเป็นCrashlyticsปลั๊กอิน Gradle v3
Crashlyticsปลั๊กอิน Gradle เวอร์ชันล่าสุดเป็นเวอร์ชันหลัก (v3.0.0) และปรับปรุง SDK ให้ทันสมัยด้วยการเลิกการรองรับ Gradle และปลั๊กอิน Android Gradle เวอร์ชันที่ต่ำกว่า นอกจากนี้ การเปลี่ยนแปลงในรุ่นนี้ยังช่วยแก้ปัญหาเกี่ยวกับ AGP v8.1 ขึ้นไป และปรับปรุงการรองรับแอปแบบเนทีฟและบิลด์ที่กำหนดเอง
ข้อกำหนดขั้นต่ำ
Crashlytics ปลั๊กอิน Gradle v3 มีข้อกำหนดขั้นต่ำดังนี้
ปลั๊กอิน Android Gradle 8.1 ขึ้นไป
อัปเกรดปลั๊กอินนี้โดยใช้ ผู้ช่วยอัปเกรดปลั๊กอิน Android Gradle ใน Android Studio เวอร์ชันล่าสุดgoogle-servicesปลั๊กอิน Gradle 4.4.1 ขึ้นไป
ของ Firebase อัปเกรดปลั๊กอินนี้โดยระบุเวอร์ชันล่าสุดในไฟล์บิลด์ Gradle ของโปรเจ็กต์ ดังนี้
Kotlin
plugins { id("com.android.application") version "8.1.4" apply false id("com.google.gms.google-services") version "4.4.4" apply false ... }
Groovy
plugins { id 'com.android.application' version '8.1.4' apply false id 'com.google.gms.google-services' version '4.4.4' apply false ... }
การเปลี่ยนแปลงส่วนขยาย Crashlytics
ปลั๊กอิน Crashlytics Gradle เวอร์ชัน 3 มีการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบต่อไปนี้สำหรับส่วนขยาย Crashlytics
นำส่วนขยายออกจากบล็อก
defaultConfigAndroid แล้ว แต่คุณควร กำหนดค่าแต่ละรูปแบบนำฟิลด์
mappingFileที่เลิกใช้งานแล้วออก แต่ตอนนี้ระบบจะให้ไฟล์แมปที่ผสานรวมแล้วโดยอัตโนมัติแทนนำฟิลด์
strippedNativeLibsDirที่เลิกใช้งานแล้วออก แต่คุณควรใช้unstrippedNativeLibsDirสำหรับไลบรารีเนทีฟทั้งหมดแทนเปลี่ยนฟิลด์
unstrippedNativeLibsDirให้เป็นแบบสะสมดูตัวอย่างที่มีหลายไดเรกทอรี
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("MY/NATIVE/LIBS") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS") } } } }
งาน
จะอัปโหลดเฉพาะสัญลักษณ์ในuploadCrashlyticsSymbolFilesBasicReleaseMY/NATIVE/LIBSแต่ จะอัปโหลดสัญลักษณ์ทั้งในuploadCrashlyticsSymbolFilesFeatureXReleaseMY/NATIVE/LIBSและMY/FEATURE_X/LIBSแทนที่ฟิลด์การปิด
symbolGeneratorด้วยฟิลด์ระดับบนสุดใหม่ 2 รายการ ดังนี้symbolGeneratorTypeสตริงของ"breakpad"(ค่าเริ่มต้น) หรือ"csym"breakpadBinaryซึ่งเป็นไฟล์ของไบนารีdump_symsที่ลบล้างในเครื่อง
ตัวอย่างวิธีอัปเกรดส่วนขยาย
Kotlin
| ก่อน |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGenerator( closureOf<SymbolGenerator> { symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } ) } } } |
| ตอนนี้ใน v3 |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Groovy
| ก่อน |
buildTypes { release { firebaseCrashlytics { // ... symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } } |
| ตอนนี้ใน v3 |
buildTypes { release { firebaseCrashlytics { // ... symbolGeneratorType "breakpad" breakpadBinary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
การสนับสนุนเฉพาะสำหรับ Android-NDK
ความแตกต่าง ระหว่าง Stack Trace ของ NDK ในแดชบอร์ด Crashlytics กับ Logcat
LLVM และ GNU Toolchain มีค่าเริ่มต้นและการจัดการที่แตกต่างกันสำหรับส่วนแบบอ่านอย่างเดียวของไบนารีของแอป ซึ่งอาจสร้าง Stack Trace ที่ไม่สอดคล้องกันในFirebase คอนโซล หากต้องการลดปัญหานี้ ให้เพิ่มแฟลกลิงก์ต่อไปนี้ ลงในกระบวนการบิลด์
หากคุณใช้
lldLinker จาก LLVM Toolchain ให้เพิ่ม-Wl,--no-rosegmentหากคุณใช้โปรแกรมลิงก์
ld.goldจาก GNU Toolchain ให้เพิ่มสิ่งต่อไปนี้-Wl,--rosegment
หากยังคงเห็นความไม่สอดคล้องกันของ Stack Trace (หรือหากไม่มีแฟล็กใดที่เกี่ยวข้องกับ Toolchain) ให้ลองเพิ่มสิ่งต่อไปนี้ลงในกระบวนการบิลด์แทน
-fno-omit-frame-pointerฉันจะใช้ไบนารีตัวสร้างไฟล์สัญลักษณ์ Breakpad ของตัวเองสำหรับ NDK ได้อย่างไร
ปลั๊กอิน Crashlytics จะรวมเครื่องมือสร้างไฟล์สัญลักษณ์ Breakpad ที่ปรับแต่งแล้ว
หากต้องการใช้ไบนารีของคุณเองเพื่อสร้างไฟล์สัญลักษณ์ Breakpad (เช่น หากต้องการสร้างไฟล์ปฏิบัติการแบบเนทีฟทั้งหมดในห่วงโซ่การสร้างจากแหล่งที่มา) ให้ใช้พร็อพเพอร์ตี้ส่วนขยาย symbolGeneratorBinary ที่ไม่บังคับเพื่อระบุเส้นทางไปยังไฟล์ปฏิบัติการ
คุณระบุเส้นทางไปยังไบนารีของเครื่องมือสร้างไฟล์สัญลักษณ์ 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
Crashlytics รองรับ armeabi ไหม
Firebase Crashlytics NDK ไม่รองรับ ARMv5 (armeabi) เราได้นำการรองรับ ABI นี้ออกแล้วตั้งแต่ NDK r17
การสนับสนุน Unity
การเห็นสแต็กเทรซที่ไม่ได้ทำสัญลักษณ์ สำหรับแอป Android ในแดชบอร์ด Crashlytics
หากคุณใช้ Unity IL2CPP และเห็น Stack Trace ที่ไม่ได้ทำสัญลักษณ์ ให้ลองทำดังนี้
ตรวจสอบว่าคุณใช้ Crashlytics Unity SDK เวอร์ชัน 8.6.1 ขึ้นไป
ตรวจสอบว่าคุณได้ตั้งค่าและเรียกใช้คำสั่ง Firebase CLI
crashlytics:symbols:uploadเพื่อสร้างและอัปโหลดไฟล์สัญลักษณ์แล้วคุณต้องเรียกใช้คำสั่ง CLI นี้ทุกครั้งที่สร้างบิลด์รีลีส หรือบิลด์ใดก็ตามที่คุณต้องการดู Stack Trace ที่มีสัญลักษณ์ในคอนโซล Firebase ดูข้อมูลเพิ่มเติมได้ที่ รับรายงานข้อขัดข้องที่อ่านได้
Crashlytics ใช้กับแอปที่ใช้ IL2CPP ได้ไหม
ได้ Crashlyticsสามารถแสดง Stack Trace ที่มีสัญลักษณ์สำหรับแอปที่ใช้ IL2CPP ได้ ความสามารถนี้พร้อมใช้งานสำหรับแอปที่เผยแพร่บนแพลตฟอร์ม Android หรือ Apple สิ่งที่คุณต้องทำมีดังนี้
ตรวจสอบว่าคุณใช้ Crashlytics Unity SDK เวอร์ชัน 8.6.0 ขึ้นไป
ทํางานที่จําเป็นสําหรับแพลตฟอร์มของคุณให้เสร็จสมบูรณ์
สำหรับแอปแพลตฟอร์ม Apple: ไม่จำเป็นต้องดำเนินการใดๆ เป็นพิเศษ สำหรับแอปแพลตฟอร์ม Apple ปลั๊กอิน Firebase Unity Editor จะกำหนดค่าโปรเจ็กต์ Xcode โดยอัตโนมัติเพื่ออัปโหลดสัญลักษณ์
สำหรับแอป Android: ตรวจสอบว่าคุณได้ตั้งค่าและเรียกใช้คำสั่ง Firebase CLI
crashlytics:symbols:uploadเพื่อสร้างและ อัปโหลดไฟล์สัญลักษณ์แล้วคุณต้องเรียกใช้คำสั่ง CLI นี้ทุกครั้งที่สร้างบิลด์รีลีส หรือบิลด์ใดก็ตามที่คุณต้องการดู Stack Trace ที่มีสัญลักษณ์ในคอนโซล Firebase ดูข้อมูลเพิ่มเติมได้ที่ รับรายงานข้อขัดข้องที่อ่านได้
การรายงานข้อยกเว้นที่ไม่ได้จัดการเป็นข้อผิดพลาดร้ายแรง
Crashlytics สามารถรายงานข้อยกเว้นที่ไม่ได้จัดการเป็นข้อผิดพลาดร้ายแรง (เริ่มต้นด้วย Unity SDK v10.4.0) คำถามที่พบบ่อยต่อไปนี้จะช่วยอธิบายเหตุผลและแนวทางปฏิบัติแนะนำในการใช้ฟีเจอร์นี้
เหตุใดแอปจึงควรรายงานข้อยกเว้นที่ไม่ได้จัดการเป็นข้อผิดพลาดร้ายแรง
การรายงานข้อยกเว้นที่ไม่ได้แคชเป็นข้อผิดพลาดร้ายแรงจะช่วยให้คุณทราบถึงข้อบ่งชี้ที่สมจริงมากขึ้น เกี่ยวกับข้อยกเว้นที่อาจส่งผลให้เกมเล่นไม่ได้ แม้ว่าแอปจะยังคงทำงานต่อไปก็ตาม
โปรดทราบว่าหากเริ่มรายงานข้อผิดพลาดร้ายแรง เปอร์เซ็นต์ผู้ใช้ที่ไม่พบข้อขัดข้อง (CFU) อาจลดลง แต่เมตริก CFU จะแสดงถึงประสบการณ์ของผู้ใช้ปลายทาง ที่มีต่อแอปของคุณได้ดีขึ้น
ระบบจะรายงานข้อยกเว้นใดเป็นข้อยกเว้นที่ร้ายแรง
หากต้องการให้ Crashlytics รายงานข้อยกเว้นที่ไม่ได้แคชเป็นข้อผิดพลาดร้ายแรง จะต้องเป็นไปตามเงื่อนไขทั้ง 2 ข้อต่อไปนี้
ในระหว่างการเริ่มต้นในแอป คุณต้องตั้งค่าพร็อพเพอร์ตี้
ReportUncaughtExceptionsAsFatalเป็นtrueแอป (หรือไลบรารีที่รวมไว้) แสดงข้อยกเว้นที่ไม่ได้ตรวจพบ ระบบจะไม่ถือว่าข้อยกเว้นที่สร้างขึ้นแต่ไม่ได้ส่งเป็นข้อยกเว้นที่ไม่ได้จัดการ
หลังจากเปิดใช้การรายงานข้อยกเว้นที่ไม่ได้แคชเป็นข้อผิดพลาดร้ายแรง ตอนนี้ฉันมีข้อผิดพลาดร้ายแรงใหม่ๆ มากมาย ฉันจะจัดการข้อยกเว้นเหล่านี้อย่างถูกต้องได้อย่างไร
เมื่อเริ่มได้รับรายงานข้อยกเว้นที่ไม่ได้แคชเป็นข้อผิดพลาดร้ายแรง คุณมีตัวเลือกในการจัดการข้อยกเว้นที่ไม่ได้แคชเหล่านี้ดังนี้
- พิจารณาวิธีเริ่มตรวจหาและจัดการข้อยกเว้นที่ไม่ได้จัดการเหล่านี้
- พิจารณาตัวเลือกต่างๆ สำหรับการบันทึกข้อยกเว้นไปยังคอนโซลการแก้ไขข้อบกพร่องของ Unity และไปยัง Crashlytics
ดักจับและจัดการข้อยกเว้นที่ส่ง
ระบบจะสร้างและส่งข้อยกเว้นเพื่อแสดงถึงสถานะที่ไม่คาดคิดหรือสถานะพิเศษ การแก้ไขปัญหาที่เกิดจากข้อยกเว้นที่ส่งคืนเกี่ยวข้องกับการนำโปรแกรมกลับสู่สถานะที่ทราบ (กระบวนการที่เรียกว่าการจัดการข้อยกเว้น)
แนวทางปฏิบัติแนะนำคือการตรวจหาและจัดการข้อยกเว้นที่คาดการณ์ไว้ทั้งหมด เว้นแต่โปรแกรมไม่สามารถกลับสู่สถานะที่รู้จักได้
หากต้องการควบคุมว่าโค้ดใดจะตรวจจับและจัดการข้อยกเว้นประเภทใด
ให้ใส่โค้ดที่อาจสร้างข้อยกเว้นไว้ในบล็อก try-catch
ตรวจสอบว่าเงื่อนไขในcatchคำสั่งมีความเฉพาะเจาะจงมากที่สุด
เท่าที่จะเป็นไปได้เพื่อจัดการข้อยกเว้นที่เฉพาะเจาะจงอย่างเหมาะสม
บันทึกข้อยกเว้นใน Unity หรือ Crashlytics
คุณบันทึกข้อยกเว้นใน Unity หรือ Crashlytics ได้หลายวิธีเพื่อช่วย แก้ไขข้อบกพร่องของปัญหา
เมื่อใช้ Crashlytics ตัวเลือกที่พบบ่อยที่สุด 2 รายการและเราขอแนะนำมีดังนี้
ตัวเลือกที่ 1: พิมพ์ในคอนโซล Unity แต่ไม่ต้องรายงานไปยัง Crashlytics ระหว่างการพัฒนาหรือการแก้ปัญหา
- พิมพ์ไปยังคอนโซล Unity โดยใช้
Debug.Log(exception),Debug.LogWarning(exception)และDebug.LogError(exception)ซึ่ง จะพิมพ์เนื้อหาของข้อยกเว้นไปยังคอนโซล Unity และไม่ ส่งต่อข้อยกเว้น
- พิมพ์ไปยังคอนโซล Unity โดยใช้
ตัวเลือกที่ 2: อัปโหลดไปยัง Crashlytics เพื่อการรายงานแบบรวมในแดชบอร์ด Crashlytics สำหรับกรณีต่อไปนี้
- หากข้อยกเว้นควรค่าแก่การบันทึกเพื่อแก้ไขข้อบกพร่องของCrashlyticsเหตุการณ์ที่อาจเกิดขึ้นในภายหลัง ให้ใช้
Crashlytics.Log(exception.ToString()) - หากยังคงควรรายงานข้อยกเว้นไปยัง Crashlytics แม้ว่าจะตรวจพบและจัดการแล้ว
ก็ตาม ให้ใช้
Crashlytics.LogException(exception)เพื่อบันทึกเป็นเหตุการณ์ที่ไม่ร้ายแรง
- หากข้อยกเว้นควรค่าแก่การบันทึกเพื่อแก้ไขข้อบกพร่องของCrashlyticsเหตุการณ์ที่อาจเกิดขึ้นในภายหลัง ให้ใช้
อย่างไรก็ตาม หากต้องการรายงานเหตุการณ์ร้ายแรงไปยังการวินิจฉัยของ Unity Cloud ด้วยตนเอง คุณสามารถใช้ Debug.LogException ได้ ตัวเลือกนี้จะพิมพ์ข้อยกเว้น
ไปยังคอนโซล Unity เช่นเดียวกับตัวเลือกที่ 1 แต่จะส่งข้อยกเว้นด้วย
(ไม่ว่าจะส่งหรือจับข้อยกเว้นแล้วหรือไม่ก็ตาม) ซึ่งจะแสดงข้อผิดพลาด
nonlocally ซึ่งหมายความว่าแม้แต่บล็อก Debug.LogException(exception)
with try-catch ที่อยู่รอบๆ ก็ยังคงทำให้เกิดข้อยกเว้นที่ไม่ได้แคช
ดังนั้น ให้เรียกใช้ Debug.LogException ก็ต่อเมื่อคุณต้องการทำทั้งหมดต่อไปนี้เท่านั้น
- หากต้องการพิมพ์ข้อยกเว้นไปยังคอนโซล Unity
- หากต้องการอัปโหลดข้อยกเว้นไปยัง Crashlytics เป็นเหตุการณ์ร้ายแรง
- หากต้องการส่งข้อยกเว้น ให้ถือว่าเป็นข้อยกเว้นที่ตรวจไม่พบ และ ให้รายงานไปยังการวินิจฉัยบนระบบคลาวด์ของ Unity
โปรดทราบว่าหากต้องการพิมพ์ข้อยกเว้นที่ตรวจพบไปยังคอนโซล Unity และ อัปโหลดไปยัง Crashlytics เป็นเหตุการณ์ที่ไม่ร้ายแรง ให้ทำดังนี้แทน
try
{
methodThatThrowsMyCustomExceptionType();
}
catch(MyCustomExceptionType exception)
{
// Print the exception to the Unity console at the error level.
Debug.LogError(exception);
// Upload the exception to Crashlytics as a non-fatal event.
Crashlytics.LogException(exception); // not Debug.LogException
//
// Code that handles the exception
//
}
การสนับสนุนเกี่ยวกับการผสานรวม
แอปยังใช้ SDK Google Mobile Ads ด้วย แต่ไม่พบข้อขัดข้อง
หากโปรเจ็กต์ใช้ Crashlytics ควบคู่กับ SDK ของ Google Mobile Ads
มีแนวโน้มที่เครื่องมือรายงานข้อขัดข้องจะรบกวนเมื่อ
ลงทะเบียนตัวแฮนเดิลข้อยกเว้น หากต้องการแก้ไขปัญหานี้ ให้ปิดการรายงานข้อขัดข้องใน SDK ของ Mobile Ads โดยเรียกใช้ disableSDKCrashReporting
ชุดข้อมูล BigQuery ของฉันอยู่ที่ไหน
Firebase จะส่งออกข้อมูลไปยังตำแหน่งชุดข้อมูลที่คุณเลือกเมื่อตั้งค่าการส่งออกข้อมูลไปยัง BigQuery
ตําแหน่งนี้มีผลกับทั้งชุดข้อมูล Crashlytics และชุดข้อมูลเซสชัน Firebase (หากเปิดใช้การส่งออกข้อมูลเซสชัน)
ตำแหน่งนี้ใช้ได้กับข้อมูลที่ส่งออกไปยัง BigQuery เท่านั้น และจะไม่ส่งผลต่อตำแหน่งของข้อมูลที่จัดเก็บไว้สำหรับ ใช้ในแดชบอร์ด Crashlytics ของคอนโซล Firebase หรือใน Android Studio
หลังจากสร้างชุดข้อมูลแล้ว คุณจะเปลี่ยนแปลงตำแหน่งไม่ได้ แต่จะคัดลอกชุดข้อมูลไปยังตำแหน่งอื่นหรือย้าย (สร้างใหม่) ชุดข้อมูลไปยังตำแหน่งอื่นด้วยตนเองได้ ดูข้อมูลเพิ่มเติมได้ที่ เปลี่ยนตำแหน่งสำหรับการส่งออกที่มีอยู่
วิธีอัปเกรดเป็นโครงสร้างพื้นฐานการส่งออกใหม่สำหรับ BigQuery
ในช่วงกลางเดือนตุลาคม 2024 Crashlytics ได้เปิดตัวโครงสร้างพื้นฐานใหม่สำหรับการส่งออกเป็นกลุ่ม ของข้อมูล Crashlytics ไปยัง BigQuery
หากคุณเปิดใช้การส่งออกเป็นกลุ่มหลังเดือนตุลาคม 2024 โปรเจ็กต์ Firebase จะใช้โครงสร้างพื้นฐานการส่งออกใหม่โดยอัตโนมัติ ไม่ต้องดำเนินการใดๆ
หากเปิดใช้การส่งออกเป็นกลุ่มก่อนหรือระหว่างเดือนตุลาคม 2024 โปรดอ่าน ข้อมูลในคำถามที่พบบ่อยนี้ เพื่อดูว่าคุณต้องดำเนินการใดๆ หรือไม่
โปรเจ็กต์ Firebase ทั้งหมดจะได้รับการอัปเกรดเป็นโครงสร้างพื้นฐานการส่งออกแบบกลุ่มใหม่โดยอัตโนมัติตั้งแต่วันที่ 9 มกราคม 2026 เป็นต้นไป คุณอัปเกรดก่อนวันที่นี้ได้ แต่โปรดตรวจสอบว่าตารางกลุ่ม BigQuery เป็นไปตามข้อกำหนดเบื้องต้นสำหรับการอัปเกรด
คุณอัปเกรดเป็นโครงสร้างพื้นฐานใหม่ได้ แต่โปรดตรวจสอบว่าตารางกลุ่ม BigQuery เป็นไปตามข้อกำหนดเบื้องต้นสำหรับการอัปเกรด
ตรวจสอบว่าคุณใช้โครงสร้างพื้นฐานใหม่หรือไม่
หากคุณเปิดใช้การส่งออกเป็นกลุ่มในช่วงกลางเดือนตุลาคม 2024 หรือหลังจากนั้น โปรเจ็กต์ Firebase จะใช้โครงสร้างพื้นฐานการส่งออกใหม่โดยอัตโนมัติ
คุณสามารถตรวจสอบโครงสร้างพื้นฐานที่โปรเจ็กต์ใช้ได้โดยทำดังนี้
ไปที่Google Cloud คอนโซล และหาก"การกำหนดค่าการโอนข้อมูล"
มีป้ายกำกับเป็น Firebase Crashlytics with Multi-Region Support แสดงว่าโปรเจ็กต์ใช้โครงสร้างพื้นฐานการส่งออกใหม่
ความแตกต่างที่สำคัญระหว่างโครงสร้างพื้นฐานการส่งออกแบบเก่ากับโครงสร้างพื้นฐานการส่งออกแบบใหม่
โครงสร้างพื้นฐานใหม่รองรับCrashlyticsตำแหน่งชุดข้อมูลนอก สหรัฐอเมริกา
เปิดใช้การส่งออกก่อนช่วงกลางเดือนตุลาคม 2024 และอัปเกรดเป็นโครงสร้างพื้นฐานการส่งออกใหม่ - ตอนนี้คุณเปลี่ยนตำแหน่งสำหรับการส่งออกข้อมูลได้แล้ว (ไม่บังคับ)
เปิดใช้การส่งออกในช่วงกลางเดือนตุลาคม 2024 หรือหลังจากนั้น - ระบบแจ้งให้คุณเลือกตำแหน่งสำหรับการส่งออกข้อมูลในระหว่างการตั้งค่า
โครงสร้างพื้นฐานใหม่ไม่รองรับการเติมข้อมูลย้อนหลังก่อนที่คุณเปิดใช้การส่งออก
โครงสร้างพื้นฐานเดิมรองรับการเติมเต็มย้อนหลังได้สูงสุด 30 วันก่อนวันที่คุณเปิดใช้การส่งออก
โครงสร้างพื้นฐานใหม่รองรับการเติมเต็ม ย้อนหลังได้สูงสุด 30 วัน หรือวันที่ล่าสุดเมื่อคุณเปิดใช้การส่งออก ไปยัง BigQuery (แล้วแต่ว่าวันที่ใดจะล่าสุด)
ชื่อโครงสร้างพื้นฐานใหม่BigQueryใช้ตารางกลุ่มโดยใช้ ตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase ในโปรเจ็กต์ Firebase
โครงสร้างพื้นฐานเดิมจะเขียนข้อมูลลงในตารางกลุ่มที่มีชื่อตาม รหัสแพ็กเกจหรือชื่อแพ็กเกจในไบนารีของแอป
โครงสร้างพื้นฐานใหม่จะเขียนข้อมูลลงในตารางกลุ่มที่มีชื่อตาม รหัสแพ็กเกจหรือชื่อแพ็กเกจ ที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียนในโปรเจ็กต์ Firebase
ขั้นตอนที่ 1: ข้อกำหนดเบื้องต้นสำหรับการอัปเกรด
ตรวจสอบว่าตารางกลุ่มBigQueryที่มีอยู่ใช้ตัวระบุที่ตรงกับรหัส Bundle หรือชื่อแพ็กเกจ ที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียนในโปรเจ็กต์ Firebase หากไม่ตรงกัน คุณอาจพบปัญหาในการหยุดชะงักของข้อมูลกลุ่มที่ส่งออก โปรเจ็กต์ส่วนใหญ่จะอยู่ในสถานะที่เหมาะสมและเข้ากันได้ แต่คุณควรตรวจสอบก่อนอัปเกรด
คุณดูแอป Firebase ทั้งหมดที่ลงทะเบียนในโปรเจ็กต์ Firebase ได้ใน Firebase คอนโซล: ไปที่settings การตั้งค่าโปรเจ็กต์ จากนั้นเลื่อนไปที่การ์ดแอปของคุณเพื่อดูแอป Firebase ทั้งหมดและ ข้อมูลของแอป
คุณดูตารางกลุ่ม BigQuery ทั้งหมดได้ใน หน้า BigQuery ของคอนโซล Google Cloud
ตัวอย่างเช่น สถานะที่เหมาะสมซึ่งคุณจะไม่มีปัญหาในการอัปเกรดมีดังนี้
คุณมีตารางกลุ่มชื่อ
com_yourcompany_yourproject_IOSและแอป Firebase iOS+ ที่มี Bundle IDcom.yourcompany.yourprojectซึ่งลงทะเบียนไว้ในโปรเจ็กต์ Firebaseคุณมีตารางกลุ่มชื่อ
com_yourcompany_yourproject_ANDROIDและ แอป Firebase บน Android ที่มีชื่อแพ็กเกจcom.yourcompany.yourprojectซึ่งลงทะเบียนในโปรเจ็กต์ Firebase
หากคุณมีชื่อตารางกลุ่มที่ไม่ตรงกับ ตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียนไว้ ให้ทำตามวิธีการ ในหน้านี้ในภายหลังก่อนที่จะอัปเกรดด้วยตนเองหรือ ก่อนวันที่ 9 มกราคม 2026 เพื่อหลีกเลี่ยงการหยุดชะงักของการส่งออกกลุ่ม
ขั้นตอนที่ 2: อัปเกรดเป็นโครงสร้างพื้นฐานใหม่ด้วยตนเอง
หากเปิดใช้การส่งออกเป็นกลุ่มก่อนช่วงกลางเดือนตุลาคม 2024 คุณจะอัปเกรดเป็นโครงสร้างพื้นฐานใหม่ได้ด้วยตนเอง เพียงแค่สลับCrashlyticsการส่งออกข้อมูล เป็นปิดแล้วเปิดอีกครั้งในคอนโซล Firebase
ขั้นตอนโดยละเอียดมีดังนี้
ในFirebaseคอนโซล ให้ไปที่ หน้าการผสานรวม
คลิกจัดการในการ์ด BigQuery
สลับแถบเลื่อน Crashlytics เป็นปิดเพื่อปิดใช้การส่งออก เมื่อได้รับข้อความแจ้ง ให้ยืนยันว่าคุณต้องการหยุดการส่งออกข้อมูล
สลับCrashlyticsแถบเลื่อนเป็นเปิดอีกครั้งทันทีเพื่อเปิดใช้การส่งออกอีกครั้ง เมื่อได้รับข้อความแจ้ง ให้ยืนยันว่าต้องการส่งออกข้อมูล
ตอนนี้การส่งออกข้อมูล Crashlytics ไปยัง BigQuery ใช้โครงสร้างพื้นฐานการส่งออกใหม่แล้ว
ชื่อตารางกลุ่มที่มีอยู่ไม่ตรงกับตัวระบุแอป Firebase
หากชื่อตารางกลุ่มที่มีอยู่ไม่ตรงกับรหัสชุดหรือชื่อแพ็กเกจที่ตั้งไว้สำหรับแอป Firebase ที่ลงทะเบียน ให้ขยายส่วนนี้และใช้ตัวเลือกใดตัวเลือกหนึ่งเพื่อหลีกเลี่ยงการหยุดชะงักของข้อมูลกลุ่มที่ส่งออก
หากคุณมีBigQueryตารางกลุ่มในสถานะนี้อยู่แล้ว แสดงว่าตารางดังกล่าวไม่ เข้ากันได้กับโครงสร้างพื้นฐานการส่งออกแบบกลุ่มใหม่ของ Firebase ไปยัง BigQuery โปรดทราบว่าระบบจะย้ายข้อมูลโปรเจ็กต์ Firebase ทั้งหมดไปยังโครงสร้างพื้นฐานการส่งออกใหม่โดยอัตโนมัติตั้งแต่วันที่ 9 มกราคม 2026
โปรดทำตามคำแนะนำในส่วนนี้ ก่อนอัปเกรดด้วยตนเอง หรือก่อนวันที่ 9 มกราคม 2026 เพื่อไม่ให้เกิดการหยุดชะงัก ในการส่งออกข้อมูล Crashlytics ไปยัง BigQuery เป็นกลุ่ม
ข้ามไปยังวิธีการสำหรับตัวเลือกเพื่อหลีกเลี่ยงการหยุดชะงัก
ทําความเข้าใจวิธีที่โครงสร้างพื้นฐานการส่งออกใช้ตัวระบุเพื่อเขียนข้อมูลลงในตาราง BigQuery
โครงสร้างพื้นฐานการส่งออกทั้ง 2 แบบจะเขียนข้อมูล Crashlytics ลงใน BigQuery ตารางแบบกลุ่มดังนี้
โครงสร้างพื้นฐานการส่งออกเดิม: เขียนข้อมูลลงในตารางที่มีชื่อ อิงตามรหัสชุดหรือชื่อแพ็กเกจในไบนารีของแอป
โครงสร้างพื้นฐานการส่งออกใหม่: เขียนข้อมูลลงในตารางที่มีชื่อ อิงตามรหัสแพ็กเกจหรือชื่อแพ็กเกจ ที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียนในโปรเจ็กต์ Firebase
แต่บางครั้งรหัสแพ็กเกจหรือชื่อแพ็กเกจในไบนารีของแอป ไม่ตรงกับรหัสแพ็กเกจหรือชื่อแพ็กเกจ ที่ตั้งไว้สำหรับแอป Firebase ที่ลงทะเบียนในโปรเจ็กต์ Firebase โดยปกติแล้ว กรณีนี้จะเกิดขึ้นหากมีคนไม่ได้ป้อนตัวระบุจริงในระหว่างการลงทะเบียนแอป
จะเกิดอะไรขึ้นหากไม่ได้แก้ไขก่อนอัปเกรด
หากตัวระบุใน 2 ตำแหน่งนี้ไม่ตรงกัน ระบบจะดำเนินการต่อไปนี้ หลังจากอัปเกรดเป็นโครงสร้างพื้นฐานการส่งออกใหม่
Crashlytics จะเริ่มเขียนข้อมูลไปยังตารางกลุ่มใหม่ BigQuery ซึ่งเป็นตารางใหม่ที่มีชื่อตามรหัสชุดหรือชื่อแพ็กเกจที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียน ในโปรเจ็กต์ Firebase
ตาราง "เดิม" ที่มีอยู่ซึ่งมีชื่อตามตัวระบุ ในไบนารีของแอปจะไม่มีการเขียนข้อมูลลงในตารางนั้นอีกต่อไป
ตัวอย่างสถานการณ์ของตัวระบุที่ไม่ตรงกัน
โปรดทราบว่าระบบจะต่อท้ายชื่อตารางกลุ่มด้วย BigQuery
_IOS หรือ _ANDROID โดยอัตโนมัติเพื่อระบุแพลตฟอร์มของแอป
| ตัวระบุในไบนารีของแอป | ตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase | ลักษณะการทำงานเดิม | ลักษณะการทำงานหลังการอัปเกรด เป็นโครงสร้างพื้นฐานการส่งออกใหม่ |
โซลูชัน |
|---|---|---|---|---|
foo |
bar |
เขียนไปยังตารางเดียวที่ตั้งชื่อตามตัวระบุในไบนารีของแอป (foo)
|
สร้างแล้วเขียนไปยังตารางเดียวที่ตั้งชื่อตาม
ตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase (bar)
|
ใช้ตัวเลือกที่ 1 หรือ 2 ตามที่อธิบายไว้ด้านล่าง |
foo |
bar, qux ฯลฯ |
เขียนไปยังตารางเดียวที่ตั้งชื่อตามตัวระบุในไบนารีของแอป (foo)
|
สร้าง* แล้วเขียนไปยังตารางหลายตารางซึ่งตั้งชื่อตาม
ตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase (bar, qux,
ฯลฯ)
|
ใช้ตัวเลือกที่ 2 ตามที่อธิบายไว้ด้านล่าง |
foo, baz ฯลฯ |
bar |
เขียนไปยังตารางหลายตารางที่มีชื่อตามตัวระบุหลายรายการ
ในไบนารีของแอป (foo, baz ฯลฯ)
|
สร้าง** แล้วเขียนข้อมูลของทุกแอปไปยังตารางเดียวชื่อ
หลังจากตัวระบุที่ตั้งไว้สำหรับแอป Firebase (bar)
|
ไม่สามารถใช้ตัวเลือกใดๆ ได้
คุณยังคงแยกความแตกต่างของข้อมูลจากแต่ละแอปภายในตารางเดียวได้โดยใช้ |
* หากตัวระบุในไบนารีของแอปตรงกับตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase อย่างใดอย่างหนึ่ง โครงสร้างพื้นฐานการส่งออกใหม่จะไม่สร้างตารางใหม่สำหรับตัวระบุดังกล่าว แต่จะเขียนข้อมูลสำหรับแอปนั้นๆ ลงในไดเรกทอรีต่อไป ระบบจะเขียนแอปอื่นๆ ทั้งหมดไปยังตารางใหม่
** หากตัวระบุตัวใดตัวหนึ่งในไบนารีของแอปตรงกับ ชุดตัวระบุที่ตั้งค่าไว้สำหรับแอป Firebase โครงสร้างพื้นฐานการส่งออกใหม่จะไม่ สร้างตารางใหม่ แต่จะยังคงตารางนั้นไว้และเริ่มเขียน ข้อมูลสำหรับแอปทั้งหมดลงในตาราง
ตัวเลือกในการหลีกเลี่ยงการหยุดชะงัก
เพื่อหลีกเลี่ยงการหยุดชะงัก ให้ทำตามวิธีการสำหรับตัวเลือกใดตัวเลือกหนึ่ง ที่อธิบายไว้ด้านล่างก่อนที่คุณจะอัปเกรดด้วยตนเอง หรือก่อนวันที่ 9 มกราคม 2026
ตัวเลือกที่ 1:
ใช้ตารางใหม่ที่สร้างขึ้นโดยโครงสร้างพื้นฐานการส่งออกใหม่ คุณจะคัดลอกข้อมูลจากตารางที่มีอยู่ไปยังตารางใหม่ในFirebase คอนโซล อัปเกรดเป็นโครงสร้างพื้นฐานการส่งออกใหม่ โดยการปิดการส่งออกแล้วเปิดอีกครั้งสำหรับแอปที่ลิงก์
การดำเนินการนี้จะสร้างตารางกลุ่มใหม่ที่มีชื่อตาม รหัสแพ็กเกจหรือชื่อแพ็กเกจ ที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียนในโปรเจ็กต์ Firebase
ในGoogle Cloudคอนโซล คัดลอกข้อมูลทั้งหมด จากตารางเดิมไปยังตารางใหม่ที่เพิ่งสร้าง
หากคุณมีการอ้างอิงดาวน์สตรีมที่ขึ้นอยู่กับตารางกลุ่ม ให้เปลี่ยนการอ้างอิงเหล่านั้นให้ใช้ตารางใหม่
ตัวเลือกที่ 2:
เขียนข้อมูลลงในตารางที่มีอยู่ต่อไป คุณจะลบล้างค่าเริ่มต้นบางอย่างในBigQueryการกำหนดค่าเพื่อให้ได้ผลลัพธ์นี้ในคอนโซล Firebase ให้ค้นหาและจดรหัสแอป Firebase (เช่น
1:1234567890:ios:321abc456def7890) ของแอปที่มี ชื่อตารางกลุ่มและตัวระบุไม่ตรงกัน
ไปที่settings การตั้งค่าโปรเจ็กต์ จากนั้นไปที่การ์ดแอปของคุณเพื่อดูแอป Firebase ทั้งหมดและ ข้อมูลของแอปในFirebase คอนโซล อัปเกรดเป็นโครงสร้างพื้นฐานการส่งออกใหม่ โดยการปิดการส่งออกแล้วเปิดอีกครั้งสำหรับแอปที่ลิงก์
การดำเนินการนี้จะทำ 2 สิ่งต่อไปนี้
สร้างตารางกลุ่มใหม่โดยมีชื่อตาม รหัสแพ็กเกจหรือชื่อแพ็กเกจที่ตั้งค่าไว้สำหรับแอป Firebase ที่ลงทะเบียน ในโปรเจ็กต์ Firebase (คุณจะลบตารางนี้ในภายหลัง แต่อย่าเพิ่งลบ)
สร้าง BigQuery "data transfer config" ด้วยแหล่งที่มา
Firebase Crashlytics with Multi-Region Support
ในGoogle Cloudคอนโซล ให้เปลี่ยน "การกำหนดค่าการโอนข้อมูล" ใหม่เพื่อให้ระบบเขียนข้อมูลลงในตารางที่มีอยู่ต่อไป
ไปที่ BigQuery > การโอนข้อมูล เพื่อดู "การกำหนดค่าการโอนข้อมูล"
เลือกการกำหนดค่าที่มีแหล่งข้อมูล
Firebase Crashlytics with Multi-Region Supportคลิกแก้ไขที่มุมขวาบน
ในส่วนรายละเอียดแหล่งข้อมูล ให้ค้นหารายการสำหรับ gmp_app_id และรายการสำหรับ client_namespace
ใน BigQuery รหัสแอป Firebase จะเรียกว่า
gmp_app_idโดยค่าเริ่มต้น ค่าclient_namespaceใน BigQuery คือรหัสชุด / ชื่อแพ็กเกจที่ไม่ซ้ำกันที่สอดคล้องกันของแอป แต่คุณจะลบล้างการกำหนดค่าเริ่มต้นนี้BigQuery ใช้ค่า
client_namespaceเป็นชื่อของ ตารางกลุ่มที่แอป Firebase ที่ลิงก์แต่ละแอปเขียนค้นหา gmp_app_id ของแอป Firebase ที่คุณต้องการ ลบล้างการตั้งค่าเริ่มต้น เปลี่ยนค่า client_namespace เป็นชื่อของตารางที่คุณต้องการให้แอป Firebase เขียนแทน (โดยปกติจะเป็นชื่อของตารางเดิมที่แอปเขียน ด้วยโครงสร้างพื้นฐานการส่งออกเดิม)
บันทึกการเปลี่ยนแปลงการกำหนดค่า
กำหนดเวลาการทดแทน สำหรับวันที่ตารางที่มีอยู่ไม่มีข้อมูล
เมื่อการป้อนข้อมูลย้อนหลังเสร็จสมบูรณ์แล้ว ให้ลบตารางใหม่ ที่โครงสร้างพื้นฐานการส่งออกใหม่สร้างขึ้นโดยอัตโนมัติ