ปรับแต่งรายงานข้อขัดข้องของ Firebase Crashlytics


ในแดชบอร์ด Crashlytics คุณสามารถคลิกปัญหาและดูรายละเอียด รายงานเหตุการณ์ คุณสามารถปรับแต่งรายงานดังกล่าวเพื่อช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้นในแอปและสถานการณ์รอบเหตุการณ์ที่รายงานไปยัง Crashlytics ได้ดีขึ้น

รายงานข้อยกเว้นที่ตรวจไม่พบ

คุณสามารถจับข้อผิดพลาด "ร้ายแรง" ทั้งหมดที่แสดงภายในเฟรมเวิร์ก Flutter โดยอัตโนมัติได้ด้วยการลบล้าง FlutterError.onError ด้วย FirebaseCrashlytics.instance.recordFlutterFatalError หรือหากต้องการจับข้อยกเว้น "ที่ไม่ร้ายแรง" ด้วย ให้ลบล้าง FlutterError.onError ด้วย FirebaseCrashlytics.instance.recordFlutterError ดังนี้

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

ข้อผิดพลาดแบบอะซิงโครนัส

เฟรมเวิร์ก Flutter จะไม่ตรวจจับข้อผิดพลาดแบบอะซิงโครนัสในกรณีต่อไปนี้

ElevatedButton(
  onPressed: () async {
    throw Error();
  }
  ...
)

หากต้องการจับข้อผิดพลาดดังกล่าว ให้ใช้ตัวแฮนเดิล PlatformDispatcher.instance.onError ดังนี้

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

ข้อผิดพลาดภายนอก Flutter

หากต้องการจับข้อผิดพลาดที่เกิดขึ้นนอกบริบท Flutter ให้ติดตั้งโปรแกรมรับฟังข้อผิดพลาดใน Isolate ปัจจุบัน

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

รายงานข้อยกเว้นที่พบ

นอกจากการรายงานข้อขัดข้องของแอปโดยอัตโนมัติแล้ว Crashlytics ยังให้คุณบันทึกข้อยกเว้นที่ไม่ร้ายแรงและส่งให้คุณได้เมื่อมีการรายงานเหตุการณ์ร้ายแรงครั้งถัดไปหรือเมื่อแอปรีสตาร์ท

ใช้เมธอด recordError เพื่อบันทึกข้อยกเว้นที่ไม่ร้ายแรงในการตรวจจับของแอป บล็อก เช่น

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

คุณอาจต้องบันทึกข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาด ซึ่งทำได้ โดยใช้พร็อพเพอร์ตี้ information:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

ข้อยกเว้นเหล่านี้จะปรากฏเป็นปัญหาที่ไม่ร้ายแรงในคอนโซล Firebase ข้อมูลสรุปปัญหาประกอบด้วยข้อมูลสถานะทั้งหมดที่คุณได้รับจากข้อขัดข้องตามปกติ รวมถึงรายละเอียดตามเวอร์ชันและอุปกรณ์ฮาร์ดแวร์

Crashlytics ประมวลผลข้อยกเว้นในเทรดเบื้องหลังโดยเฉพาะเพื่อ ลดผลกระทบด้านประสิทธิภาพที่มีต่อแอปให้เหลือน้อยที่สุด วิธีลดเครือข่ายของผู้ใช้ การเข้าชม Crashlytics จะจำกัดจำนวนรายงานที่ส่งออกจากอุปกรณ์ หากจำเป็น

เพิ่มคีย์ที่กำหนดเอง

