ทำความเข้าใจข้อขัดข้องของเกม Unity โดยใช้ฟีเจอร์ขั้นสูงของ Crashlytics

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้ฟีเจอร์ขั้นสูงของ Crashlytics ซึ่งจะทำให้เห็นข้อขัดข้องและสถานการณ์ที่อาจทำให้เกิดขึ้นได้ดียิ่งขึ้น

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

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

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

สิ่งที่คุณจะได้เรียนรู้

  • ประเภทข้อผิดพลาดที่ Crashlytics ตรวจพบโดยอัตโนมัติ
  • ข้อผิดพลาดอื่นๆ ที่ตั้งใจบันทึกได้
  • วิธีใส่ข้อมูลเพิ่มเติมลงในข้อผิดพลาดเหล่านี้เพื่อให้เข้าใจง่ายขึ้น

สิ่งที่ต้องมี

  • Unity (เวอร์ชันต่ำสุดที่แนะนำ 2019 ขึ้นไป) ที่มีเวอร์ชันใดเวอร์ชันหนึ่งหรือทั้ง 2 รายการต่อไปนี้
    • การสนับสนุนบิลด์ของ iOS
    • การสนับสนุนบิลด์ของ Android
  • (สำหรับ Android เท่านั้น) Firebase CLI (ใช้เพื่ออัปโหลดสัญลักษณ์สำหรับรายงานข้อขัดข้อง)

2. ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

ส่วนต่อไปนี้จะอธิบายวิธีดาวน์โหลดโค้ด Level Up ด้วย Firebase และเปิดใน Unity

โปรดทราบว่า Codelab อื่นๆ อีกหลายแห่งของ Firebase + Unity มีการใช้เกมตัวอย่าง Level Up with Firebase คุณจึงอาจทำงานในส่วนนี้เสร็จเรียบร้อยแล้ว ในกรณีนี้ คุณไปที่ขั้นตอนสุดท้ายในหน้า "เพิ่ม Firebase SDK สำหรับ Unity" ได้โดยตรง

ดาวน์โหลดโค้ด

โคลนที่เก็บ GitHub ของ Codelab นี้จากบรรทัดคำสั่ง

git clone https://github.com/firebase/level-up-with-firebase.git

หรือหากยังไม่ได้ติดตั้ง Git ให้ดาวน์โหลดที่เก็บเป็นไฟล์ ZIP

เปิด Level Up ด้วย Firebase ในตัวแก้ไข Unity

  1. เปิด Unity Hub แล้วคลิกลูกศรแบบเลื่อนลงข้างเปิดจากแท็บโปรเจ็กต์
  2. คลิกเพิ่มโปรเจ็กต์จากดิสก์
  3. ไปที่ไดเรกทอรีที่มีโค้ด แล้วคลิกตกลง
  4. หากได้รับข้อความแจ้ง ให้เลือกเวอร์ชันตัวแก้ไข Unity ที่จะใช้และแพลตฟอร์มเป้าหมาย (Android หรือ iOS)
  5. คลิกที่ชื่อโปรเจ็กต์ level-up-with-firebase แล้วโปรเจ็กต์จะเปิดขึ้นในตัวแก้ไข Unity
  6. หากเครื่องมือแก้ไขไม่เปิดโดยอัตโนมัติ ให้เปิด MainGameScene ในเนื้อหา > Hamster ในแท็บโปรเจ็กต์ของ Unity Editor
    ff4ea3f3c0d29379.png

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการใช้ Unity ได้ที่การทำงานใน Unity

3. เพิ่ม Firebase ไปยังโปรเจ็กต์ Unity

สร้างโปรเจ็กต์ Firebase

  1. ในคอนโซล Firebase ให้คลิกเพิ่มโปรเจ็กต์
  2. หากต้องการสร้างโปรเจ็กต์ใหม่ ให้ป้อนชื่อโปรเจ็กต์ที่ต้องการ
    การดำเนินการนี้ยังจะตั้งค่ารหัสโปรเจ็กต์ (แสดงอยู่ใต้ชื่อโปรเจ็กต์) ตามชื่อโปรเจ็กต์ด้วย หรือคุณจะคลิกไอคอนแก้ไขบนรหัสโปรเจ็กต์เพื่อปรับแต่งเพิ่มเติมก็ได้
  3. หากได้รับข้อความแจ้ง ให้ตรวจสอบและยอมรับข้อกำหนดของ Firebase
  4. คลิกต่อไป
  5. เลือกตัวเลือกเปิดใช้ Google Analytics สำหรับโปรเจ็กต์นี้ แล้วคลิกต่อไป
  6. เลือกบัญชี Google Analytics ที่มีอยู่เพื่อใช้ หรือเลือกสร้างบัญชีใหม่เพื่อสร้างบัญชีใหม่
  7. คลิกสร้างโครงการ
  8. เมื่อสร้างโปรเจ็กต์แล้ว ให้คลิกต่อไป

