Nhận báo cáo sự cố về Android NDK

Nếu ứng dụng Android của bạn chứa thư viện gốc, bạn có thể bật toàn bộ dấu vết ngăn xếp và báo cáo sự cố chi tiết cho mã gốc của mình từ Firebase Crashlytics với một vài điểm cập nhật nhỏ đối với bản dựng ứng dụng của bạn .

Hướng dẫn này mô tả cách định cấu hình tính năng báo cáo sự cố bằng Firebase Crashlytics SDK dành cho NDK.

Nếu bạn đang tìm cách bắt đầu sử dụng Crashlytics trong Unity hãy xem các dự án Hướng dẫn bắt đầu sử dụng Unity.

Trước khi bắt đầu

  1. Thêm Firebase vào thiết bị Android của bạn nếu bạn chưa thêm dự án. Nếu chưa có ứng dụng Android, bạn có thể tải xuống ứng dụng mẫu.

  2. Đề xuất: Để tự động nhận nhật ký breadcrumb (tập hợp liên kết phân cấp) để tìm hiểu hành động của người dùng dẫn đến sự cố, sự cố không nghiêm trọng hoặc sự kiện ANR, bạn cần bật Google Analytics trong dự án Firebase của mình.

    • Nếu dự án Firebase hiện tại của bạn không có Google Analytics , bạn có thể bật Google Analytics từ Thẻ Tích hợp trong > Cài đặt dự án trong bảng điều khiển của Firebase.

    • Nếu bạn đang tạo một dự án Firebase mới, hãy bật Google Analytics trong quy trình tạo dự án.

  3. Đảm bảo ứng dụng của bạn có các phiên bản được yêu cầu tối thiểu sau đây:

    • Gradle 8.0
    • Trình bổ trợ Android cho Gradle 8.1.0
    • Trình bổ trợ Gradle cho các dịch vụ của Google 4.4.1

Bước 1: Thêm Crashlytics SDK cho NDK vào ứng dụng của bạn

Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), thêm phần phụ thuộc cho thư viện Crashlytics NDK cho Android. Bạn nên sử dụng Bảng kê khai thành phần của Firebase cho Android để kiểm soát việc tạo phiên bản thư viện.

Để có trải nghiệm tối ưu với Crashlytics, bạn nên bật Google Analytics trong dự án Firebase và thêm Firebase SDK cho Google Analytics vào ứng dụng của bạn.

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:33.1.2"))

    // Add the dependencies for the Crashlytics NDK and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation("com.google.firebase:firebase-crashlytics-ndk")
    implementation("com.google.firebase:firebase-analytics")
}

Bằng cách sử dụng Firebase Android BoM, ứng dụng của bạn sẽ luôn sử dụng các phiên bản tương thích của thư viện Android trên Firebase.

(Phương án thay thế) Thêm các phần phụ thuộc của thư viện Firebase mà không sử dụng BoM

Nếu chọn không sử dụng BoM của Firebase, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phụ thuộc.

Lưu ý rằng nếu bạn sử dụng nhiều thư viện Firebase trong ứng dụng của mình, chúng tôi thực sự bạn nên sử dụng BoM để quản lý các phiên bản thư viện. Điều này đảm bảo rằng tất cả các phiên bản đều tương thích.

dependencies {
    // Add the dependencies for the Crashlytics NDK and Analytics libraries
    // When NOT using the BoM, you must specify versions in Firebase library dependencies
    implementation("com.google.firebase:firebase-crashlytics-ndk:19.0.3")
    implementation("com.google.firebase:firebase-analytics:22.0.2")
}
Bạn đang tìm một mô-đun thư viện dành riêng cho Kotlin? Bắt đầu sau Tháng 10 năm 2023 (Firebase BoM 32.5.0), cả nhà phát triển Kotlin và Java đều có thể phụ thuộc vào mô-đun thư viện chính (để biết thông tin chi tiết, hãy xem Câu hỏi thường gặp về sáng kiến này).

