Firebase Crashlytics เป็นบริการของ Google สำหรับรวบรวม จัดกลุ่ม และวิเคราะห์การขัดข้องของแอปพลิเคชันมือถือแบบเรียลไทม์ SDK จะสกัดกั้นข้อยกเว้นที่ไม่ได้รับการจัดการ การขัดข้องของโค้ดเนทีฟ และสัญญาณ ANR โดยอัตโนมัติ สร้างรายงานโดยละเอียดพร้อมร่องรอยสแต็ก สถานะอุปกรณ์ และบันทึก ตามข้อมูลของ Google, 2026 Crashlytics ถูกใช้ในแอปพลิเคชันมากกว่า 4 ล้านรายการทั่วโลก บริการนี้ให้บริการฟรีโดยมีขีดจำกัด 500,000 เซสชันต่อวันต่อโปรเจกต์
ประเด็นสำคัญ
Firebase Crashlytics เป็นบริการฟรีของ Google สำหรับตรวจสอบความเสถียรของแอปพลิเคชันมือถือ ซึ่ง Google ซื้อกิจการในปี 2017 พร้อมกับบริษัท Fabric Crashlytics จะรวบรวมข้อมูลเกี่ยวกับการขัดข้องของแอปพลิเคชันทุกครั้งโดยอัตโนมัติ จัดกลุ่มการขัดข้องที่เหมือนกันตามลายเซ็นสแต็ก และแสดงในคอนโซล Firebase โดยจัดลำดับความสำคัญตามจำนวนผู้ใช้ที่ได้รับผลกระทบ
Crashlytics เปิดตัวในปี 2011 โดยเป็นส่วนหนึ่งของแพลตฟอร์ม Fabric และกลายเป็นมาตรฐานโดยพฤตินัยสำหรับการรายงานการขัดข้องบน iOS อย่างรวดเร็ว หลังจากที่ Google ซื้อกิจการในปี 2017 ด้วยมูลค่าประมาณ 2 พันล้านดอลลาร์ (ทั้ง Fabric) Crashlytics ถูกรวมเข้ากับ Firebase SDK เวอร์ชัน 18.0.0 (2021) เพิ่มการรองรับ Kotlin Multiplatform และเวอร์ชัน 19.0.0 (2024) เพิ่มการรวบรวม ANR อัตโนมัติบน Android โดยไม่ต้องกำหนดค่าเพิ่มเติม ตามข้อมูลของ Google (2026) Crashlytics ประมวลผลการขัดข้องมากกว่า 10 พันล้านครั้งต่อเดือน
Crashlytics ให้บริการฟรีโดยมีขีดจำกัด 500,000 เซสชันต่อวันต่อโปรเจกต์ Firebase สำหรับแอปพลิเคชันส่วนใหญ่ นี่เพียงพอแล้ว — ตามข้อมูลของ Google (2026) 95% ของโปรเจกต์ไม่เกินขีดจำกัด เมื่อเกินขีดจำกัด การรวบรวมข้อมูลจะไม่หยุด แต่รายงานจะหยุดอัปเดตจนถึงวันถัดไป สำหรับโปรเจกต์ที่มีโหลดสูง มีแผน Spark และ Blaze ของ Firebase ให้เลือก — Crashlytics ยังคงฟรีในทั้งสองแผน และขีดจำกัดเซสชันจะนับแยกต่างหาก
กลไกการรวบรวม ของ Crashlytics อาศัยการสกัดกั้นข้อยกเว้นในระดับแพลตฟอร์มและรันไทม์ บน Android SDK จะติดตั้ง UncaughtExceptionHandler ซึ่งสกัดกั้นข้อยกเว้นที่ไม่ได้ถูกจับทั้งหมดของ Kotlin และ Java บน iOS Crashlytics ใช้ NSSetUncaughtExceptionHandler สำหรับ Objective-C/Swift และตัวจัดการข้อยกเว้น Mach ของตัวเองสำหรับการขัดข้องของโค้ดเนทีฟ
Crashlytics แยกแยะ ห้าประเภท ของการขัดข้อง: fatal (การขัดข้องร้ายแรง), non-fatal (ข้อยกเว้นไม่ร้ายแรงที่ส่งด้วยตนเอง), ANR (Android — แอปไม่ตอบสนอง), signal (สัญญาณ OS — SIGSEGV, SIGABRT) และ OOM (หน่วยความจำไม่เพียงพอบน iOS) แต่ละประเภทจะถูกจัดการโดยกลไกแยกต่างหากและแสดงในคอนโซลพร้อมป้ายกำกับที่เกี่ยวข้อง
| ประเภทการขัดข้อง | แพลตฟอร์ม | ตัวกระตุ้น |
|---|---|---|
| Fatal | Android, iOS | ข้อยกเว้นที่ไม่ได้ถูกจับ |
| Non-fatal | Android, iOS | การเรียก Crashlytics.logException() ด้วยตนเอง |
| ANR | Android | ไม่ตอบสนองนานกว่า 5 วินาที |
| Signal | Android, iOS | สัญญาณ OS (SEGV, ABRT, BUS) |
| OOM | iOS | หน่วยความจำไม่เพียงพอ |
แต่ละ รายงาน Crashlytics ประกอบด้วยข้อมูลที่ครบถ้วน: ร่องรอยสแต็กที่สมบูรณ์พร้อมชื่อคลาสและหมายเลขบรรทัด เวอร์ชันแอปพลิเคชัน (versionName + versionCode) รุ่นอุปกรณ์ เวอร์ชัน OS ปริมาณหน่วยความจำว่าง การวางแนวหน้าจอ และเวลาตั้งแต่เริ่มต้น หากเชื่อมต่อ Firebase Analytics รายงานจะรวมเส้นทางของ 50 เหตุการณ์ผู้ใช้ล่าสุดก่อนการขัดข้องด้วย — ซึ่งสำคัญอย่างยิ่งสำหรับการจำลองการขัดข้องซ้ำ
class CrashlyticsHelper {
fun logNonFatal(error: Throwable) {
FirebaseCrashlytics.getInstance()
.log("Non-fatal: user action = payment_failed")
FirebaseCrashlytics.getInstance()
.recordException(error)
}
fun setUserContext(userId: String) {
FirebaseCrashlytics.getInstance()
.setUserId(userId)
FirebaseCrashlytics.getInstance()
.setCustomKey("subscription", "premium")
}
}
การเชื่อมต่อ Crashlytics กับแอปพลิเคชัน Android ต้องเพิ่ม dependencies สองรายการใน build.gradle และกำหนดค่า Google Services Plugin SDK จะเชื่อมต่อการรายงานการขัดข้องโดยอัตโนมัติเมื่อเริ่มต้น Firebase โดยไม่ต้องใช้โค้ดเพิ่มเติม สำหรับการทำงานที่ถูกต้อง จำเป็นต้องมี google-services plugin และไฟล์ google-services.json จากคอนโซล Firebase
// build.gradle (ระดับโปรเจกต์)
plugins {
id "com.google.gms.google-services" version "4.4.0"
}
// build.gradle (ระดับแอป)
plugins {
id "com.google.firebase.crashlytics"
}
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-crashlytics-ktx")
implementation("com.google.firebase:firebase-analytics-ktx")
}
Plugin com.google.firebase.crashlytics ทำสองภารกิจ: สร้างรหัสประจำตัวบิลด์ที่ไม่ซ้ำกัน (build ID) สำหรับการแมปสแต็กที่ถูกทำให้สับสน และสร้างทรัพยากรสำหรับ Crashlytics SDK โดยอัตโนมัติ หากไม่มี plugin การขัดข้องจะถูกทำเครื่องหมายเป็น "ไม่ได้แมป" — คุณจะเห็นเฉพาะชื่อคลาสที่ถูกทำให้สับสน (a.b.c) โดยไม่สามารถค้นหาโค้ดต้นฉบับได้ Plugin จะถูกเพิ่มใน build.gradle ระดับรากและ build.gradle ของโมดูลแอปพลิเคชัน
สำหรับ การทดสอบ การรวม Crashlytics ใช้ method พิเศษ forceCrash() ซึ่งสร้างข้อยกเว้นสำหรับทดสอบ ในบิลด์โปรดักชัน method นี้จะไม่พร้อมใช้งาน หลังจากเรียกใช้การขัดข้องทดสอบ รายงานจะปรากฏในคอนโซล Firebase ภายใน 1-5 นาที หากรายงานไม่แสดง ให้ตรวจสอบว่า google-services.json ตรงกับแพ็กเกจของแอปพลิเคชัน และ AndroidManifest ไม่มีแฟลกที่ปิดการรวบรวมข้อมูล
คอนโซล Crashlytics ให้มุมมองสองระดับ: รายการการขัดข้องทั้งหมด (Issues) ที่จัดกลุ่มตามประเภทการขัดข้อง และรายงานโดยละเอียดสำหรับแต่ละ Issue พร้อมร่องรอย สถิติ และข้อมูลที่กำหนดเอง แต่ละ Issue จะรวมการขัดข้องทั้งหมดที่มีลายเซ็นเดียวกัน — ข้อยกเว้นประเภทเดียวกันและร่องรอยสแต็กที่ตรงกัน
การจัดกลุ่มการขัดข้อง เป็นคุณสมบัติหลักของ Crashlytics แทนที่จะแสดงการขัดข้องนับพันรายการ บริการจะรวมเข้าด้วยกันเป็น Issues ตามลายนิ้วมือ (fingerprint) — ผลรวมตรวจสอบของร่องรอยสแต็ก หนึ่ง Issue สามารถมีการขัดข้องตั้งแต่ 1 ถึงหลายล้านครั้ง สำหรับแต่ละ Issue จะแสดง: จำนวนครั้งที่ร้ายแรง จำนวนผู้ใช้ที่ไม่ซ้ำกัน เวอร์ชันแอปพลิเคชันที่พบการขัดข้อง และเปอร์เซ็นต์ของผู้ใช้ที่พบปัญหา
ตามข้อมูลของ Google (2026) โดยเฉลี่ย 20% ของ Issues คิดเป็น 80% ของการขัดข้องร้ายแรงทั้งหมดของแอปพลิเคชัน (หลักการพาเรโต) Crashlytics จะจัดเรียง Issues ตามความรุนแรงโดยอัตโนมัติ — ยิ่งมีผู้ใช้ได้รับผลกระทบมากเท่าใด ลำดับความสำคัญก็จะยิ่งสูงขึ้นเท่านั้น ช่วยให้นักพัฒนาสามารถแก้ไขปัญหาที่พบบ่อยที่สุดได้เป็นอันดับแรก
Crashlytics ติดตามความเสถียรของแต่ละเวอร์ชันแอปพลิเคชันแยกกัน กราฟ crash-free users แสดงเปอร์เซ็นต์ของผู้ใช้ที่ไม่พบการขัดข้องร้ายแรงในแต่ละเวอร์ชัน หากเมื่ออัปเดต เปอร์เซ็นต์ลดลงต่ำกว่าเกณฑ์ (ค่าเริ่มต้น 99%) Crashlytics จะส่งการแจ้งเตือนทางอีเมลและใน Firebase Console ซึ่งช่วยให้สามารถย้อนกลับเวอร์ชันที่มีปัญหาหรือเผยแพร่ hotfix ได้อย่างรวดเร็ว
Crashlytics มีกลไกสามอย่างสำหรับเพิ่มบริบทให้กับรายงาน: คีย์ที่กำหนดเอง (keys) สำหรับข้อมูลที่มีโครงสร้าง บันทึก (logs) สำหรับร่องรอยข้อความ และ Breadcrumbs จาก Analytics สำหรับเส้นทางผู้ใช้ ข้อมูลทั้งสามประเภทจะถูกแนบไปกับรายงานการขัดข้องและแสดงในการ์ดรายละเอียด
Custom Keys คือคู่ "คีย์-ค่า" ที่ส่งไปพร้อมกับการขัดข้องแต่ละครั้ง สูงสุด 64 คีย์ต่อแอปพลิเคชัน แต่ละคีย์เป็นสตริงยาวสูงสุด 1,024 ตัวอักษร คีย์มีประโยชน์สำหรับการทำเครื่องหมายสถานะของแอปพลิเคชัน: ระดับการสมัครสมาชิก สถานะการยืนยันตัวตน หน้าจอล่าสุด เปิด VPN หรือไม่ ค่าจะถูกเขียนทับ — คีย์ใหม่ที่มีชื่อเดียวกันจะแทนที่คีย์เก่า
Custom Logs คือข้อความที่ Crashlytics เก็บไว้ในบัฟเฟอร์วงกลมขนาด 64 KB บันทึกจะถูกแนบไปกับการขัดข้องครั้งถัดไปโดยอัตโนมัติ หากไม่เกิดการขัดข้อง บันทึกจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ (ไม่ใช้แบนด์วิดท์) การบันทึกใช้สำหรับบันทึกขั้นตอนของผู้ใช้ก่อนการขัดข้อง: "payment_processing_started", "api_call_initiated", "response_received_200"
class PaymentViewModel {
fun processPayment(amount: Double) {
FirebaseCrashlytics.getInstance().log("Payment started: amount=$amount")
FirebaseCrashlytics.getInstance().setCustomKey("last_screen", "payment_screen")
FirebaseCrashlytics.getInstance().setCustomKey("subscription_tier", "basic")
try {
paymentGateway.charge(amount)
} catch (e: NetworkException) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
}
หากเชื่อมต่อ Firebase Analytics ในโปรเจกต์ Crashlytics จะได้รับ Breadcrumbs โดยอัตโนมัติ — 50 เหตุการณ์การวิเคราะห์ล่าสุดก่อนการขัดข้อง แต่ละ breadcrumb ประกอบด้วยชื่อเหตุการณ์และพารามิเตอร์ ซึ่งช่วยให้สามารถสร้างลำดับการกระทำที่นำไปสู่การขัดข้องได้อย่างแม่นยำ: ผู้ใช้เปิดหน้าจอ → เพิ่มสินค้า → ไปที่การชำระเงิน → เกิดการขัดข้อง Breadcrumbs จะแสดงในการ์ด Issue ในแท็บ "บันทึก" แยกต่างหาก
Crashlytics มีประสิทธิภาพสูงสุดเมื่อกำหนดค่าบริบทและกระบวนการจัดการ Issues อย่างถูกต้อง การปฏิบัติแสดงให้เห็นว่าทีมที่นำระเบียบการจัดการการขัดข้องมาใช้ช่วยลดเวลาในการแก้ไขบั๊กวิกฤตลง 60% (ข้อมูล Google, 2026)
ไม่ใช่ทุกการขัดข้องที่สำคัญเท่ากัน การจัดลำดับความสำคัญ ตามจำนวนผู้ใช้และความถี่ช่วยให้มุ่งเน้นไปที่ปัญหาที่สำคัญที่สุด กฎ: แก้ไข Issues ที่ส่งผลกระทบต่อผู้ใช้มากกว่า 0.1% ภายใน 24 ชั่วโมง Issues ที่เกิดขึ้นเพียงครั้งเดียว (< 0.01%) สามารถเลื่อนออกไปจนกว่ารุ่นที่วางแผนไว้ถัดไป Crashlytics จะทำเครื่องหมายการถดถอยโดยอัตโนมัติ — Issues ที่ได้รับการแก้ไขแล้วแต่ปรากฏขึ้นอีกครั้งในเวอร์ชันใหม่
Crashlytics API ช่วยให้สามารถรวมรายงานการขัดข้องเข้ากับไปป์ไลน์ CI/CD ผ่าน REST API หรือ Firebase CLI ในการเผยแพร่แต่ละครั้ง คุณสามารถตรวจสอบโดยอัตโนมัติว่าเปอร์เซ็นต์ผู้ใช้ที่ไม่พบการขัดข้องเกินเกณฑ์หรือไม่ หากเกินเกณฑ์ CI/CD จะบล็อกการปรับใช้และส่งการแจ้งเตือนไปยังทีม Firebase CLI รองรับคำสั่ง firebase crashlytics:builds:upload สำหรับอัปโหลดไฟล์แมป ProGuard/R8 — หากไม่มีไฟล์เหล่านี้ สแต็กจะไม่สามารถอ่านได้
ตามข้อมูลของ Google (2026) แอปพลิเคชันที่ใช้การตรวจสอบเกณฑ์ crash-free อัตโนมัติใน CI/CD เผยแพร่การถดถอยน้อยลง 40% ในโปรดักชัน เกณฑ์ที่แนะนำ: crash-free users >= 99.5% สำหรับรุ่นที่สำคัญ และ >= 99.0% สำหรับรุ่นปกติ
คำถามที่พบบ่อย
Crashlytics ฟรีสูงสุด 500,000 เซสชันต่อวันต่อโปรเจกต์ Firebase เมื่อเกินขีดจำกัด รายงานจะหยุดอัปเดตจนถึงวันถัดไป แต่การรวบรวมข้อมูลไม่หยุด
Crashlytics ทำงานได้โดยไม่ต้องใช้ Analytics แต่เมื่อใช้ Analytics รายงานจะประกอบด้วย Breadcrumbs — 50 เหตุการณ์ผู้ใช้ล่าสุดก่อนการขัดข้อง แนะนำให้เชื่อมต่อทั้งสองโมดูล
การจัดกลุ่ม ดำเนินการตามลายนิ้วมือ (fingerprint) — ผลรวมตรวจสอบของร่องรอยสแต็ก รวมถึงประเภทข้อยกเว้นและหมายเลขบรรทัด การขัดข้องที่มีลายนิ้วมือเดียวกันจะถูกรวมเข้าใน Issue เดียวกัน
ตรวจสอบ การตั้งค่า: ไฟล์ google-services.json, การมีอยู่ของ plugin crashlytics ใน build.gradle, ไม่มีการกรองตามเวอร์ชันในคอนโซล และการมีบิลด์ที่ยอมรับข้อตกลงใบอนุญาต การดีบักทำงานเฉพาะในบิลด์รีลีสเท่านั้น
ได้ ใช้ recordException() สำหรับข้อยกเว้นที่ไม่ร้ายแรง รายงานเหล่านี้ไม่ขัดจังหวะการทำงานของแอปพลิเคชัน แต่แสดงในคอนโซลพร้อมตัวนับจำนวนครั้งที่เกิดและร่องรอยสแต็กที่สมบูรณ์
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม