ปรับแต่งรายงานข้อขัดข้องของ 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 ให้ติดตั้งข้อผิดพลาด Listener ใน 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 เพื่อบันทึกข้อยกเว้นที่ไม่ร้ายแรงในบล็อก catch ของแอป เช่น

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 มีวิธีระบุผู้ใช้โดยไม่ระบุตัวตนในรายงานข้อขัดข้อง

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

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 อื่นๆ และแจ้งให้คุณทราบหากปัญหาที่พบ อยู่ในเทรนด์ที่ใหญ่กว่า สําหรับปัญหาหลายอย่าง ข้อมูลวิเคราะห์ข้อขัดข้องยังมีแหล่งข้อมูลเพื่อช่วยแก้ไขข้อขัดข้องด้วย

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