ลงทะเบียนแอปด้วย Firebase

  1. ยังคงอยู่ในคอนโซล Firebase จากตรงกลางของหน้าภาพรวมโปรเจ็กต์ ให้คลิกไอคอน Unity เพื่อเปิดเวิร์กโฟลว์การตั้งค่า หรือหากคุณเพิ่มแอปในโปรเจ็กต์ Firebase แล้ว ให้คลิกเพิ่มแอปเพื่อแสดงตัวเลือกแพลตฟอร์ม
  2. เลือกเพื่อลงทะเบียนเป้าหมายบิลด์ของทั้ง Apple (iOS) และ Android
  3. ป้อนรหัสเฉพาะแพลตฟอร์มของโปรเจ็กต์ Unity สำหรับ Codelab นี้ ให้ป้อนข้อมูลต่อไปนี้
  4. (ไม่บังคับ) ป้อนชื่อเล่นเฉพาะแพลตฟอร์มของโปรเจ็กต์ Unity
  5. คลิกลงทะเบียนแอป แล้วดำเนินการต่อในส่วนดาวน์โหลดไฟล์การกำหนดค่า

เพิ่มไฟล์การกำหนดค่า Firebase

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

  1. ดาวน์โหลดไฟล์กำหนดค่าที่ใช้ได้ทั้ง 2 ไฟล์:
    • สําหรับ Apple (iOS): ดาวน์โหลด GoogleService-Info.plist
    • สำหรับ Android: ดาวน์โหลด google-services.json
  2. เปิดหน้าต่าง Project ของโปรเจ็กต์ Unity จากนั้นย้ายไฟล์การกำหนดค่าทั้ง 2 ไฟล์ไปยังโฟลเดอร์ Assets
  3. กลับไปที่คอนโซล Firebase ในขั้นตอนการตั้งค่า ให้คลิกถัดไป แล้วเพิ่ม Firebase SDK สำหรับ Unity

เพิ่ม Firebase SDK สำหรับ Unity

  1. คลิกดาวน์โหลด Firebase Unity SDK ในคอนโซล Firebase
  2. แตกไฟล์ SDK ในจุดที่สะดวกสบาย
  3. ในโปรเจ็กต์ Unity แบบเปิด ให้ไปที่เนื้อหา > นำเข้าแพ็กเกจ > แพ็กเกจที่กำหนดเอง
  4. ในกล่องโต้ตอบนำเข้าแพ็กเกจ ให้ไปที่ไดเรกทอรีที่มี SDK ที่แยกไฟล์แล้ว เลือก FirebaseAnalytics.unitypackage แล้วคลิกเปิด
  5. จากกล่องโต้ตอบนำเข้าแพ็กเกจ Unity ที่ปรากฏขึ้น ให้คลิกนำเข้า
  6. ทำซ้ำขั้นตอนก่อนหน้าเพื่อนำเข้า FirebaseCrashlytics.unitypackage
  7. กลับไปที่คอนโซล Firebase แล้วคลิกถัดไปในเวิร์กโฟลว์การตั้งค่า

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม Firebase SDK ไปยังโปรเจ็กต์ Unity ได้ที่ตัวเลือกการติดตั้ง Unity เพิ่มเติม

4. ตั้งค่า Crashlytics ในโปรเจ็กต์ Unity

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

เริ่มต้น Crashlytics SDK

  1. ใน Assets/Hamster/Scripts/MainGame.cs ให้เพิ่มคำสั่ง using ต่อไปนี้
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    
    โมดูลแรกช่วยให้คุณใช้เมธอดจาก Crashlytics SDK ได้ และโมดูลที่ 2 จะมีส่วนขยายบางรายการไปยัง C# Tasks API หากไม่มีคำสั่ง ทั้ง 2 รายการ using โค้ดต่อไปนี้จะใช้งานไม่ได้
  2. หากยังอยู่ใน MainGame.cs ให้เพิ่มการเริ่มต้น Firebase ไปยังเมธอด Start() ที่มีอยู่โดยเรียกใช้ InitializeFirebaseAndStartGame():
    void Start()
    {
      Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
      InitializeFirebaseAndStartGame();
    }
    
  3. และเช่นเคย ใน MainGame.cs ให้ค้นหา InitializeFirebaseAndStartGame() แล้วประกาศตัวแปรของแอป แล้วเขียนทับการติดตั้งใช้งานเมธอด เช่น
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
      Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
      .ContinueWithOnMainThread(
        previousTask => 
        {
          var dependencyStatus = previousTask.Result;
          if (dependencyStatus == Firebase.DependencyStatus.Available) {
            // Create and hold a reference to your FirebaseApp,
            app = Firebase.FirebaseApp.DefaultInstance;
            // Set the recommended Crashlytics uncaught exception behavior.
            Crashlytics.ReportUncaughtExceptionsAsFatal = true;
            InitializeCommonDataAndStartGame();
          } else {
            UnityEngine.Debug.LogError(
              $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
              "Firebase Unity SDK is not safe to use here");
          }
        });
    }
    

