Hiểu sự cố của trò chơi Unity khi sử dụng các tính năng nâng cao của Crashlytics, Hiểu sự cố của trò chơi Unity khi sử dụng các tính năng nâng cao của Crashlytics

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng các tính năng nâng cao của Crashlytics, giúp bạn hiểu rõ hơn về các sự cố và các trường hợp có thể gây ra sự cố.

Bạn sẽ thêm chức năng mới vào trò chơi mẫu, MechaHamster: Tăng cấp với phiên bản Firebase . Trò chơi mẫu này là phiên bản mới của trò chơi Firebase cổ điển MechaHamster loại bỏ hầu hết chức năng Firebase tích hợp sẵn, mang lại cho bạn cơ hội triển khai các cách sử dụng mới của Firebase thay cho chúng.

Bạn sẽ thêm một menu gỡ lỗi vào trò chơi. Menu gỡ lỗi này gọi các phương thức mà bạn sẽ tạo và cho phép bạn thực hiện các chức năng khác nhau của Crashlytics. Các phương pháp này sẽ chỉ cho bạn cách chú thích các báo cáo sự cố tự động bằng khóa tùy chỉnh, nhật ký tùy chỉnh, lỗi không nghiêm trọng, v.v.

Sau khi xây dựng trò chơi, bạn sẽ sử dụng menu gỡ lỗi và kiểm tra kết quả để hiểu cái nhìn độc đáo mà chúng cung cấp về cách trò chơi của bạn chạy trong thực tế.

Bạn sẽ học được gì

  • Các loại lỗi được Crashlytics tự động phát hiện.
  • Các lỗi bổ sung có thể được ghi lại có mục đích.
  • Làm cách nào để thêm thông tin vào các lỗi này để dễ hiểu hơn.

Những gì bạn cần

  • Unity (Phiên bản được đề xuất tối thiểu 2019+) với một hoặc cả hai điều sau:
    • Hỗ trợ xây dựng iOS
    • Hỗ trợ xây dựng Android
  • (Chỉ dành cho Android) CLI Firebase (dùng để tải biểu tượng lên cho báo cáo sự cố)

2. Thiết lập môi trường phát triển của bạn

Các phần sau đây mô tả cách tải xuống mã Tăng cấp bằng Firebase và mở mã đó trong Unity.

Xin lưu ý rằng trò chơi mẫu Lên cấp với Firebase này được một số lớp học lập trình Firebase + Unity khác sử dụng, vì vậy có thể bạn đã hoàn thành các nhiệm vụ trong phần này. Nếu vậy, bạn có thể chuyển thẳng đến bước cuối cùng trên trang này: "Thêm SDK Firebase cho Unity".

Tải mã xuống

Sao chép kho lưu trữ GitHub của lớp học lập trình này từ dòng lệnh:

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

Ngoài ra, nếu bạn chưa cài đặt git, bạn có thể tải xuống kho lưu trữ dưới dạng tệp ZIP .

Mở Tăng cấp với Firebase trong trình chỉnh sửa Unity

  1. Khởi chạy Unity Hub và từ tab Dự án , nhấp vào mũi tên thả xuống bên cạnh Mở .
  2. Nhấp vào Thêm dự án từ đĩa .
  3. Điều hướng đến thư mục chứa mã, sau đó nhấp vào OK .
  4. Nếu được nhắc, hãy chọn phiên bản trình chỉnh sửa Unity để sử dụng và nền tảng mục tiêu của bạn (Android hoặc iOS).
  5. Nhấp vào tên dự án, tăng cấp với firebase và dự án sẽ mở trong trình chỉnh sửa Unity.
  6. Nếu trình soạn thảo của bạn không tự động mở nó, hãy mở MainGameScene trong Nội dung > Hamster trong tab Dự án của Trình chỉnh sửa Unity.
    ff4ea3f3c0d29379.png

Để biết thêm thông tin về cách cài đặt và sử dụng Unity, hãy xem Làm việc trong Unity .

3. Thêm Firebase vào dự án Unity của bạn

Tạo dự án Firebase

  1. Trong bảng điều khiển Firebase , nhấp vào Thêm dự án .
  2. Để tạo một dự án mới, hãy nhập tên dự án mong muốn.
    Điều này cũng sẽ đặt ID dự án (hiển thị bên dưới tên dự án) thành giá trị nào đó dựa trên tên dự án. Bạn có thể tùy ý nhấp vào biểu tượng chỉnh sửa trên ID dự án để tùy chỉnh thêm.
  3. Nếu được nhắc, hãy xem lại và chấp nhận các điều khoản của Firebase .
  4. Nhấp vào Tiếp tục .
  5. Chọn tùy chọn Bật Google Analytics cho dự án này rồi nhấp vào Tiếp tục .
  6. Chọn tài khoản Google Analytics hiện có để sử dụng hoặc chọn Tạo tài khoản mới để tạo tài khoản mới.
  7. Nhấp vào Tạo dự án .
  8. Khi dự án đã được tạo, hãy nhấp vào Tiếp tục .

