https://github.com/kiwi-bop/flutter_crashlytics
:package: Flutter plugin for Crashlytics integration
https://github.com/kiwi-bop/flutter_crashlytics
crash-reporting crashlytics flutter flutter-plugin
Last synced: 9 months ago
JSON representation
:package: Flutter plugin for Crashlytics integration
- Host: GitHub
- URL: https://github.com/kiwi-bop/flutter_crashlytics
- Owner: kiwi-bop
- License: bsd-2-clause
- Created: 2018-08-21T07:28:29.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2019-10-23T13:29:07.000Z (over 6 years ago)
- Last Synced: 2024-06-19T00:30:03.026Z (about 2 years ago)
- Topics: crash-reporting, crashlytics, flutter, flutter-plugin
- Language: Java
- Homepage:
- Size: 241 KB
- Stars: 194
- Watchers: 7
- Forks: 46
- Open Issues: 19
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# flutter_crashlytics
[](https://pub.dartlang.org/packages/flutter_crashlytics)
Flutter plugin to enable Crashlytics reporting.
## Setup
### Firebase Crashlytics
If you're using Firebase instead of Fabric, you must first setup your app to use Firebase as per this tutorial.
https://codelabs.developers.google.com/codelabs/flutter-firebase/#4
The instructions are the same for Fabric and Firebase, except that for Firebase, you don't get an API key so you don't have to add it anywhere.
### Android
To setup Crashlytics on Android side, you need to set the Fabric ID in your manifest like this:
(Only do this if using Fabric, not Firebase as you will not have an API Key)
```
```
You also need to change your build.gradle file like this:
```
buildscript {
repositories {
...
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
...
}
}
```
And apply the fabric plugin `apply plugin: 'io.fabric'`
Nothing more.
### Symbolicating Native Android Crashes
Unfortunately, even pure Dart projects can't always protect you from native
crashes. Without the following setup, a native crash like SIGSEGV will
appear as a blank stacktrace in Crashlytics. Here's how to get some symbols:
Add the following to build.gradle, after `apply plugin: 'io.fabric'`:
```
crashlytics {
enableNdk true
androidNdkOut "../../debugSymbols"
androidNdkLibsOut "../../build/app/intermediates/transforms/stripDebugSymbol/release/0/lib"
}
```
Ensure that the NDK bundle is installed or the stripDebugSymbol directory won't
get created.
Now setup a release script to populate the debugSymbols directory, guided by
the instructions from https://github.com/flutter/flutter/wiki/Crashes
```
# Build our app like usual
flutter -v build apk --release
### BEGIN MODIFICATIONS
# Copy mergeJniLibs to debugSymbols
cp -R ./build/app/intermediates/transforms/mergeJniLibs/release/0/lib debugSymbols
# The libflutter.so here is the same as in the artifacts.zip found with symbols.zip
cd debugSymbols/armeabi-v7a
# Download the corresponding libflutter.so with debug symbols
ENGINE_VERSION=`cat $HOME/flutter/bin/internal/engine.version`
gsutil cp gs://flutter_infra/flutter/${ENGINE_VERSION}/android-arm-release/symbols.zip .
# Replace libflutter.so
unzip -o symbols.zip
rm -rf symbols.zip
# Upload symbols to Crashlytics
cd ../../android
./gradlew crashlyticsUploadSymbolsRelease
### END MODIFICATIONS
# Release your app like usual
cd ../..
fastlane submit_playalpha
```
### iOS
On iOS side you need to set your Fabric ID under your Info.plist like:
(Only do this if using Fabric, not Firebase as you will not have an API Key)
```
Fabric
APIKey
YOUR_ID_HERE
Kits
KitInfo
KitName
Crashlytics
```
Turn off automatic collection with a new key to your Info.plist file (GDPR compliency if you want it):
Key: firebase_crashlytics_collection_enabled
Value: false
Don't forget to add your `Run Script` step (with any version of Xcode) on the build phases tab.
If using `Xcode 10`, you also must add your app's built Info.plist location to the Build Phase's Input Files field:
```
$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
```

That's it :)
### Flutter
All you need to do under your code is to let the plugin handle the Flutter crashes.
Your `main` method should look like:
```
void main() async {
bool isInDebugMode = false;
FlutterError.onError = (FlutterErrorDetails details) {
if (isInDebugMode) {
// In development mode simply print to console.
FlutterError.dumpErrorToConsole(details);
} else {
// In production mode report to the application zone to report to
// Crashlytics.
Zone.current.handleUncaughtError(details.exception, details.stack);
}
};
await FlutterCrashlytics().initialize();
runZoned>(() async {
runApp(MyApp());
}, onError: (error, stackTrace) async {
// Whenever an error occurs, call the `reportCrash` function. This will send
// Dart errors to our dev console or Crashlytics depending on the environment.
await FlutterCrashlytics().reportCrash(error, stackTrace, forceCrash: false);
});
}
```
`forceCrash` allows you to have a real crash instead of the red screen, in that case the exception will be tagged as fatal.
## API available
- Add log to crash reporting with `log(String msg, {int priority, String tag})`
- Add manual log to crash reporting with `logException(Error/Exception exception, Stacktrace stack)`
- Add user info to crash reporting with `setUserInfo(String identifier, String email, String name)`
- Add general info to crash reporting with `setInfo(String key, dyncamic value)`
## Limitation
This plugin uses Crashlytics SDK to log manual dart crashes, all manually logged crashes are tagged as non fatal under Crashlytics, that's a limitation of the SDK.
You can bypass that limitation with the `forceCrash` parameter, instead of the red screen an actual crash will be appended, the crash will be tagged as fatal.
On iOS fatal crash has their dart stacktrace under the `Logs` tab of Crashlytics, that's a limitation of iOS that prevents developers to set a custom stacktrace to an exception.
## Contribution
We love contributions! Don't hesitate to open issues and make pull request to help improve this plugin.