Nhận báo cáo sự cố NDK của Android

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

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

Nếu bạn đang tìm cách bắt đầu với Crashlytics trong các dự án Unity của mình, hãy xem hướng dẫn Bắt đầu Unity .

Trước khi bắt đầu

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

  2. Đề xuất : Để có được các tính năng như người dùng không gặp sự cố, nhật ký breadcrumb và cảnh báo vận tốc, 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 chưa bật Google Analytics, thì bạn có thể bật Google Analytics từ tab Tích hợp trong > Cài đặt dự án trong bảng điều khiển Firebase.

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

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

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

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

Kotlin+KTX

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

    // 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-ktx")
}

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 Firebase.

(Thay thế) Thêm phụ thuộc thư viện Firebase mà không cần sử dụng BoM

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

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ự khuyên 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:18.4.3")
    implementation("com.google.firebase:firebase-analytics-ktx:21.3.0")
}

Java

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

    // 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 Firebase.

(Thay thế) Thêm phụ thuộc thư viện Firebase mà không cần sử dụng BoM

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

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ự khuyên 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:18.4.3")
    implementation("com.google.firebase:firebase-analytics:21.3.0")
}

Bước 2 : Thêm plugin 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 plugin Crashlytics Gradle vào khối plugins :

    Kotlin

    plugins {
        id("com.android.application") version "7.2.0" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id("com.google.gms.google-services") version "4.3.15" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "2.9.9" apply false
    }
    

    Groovy

    plugins {
        id 'com.android.application' version '7.2.0' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id 'com.google.gms.google-services' version '4.3.15' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '2.9.9' apply false
    }
    
  2. Trong tệp Gradle mô -đun (cấp ứng dụng) của bạn (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle ), hãy thêm plugin 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 mở rộng Crashlytics vào bản dựng của bạn

Trong tệp Gradle mô -đun (cấp ứng dụng) của bạn (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle ), định cấu hình tiện ích mở rộng 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ự động tải lên các biểu tượng gốc

Để tạo dấu vết ngăn xếp có thể đọc được từ sự cố NDK, Crashlytics cần biết về các ký hiệu trong tệp nhị phân gốc của bạn. Plugin Crashlytics Gradle bao gồm tác vụ uploadCrashlyticsSymbolFile BUILD_VARIANT để tự động hóa quy trình này.

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

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

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. Cả SDK Crashlytics cho NDK và plugin Crashlytics Gradle đều phụ thuộc vào sự hiện diện của ID bản dựng GNU trong các đối tượng được chia sẻ gốc.

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

Bước 5 : Buộc chạy thử nghiệm để hoàn tất thiết lập

Để hoàn tất quá trình 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 một sự cố thử nghiệm.

  1. Thêm mã vào ứng dụng của bạn mà bạn có thể sử dụng để buộc thử nghiệm gặp sự cố.

    Bạn có thể sử dụng mã sau trong MainActivity của ứng dụng để thêm một nút vào ứng dụng của mình. Nút này khi được nhấn sẽ gây ra sự cố. Nút được gắn nhãn "Kiểm tra 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. Xây dựng và chạy ứng dụng của bạn.

  3. Buộc thử nghiệm gặp 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 giả lập.

    2. Trong ứng dụng của bạn, nhấn nút "Kiểm tra sự cố" 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 báo cáo sự cố tới Firebase.

  4. Truy cập bảng điều khiển Crashlytics của bảng điều khiển Firebase để xem sự cố thử nghiệm của bạn.

    Nếu bạn đã làm mới bảng điều khiển và vẫn không thấy sự cố thử nghiệm sau năm phút, hãy bật 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.


Và thế là xong! Crashlytics hiện đang giám sát ứng dụng của bạn để tìm sự cố và bạn có thể xem cũng như điều tra các báo cáo và thống kê sự cố trong bảng điều khiển Crashlytics.

Bước tiếp theo

  • (Được khuyến nghị) Nhận trợ giúp khắc phục sự cố do lỗi bộ nhớ riêng gây ra bằng cách thu thập báo cáo GWP-ASan . Các lỗi liên quan đến bộ nhớ này có thể liên quan đến lỗi 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 đã bật rõ ràng GWP-ASan và sử dụng SDK Crashlytics mới nhất cho NDK (v18.3.6+ hoặc Firebase BoM v31.3.0+).

  • Tùy chỉnh thiết lập báo cáo sự cố của bạn bằng cách thêm báo cáo chọn tham gia, nhật ký, khóa và theo dõi các lỗi không nghiêm trọng.

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

Xử lý 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 Firebase và trong logcat, hãy tham khảo hướng dẫn Khắc phục sự cố .



Các tùy chọn thay thế để tải lên các biểu tượng

Quy trình công việc chính trên trang này ở trên có thể á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ụ: quy trình xây dựng không phải Gradle). Trong những trường hợp này, các tùy chọn sau đây có thể hữu ích để tải lên thành công các biểu tượng.

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

Tùy 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 NDK tùy chỉnh trong Gradle
  • Nếu thư viện gốc của bạn được xây dựng trong mô-đun thư viện/tính năng hoặc do bên thứ ba cung cấp
  • 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 các sự cố không có biểu tượng trong bảng điều khiển

Tùy chọn : Tải lên các biểu tượng cho các bản dựng không phải Gradle hoặc các thư viện gốc không thể truy cập được

Tùy 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ác với Gradle

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