Đăng ký ứng dụng của bạn với Firebase

  1. Vẫn trong bảng điều khiển Firebase , từ giữa trang tổng quan dự án, hãy nhấp vào biểu tượng Unity để khởi chạy quy trình thiết lập hoặc nếu bạn đã thêm ứng dụng vào dự án Firebase của mình, hãy nhấp vào Thêm ứng dụng để hiển thị các tùy chọn nền tảng.
  2. Chọn để đăng ký cả mục tiêu xây dựng Apple (iOS) và Android.
  3. Nhập (các) ID dành riêng cho nền tảng của dự án Unity của bạn. Đối với lớp học lập trình này, hãy nhập thông tin sau:
    • Đối với Apple (iOS) : Nhập com.google.firebase.level-up vào trường ID gói iOS .
    • Đối với Android : Nhập com.google.firebase.level_up vào trường tên gói Android .
  4. (Tùy chọn) Nhập (các) biệt hiệu dành riêng cho nền tảng của dự án Unity của bạn.
  5. Nhấp vào Đăng ký ứng dụng , sau đó chuyển sang phần Tải xuống tệp cấu hình .

Thêm tệp cấu hình Firebase

Sau khi nhấp vào Đăng ký ứng dụng , bạn sẽ được nhắc tải xuống hai tệp cấu hình (một tệp cấu hình cho mỗi mục tiêu xây dựng). Dự án Unity của bạn cần siêu dữ liệu Firebase trong các tệp này để kết nối với Firebase.

  1. Tải xuống cả hai tệp cấu hình có sẵn:
    • Đối với Apple (iOS) : Tải xuống GoogleService-Info.plist .
    • Đối với Android : Tải xuống google-services.json .
  2. Mở cửa sổ Project của dự án Unity của bạn, sau đó di chuyển cả hai tệp cấu hình vào thư mục Nội dung .
  3. Quay lại bảng điều khiển Firebase, trong quy trình thiết lập, hãy nhấp vào Tiếp theo và tiến hành Thêm SDK Firebase cho Unity.

Thêm SDK Firebase cho Unity

  1. Nhấp vào Tải xuống Firebase Unity SDK trong bảng điều khiển Firebase.
  2. Giải nén SDK ở nơi thuận tiện.
  3. Trong Dự án Unity đang mở của bạn, hãy điều hướng đến Nội dung > Gói nhập > Gói tùy chỉnh .
  4. Trong hộp thoại Nhập gói , hãy điều hướng đến thư mục chứa SDK đã giải nén, chọn FirebaseAnalytics.unitypackage rồi nhấp vào Mở .
  5. Từ hộp thoại Nhập gói thống nhất xuất hiện, nhấp vào Nhập .
  6. Lặp lại các bước trước để nhập FirebaseCrashlytics.unitypackage .
  7. Quay lại bảng điều khiển Firebase và trong quy trình thiết lập, hãy nhấp vào Tiếp theo .

Để biết thêm thông tin về cách thêm SDK Firebase vào các dự án Unity, hãy xem Tùy chọn cài đặt Unity bổ sung .

4. Thiết lập Crashlytics trong dự án Unity của bạn

Để sử dụng Crashlytics trong các dự án Unity, bạn sẽ cần thực hiện thêm một số bước thiết lập. Tất nhiên, bạn sẽ cần khởi tạo SDK. Ngoài ra, bạn sẽ cần tải lên các biểu tượng của mình để có thể xem các dấu vết ngăn xếp được biểu tượng hóa trong bảng điều khiển Firebase và bạn sẽ cần thực hiện một sự cố thử nghiệm để đảm bảo rằng Firebase đang nhận được các sự kiện sự cố của bạn.

Khởi tạo SDK Crashlytics

  1. Trong Assets/Hamster/Scripts/MainGame.cs , thêm câu lệnh using sau:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    
    Mô-đun đầu tiên cho phép bạn sử dụng các phương thức từ SDK Crashlytics và mô-đun thứ hai chứa một số tiện ích mở rộng cho API tác vụ C# . Nếu không có cả hai câu lệnh using , đoạn mã sau sẽ không hoạt động.
  2. Vẫn trong MainGame.cs , hãy thêm khởi tạo Firebase vào phương thức Start() hiện có bằng cách gọi InitializeFirebaseAndStartGame() :
    void Start()
    {
      Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
      InitializeFirebaseAndStartGame();
    }
    
  3. Và một lần nữa, trong MainGame.cs , hãy tìm InitializeFirebaseAndStartGame() , khai báo một biến ứng dụng và sau đó ghi đè cách triển khai của phương thức như sau:
    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");
          }
        });
    }
    