คีย์ที่กำหนดเองจะช่วยให้คุณทราบสถานะที่เฉพาะเจาะจงของแอปก่อนที่จะเกิดข้อขัดข้อง คุณสามารถเชื่อมโยงคู่คีย์/ค่าที่กำหนดเองกับรายงานข้อขัดข้อง จากนั้นใช้ คีย์ที่กำหนดเองเพื่อค้นหาและกรองรายงานข้อขัดข้องในคอนโซล Firebase

  • ในแดชบอร์ด Crashlytics คุณสามารถค้นหาปัญหาที่ตรงกับคีย์ที่กำหนดเองได้

  • ขณะตรวจสอบปัญหาในคอนโซล คุณสามารถดู คีย์ที่กำหนดเองที่เกี่ยวข้องสำหรับแต่ละเหตุการณ์ (แท็บย่อยคีย์) และแม้แต่กรอง เหตุการณ์ตามคีย์ที่กำหนดเอง (เมนูตัวกรองที่ด้านบนของหน้า)

ใช้เมธอดอินสแตนซ์ setCustomKey เพื่อตั้งค่าคู่คีย์/ค่า นี่คือบางส่วน ตัวอย่าง:

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

เพิ่มข้อความบันทึกที่กำหนดเอง

คุณสามารถเพิ่มบริบทเพิ่มเติมเกี่ยวกับเหตุการณ์ที่นำไปสู่การชนได้ บันทึก Crashlytics ที่กำหนดเองไปยังแอปของคุณ Crashlytics เชื่อมโยงบันทึก กับข้อมูลข้อขัดข้องของคุณ และแสดงข้อมูลใน คอนโซล Firebase, ใต้แท็บ บันทึก Crashlytics

ใช้ log เพื่อช่วยระบุปัญหา เช่น

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

กำหนดตัวระบุผู้ใช้

ในการวินิจฉัยปัญหา ข้อมูลว่าผู้ใช้รายใดพบข้อขัดข้องหนึ่งๆ มักจะมีประโยชน์ Crashlytics มีวิธีระบุผู้ใช้โดยไม่ระบุตัวตนในรายงานข้อขัดข้อง

หากต้องการเพิ่มรหัสผู้ใช้ลงในรายงาน ให้กําหนดตัวระบุที่ไม่ซ้ำกันให้กับผู้ใช้แต่ละรายในรูปแบบหมายเลขประจําตัว โทเค็น หรือค่าที่ผ่านการแฮช โดยทําดังนี้

FirebaseCrashlytics.instance.setUserIdentifier("12345");

หากต้องการล้างตัวระบุผู้ใช้หลังจากตั้งค่าแล้ว ให้รีเซ็ตค่าเป็นสตริงว่าง การล้างตัวระบุผู้ใช้จะไม่ลบตัวระบุที่มีอยู่ ระเบียน Crashlytics รายการ หากต้องการลบระเบียนที่เชื่อมโยงกับรหัสผู้ใช้ ให้ติดต่อทีมสนับสนุนของ Firebase

รับบันทึกเบรดครัมบ์

บันทึกเบรดครัมบ์ช่วยให้คุณเข้าใจการโต้ตอบของผู้ใช้กับแอปที่ทําให้เกิดเหตุการณ์ข้อขัดข้อง เหตุการณ์ที่ไม่ใช่ข้อขัดข้องร้ายแรง หรือ ANR ได้ดียิ่งขึ้น บันทึกเหล่านี้อาจ เกิดประโยชน์เมื่อพยายามสร้างข้อผิดพลาดซ้ำและแก้ไขข้อบกพร่อง

บันทึกเบรดครัมบ์ขับเคลื่อนโดย Google Analytics ดังนั้นในการรับบันทึกเบรดครัมบ์ จำเป็นต้อง เปิดใช้ Google Analytics สำหรับโปรเจ็กต์ Firebase และ เพิ่ม Firebase SDK สำหรับ Google Analytics กับแอปของคุณ เมื่อมีคุณสมบัติตามข้อกำหนดเหล่านี้ บันทึกเบรดครัมบ์จะ รวมกับข้อมูลของเหตุการณ์ภายในแท็บบันทึกเมื่อคุณดูรายละเอียด ของปัญหา

SDK Analytics จะบันทึกเหตุการณ์ screen_view โดยอัตโนมัติ ซึ่งจะทำให้บันทึกเบรดครัมบ์แสดงรายการหน้าจอที่มีการดูก่อน เหตุการณ์ข้อขัดข้อง ไม่ร้ายแรง หรือ ANR บันทึกเบรดครัมบ์ screen_view ประกอบด้วย พารามิเตอร์ firebase_screen_class

