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

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 Logs

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

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

ตั้งค่าตัวระบุผู้ใช้

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

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

FirebaseCrashlytics.instance.setUserIdentifier("12345");

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

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

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

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

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

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

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

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

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

  1. ปิดการรวบรวมอัตโนมัติโดยกำเนิด:

    แพลตฟอร์มของ Apple

    เพิ่มคีย์ใหม่ให้กับไฟล์ Info.plist ของคุณ:

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

    หุ่นยนต์

    ในบล็อก 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);
    

จัดการข้อมูล Crash Insights

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

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