การวางตรรกะการเริ่มต้นที่นี่จะป้องกันไม่ให้เกิดการโต้ตอบของผู้เล่นก่อนที่ทรัพยากร Dependency ของ Firebase จะเริ่มต้น

คำถามที่พบบ่อยเกี่ยวกับ Crashlytics เกี่ยวกับประโยชน์และผลของการรายงานข้อยกเว้นที่ไม่มีการจัดการว่าร้ายแรง

สร้างโปรเจ็กต์และอัปโหลดสัญลักษณ์

ขั้นตอนในการสร้างและอัปโหลดสัญลักษณ์สำหรับแอป iOS และ Android จะแตกต่างกัน

iOS+ (แพลตฟอร์ม Apple)

  1. ส่งออกโปรเจ็กต์ไปยังพื้นที่ทำงาน Xcode จากกล่องโต้ตอบ Build Settings
  2. สร้างแอป
    สำหรับแพลตฟอร์ม Apple ปลั๊กอิน Firebase Unity Editor จะกำหนดค่าโปรเจ็กต์ Xcode โดยอัตโนมัติเพื่อสร้างและอัปโหลดไฟล์สัญลักษณ์ที่เข้ากันได้กับ Crashlytics ไปยังเซิร์ฟเวอร์ Firebase สำหรับแต่ละบิลด์ ต้องระบุข้อมูลสัญลักษณ์นี้เพื่อดูสแต็กเทรซที่แทนที่ด้วยสัญลักษณ์ในหน้าแดชบอร์ด Crashlytics

Android

  1. (ระหว่างการตั้งค่าครั้งแรกเท่านั้น ไม่ใช่สำหรับแต่ละบิลด์) ตั้งค่าบิลด์
    1. สร้างโฟลเดอร์ใหม่ชื่อ Builds ที่รูทของไดเรกทอรีโปรเจ็กต์ (กล่าวคือ เป็นโฟลเดอร์ข้างเคียงของไดเรกทอรี Assets) แล้วสร้างโฟลเดอร์ย่อยชื่อ Android
    2. ในไฟล์ > การตั้งค่าบิลด์ > การตั้งค่าโปรแกรมเล่น > การกำหนดค่า ตั้งค่าแบ็กเอนด์ของสคริปต์เป็น IL2CPP
      • โดยทั่วไปแล้ว IL2CPP จะทำให้บิลด์มีขนาดเล็กลงและมีประสิทธิภาพดีกว่า
      • IL2CPP เป็นตัวเลือกเดียวที่ใช้งานได้ใน iOS และการเลือกตัวเลือกนี้จะทำให้ทั้ง 2 แพลตฟอร์มมีความเท่าเทียมกันมากขึ้น และทำให้ความแตกต่างของการแก้ไขข้อบกพร่องระหว่าง 2 แพลตฟอร์ม (หากคุณเลือกสร้างทั้ง 2 แบบ) ง่ายขึ้น
  2. สร้างแอปของคุณ ในไฟล์ > การตั้งค่าบิลด์ ให้กรอกข้อมูลต่อไปนี้
    1. ตรวจสอบว่าได้เลือกสร้างสัญลักษณ์.zip แล้ว (หรือหากมีเมนูแบบเลื่อนลง ให้เลือกการแก้ไขข้อบกพร่อง)
    2. สร้าง APK โดยตรงจาก Unity Editor ลงในโฟลเดอร์ย่อย Builds/Android ที่คุณเพิ่งสร้าง
  3. เมื่อสร้างเสร็จแล้ว คุณต้องสร้างไฟล์สัญลักษณ์ที่เข้ากันได้กับ Crashlytics และอัปโหลดไปยังเซิร์ฟเวอร์ Firebase ต้องใช้ข้อมูลสัญลักษณ์นี้เพื่อดูสแต็กเทรซที่แทนที่ด้วยสัญลักษณ์สำหรับข้อขัดข้องของไลบรารีแบบเนทีฟในหน้าแดชบอร์ด Crashlytics

    สร้างและอัปโหลดไฟล์สัญลักษณ์นี้โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
    • FIREBASE_APP_ID: รหัสแอป Android ใน Firebase (ไม่ใช่ชื่อแพ็กเกจ) ค้นหาค่านี้ในไฟล์ google-services.json ที่คุณดาวน์โหลดไว้ก่อนหน้านี้ ค่านี้คือค่า mobilesdk_app_id
      ตัวอย่างรหัสแอป Android ใน Firebase: 1:567383003300:android:17104a2ced0c9b9b
    • PATH/TO/SYMBOLS: เส้นทางของไฟล์สัญลักษณ์แบบซิปที่สร้างขึ้นในไดเรกทอรี Builds/Android เมื่อบิลด์เสร็จแล้ว (เช่น Builds/Android/myapp-1.0-v100.symbols.zip)

