This app demonstrates how to use Sentry in an Android application for capturing 4 types of exceptions:
This app has all configuration (e.g. gradle) set to include Sentry SDK and ANR (Application Not Responding) and NDK (crash) events.
Sentry NDK libraries are used in addition to the Sentry SDK, for capturing errors and crashes in C++.
For use in Production see the Official Sentry Android Documentation Additional documentation: ANR Configuration NDK Configuration
dependency | version |
---|---|
sentry-java | 5.1.2 |
sentry-android-gradle-plugin | 3.0.0 |
Android Studio Arctic Fox | 2020.3.1 |
Gradle | 7.0.2 |
AVD | Nexus 5x API 29 x86, Pixel 2 API 29 |
sentry-cli | 1.55.1 |
macOS | Catalina 10.15.7 |
java | 16.0.2 |
jdk | 11.0.13 |
Do not use JDK 14
which java
/usr/bin/java
git clone git@github.com:sentry-demos/android.git
Open project using Android Studio. It will take a few minutes for Gradle to configure itself and download dependencies.
Set your Build Variant to 'release' instead of debug. Or else debug symbols won't get uploaded. Build Variants tab (left side of Android Studio) > Select 'release' under Active Build Variant Column > if that's missing then go to Build > Edit Build Types.
Sync the project with the Gradle files
Tools -> Android -> Sync Project with Gradle Files
In some Android Studio version this will be available under:
File -> Sync Project with Gradle Files
Put your Sentry DSN key in AndroidManifest.xml
and your 'project' name in the Makefile
For Performance Demo: Configure your backend endpoint in the empowerplant.domain
attribute in AndroidManifest.xml
(application-monitoring-python
by default)
Put your AUTH Token and project name in sentry.properties
make all
Android Studio install Android NDK in Preferences > System & Behavior > System Settings > Android SDK > SDK Tools > and install the following:
Maintain a separate branch which has your auth token.
Optional - Add se:
make all
if you haven't yet, or have made significant changes to your code. otherwise run the app.The MainActivity has 5 buttons that generate the following exception types:
The Android ToolStore demos the 2 classic toolstore transactions:
toolstore [android] -
/tools
flask backend, and processing the responsecheckout [android] -
Add to Cart
/checkout
endpointException:Failed to init delivery workflow
and the Not enough inventory for wrench
exception on the backend.The Android team has added Android system symbol files to our built-in repositories (Add the new Android option in your project settings). If the native crash generated from your emulator is not fully symbolicated, this probably means our symbol server doesn't have the files relevant for your (virtual) device. In this case, you can fix that by updating Sentry's server. To do that:
Symbol Collector
app (io.sentry.symbol.collector-Signed.apk) which is available in the latest releasehttps://symbol-collector.services.sentry.io
Collect Symbols
Use two different devices (ie. two different android emulators). Keep one device crash free and one that has crashes so you can compare the crash free user rates.
1st device - errors, so you see Crash Free Rate go Down 2nd device - sessions w/out errors, so if you keep creaitng healthy sessions, the nCrash Free Rate should go back up
ANR - click button, then start clicking on other areas of the screen. The second click (not the button click) is when it starts counting the seconds right when pop-up comes , event should be sent to Sentry. click 'close-up'.
See AndroidManifest.xml for different settings we tweak for demo's (e.g. default Session time, default ANR time
:warning: Only follow these steps when on the master
branch, with no untracked git changes. This is necessary because we rely on these releases for our automated test data ("TDA") and don't want unintended local modifications (i.e. to DSNs or project names) to accidentally make it into our automated data. :warning:
versionName
and versionCode
by 1 in build.gradle
. I.e. in the below example, we updated versionCode from 12
to 13
and versionName from 1.2.0
to 1.3.0
. Then run the app once so the executable gets this updated value.
defaultConfig {
applicationId "com.example.vu.android"
minSdkVersion 21
targetSdkVersion 29
versionCode 13
versionName "1.3.0"
}
(This would make for a release of 1.3.0 (13) com.example.vu.androidh@1.3+13
.)
./generate_release_artifacts.sh
, which generates debug-build and release-build .apk
files.build.gradle
, app-release.apk
, and app-debug.apk
.master
branch and pull down the latest changes. Ensure your branch is clean (no untracked git changes)../github_release.sh
, and select y
when prompted.The version code is unique. This is already part of build system in Android. The app won't compile without it.
Optional - Setting the release in AndroidManifest.xml will override what's set in src/build.gradle. Possible uses cases would be:
<meta-data android:name="io.sentry.release" android:value="io.sentry.sample@1.0.0+1" />
implementation 'io.sentry:sentry-android:5.6.0'
implementation 'io.sentry:sentry-android-okhttp:5.6.0'
implementation 'io.sentry:sentry-android-fragment:5.6.0'
make all
will do a new ./gradlew build
Sometimes you'll see extra ANR events, because you have setting set to 3 seconds Hard to compare Total Number of Crashes to a report in Discover on handled:no and the release, because when a crash happens, you have to wait for the device to come back online again. There are some other technical reasons as well, which are still being sorted out. For instance, if you're ever filtering, sampling or Rate Limiting events/crashes out, then it's possible that the Sessions data isn ot getting filtered/sampled and so your Crash Free rate will appear higher than it actually is.
mechanism:signalHandler
comes from sentry-native and mechanism:uncaughtException
comes from java/kotlinIf you're getting errors about "You need Java 11, not 1.8" and when you run java --version
it says you're already on Java 11, then you may need to go into Android Studio Settings > Preferences > Build, Execution, Deployment > Gradle > Select jdk-11.
If youre app builds, compiles and starts to run but the AVD screen never appears and the Logcat is stuck on "E/GnssHAL_GnssInterface: gnssSvStatusCb: b: input svInfo.flags is", then you may need to disable Location and GPS services from your AVD. If you can't edit these settings on an existing AVD (as they're from the Hardware Profile), then create a new AVD and as you're doing that, go into the Hardware Profile settings and uncheck the box for GPS.