Bước 2: Thêm trình bổ trợ Crashlytics Gradle vào ứng dụng của bạn

  1. Trong tệp Gradle cấp gốc (cấp dự án) (<project>/build.gradle.kts hoặc <project>/build.gradle), hãy thêm Trình bổ trợ Crashlytics Gradle vào khối plugins:

    Kotlin

    plugins {
        // Make sure that you have the AGP plugin 8.1+ dependency
        id("com.android.application") version "8.1.4" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency
        id("com.google.gms.google-services") version "4.4.2" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.2" apply false
    }
    

    Groovy

    plugins {
        // Make sure that you have the AGP plugin 8.1+ dependency
        id 'com.android.application' version '8.1.4' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency
        id 'com.google.gms.google-services' version '4.4.2' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.2' apply false
    }
    
  2. Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), thêm trình bổ trợ Crashlytics Gradle:

    Kotlin

    plugins {
      id("com.android.application")
      // ...
    
      // Make sure that you have the Google services Gradle plugin
      id("com.google.gms.google-services")
    
      // Add the Crashlytics Gradle plugin
      id("com.google.firebase.crashlytics")
    }

    Groovy

    plugins {
      id 'com.android.application'
      // ...
    
      // Make sure that you have the Google services Gradle plugin
      id 'com.google.gms.google-services'
    
      // Add the Crashlytics Gradle plugin
      id 'com.google.firebase.crashlytics'
    }

Bước 3: Thêm tiện ích Crashlytics vào bản dựng

Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), hãy định cấu hình tiện ích Crashlytics.

Kotlin

import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension

// ...

android {
  // ...
  buildTypes {
      getByName("release") {
          // Add this extension
          configure<CrashlyticsExtension> {
              // Enable processing and uploading of native symbols to Firebase servers.
              // By default, this is disabled to improve build speeds.
              // This flag must be enabled to see properly-symbolicated native
              // stack traces in the Crashlytics dashboard.
              nativeSymbolUploadEnabled = true
          }
      }
  }
}

Groovy

// ...

android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Firebase servers.
              // By default, this is disabled to improve build speeds.
              // This flag must be enabled to see properly-symbolicated native
              // stack traces in the Crashlytics dashboard.
              nativeSymbolUploadEnabled true
          }
      }
  }
}

Bước 4: Thiết lập tính năng tự động tải biểu tượng gốc lên

Để tạo ra dấu vết ngăn xếp có thể đọc được từ các sự cố NDK, Crashlytics cần biết về các biểu tượng trong tệp nhị phân gốc. Trình bổ trợ Crashlytics Gradle bao gồm uploadCrashlyticsSymbolFileBUILD_VARIANT để tự động hoá quy trình này.

  1. Để bạn có thể truy cập vào nhiệm vụ tải biểu tượng tự động lên, hãy đảm bảo nativeSymbolUploadEnabled được đặt thành true trong mô-đun của bạn (cấp ứng dụng) Tệp Gradle.

  2. Để tên phương thức xuất hiện trong dấu vết ngăn xếp, bạn phải gọi một cách rõ ràng uploadCrashlyticsSymbolFileBUILD_VARIANT sau mỗi bản dựng của thư viện NDK. Ví dụ:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. Cả Crashlytics SDK cho NDK và trình bổ trợ Crashlytics Gradle phụ thuộc vào sự hiện diện của mã bản dựng GNU trong các đối tượng gốc dùng chung.

    Bạn có thể xác minh sự hiện diện của mã nhận dạng này bằng cách chạy readelf -n trên mỗi tệp nhị phân. Nếu mã bản dựng là không có, hãy thêm -Wl,--build-id vào cờ để khắc phục sự cố này.

Bước 5: Xác định sự cố thử nghiệm để 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 Trang tổng quan Crashlytics trong bảng điều khiển của Firebase, bạn cần buộc thử nghiệm sự cố.

  1. Thêm mã vào ứng dụng mà bạn có thể sử dụng để xác định sự cố kiểm thử.

    Bạn có thể sử dụng mã sau trong MainActivity của ứng dụng để thêm nút cho ứng dụng của bạn và khi được nhấn, sẽ gây ra sự cố. Nút này được gắn nhãn "Thử nghiệm sự cố".

    Kotlin+KTX

    val crashButton = Button(this)
    crashButton.text = "Test Crash"
    crashButton.setOnClickListener {
       throw RuntimeException("Test Crash") // Force a crash
    }
    
    addContentView(crashButton, ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT,
           ViewGroup.LayoutParams.WRAP_CONTENT))
    

    Java

    Button crashButton = new Button(this);
    crashButton.setText("Test Crash");
    crashButton.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
           throw new RuntimeException("Test Crash"); // Force a crash
       }
    });
    
    addContentView(crashButton, new ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT,
           ViewGroup.LayoutParams.WRAP_CONTENT));
    
  2. Tạo bản dựng và chạy ứng dụng của bạn.

  3. Buộc kiểm thử sự cố để gửi báo cáo sự cố đầu tiên cho ứng dụng của bạn:

    1. Mở ứng dụng của bạn từ thiết bị thử nghiệm hoặc trình mô phỏng.

    2. Trong ứng dụng của bạn, hãy nhấn vào nút "Test Crash" (Sự cố kiểm thử) mà bạn đã thêm bằng mã ở trên.

    3. Sau khi ứng dụng của bạn gặp sự cố, hãy khởi động lại ứng dụng để ứng dụng của bạn có thể gửi sự cố báo cáo cho Firebase.

  4. Chuyển đến trang tổng quan Crashlytics của bảng điều khiển của Firebase để xem sự cố thử nghiệm của bạn.

    Nếu đã làm mới bảng điều khiển mà vẫn không thấy sự cố thử nghiệm sau 5 phút, bật tính năng ghi nhật ký gỡ lỗi để xem liệu ứng dụng của bạn có đang gửi báo cáo sự cố hay không.


