ปรับแต่งรายงานข้อขัดข้องสำหรับ Flutter

เลือกแพลตฟอร์ม iOS+ Android Flutter Unity


คุณสามารถคลิกปัญหาเพื่อดูรายงานเหตุการณ์โดยละเอียดได้ในแดชบอร์ด DevOps และการมีส่วนร่วม > Crashlytics ของคอนโซล Firebase คุณสามารถปรับแต่งรายงานเหล่านั้นเพื่อช่วยให้เข้าใจสิ่งที่เกิดขึ้นในแอปและสถานการณ์เกี่ยวกับเหตุการณ์ที่รายงานไปยัง 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'],
);

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

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

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

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

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

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

ใช้เมธอดอินสแตนซ์ 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 จะเชื่อมโยงบันทึกกับข้อมูลข้อขัดข้องและแสดงในแท็บบันทึกเมื่อคุณดูรายละเอียดของปัญหา (ดูปัญหาทั้งหมดในแดชบอร์ดDevOps และการมีส่วนร่วม > Crashlytics ของคอนโซล Firebase)

ใช้ 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 ลงในแอป เมื่อเป็นไปตามข้อกำหนดเหล่านี้แล้ว บันทึกเบรดครัมบ์จะรวมอยู่ในข้อมูลของเหตุการณ์โดยอัตโนมัติภายในแท็บบันทึกเมื่อคุณดูรายละเอียดของปัญหา (ดูปัญหาทั้งหมดในแดชบอร์ดDevOps และการมีส่วนร่วม > Crashlytics ของคอนโซล Firebase)

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 รวบรวมรายงานสำหรับผู้ใช้รายนั้นได้โดยอัตโนมัติ

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

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

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

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

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

ขั้นตอนถัดไป

  • ส่งออกข้อมูลไปยัง BigQuery หรือ Cloud Logging เพื่อใช้การวิเคราะห์และฟีเจอร์ขั้นสูง เช่น การค้นหาข้อมูล การสร้างแดชบอร์ดที่กำหนดเอง และการตั้งค่าการแจ้งเตือนที่กำหนดเอง