บังคับให้ทดสอบการขัดข้องเพื่อตั้งค่าให้เสร็จสิ้น

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

  1. ใน MainGameScene ให้ค้นหา EmptyObjectGameObject ในลำดับชั้นของตัวแก้ไข ให้เพิ่มสคริปต์ต่อไปนี้ลงในสคริปต์แล้วบันทึกฉาก สคริปต์นี้จะทำให้การทดสอบขัดข้องเป็นเวลา 2-3 วินาทีหลังจากที่คุณเรียกใช้แอป
    using System;
    using UnityEngine;
    
    public class CrashlyticsTester : MonoBehaviour {
        // Update is called once per frame
        void Update()
        {
            // Tests your Crashlytics implementation by
            // throwing an exception every 60 frames.
            // You should see reports in the Firebase console
            // a few minutes after running your app with this method.
            if(Time.frameCount >0 && (Time.frameCount%60) == 0)
            {
                throw new System.Exception("Test exception; please ignore");
            }
        }
    }
    
  2. สร้างแอปและอัปโหลดข้อมูลสัญลักษณ์หลังจากสร้างเสร็จแล้ว
    • iOS: ปลั๊กอิน Firebase Unity Editor จะกำหนดค่าโปรเจ็กต์ Xcode โดยอัตโนมัติเพื่ออัปโหลดไฟล์สัญลักษณ์
    • Android: เรียกใช้คำสั่ง Firebase CLI crashlytics:symbols:upload เพื่ออัปโหลดไฟล์สัญลักษณ์
  3. เรียกใช้แอป เมื่อแอปทำงานแล้ว ให้ดูบันทึกของอุปกรณ์และรอให้ข้อยกเว้นทริกเกอร์จาก CrashlyticsTester
    • iOS: ดูบันทึกในแผงด้านล่างของ Xcode
    • Android: ดูบันทึกโดยเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล: adb logcat
  4. ไปที่แดชบอร์ดของ Crashlytics เพื่อดูข้อยกเว้น คุณจะเห็นปัญหาในตารางปัญหาที่ด้านล่างของหน้าแดชบอร์ด คุณจะได้ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสำรวจรายงานเหล่านี้ใน Codelab ในภายหลัง
  5. เมื่อยืนยันว่าอัปโหลดเหตุการณ์ไปยัง Crashlytics แล้ว ให้เลือก EmptyObject GameObject ที่แนบมา นำเฉพาะคอมโพเนนต์ CrashlyticsTester ออก จากนั้นบันทึกฉากเพื่อคืนค่าเป็นเงื่อนไขเดิม

5. เปิดใช้และทำความเข้าใจเมนูการแก้ไขข้อบกพร่อง

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

เปิดใช้เมนูแก้ไขข้อบกพร่อง

โปรเจ็กต์ Unity มีปุ่มสำหรับเข้าถึงเมนูแก้ไขข้อบกพร่องอยู่ แต่ยังไม่ได้เปิดใช้ คุณต้องเปิดใช้งานปุ่มเพื่อเข้าถึงปุ่มจาก Prefab ของ MainMenu:

  1. ใน Unity Editor ให้เปิด Prefab ที่ชื่อ MainMenu4148538cbe9f36c5.png
  2. ในลำดับชั้นของ Prefab ให้ค้นหาวัตถุย่อยที่ปิดใช้ ชื่อ DebugMenuButton แล้วเลือกวัตถุนั้น816f8f9366280f6c.png
  3. เปิดใช้ DebugMenuButton โดยเลือกช่องที่มุมซ้ายบนทางด้านซ้ายของช่องข้อความที่มี DebugMenuButton8a8089d2b4886da2.png
  4. บันทึก Prefab
  5. เรียกใช้เกมในโปรแกรมตัดต่อหรือบนอุปกรณ์ของคุณ ตอนนี้คุณควรเข้าถึงเมนูได้แล้ว

ดูตัวอย่างและทำความเข้าใจเนื้อหาของเมธอดสำหรับเมนูการแก้ไขข้อบกพร่อง