Việc đặt logic khởi tạo ở đây sẽ ngăn cản sự tương tác của người chơi trước khi khởi tạo phần phụ thuộc Firebase.

Lợi ích và tác động của việc báo cáo các trường hợp ngoại lệ chưa được xử lý là nghiêm trọng sẽ được thảo luận trong Câu hỏi thường gặp về Crashlytics .

Xây dựng dự án của bạn và tải lên các biểu tượng

Các bước tạo và tải biểu tượng lên là khác nhau đối với ứng dụng iOS và Android.

iOS+ (nền tảng Apple)

  1. Từ hộp thoại Cài đặt bản dựng , xuất dự án của bạn sang không gian làm việc Xcode.
  2. Xây dựng ứng dụng của bạn.
    Đối với nền tảng Apple, plugin Firebase Unity Editor tự động định cấu hình dự án Xcode của bạn để tạo và tải tệp biểu tượng tương thích với Crashlytics lên máy chủ Firebase cho mỗi bản dựng. Thông tin ký hiệu này là bắt buộc để xem dấu vết ngăn xếp được ký hiệu trong bảng thông tin Crashlytics.

Android

  1. (chỉ trong quá trình thiết lập ban đầu, không phải cho mỗi bản dựng) Thiết lập bản dựng của bạn:
    1. Tạo một thư mục mới có tên Builds ở thư mục gốc của dự án (tức là thư mục anh em với thư mục Nội dung của bạn), sau đó tạo một thư mục con có tên Android .
    2. Trong Tệp > Cài đặt bản dựng > Cài đặt trình phát > Cấu hình , đặt Phần cuối tập lệnh thành IL2CPP.
      • IL2CPP thường khiến các bản dựng nhỏ hơn và có hiệu suất tốt hơn.
      • IL2CPP cũng là tùy chọn DUY NHẤT có sẵn trên iOS và việc chọn nó ở đây cho phép hai nền tảng có tính tương đương tốt hơn và giúp việc gỡ lỗi giữa hai nền tảng trở nên đơn giản hơn (nếu bạn chọn xây dựng cả hai).
  2. Xây dựng ứng dụng của bạn. Trong Tệp > Cài đặt bản dựng , hãy hoàn thành các bước sau:
    1. Đảm bảo rằng Tạo biểu tượng.zip được chọn (hoặc nếu được hiển thị trong danh sách thả xuống, hãy chọn Gỡ lỗi ).
    2. Xây dựng APK của bạn trực tiếp từ Unity Editor vào thư mục con Builds/Android mà bạn vừa tạo.
  3. Sau khi quá trình xây dựng của bạn hoàn tất, bạn cần tạo tệp biểu tượng tương thích với Crashlytics và tải tệp đó lên máy chủ Firebase. Thông tin ký hiệu này là bắt buộc để xem dấu vết ngăn xếp được ký hiệu cho các sự cố thư viện gốc trong bảng thông tin Crashlytics.

    Tạo và tải lên tệp ký hiệu này bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
    • FIREBASE_APP_ID : ID ứng dụng Android Firebase của bạn (không phải tên gói của bạn). Tìm giá trị này trong tệp google-services.json mà bạn đã tải xuống trước đó. Đó là giá trị mobilesdk_app_id .
      Ví dụ ID ứng dụng Android Firebase: 1:567383003300:android:17104a2ced0c9b9b
    • PATH/TO/SYMBOLS : đường dẫn của tệp biểu tượng nén được tạo trong thư mục Builds/Android khi quá trình xây dựng của bạn hoàn tất (ví dụ: Builds/Android/myapp-1.0-v100.symbols.zip ).

Buộc thử nghiệm sự cố để hoàn tất quá trình thiết lập

Để hoàn tất việc thiết lập Crashlytics và xem dữ liệu ban đầu trong bảng điều khiển Crashlytics của bảng điều khiển Firebase, bạn cần thực hiện thử nghiệm sự cố.

  1. Trong MainGameScene, tìm EmptyObject GameObject trong trình soạn thảo Hierarchy , thêm đoạn mã sau vào đó rồi lưu cảnh. Tập lệnh này sẽ gây ra sự cố kiểm tra vài giây sau khi bạn chạy ứng dụng của mình.
    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. Xây dựng ứng dụng của bạn và tải lên thông tin biểu tượng sau khi quá trình xây dựng của bạn kết thúc.
    • iOS : Plugin Firebase Unity Editor tự động định cấu hình dự án Xcode của bạn để tải lên tệp biểu tượng của bạn.
    • Android : Chạy lệnh Firebase CLI crashlytics:symbols:upload để tải lên tệp biểu tượng của bạn.
  3. Chạy ứng dụng của bạn. Khi ứng dụng của bạn đang chạy, hãy xem nhật ký thiết bị và đợi ngoại lệ kích hoạt từ CrashlyticsTester .
    • iOS : Xem nhật ký ở khung dưới cùng của Xcode.
    • Android : Xem nhật ký bằng cách chạy lệnh sau trong thiết bị đầu cuối: adb logcat .
  4. Hãy truy cập bảng điều khiển Crashlytics để xem ngoại lệ! Bạn sẽ thấy nó trong bảng Vấn đề ở cuối trang tổng quan. Ở phần sau của lớp học lập trình, bạn sẽ tìm hiểu thêm về cách khám phá các báo cáo này.
  5. Sau khi bạn xác nhận sự kiện đã được tải lên Crashlytics, hãy chọn EmptyObject GameObject mà bạn đã đính kèm, chỉ xóa thành phần CrashlyticsTester rồi lưu cảnh để khôi phục cảnh đó về tình trạng ban đầu.

