獲取 Android NDK 崩潰報告

如果您的Android應用程序包含本機庫,您可以啟用完整的堆棧跟踪,並從火力地堡Crashlytics有一些小的更新到你的應用程序的構建配置您的本機代碼的詳細崩潰報告。本指南介紹瞭如何使用新的 Firebase Crashlytics SDK 配置崩潰報告。

在你開始之前

要開始,建立Crashlytics

  1. 作為一部分步驟2(添加火力地堡Crashlytics插件,您的應用程序) ,請確保您的應用程序使用Crashlytics搖籃插件V2.4.0 +,它允許您只使用剝開二進制文件生成symbolicated崩潰上傳的符號。

第1步:更新你的配置搖籃

在您的應用程序級build.gradle ,申報Crashlytics NDK運行時依賴性:

爪哇

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

  // Import the BoM for the Firebase platform
  implementation platform('com.google.firebase:firebase-bom:28.4.1')

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics'
}

// …
android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

(替代)聲明火力地堡庫依賴使用物料清單

如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics:18.2.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
      implementation 'com.google.firebase:firebase-analytics:19.0.1'
  }
  

科特林+KTX

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

  // Import the BoM for the Firebase platform
  implementation platform('com.google.firebase:firebase-bom:28.4.1')

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics-ktx'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics-ktx'
}

// …
android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

(替代)聲明火力地堡庫依賴使用物料清單

如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
      implementation 'com.google.firebase:firebase-analytics-ktx:19.0.1'
  }
  

需要Crashlytics NDK版本17.3.0:如果您的應用程序使用targetSdkLevel 30歲或以上,您也必須通過添加以下到您禁用您的應用程序指針標記功能AndroidManifest.xml

<application android:allowNativeHeapPointerTagging="false">
...
</application>

欲了解更多信息,請閱讀為標記指針開發者的支持

步驟2:啟用本地符號載

為了從 NDK 崩潰中生成可讀的堆棧跟踪,Crashlytics 需要了解您的本機二進製文件中的符號。我們的搖籃插件包括uploadCrashlyticsSymbolFile BUILD_VARIANT任務自動完成這一過程(這個任務能夠訪問,確保nativeSymbolUploadEnabled設置為true)。

對於方法的名字出現在你的堆棧跟踪,你必須明確地調用uploadCrashlyticsSymbolFile BUILD_VARIANT你的NDK庫的每個版本後的任務。例如:

>./gradlew app:assembleBUILD_VARIANT\
           app:uploadCrashlyticsSymbolFileBUILD_VARIANT

Crashlytics NDK v17.3.0+ 和 Gradle 插件 v2.4.1+ 取決於本機共享對像中是否存在 GNU 構建 ID。您可以通過運行驗證這個ID的存在readelf -n每個二進制文件。如果生成的ID不存在,加上-Wl,--build-id以構建系統的標誌來解決這個問題。

步驟3(任選):為庫模塊和外部依賴上傳符號

我們的符號上傳任務假設您使用標準 NDK 構建工具(如 CMake)構建您的原生庫,作為應用程序模塊的 Gradle 構建的一部分。如果您在 Gradle 中使用自定義 NDK 構建過程,或者您的本機庫構建在庫/功能模塊中或由第三方提供,您可能需要明確指定未剝離庫的路徑。該firebaseCrashlytics擴展提供了財產unstrippedNativeLibsDir做到這一點。

以下添加到您的應用一級build.gradle文件:

// …
android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir file("path/to/unstripped/dir")
            }
        }
    }
}

該Crashlytics插件將搜索指定的目錄一個機庫及其所有子目錄.so擴展。 Crashlytics 然後將從所有此類庫中提取調試符號並將它們上傳到 Firebase 服務器。

unstrippedNativeLibsDir屬性接受任何參數允許的org.gradle.api.Project#files(Object...)包括java.lang.Stringjava.io.File ,和org.gradle.api.file.FileCollection 。您可以通過提供一個列表或指定一個構建味道多個目錄FileCollection實例。

步驟4(可選):自定義NDK崩潰報告

您可以選擇包括crashlytics.h頭在你的C ++代碼添加元數據,以NDK崩潰報告,如日誌,自定義鍵,和用戶ID。 crashlytics.h可作為僅標頭C ++庫中的火力地堡Android SDK中的GitHub庫。有關使用 NDK C++ API 的說明,請閱讀頭文件中的註釋。

步驟5(可選):使用Breakpad符號symbolication文件

Crashlytics Gradle 插件提供以下功能:

  • 處理未剝離的本機二進製文件以生成符號文件。
  • 將生成的符號文件上傳到我們的服務器,以便稍後在符號化本機崩潰時使用。

Crashlytics Gradle 插件支持兩種類型的符號文件格式:
該Crashlytics符號文件(cSYM)和Breakpad符號文件。

Breakpad 生成的符號文件比 Crashlytics 生成的符號文件包含更多信息,包括在展開過程中用於幫助計算堆棧幀的調用幀信息 (CFI)。使用 CFI 將產生更高保真度的堆棧跟踪,特別是對於高度優化的應用程序,例如游戲和媒體應用程序。

您可以通過以下兩種方式之一啟用基於 Breakpad 的符號文件生成器的使用:

  • 選項1:通過啟用firebaseCrashlytics擴展你build.gradle文件

    以下添加到您的應用一級build.gradle文件:

    android {
      // ...
      buildTypes {
        // ...
        release {
          // ...
          firebaseCrashlytics {
            // existing; required for either symbol file generator
            nativeSymbolUploadEnabled true
            // Add this optional new block to specify breakpad() or csym()
            symbolGenerator {
               breakpad()
            }
          }
        }
      }
    }
    

    要切換回默認的 Crashlytics 符號文件生成器,您可以執行以下任一操作:

    • 略去symbolGenerator塊完全,作為插件使用默認Crashlytics符號文件發生器。

    • 保持塊,但變化breakpad()csym()

  • 選項2:通過您的搖籃屬性文件的屬性線啟用

    您可以使用com.google.firebase.crashlytics.symbolGenerator屬性來控制要使用的符號文件生成。該屬性的有效值為breakpadcsym 。如果未指定,當前的默認等同於csym ,儘管這可能會在未來的版本中改變。

    您可以手動更新 Gradle 屬性文件或通過命令行更新文件。例如,為了使Breakpad符號文件生成器,指定的值breakpad如圖以下命令:

    ./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \
    app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
    

第6步:查看您的崩潰報告

通過構建您的應用程序、上傳符號和強製本機崩潰來驗證 Crashlytics 是否正確報告 NDK 崩潰。您需要在應用程序崩潰後重新啟動應用程序,以便 Crashlytics 發送報告。您應該看到在你的崩潰火力地堡控制台在幾分鐘之內。

故障排除

如果你看到在火力地堡控制台,並在不同的logcat中的堆棧跟踪,請參閱故障排除指南