จากนั้นใน Codelab นี้ คุณจะต้องเขียนเนื้อหาของเมธอดสำหรับเมธอด Crashlytics ที่มีการแก้ไขข้อบกพร่องที่กำหนดค่าไว้ล่วงหน้า แต่ในโปรเจ็กต์ Unity Level Up with Firebase จะมีการกำหนดและเรียกใช้งานเมธอดจาก DebugMenu.cs

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

เปิด DebugMenu.cs แล้วค้นหาเมธอดต่อไปนี้

วิธีสร้างและระบุปัญหาเกี่ยวกับ Crashlytics

  • CrashNow
  • LogNonfatalError
  • LogStringsAndCrashNow
  • SetAndOverwriteCustomKeyThenCrash
  • SetLogsAndKeysBeforeANR

วิธีการบันทึกเหตุการณ์ Analytics เพื่อช่วยในการแก้ไขข้อบกพร่อง

  • LogProgressEventWithStringLiterals
  • LogIntScoreWithBuiltInEventAndParams

ในขั้นตอนต่อๆ ไปของ Codelab นี้ คุณจะได้นำวิธีการเหล่านี้ไปใช้และเรียนรู้วิธีที่เป็นวิธีช่วยแก้ปัญหาเฉพาะหน้าที่อาจเกิดขึ้นในการพัฒนาเกม

6. ดูแลให้มีการส่งรายงานข้อขัดข้องในระหว่างการพัฒนา

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