5. Kích hoạt và hiểu Menu gỡ lỗi

Cho đến nay, bạn đã thêm Crashlytics vào dự án Unity của mình, thiết lập xong và xác nhận rằng SDK Crashlytics đang tải các sự kiện lên Firebase. Bây giờ, bạn sẽ tạo một menu trong dự án Unity để minh họa cách sử dụng chức năng Crashlytics nâng cao hơn trong trò chơi của mình. Dự án Tăng cấp với Firebase Unity đã có Menu gỡ lỗi ẩn mà bạn sẽ hiển thị và viết chức năng cho nó.

Kích hoạt Menu gỡ lỗi

Nút truy cập Menu gỡ lỗi tồn tại trong dự án Unity của bạn nhưng hiện chưa được bật. Bạn phải kích hoạt nút để truy cập nó từ prefab MainMenu :

  1. Trong Unity Editor, hãy mở prefab có tên MainMenu . 4148538cbe9f36c5.png
  2. Trong hệ thống phân cấp nhà lắp ghép, hãy tìm đối tượng phụ bị vô hiệu hóa có tên DebugMenuButton rồi chọn nó. 816f8f9366280f6c.png
  3. Bật DebugMenuButton bằng cách chọn hộp ở góc trên bên trái bên trái trường văn bản chứa DebugMenuButton . 8a8089d2b4886da2.png
  4. Lưu nhà tiền chế.
  5. Chạy trò chơi trong trình chỉnh sửa hoặc trên thiết bị của bạn. Menu bây giờ có thể truy cập được.

Xem trước và hiểu nội dung phương thức cho Menu gỡ lỗi

Ở phần sau của lớp học lập trình này, bạn sẽ viết nội dung phương thức cho một số phương thức Crashlytics gỡ lỗi được cấu hình sẵn. Tuy nhiên, trong dự án Tăng cấp với Firebase Unity, các phương thức được xác định và gọi từ DebugMenu.cs .

Mặc dù một số phương thức này sẽ gọi các phương thức Crashlytics và đưa ra lỗi, nhưng khả năng Crashlytics phát hiện các lỗi này không phụ thuộc vào việc gọi các phương thức đó trước tiên. Đúng hơn, các báo cáo sự cố được tạo ra từ việc tự động phát hiện lỗi sẽ được nâng cao nhờ thông tin được thêm vào bằng các phương pháp này.

Mở DebugMenu.cs rồi tìm các phương pháp sau:

Các phương pháp tạo và chú thích các sự cố Crashlytics:

  • CrashNow
  • LogNonfatalError
  • LogStringsAndCrashNow
  • SetAndOverwriteCustomKeyThenCrash
  • SetLogsAndKeysBeforeANR

Các phương pháp ghi nhật ký sự kiện Analytics để hỗ trợ gỡ lỗi:

  • LogProgressEventWithStringLiterals
  • LogIntScoreWithBuiltInEventAndParams

Trong các bước sau của lớp học lập trình này, bạn sẽ triển khai các phương pháp này và tìm hiểu cách chúng giúp giải quyết các tình huống cụ thể có thể xảy ra trong quá trình phát triển trò chơi.

6. Đảm bảo gửi báo cáo sự cố trong quá trình phát triển

Trước khi bạn bắt đầu triển khai các phương pháp gỡ lỗi này và xem chúng ảnh hưởng như thế nào đến báo cáo sự cố, hãy đảm bảo bạn hiểu cách các sự kiện được báo cáo cho Crashlytics.