บันทึกเบรดครัมบ์จะสร้างขึ้นจากเหตุการณ์ที่กําหนดเองที่คุณบันทึกด้วยตนเองภายในเซสชันของผู้ใช้ รวมถึงข้อมูลพารามิเตอร์ของเหตุการณ์ ข้อมูลนี้ช่วยแสดงชุดการดำเนินการของผู้ใช้ที่นำไปสู่ข้อขัดข้อง เหตุการณ์ที่ไม่ร้ายแรง หรือ ANR

โปรดทราบว่าคุณสามารถ ควบคุมการเก็บรวบรวมและการใช้ข้อมูลของ Google Analytics ซึ่งมีข้อมูลที่สร้างบันทึกเบรดครัมบ์

เปิดใช้การรายงานการเลือกใช้

โดยค่าเริ่มต้น Crashlytics จะรวบรวมรายงานข้อขัดข้องโดยอัตโนมัติสำหรับ ผู้ใช้แอป เพื่อให้ผู้ใช้ควบคุมข้อมูลที่ส่งได้มากขึ้น ให้เปิดใช้ การเลือกใช้การรายงานโดยปิดการใช้งานการรายงานอัตโนมัติและส่งข้อมูลไปที่ Crashlytics เมื่อคุณเลือก "ในรหัส":

  1. วิธีปิดการรวบรวมอัตโนมัติตามค่าเริ่มต้น

    แพลตฟอร์ม Apple

    เพิ่มคีย์ใหม่ลงในไฟล์ Info.plist ดังนี้

    • คีย์: FirebaseCrashlyticsCollectionEnabled
    • ค่า: false

    Android

    ในบล็อก application ของไฟล์ AndroidManifest.xml ให้เพิ่ม แท็ก meta-data เพื่อปิดการรวบรวมอัตโนมัติ

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. เปิดใช้การเก็บรวบรวมสําหรับผู้ใช้บางรายโดยการเรียกใช้การลบล้างCrashlyticsการเก็บรวบรวมข้อมูลขณะรันไทม์

    ค่าการลบล้างจะยังคงอยู่ตลอดการเปิดตัวแอปเพื่อให้ Crashlytics รวบรวมรายงานได้โดยอัตโนมัติ หากต้องการเลือกไม่ใช้การรายงานข้อขัดข้องอัตโนมัติ ให้ส่ง false เป็นค่าลบล้าง เมื่อตั้งค่าเป็น false ระบบจะไม่ใช้ค่าใหม่จนกว่าแอปจะทำงานครั้งถัดไป

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

จัดการข้อมูลเชิงลึกเกี่ยวกับข้อขัดข้อง

ข้อมูลเชิงลึกเกี่ยวกับข้อขัดข้องจะช่วยคุณแก้ปัญหาโดยการเปรียบเทียบสแต็กเทรซที่ลบข้อมูลระบุตัวบุคคลแล้วกับเทรซจากแอป Firebase อื่นๆ และแจ้งให้คุณทราบว่าปัญหาของคุณเป็นส่วนหนึ่งของแนวโน้มที่ใหญ่ขึ้นหรือไม่ สําหรับปัญหาหลายอย่าง ข้อมูลวิเคราะห์ข้อขัดข้องยังมีแหล่งข้อมูลเพื่อช่วยแก้ไขข้อขัดข้องด้วย

Crash Insights ใช้ข้อมูลข้อขัดข้องที่รวบรวมไว้เพื่อระบุแนวโน้มความเสถียรที่พบบ่อย หากไม่ต้องการแชร์ข้อมูลของแอป คุณสามารถเลือกไม่ใช้ข้อมูลเชิงลึกข้อขัดข้องจากเมนูข้อมูลเชิงลึกข้อขัดข้องที่ด้านบนของรายการปัญหา Crashlytics ในคอนโซล Firebase