สำหรับโปรเจ็กต์ Unity ระบบจะเขียนเหตุการณ์ข้อขัดข้องและข้อยกเว้นในเกมลงในดิสก์ทันที สำหรับข้อยกเว้นที่ไม่พบแต่ไม่ขัดข้องที่ทำให้เกมขัดข้อง (เช่น ข้อยกเว้น C# ที่ไม่ถูกตรวจจับในตรรกะเกม) คุณให้ Crashlytics SDK รายงานว่าเป็นเหตุการณ์ร้ายแรงได้โดยตั้งค่าพร็อพเพอร์ตี้ Crashlytics.ReportUncaughtExceptionsAsFatal เป็น true เพื่อเริ่มต้น Crashlytics ในโปรเจ็กต์ Unity ระบบจะรายงานเหตุการณ์เหล่านี้ไปยัง Crashlytics แบบเรียลไทม์โดยที่ผู้ใช้ไม่ต้องรีสตาร์ทเกม โปรดทราบว่าข้อขัดข้องของระบบจะรายงานเป็นเหตุการณ์ร้ายแรงเสมอ และจะส่งไปเมื่อผู้ใช้ปลายทางรีสตาร์ทเกม

นอกจากนี้ โปรดคำนึงถึงความแตกต่างระหว่างวิธีที่สภาพแวดล้อมรันไทม์ที่ต่างกันส่งข้อมูล Crashlytics ไปยัง Firebase ด้วย (ซึ่งมีนัยสำคัญ) ดังต่อไปนี้

เครื่องจำลอง iOS

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

อุปกรณ์เคลื่อนที่ (Android และ iOS)

  • เฉพาะสำหรับ Android: ระบบจะรายงาน ANR ใน Android 11 ขึ้นไปเท่านั้น ระบบจะรายงาน ANR และเหตุการณ์ที่ไม่ร้ายแรงในการเรียกใช้ครั้งถัดไป

ตัวแก้ไข Unity:

ทดสอบเกมขัดข้องเมื่อแตะปุ่มใน CrashNow()

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

  1. หากต้องการแสดงให้เห็นว่าการทำงานนี้เป็นแบบอัตโนมัติจริงๆ ให้เปิด DebugMenu.cs แล้วเขียนทับเมธอด CrashNow() ดังนี้
    void CrashNow()
    {
        TestCrash();
    }
    
  2. สร้างแอปของคุณ
  3. (Android เท่านั้น) อัปโหลดสัญลักษณ์โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. แตะปุ่มข้อขัดข้องเลย แล้วไปยังขั้นตอนถัดไปของ Codelab เพื่อดูวิธีดูและตีความรายงานข้อขัดข้อง

7. ทำความเข้าใจรายงานปัญหาในคอนโซล Firebase

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

  1. แตะปุ่มขัดข้องเลย แล้วรีสตาร์ทแอป
  2. ไปที่แดชบอร์ดของ Crashlytics เลื่อนลงไปที่ตารางปัญหาที่ด้านล่างของแดชบอร์ด ซึ่ง Crashlytics จะจัดกลุ่มเหตุการณ์ที่มีสาเหตุที่แท้จริงเดียวกันเข้าเป็น "ปัญหา"
  3. คลิกปัญหาใหม่ที่แสดงในตารางปัญหา การดำเนินการนี้จะแสดงสรุปเหตุการณ์เกี่ยวกับแต่ละเหตุการณ์ที่ส่งไปยัง Firebase

    คุณควรจะเห็นบางอย่าง เช่น ภาพหน้าจอต่อไปนี้ สังเกตได้ว่าสรุปเหตุการณ์แสดงสแต็กเทรซของการเรียกใช้ที่นำไปสู่ข้อขัดข้องอย่างชัดเจน40c96abe7f90c3aa.png

ข้อมูลเมตาเพิ่มเติม

แท็บที่มีประโยชน์อีกแท็บหนึ่งคือแท็บข้อมูลเมตาของ Unity ส่วนนี้จะแจ้งให้ทราบเกี่ยวกับแอตทริบิวต์ของอุปกรณ์ที่เกิดเหตุการณ์ขึ้น รวมถึงฟีเจอร์ทางกายภาพ รุ่น/ข้อมูลจำเพาะของ CPU และเมตริก GPU ทุกประเภท

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

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

41d8d7feaa87454d.png

8. ส่ง รับ และบันทึกข้อยกเว้น

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

  1. ใน Assets/Hamster/Scripts/States/DebugMenu.cs ให้เพิ่มคำสั่งต่อไปนี้ต่อท้ายคำสั่ง using
    // Import Firebase
    using Firebase.Crashlytics;
    
  2. ยังคงอยู่ใน DebugMenu.cs ให้เขียนทับ LogNonfatalError() ดังนี้
    void LogNonfatalError()
    {
        try
        {
            throw new System.Exception($"Test exception thrown in {nameof(LogNonfatalError)}");
        }
        catch(System.Exception exception)
        {
            Crashlytics.LogException(exception);
        }
    }
    
  3. สร้างแอปของคุณ
  4. (Android เท่านั้น) อัปโหลดสัญลักษณ์โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  5. แตะปุ่มบันทึกข้อผิดพลาดที่ไม่ร้ายแรง แล้วรีสตาร์ทแอป
  6. ไปที่แดชบอร์ดของ Crashlytics คุณจะเห็นสิ่งที่คล้ายกับที่เห็นในขั้นตอนสุดท้ายของ Codelab นี้
  7. แต่ในตอนนี้ ให้จำกัดตัวกรองประเภทเหตุการณ์เป็นไม่ร้ายแรง เพื่อให้คุณดูเฉพาะข้อผิดพลาดที่ไม่ร้ายแรง เช่น ข้อผิดพลาดที่คุณเพิ่งบันทึก
    a39ea8d9944cbbd9.png

9. บันทึกสตริงไปยัง Crashlytics เพื่อให้เข้าใจกระบวนการดำเนินการโปรแกรมได้ดียิ่งขึ้น

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

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

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

  1. ใน Assets/Hamster/Scripts/States/DebugMenu.cs ให้เขียนทับ LogStringsAndCrashNow() ดังนี้
    void LogStringsAndCrashNow()
    {
        Crashlytics.Log($"This is the first of two descriptive strings in {nameof(LogStringsAndCrashNow)}");
        const bool RUN_OPTIONAL_PATH = false;
        if(RUN_OPTIONAL_PATH)
        {
            Crashlytics.Log(" As it stands, this log should not appear in your records because it will never be called.");
        }
        else
        {
            Crashlytics.Log(" A log that will simply inform you which path of logic was taken. Akin to print debugging.");
        }
        Crashlytics.Log($"This is the second of two descriptive strings in {nameof(LogStringsAndCrashNow)}");
        TestCrash();
    }
    
  2. สร้างแอปของคุณ
  3. (Android เท่านั้น) อัปโหลดสัญลักษณ์โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. แตะปุ่มสตริงบันทึกและข้อขัดข้องเลย แล้วรีสตาร์ทแอป
  5. กลับไปที่แดชบอร์ดของ Crashlytics แล้วคลิกปัญหาใหม่ล่าสุดที่แสดงอยู่ในตารางปัญหา คุณจะเห็นสิ่งที่คล้ายกับฉบับก่อนหน้าอีกครั้ง
    7aabe103b8589cc7.png
  6. อย่างไรก็ตาม หากคลิกแท็บบันทึกในสรุปเหตุการณ์ คุณจะเห็นมุมมองดังนี้
    4e27aa407b7571cf.png

10. เขียนและเขียนทับคีย์ที่กำหนดเอง

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

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

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

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

  1. ใน Assets/Hamster/Scripts/States/DebugMenu.cs ให้เขียนทับ SetAndOverwriteCustomKeyThenCrash() ดังนี้
    void SetAndOverwriteCustomKeyThenCrash()
    {
        const string CURRENT_TIME_KEY = "Current Time";
        System.TimeSpan currentTime = System.DateTime.Now.TimeOfDay;
        Crashlytics.SetCustomKey(
            CURRENT_TIME_KEY,
            DayDivision.GetPartOfDay(currentTime).ToString() // Values must be strings
            );
    
        // Time Passes
        currentTime += DayDivision.DURATION_THAT_ENSURES_PHASE_CHANGE;
    
        Crashlytics.SetCustomKey(
            CURRENT_TIME_KEY,
            DayDivision.GetPartOfDay(currentTime).ToString()
            );
        TestCrash();
    }
    
  2. สร้างแอปของคุณ
  3. (Android เท่านั้น) อัปโหลดสัญลักษณ์โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. แตะปุ่มตั้งค่าคีย์ที่กำหนดเองและข้อขัดข้อง จากนั้นรีสตาร์ทแอป
  5. กลับไปที่แดชบอร์ดของ Crashlytics แล้วคลิกปัญหาใหม่ล่าสุดที่แสดงอยู่ในตารางปัญหา คุณจะเห็นสิ่งที่คล้ายกับปัญหาก่อนหน้านี้อีกครั้ง
  6. แต่ในตอนนี้ ให้คลิกแท็บคีย์ในสรุปเหตุการณ์ เพื่อดูค่าของคีย์ต่างๆ ซึ่งรวมถึง Current Time:
    7dbe1eb00566af98.png

เหตุใดคุณจึงควรใช้คีย์ที่กำหนดเองแทนบันทึกที่กำหนดเอง

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

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

11. (Android เท่านั้น) ใช้คีย์และบันทึกที่กำหนดเองเพื่อทำความเข้าใจและวินิจฉัย ANR

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

ANR เป็นประสบการณ์ที่ไม่ดีของผู้ใช้และ (ดังที่กล่าวไว้ในลิงก์ ANR ด้านบน) อาจส่งผลต่อการค้นพบได้ของแอปใน Google Play Store เนื่องจากความซับซ้อนและมักเกิดจากโค้ดแบบหลายเธรดที่มีลักษณะการทำงานที่ต่างกันอย่างมากในโทรศัพท์รุ่นต่างๆ การสร้าง ANR ซ้ำขณะแก้ไขข้อบกพร่องจึงมักจะยากมากแต่ก็แทบเป็นไปไม่ได้เลย ด้วยเหตุนี้ แนวทางที่ดีที่สุดคือการพูดคุยกับพวกเขาโดยใช้การวิเคราะห์และนิรนัย

ในวิธีนี้ เราจะใช้ทั้ง Crashlytics.LogException, Crashlytics.Log และ Crashlytics.SetCustomKey เพื่อเสริมการบันทึกปัญหาอัตโนมัติและให้ข้อมูลเพิ่มเติม

  1. ใน Assets/Hamster/Scripts/States/DebugMenu.cs ให้เขียนทับ SetLogsAndKeysBeforeANR() ดังนี้
    void SetLogsAndKeysBeforeANR()
    {
        System.Action<string,long> WaitAndRecord =
        (string methodName, long targetCallLength)=>
        {
            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
            const string CURRENT_FUNCTION = "Current Async Function";
    
            // Initialize key and start timing
            Crashlytics.SetCustomKey(CURRENT_FUNCTION, methodName);
            stopWatch.Start();
    
            // The actual (simulated) work being timed.
            BusyWaitSimulator.WaitOnSimulatedBlockingWork(targetCallLength);
    
            // Stop timing
            stopWatch.Stop();
    
            if(stopWatch.ElapsedMilliseconds>=BusyWaitSimulator.EXTREME_DURATION_MILLIS)
            {
              Crashlytics.Log($"'{methodName}' is long enough to cause an ANR.");
            }
            else if(stopWatch.ElapsedMilliseconds>=BusyWaitSimulator.SEVERE_DURATION_MILLIS)
            {
              Crashlytics.Log($"'{methodName}' is long enough it may cause an ANR");
            }
        };
    
        WaitAndRecord("DoSafeWork",1000L);
        WaitAndRecord("DoSevereWork",BusyWaitSimulator.SEVERE_DURATION_MILLIS);
        WaitAndRecord("DoExtremeWork",2*BusyWaitSimulator.EXTREME_DURATION_MILLIS);
    }
    
  2. สร้างแอปของคุณ
  3. อัปโหลดสัญลักษณ์โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. แตะปุ่มตั้งค่าบันทึกและคีย์ → ANR จากนั้นรีสตาร์ทแอป
  5. กลับไปที่แดชบอร์ดของ Crashlytics แล้วคลิกปัญหาใหม่ในตารางปัญหาเพื่อดูสรุปเหตุการณ์ หากการโทรดำเนินไปอย่างราบรื่น คุณจะเห็นลักษณะเช่นนี้
    876c3cff7037bd07.png

    อย่างที่เห็นคือ Firebase ระบุการรอที่ไม่ว่างในเทรดเป็นเหตุผลหลักที่แอปทำให้เกิด ANR
  6. หากคุณดูบันทึกในแท็บบันทึกของสรุปเหตุการณ์ คุณจะเห็นว่าวิธีสุดท้ายที่บันทึกว่าเสร็จสมบูรณ์คือ DoSevereWork
    5a4bec1cf06f6984.png

    ในทางตรงกันข้าม วิธีสุดท้ายที่ระบุว่าเริ่มต้นคือ DoExtremeWork ซึ่งระบุว่า ANR เกิดขึ้นระหว่างวิธีนี้และเกมปิดก่อนที่จะบันทึก DoExtremeWork

    89d86d5f598ecf3a.png

ทำไมต้องดำเนินการแบบนี้

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

12. การสลับเหตุการณ์ Analytics เพื่อเพิ่มประสิทธิภาพให้รายงาน

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

คุณควรใช้วิธีการเหล่านี้ร่วมกับวิธีการอื่นๆ ซึ่งแตกต่างจากวิธีการอื่นๆ ที่คุณเขียนใน Codelab นี้ เรียกใช้เมธอดเหล่านี้ (โดยกดปุ่มที่เกี่ยวข้องในเมนูแก้ไขข้อบกพร่อง) ในลำดับที่ต้องการก่อนที่จะเรียกใช้เมธอดอื่นๆ จากนั้นเมื่อตรวจสอบข้อมูลเกี่ยวกับปัญหา Crashlytics ที่เฉพาะเจาะจง คุณจะเห็นบันทึกตามลำดับของเหตุการณ์ Analytics ข้อมูลนี้สามารถใช้ในเกมเพื่อให้เข้าใจถึงการไหลเวียนของโปรแกรมหรือข้อมูลของผู้ใช้ร่วมกันได้ดียิ่งขึ้น โดยขึ้นอยู่กับวิธีที่คุณใช้แอป

  1. ใน Assets/Hamster/Scripts/States/DebugMenu.cs ให้เขียนทับการใช้งานที่มีอยู่ตามวิธีการต่อไปนี้
    public void LogProgressEventWithStringLiterals()
    {
          Firebase.Analytics.FirebaseAnalytics.LogEvent("progress", "percent", 0.4f);
    }
    
    public void LogIntScoreWithBuiltInEventAndParams()
    {
          Firebase.Analytics.FirebaseAnalytics
            .LogEvent(
              Firebase.Analytics.FirebaseAnalytics.EventPostScore,
              Firebase.Analytics.FirebaseAnalytics.ParameterScore,
              42
            );
    }
    
  2. สร้างเกมและทำให้เกมใช้งานได้ จากนั้นป้อนเมนูแก้ไขข้อบกพร่อง
  3. (Android เท่านั้น) อัปโหลดสัญลักษณ์โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. กดปุ่มต่อไปนี้อย่างน้อยหนึ่งปุ่มอย่างน้อย 1 ครั้งเพื่อเรียกใช้ฟังก์ชันข้างต้น:
    • เหตุการณ์สตริงบันทึก
    • เหตุการณ์การลงชื่อเข้าสู่ระบบ
  5. กดปุ่มขัดข้องเลย
  6. รีสตาร์ทเกมเพื่อให้อัปโหลดเหตุการณ์ข้อขัดข้องไปยัง Firebase
  7. เมื่อคุณบันทึกเหตุการณ์ Analytics ลำดับต่างๆ ที่กำหนดเอง แล้วให้เกมสร้างเหตุการณ์ที่ Crashlytics สร้างรายงาน (ตามที่คุณเห็น) ระบบจะเพิ่มเหตุการณ์ดังกล่าวไปยังแท็บบันทึกของสรุปเหตุการณ์ของ Crashlytics ดังนี้
    d3b16d78f76bfb04.png

13. จากนี้ไป

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

หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป ให้พิจารณารวม GWP-ASan ซึ่งเป็นฟีเจอร์ตัวจัดสรรหน่วยความจำในเครื่องซึ่งมีประโยชน์ในการแก้ไขข้อบกพร่องที่เกิดจากข้อผิดพลาดของหน่วยความจําของระบบ เช่น use-after-free และข้อบกพร่อง heap-buffer-overflow หากต้องการใช้ประโยชน์จากฟีเจอร์การแก้ไขข้อบกพร่องนี้ ให้เปิดใช้ GWP-ASan อย่างชัดแจ้ง

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

ไปที่ Codelab เกี่ยวกับเครื่องมือของเกม Unity ด้วยการกำหนดค่าระยะไกล ซึ่งคุณจะได้เรียนรู้เกี่ยวกับการใช้การกำหนดค่าระยะไกลและการทดสอบ A/B ใน Unity