Đối với các dự án Unity, các sự kiện ngoại lệ và sự cố trong trò chơi của bạn sẽ được ghi ngay vào đĩa. Đối với các trường hợp ngoại lệ chưa được phát hiện không làm hỏng trò chơi của bạn (ví dụ: các ngoại lệ C# chưa được phát hiện trong logic trò chơi), bạn có thể yêu cầu SDK Crashlytics báo cáo chúng là các sự kiện nghiêm trọng bằng cách đặt thuộc tính Crashlytics.ReportUncaughtExceptionsAsFatal thành true khi bạn khởi tạo Crashlytics trong dự án Unity của mình . Những sự kiện này được báo cáo cho Crashlytics trong thời gian thực mà không cần người dùng cuối phải khởi động lại trò chơi. Lưu ý rằng các sự cố gốc luôn được báo cáo là sự kiện nghiêm trọng và được gửi đi khi người dùng cuối khởi động lại trò chơi.

Ngoài ra, hãy lưu ý những khác biệt nhỏ—nhưng quan trọng—sau đây giữa cách các môi trường thời gian chạy khác nhau gửi thông tin Crashlytics tới Firebase:

Trình mô phỏng iOS:

  • Thông tin Crashlytics được báo cáo khi và chỉ khi bạn tách Xcode khỏi trình mô phỏng. Nếu Xcode được đính kèm, nó sẽ phát hiện lỗi ngược dòng, ngăn cản việc gửi thông tin.

Thiết bị vật lý di động (Android và iOS):

  • Dành riêng cho Android: ANR chỉ được báo cáo trên Android 11+. ANR và các sự kiện không gây tử vong sẽ được báo cáo trong lần chạy tiếp theo.

Trình chỉnh sửa thống nhất:

Kiểm tra lỗi treo trò chơi của bạn chỉ bằng một nút bấm trong CrashNow()

Sau khi thiết lập Crashlytics trong trò chơi của bạn, SDK Crashlytics sẽ tự động ghi lại các sự cố và ngoại lệ chưa được phát hiện rồi tải chúng lên Firebase để phân tích. Và các báo cáo được hiển thị trong bảng điều khiển Crashlytics trong bảng điều khiển Firebase.

  1. Để chứng minh rằng đây thực sự là tự động: hãy mở DebugMenu.cs và sau đó ghi đè phương thức CrashNow() như sau:
    void CrashNow()
    {
        TestCrash();
    }
    
  2. Xây dựng ứng dụng của bạn.
  3. (Chỉ dành cho Android) Tải biểu tượng của bạn lên bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Nhấn vào nút Sự cố ngay và chuyển sang bước tiếp theo của lớp học lập trình này để tìm hiểu cách xem và diễn giải báo cáo sự cố.

7. Hiểu các báo cáo sự cố trong bảng điều khiển Firebase

Khi xem báo cáo sự cố, bạn cần biết thêm một chút về cách tận dụng tối đa chúng. Mỗi phương pháp bạn viết sẽ hiển thị cách thêm các loại thông tin khác nhau vào báo cáo Crashlytics.

  1. Nhấn vào nút Crash Now rồi khởi động lại ứng dụng của bạn.
  2. Đi tới bảng điều khiển Crashlytics . Cuộn xuống bảng Sự cố ở cuối trang tổng quan nơi Crashlytics nhóm các sự kiện có cùng nguyên nhân gốc rễ thành "sự cố".
  3. Nhấp vào vấn đề mới được liệt kê trong bảng Vấn đề . Việc này sẽ hiển thị tóm tắt Sự kiện về từng sự kiện riêng lẻ được gửi tới Firebase.

    Bạn sẽ thấy một cái gì đó giống như ảnh chụp màn hình sau. Lưu ý cách tóm tắt Sự kiện làm nổi bật dấu vết ngăn xếp của cuộc gọi dẫn đến sự cố. 40c96abe7f90c3aa.png

Siêu dữ liệu bổ sung

Một tab hữu ích khác là tab Siêu dữ liệu Unity . Phần này thông báo cho bạn về các thuộc tính của thiết bị xảy ra sự kiện, bao gồm các tính năng vật lý, kiểu máy/thông số kỹ thuật CPU và tất cả các loại chỉ số GPU.

Đây là một ví dụ trong đó thông tin trong tab này có thể hữu ích:
Hãy tưởng tượng trò chơi của bạn sử dụng nhiều trình đổ bóng để đạt được giao diện nhất định, nhưng không phải tất cả điện thoại đều có GPU có khả năng hiển thị tính năng này. Thông tin trong tab Siêu dữ liệu Unity có thể cho bạn ý tưởng tốt hơn về phần cứng mà ứng dụng của bạn nên kiểm tra khi quyết định những tính năng nào sẽ tự động khả dụng hoặc tắt hoàn toàn.

Mặc dù lỗi hoặc sự cố có thể không bao giờ xảy ra trên thiết bị của bạn nhưng do tính đa dạng rộng rãi của các thiết bị Android, điều này giúp bạn hiểu rõ hơn về các "điểm phát sóng" cụ thể trên thiết bị của đối tượng.

41d8d7feaa87454d.png

8. Ném, bắt và ghi lại một ngoại lệ

Thông thường, với tư cách là nhà phát triển, ngay cả khi mã của bạn nắm bắt và xử lý ngoại lệ thời gian chạy đúng cách, bạn nên lưu ý rằng ngoại lệ đó đã xảy ra và trong trường hợp nào. Crashlytics.LogException có thể được sử dụng cho mục đích chính xác này—để gửi một sự kiện ngoại lệ tới Firebase để bạn có thể gỡ lỗi thêm cho sự cố trong bảng điều khiển Firebase.

  1. Trong Assets/Hamster/Scripts/States/DebugMenu.cs , thêm phần sau vào câu lệnh using :
    // Import Firebase
    using Firebase.Crashlytics;
    
  2. Vẫn trong DebugMenu.cs , ghi đè LogNonfatalError() như sau:
    void LogNonfatalError()
    {
        try
        {
            throw new System.Exception($"Test exception thrown in {nameof(LogNonfatalError)}");
        }
        catch(System.Exception exception)
        {
            Crashlytics.LogException(exception);
        }
    }
    
  3. Xây dựng ứng dụng của bạn.
  4. (Chỉ dành cho Android) Tải biểu tượng của bạn lên bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  5. Nhấn vào nút Ghi lại lỗi không nghiêm trọng rồi khởi động lại ứng dụng của bạn.
  6. Đi tới trang tổng quan Crashlytics và bạn sẽ thấy nội dung tương tự như những gì bạn đã thấy ở bước cuối cùng của lớp học lập trình này.
  7. Tuy nhiên, lần này, hãy giới hạn bộ lọc Loại sự kiện ở mức Không nghiêm trọng để bạn chỉ xem các lỗi không nghiêm trọng, chẳng hạn như lỗi bạn vừa ghi lại.
    a39ea8d9944cbbd9.png

9. Ghi nhật ký chuỗi vào Crashlytics để hiểu rõ hơn về luồng thực thi chương trình

Bạn đã bao giờ thử tìm hiểu lý do tại sao một dòng mã được gọi từ nhiều đường dẫn, hàng trăm, nếu không phải hàng nghìn lần mỗi phiên, lại có thể đột nhiên tạo ra ngoại lệ hoặc gặp sự cố? Mặc dù có thể tốt hơn nếu bạn xem qua mã trong IDE và xem xét các giá trị kỹ hơn, nhưng điều gì sẽ xảy ra nếu điều này chỉ xảy ra với một tỷ lệ phần trăm rất nhỏ người dùng của bạn? Tệ hơn nữa, bạn sẽ làm gì nếu không thể lặp lại sự cố này cho dù bạn có làm gì đi chăng nữa?

Trong những tình huống như thế này, việc có một số bối cảnh có thể tạo ra sự khác biệt lớn. Với Crashlytics.Log , bạn có khả năng viết ra ngữ cảnh bạn cần. Hãy coi những thông điệp này như những gợi ý cho bản thân bạn trong tương lai về những gì có thể xảy ra.

Mặc dù nhật ký có thể được sử dụng theo vô số cách nhưng chúng thường hữu ích nhất để ghi lại các tình huống trong đó thứ tự và/hoặc sự vắng mặt của cuộc gọi là một thông tin cực kỳ quan trọng.

  1. Trong Assets/Hamster/Scripts/States/DebugMenu.cs , ghi đè LogStringsAndCrashNow() như sau:
    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. Xây dựng ứng dụng của bạn.
  3. (Chỉ dành cho Android) Tải biểu tượng của bạn lên bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Nhấn vào nút Chuỗi nhật ký và Sự cố ngay , sau đó khởi động lại ứng dụng của bạn.
  5. Quay lại trang tổng quan Crashlytics và nhấp vào sự cố mới nhất được liệt kê trong bảng Sự cố . Một lần nữa bạn sẽ thấy một cái gì đó tương tự như các vấn đề trước đó.
    7aabe103b8589cc7.png
  6. Tuy nhiên, nếu bạn nhấp vào tab Nhật ký trong Tóm tắt sự kiện , bạn sẽ có được chế độ xem như thế này:
    4e27aa407b7571cf.png

10. Viết và ghi đè khóa tùy chỉnh

Giả sử bạn muốn hiểu rõ hơn về sự cố tương ứng với các biến được đặt thành một số lượng nhỏ giá trị hoặc cấu hình. Sẽ thật tuyệt nếu bạn có thể lọc, dựa trên sự kết hợp của các biến và các giá trị có thể có mà bạn đang xem, tại bất kỳ thời điểm nào.

Ngoài việc ghi nhật ký các chuỗi tùy ý, Crashlytics còn cung cấp một hình thức gỡ lỗi khác khi biết chính xác trạng thái chương trình của bạn khi nó gặp sự cố sẽ có ích: các khóa tùy chỉnh.

Đây là các cặp khóa-giá trị mà bạn có thể đặt cho một phiên. Không giống như nhật ký tích lũy và hoàn toàn bổ sung, khóa có thể được ghi đè để chỉ phản ánh trạng thái gần đây nhất của một biến hoặc điều kiện.

Ngoài vai trò là sổ cái về trạng thái được ghi lại cuối cùng trong chương trình của bạn, các khóa này sau đó có thể được sử dụng làm bộ lọc mạnh mẽ cho các sự cố Crashlytics.

  1. Trong Assets/Hamster/Scripts/States/DebugMenu.cs , ghi đè SetAndOverwriteCustomKeyThenCrash() như sau:
    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. Xây dựng ứng dụng của bạn.
  3. (Chỉ dành cho Android) Tải biểu tượng của bạn lên bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Nhấn vào nút Đặt khóa tùy chỉnh và sự cố , sau đó khởi động lại ứng dụng của bạn.
  5. Quay lại trang tổng quan Crashlytics và nhấp vào sự cố mới nhất được liệt kê trong bảng Sự cố . Một lần nữa bạn sẽ thấy một cái gì đó tương tự như các vấn đề trước đó.
  6. Tuy nhiên, lần này, hãy nhấp vào tab Khóa trong tóm tắt Sự kiện để bạn có thể xem giá trị của các khóa bao gồm Current Time :
    7dbe1eb00566af98.png

Tại sao bạn muốn sử dụng khóa tùy chỉnh thay vì nhật ký tùy chỉnh?

  • Nhật ký rất tốt trong việc lưu trữ dữ liệu tuần tự, nhưng khóa tùy chỉnh sẽ tốt hơn nếu bạn chỉ muốn giá trị gần đây nhất .
  • Trong bảng điều khiển Firebase, bạn có thể dễ dàng lọc sự cố theo giá trị của khóa trong hộp tìm kiếm bảng Sự cố .

Tuy nhiên, tương tự như nhật ký, các khóa tùy chỉnh cũng có giới hạn. Crashlytics hỗ trợ tối đa 64 cặp khóa-giá trị. Sau khi bạn đạt đến ngưỡng này, các giá trị bổ sung sẽ không được lưu. Mỗi cặp khóa-giá trị có thể có kích thước tối đa 1 KB.

11. (Chỉ dành cho Android) Sử dụng khóa và nhật ký tùy chỉnh để hiểu và chẩn đoán ANR

Một trong những loại vấn đề khó gỡ lỗi nhất đối với nhà phát triển Android là lỗi Ứng dụng không phản hồi (ANR). ANR xảy ra khi ứng dụng không phản hồi dữ liệu đầu vào trong hơn 5 giây. Nếu điều này xảy ra, điều đó có nghĩa là ứng dụng bị treo hoặc hoạt động rất chậm. Một hộp thoại được hiển thị cho người dùng và họ có thể chọn "Đợi" hoặc "Đóng ứng dụng".

ANR là trải nghiệm người dùng kém và (như đã đề cập trong liên kết ANR ở trên) có thể ảnh hưởng đến khả năng phát hiện ứng dụng của bạn trong Cửa hàng Google Play. Do tính phức tạp và thường do mã đa luồng có hành vi rất khác nhau trên các mẫu điện thoại khác nhau gây ra nên việc tái tạo ANR trong khi gỡ lỗi thường rất khó, nếu không muốn nói là gần như không thể. Vì vậy, tiếp cận chúng bằng phương pháp phân tích và suy diễn thường là cách tiếp cận tốt nhất.

Trong phương pháp này, chúng tôi sẽ sử dụng kết hợp Crashlytics.LogException , Crashlytics.LogCrashlytics.SetCustomKey để bổ sung tính năng ghi nhật ký sự cố tự động và cung cấp cho chúng tôi thêm thông tin.

  1. Trong Assets/Hamster/Scripts/States/DebugMenu.cs , ghi đè SetLogsAndKeysBeforeANR() như sau:
    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. Xây dựng ứng dụng của bạn.
  3. Tải biểu tượng của bạn lên bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Nhấn vào nút có nhãn Đặt nhật ký và khóa → ANR , sau đó khởi động lại ứng dụng của bạn.
  5. Quay trở lại bảng điều khiển Crashlytics , sau đó nhấp vào vấn đề mới trong bảng Sự cố để xem tóm tắt Sự kiện . Nếu cuộc gọi diễn ra bình thường, bạn sẽ thấy nội dung như thế này:
    876c3cff7037bd07.png

    Như bạn có thể thấy, Firebase đã xác định chính xác tình trạng chờ bận trên chuỗi là lý do chính khiến ứng dụng của bạn kích hoạt ANR.
  6. Nếu nhìn vào nhật ký trong tab Nhật ký của tóm tắt Sự kiện , bạn sẽ thấy phương thức cuối cùng được ghi là hoàn tất là DoSevereWork .
    5a4bec1cf06f6984.png

    Ngược lại, phương thức cuối cùng được liệt kê là bắt đầu là DoExtremeWork , cho biết rằng ANR đã xảy ra trong phương pháp này và trò chơi đã đóng trước khi có thể ghi lại DoExtremeWork .

    89d86d5f598ecf3a.png

Tại sao làm điều này?

  • Việc tái tạo ANR cực kỳ khó khăn, vì vậy việc có thể thu được thông tin phong phú về vùng mã và số liệu là vô cùng quan trọng để tìm ra nó một cách suy diễn.
  • Với thông tin được lưu trữ trong các khóa tùy chỉnh, giờ đây bạn biết luồng không đồng bộ nào mất nhiều thời gian nhất để chạy và luồng nào có nguy cơ kích hoạt ANR. Loại dữ liệu số và logic có liên quan này sẽ cho bạn thấy vị trí nào trong mã của bạn cần tối ưu hóa nhất.

12. Các sự kiện Analytics xen kẽ để làm phong phú thêm báo cáo

Các phương pháp sau đây cũng có thể được gọi từ Menu gỡ lỗi, nhưng thay vì tự tạo ra sự cố, chúng sử dụng Google Analytics làm nguồn thông tin khác để hiểu rõ hơn về hoạt động của trò chơi của bạn.

Không giống như các phương thức khác mà bạn đã viết trong lớp học lập trình này, bạn nên sử dụng các phương thức này kết hợp với các phương thức khác. Gọi các phương thức này (bằng cách nhấn nút tương ứng trong Menu gỡ lỗi) theo bất kỳ thứ tự tùy ý nào bạn muốn trước khi chạy một trong các phương thức khác. Sau đó, khi kiểm tra thông tin về vấn đề Crashlytics cụ thể, bạn sẽ thấy nhật ký theo thứ tự các sự kiện Analytics. Dữ liệu này có thể được sử dụng trong trò chơi để hiểu rõ hơn về sự kết hợp giữa luồng chương trình hoặc thông tin đầu vào của người dùng, tùy thuộc vào cách bạn trang bị ứng dụng của mình.

  1. Trong Assets/Hamster/Scripts/States/DebugMenu.cs , ghi đè các triển khai hiện có của các phương thức sau:
    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. Xây dựng và triển khai trò chơi của bạn, sau đó vào Menu Gỡ lỗi .
  3. (Chỉ dành cho Android) Tải biểu tượng của bạn lên bằng cách chạy lệnh Firebase CLI sau:
    firebase crashlytics:symbols:upload --app=<FIREBASE_APP_ID> <PATH/TO/SYMBOLS>
    
  4. Nhấn ít nhất một trong các nút sau một hoặc nhiều lần để gọi các chức năng trên:
    • Sự kiện chuỗi nhật ký
    • Đăng nhập sự kiện
  5. Nhấn nút Crash Now .
  6. Khởi động lại trò chơi của bạn để tải sự kiện sự cố lên Firebase.
  7. Khi bạn ghi lại các chuỗi sự kiện Analytics tùy ý khác nhau và sau đó để trò chơi của bạn tạo một sự kiện mà Crashlytics tạo báo cáo từ đó (như bạn vừa làm), chúng sẽ được thêm vào tab Nhật ký của Tóm tắt sự kiện Crashlytics như thế này:
    d3b16d78f76bfb04.png

13. Tiến về phía trước

Và cùng với đó, bạn sẽ có cơ sở lý thuyết tốt hơn để bổ sung cho các báo cáo sự cố được tạo tự động của mình. Thông tin mới này cho phép bạn sử dụng trạng thái hiện tại, bản ghi các sự kiện trong quá khứ và các sự kiện Google Analytics hiện có để phân tích rõ hơn trình tự các sự kiện và logic dẫn đến kết quả của nó.

Nếu ứng dụng của bạn nhắm mục tiêu Android 11 (API cấp 30) trở lên, hãy cân nhắc việc kết hợp GWP-ASan , một tính năng cấp phát bộ nhớ gốc hữu ích để gỡ lỗi các sự cố do lỗi bộ nhớ gốc gây ra, chẳng hạn như lỗi use-after-free và lỗi heap-buffer-overflow . Để tận dụng tính năng gỡ lỗi này, hãy bật GWP-ASan một cách rõ ràng .

Bước tiếp theo

Tiếp tục tham gia trò chơi Unity của bạn với lớp học lập trình Cấu hình từ xa , nơi bạn sẽ tìm hiểu về cách sử dụng Cấu hình từ xa và Thử nghiệm A/B trong Unity.