Chỉ vậy thôi! Crashlytics hiện đang theo dõi ứng dụng của bạn để phát hiện các sự cố và bạn có thể xem và điều tra báo cáo sự cố và số liệu thống kê trong Trang tổng quan Crashlytics.

Các bước tiếp theo

  • (Nên dùng) Nhận trợ giúp để gỡ lỗi sự cố do lỗi bộ nhớ gốc gây ra bằng cách đang thu thập Báo cáo GWP-ASan. Những lỗi liên quan đến bộ nhớ này có thể có liên quan đến tình trạng hỏng bộ nhớ trong ứng dụng của bạn, đây là nguyên nhân hàng đầu gây ra lỗ hổng bảo mật ứng dụng. Để tận dụng tính năng gỡ lỗi này, hãy đảm bảo ứng dụng của bạn có GWP-ASan được bật rõ ràng và sử dụng Crashlytics SDK mới nhất cho NDK (phiên bản 18.3.6+ hoặc Firebase BoM phiên bản 31.3.0 trở lên).

  • Tuỳ chỉnh thiết lập báo cáo sự cố bằng cách thêm tuỳ chọn báo cáo, nhật ký, khoá và theo dõi lỗi không nghiêm trọng.

  • Tích hợp với Google Play để bạn có thể lọc trực tiếp các báo cáo sự cố của ứng dụng Android theo dõi trên Google Play trong Trang tổng quan Crashlytics. Điều này cho phép bạn tập trung tốt hơn vào trang tổng quan của mình vào các bản dựng cụ thể.

Khắc phục sự cố

Nếu bạn thấy các dấu vết ngăn xếp khác nhau trong bảng điều khiển của Firebase và trong logcat, hãy tham khảo Hướng dẫn khắc phục sự cố.



Các lựa chọn khác để tải biểu tượng lên

Quy trình làm việc chính trên trang ở trên này áp dụng cho các bản dựng Gradle tiêu chuẩn. Tuy nhiên, một số ứng dụng sử dụng cấu hình hoặc công cụ khác (ví dụ: bản dựng khác Gradle). Trong những trường hợp này, các phương án sau có thể rất hữu ích để tải biểu tượng lên thành công.

Cách: Tải biểu tượng lên cho mô-đun thư viện và phần phụ thuộc bên ngoài

Tuỳ chọn này có thể hữu ích trong các trường hợp sau:

  • Nếu bạn sử dụng một quy trình xây dựng NDK tuỳ chỉnh trong Gradle
  • Nếu thư viện gốc của bạn được xây dựng trong một thư viện/mô-đun tính năng hoặc được cung cấp bởi bên thứ ba
  • Nếu tác vụ tải biểu tượng tự động lên không thành công hoặc bạn thấy sự cố không có biểu tượng trong trang tổng quan

Tuỳ chọn: Tải biểu tượng lên cho các bản dựng không dựa trên Gradle hoặc các thư viện gốc chưa gỡ bỏ và không thể truy cập được

Tuỳ chọn này có thể hữu ích trong các trường hợp sau:

  • Nếu bạn sử dụng quy trình xây dựng không phải Gradle

  • Nếu thư viện gốc chưa được phân phát của bạn được cung cấp cho bạn theo cách nào đó mà các tệp đó không thể truy cập được trong quá trình tạo Gradle