diff --git a/.github/workflows/integration-tests-benchmarks.yml b/.github/workflows/integration-tests-benchmarks.yml
index ddf87f03ef5..fed0471cfa7 100644
--- a/.github/workflows/integration-tests-benchmarks.yml
+++ b/.github/workflows/integration-tests-benchmarks.yml
@@ -1,4 +1,4 @@
-name: "Integration Tests - Benchmarks"
+name: 'Integration Tests - Benchmarks'
on:
schedule:
- cron: '0 0 * * *' # every night at midnight UTC
@@ -8,7 +8,7 @@ on:
- '**/sentry-android/**'
- '**/sentry-android-core/**'
- '**/sentry-android-ndk/**'
- - '**/sentry-android-integration-tests/sentry-uitest-android-benchmark/**'
+ - '**/sentry-android-integration-tests/**'
- '**/.github/**'
jobs:
@@ -20,11 +20,11 @@ jobs:
- name: Git checkout
uses: actions/checkout@v2
- - name: "Set up Java: 11"
+ - name: 'Set up Java: 11'
uses: actions/setup-java@v2
with:
- java-version: "11"
- distribution: "adopt"
+ java-version: '11'
+ distribution: 'adopt'
# Clean, build and release a test apk
- name: Make assembleBenchmarks
@@ -50,3 +50,35 @@ jobs:
sauce-username: ${{ secrets.SAUCE_USERNAME }}
sauce-access-key: ${{ secrets.SAUCE_ACCESS_KEY }}
config-file: .sauce/sentry-uitest-android-benchmark-lite.yml
+
+ app-metrics:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v2
+
+ - name: 'Set up Java: 11'
+ uses: actions/setup-java@v2
+ with:
+ java-version: '11'
+ distribution: 'adopt'
+
+ - uses: actions/cache@v3
+ id: app-plain-cache
+ with:
+ path: sentry-android-integration-tests/test-app-plain/build/outputs/apk/release/test-app-plain-release.apk
+ key: ${{ github.workflow }}-${{ github.job }}-appplain-${{ hashFiles('sentry-android-integration-tests/test-app-plain/**') }}
+
+ - name: Build Android app plain
+ if: steps.app-plain-cache.outputs['cache-hit'] != 'true'
+ run: ./gradlew :sentry-android-integration-tests:test-app-plain:assembleRelease
+
+ - name: Build Android app with Sentry
+ run: ./gradlew :sentry-android-integration-tests:test-app-sentry:assembleRelease
+
+ - name: Collect app metrics
+ uses: getsentry/action-app-sdk-overhead-metrics@v1
+ with:
+ config: sentry-android-integration-tests/metrics-test.yml
+ sauce-user: ${{ secrets.SAUCE_USERNAME }}
+ sauce-key: ${{ secrets.SAUCE_ACCESS_KEY }}
diff --git a/build.gradle.kts b/build.gradle.kts
index 1e6f40e5fe0..2b6ffd9c63e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -60,6 +60,8 @@ apiValidation {
"sentry-samples-netflix-dgs",
"sentry-uitest-android",
"sentry-uitest-android-benchmark",
+ "test-app-plain",
+ "test-app-sentry",
)
)
}
diff --git a/sentry-android-integration-tests/README.md b/sentry-android-integration-tests/README.md
new file mode 100644
index 00000000000..585fa5fa06e
--- /dev/null
+++ b/sentry-android-integration-tests/README.md
@@ -0,0 +1,7 @@
+# Android performance-impact and integration tests
+
+* [Sample app without sentry](./test-app-plain) created with Android Studio -> New Project -> Basic Activity
+* [Same app, but with Sentry included](./test-app-sentry) - made part of the root project
+* [App metrics test specification (yaml)](./metrics-test.yml)
+* [Espresso-based benchmarks](./sentry-uitest-android-benchmark) - run within SauceLabs (see /.sauce/*.yml)
+* [Espresso-based UI tests](./sentry-uitest-android) - run within SauceLabs (see /.sauce/*.yml)
diff --git a/sentry-android-integration-tests/metrics-test.yml b/sentry-android-integration-tests/metrics-test.yml
new file mode 100644
index 00000000000..c6b3fdd54de
--- /dev/null
+++ b/sentry-android-integration-tests/metrics-test.yml
@@ -0,0 +1,16 @@
+apps:
+ - name: io.sentry.java.tests.perf.appplain
+ activity: MainActivity
+ path: ./test-app-plain/build/outputs/apk/release/test-app-plain-release.apk
+ - name: io.sentry.java.tests.perf.appsentry
+ activity: MainActivity
+ path: ./test-app-sentry/build/outputs/apk/release/test-app-sentry-release.apk
+
+startupTimeTest:
+ runs: 50
+ diffMin: 0
+ diffMax: 150
+
+binarySizeTest:
+ diffMin: 500 KiB
+ diffMax: 700 KiB
diff --git a/sentry-android-integration-tests/test-app-plain/.gitignore b/sentry-android-integration-tests/test-app-plain/.gitignore
new file mode 100644
index 00000000000..42afabfd2ab
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/build.gradle.kts b/sentry-android-integration-tests/test-app-plain/build.gradle.kts
new file mode 100644
index 00000000000..57a40a94e42
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/build.gradle.kts
@@ -0,0 +1,56 @@
+plugins {
+ id("com.android.application")
+}
+
+android {
+ compileSdk = Config.Android.compileSdkVersion
+
+ defaultConfig {
+ applicationId = "io.sentry.java.tests.perf.appplain"
+ minSdk = Config.Android.minSdkVersionNdk
+ targetSdk = Config.Android.targetSdkVersion
+ versionCode = 1
+ versionName = "1.0"
+ }
+
+ buildTypes {
+ getByName("release") {
+ isMinifyEnabled = true
+ signingConfig = signingConfigs.getByName("debug") // to be able to run release mode
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro")
+ ndk {
+ abiFilters.clear()
+ abiFilters.add("arm64-v8a")
+ }
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+ buildFeatures {
+ viewBinding = true
+ }
+ signingConfigs {
+ getByName("debug") {
+ storeFile = rootProject.file("debug.keystore")
+ storePassword = "android"
+ keyAlias = "androiddebugkey"
+ keyPassword = "android"
+ }
+ }
+
+ variantFilter {
+ if (Config.Android.shouldSkipDebugVariant(buildType.name)) {
+ ignore = true
+ }
+ }
+}
+
+dependencies {
+ implementation("androidx.appcompat:appcompat:1.3.0")
+ implementation("com.google.android.material:material:1.4.0")
+ implementation("androidx.constraintlayout:constraintlayout:2.0.4")
+ implementation("androidx.navigation:navigation-fragment:2.3.5")
+ implementation("androidx.navigation:navigation-ui:2.3.5")
+}
diff --git a/sentry-android-integration-tests/test-app-plain/proguard-rules.pro b/sentry-android-integration-tests/test-app-plain/proguard-rules.pro
new file mode 100644
index 00000000000..2f9dc5a47ed
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.kts.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/AndroidManifest.xml b/sentry-android-integration-tests/test-app-plain/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..85c4f7ca430
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/AndroidManifest.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/FirstFragment.java b/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/FirstFragment.java
new file mode 100644
index 00000000000..473aaf8aa76
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/FirstFragment.java
@@ -0,0 +1,42 @@
+package io.sentry.java.tests.perf.appplain;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
+import io.sentry.java.tests.perf.appplain.databinding.FragmentFirstBinding;
+
+public class FirstFragment extends Fragment {
+
+ private FragmentFirstBinding binding;
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ binding = FragmentFirstBinding.inflate(inflater, container, false);
+ return binding.getRoot();
+ }
+
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ binding.buttonFirst.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ NavHostFragment.findNavController(FirstFragment.this)
+ .navigate(R.id.action_FirstFragment_to_SecondFragment);
+ }
+ });
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+}
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/MainActivity.java b/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/MainActivity.java
new file mode 100644
index 00000000000..e37de2be3a3
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/MainActivity.java
@@ -0,0 +1,74 @@
+package io.sentry.java.tests.perf.appplain;
+
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.navigation.NavController;
+import androidx.navigation.Navigation;
+import androidx.navigation.ui.AppBarConfiguration;
+import androidx.navigation.ui.NavigationUI;
+import com.google.android.material.snackbar.Snackbar;
+import io.sentry.java.tests.perf.appplain.databinding.ActivityMainBinding;
+
+public class MainActivity extends AppCompatActivity {
+
+ private AppBarConfiguration appBarConfiguration;
+ private ActivityMainBinding binding;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ binding = ActivityMainBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+
+ setSupportActionBar(binding.toolbar);
+
+ NavController navController =
+ Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
+ appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
+ NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
+
+ binding.fab.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
+ .setAction("Action", null)
+ .show();
+ }
+ });
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ //noinspection SimplifiableIfStatement
+ if (id == R.id.action_settings) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ NavController navController =
+ Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
+ return NavigationUI.navigateUp(navController, appBarConfiguration)
+ || super.onSupportNavigateUp();
+ }
+}
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/SecondFragment.java b/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/SecondFragment.java
new file mode 100644
index 00000000000..cf04c92febf
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/java/io/sentry/java/tests/perf/appplain/SecondFragment.java
@@ -0,0 +1,42 @@
+package io.sentry.java.tests.perf.appplain;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
+import io.sentry.java.tests.perf.appplain.databinding.FragmentSecondBinding;
+
+public class SecondFragment extends Fragment {
+
+ private FragmentSecondBinding binding;
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ binding = FragmentSecondBinding.inflate(inflater, container, false);
+ return binding.getRoot();
+ }
+
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ binding.buttonSecond.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ NavHostFragment.findNavController(SecondFragment.this)
+ .navigate(R.id.action_SecondFragment_to_FirstFragment);
+ }
+ });
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+}
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000000..2b068d11462
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/drawable/ic_launcher_background.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000000..07d5da9cbf1
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/layout/activity_main.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000000..1acd302c3fc
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/activity_main.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/layout/content_main.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/content_main.xml
new file mode 100644
index 00000000000..e416e1c18d5
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/content_main.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/layout/fragment_first.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/fragment_first.xml
new file mode 100644
index 00000000000..fb44a3d9176
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/fragment_first.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/layout/fragment_second.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/fragment_second.xml
new file mode 100644
index 00000000000..bd9052422ed
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/layout/fragment_second.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/menu/menu_main.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/menu/menu_main.xml
new file mode 100644
index 00000000000..31cb4e9470b
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/menu/menu_main.xml
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000000..eca70cfe52e
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000000..eca70cfe52e
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-hdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000000..898f3ed59ac
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..dffca3601eb
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-mdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000000..64ba76f75e9
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..dae5e082342
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xhdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000000..e5ed46597ea
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..14ed0af3502
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..b0907cac3bf
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..d8ae0315497
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..2c18de9e661
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..beed3cdd2c3
Binary files /dev/null and b/sentry-android-integration-tests/test-app-plain/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/navigation/nav_graph.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/navigation/nav_graph.xml
new file mode 100644
index 00000000000..19b476cd1e7
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/navigation/nav_graph.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values-land/dimens.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values-land/dimens.xml
new file mode 100644
index 00000000000..22d7f004329
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values-land/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values-night/themes.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values-night/themes.xml
new file mode 100644
index 00000000000..a74202c9093
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values-w1240dp/dimens.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values-w1240dp/dimens.xml
new file mode 100644
index 00000000000..d73f4a359b5
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values-w1240dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 200dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values-w600dp/dimens.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values-w600dp/dimens.xml
new file mode 100644
index 00000000000..22d7f004329
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values-w600dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values/colors.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values/colors.xml
new file mode 100644
index 00000000000..f8c6127d327
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values/dimens.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values/dimens.xml
new file mode 100644
index 00000000000..125df871191
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values/dimens.xml
@@ -0,0 +1,3 @@
+
+ 16dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values/strings.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values/strings.xml
new file mode 100644
index 00000000000..b7cba5c9e6f
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values/strings.xml
@@ -0,0 +1,12 @@
+
+ TestAppPlain
+ Settings
+
+ First Fragment
+ Second Fragment
+ Next
+ Previous
+
+ Hello first fragment
+ Hello second fragment. Arg: %1$s
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/values/themes.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/values/themes.xml
new file mode 100644
index 00000000000..9a5a6a169b1
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/values/themes.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/xml/backup_rules.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/xml/backup_rules.xml
new file mode 100644
index 00000000000..fa0f996d2c2
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-plain/src/main/res/xml/data_extraction_rules.xml b/sentry-android-integration-tests/test-app-plain/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 00000000000..9ee9997b0b4
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-plain/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/.gitignore b/sentry-android-integration-tests/test-app-sentry/.gitignore
new file mode 100644
index 00000000000..42afabfd2ab
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/build.gradle.kts b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts
new file mode 100644
index 00000000000..f0571e99de8
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts
@@ -0,0 +1,57 @@
+plugins {
+ id("com.android.application")
+}
+
+android {
+ compileSdk = Config.Android.compileSdkVersion
+
+ defaultConfig {
+ applicationId = "io.sentry.java.tests.perf.appsentry"
+ minSdk = Config.Android.minSdkVersionNdk
+ targetSdk = Config.Android.targetSdkVersion
+ versionCode = 1
+ versionName = "1.0"
+ }
+
+ buildTypes {
+ getByName("release") {
+ isMinifyEnabled = true
+ signingConfig = signingConfigs.getByName("debug") // to be able to run release mode
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro")
+ ndk {
+ abiFilters.clear()
+ abiFilters.add("arm64-v8a")
+ }
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+ buildFeatures {
+ viewBinding = true
+ }
+ signingConfigs {
+ getByName("debug") {
+ storeFile = rootProject.file("debug.keystore")
+ storePassword = "android"
+ keyAlias = "androiddebugkey"
+ keyPassword = "android"
+ }
+ }
+
+ variantFilter {
+ if (Config.Android.shouldSkipDebugVariant(buildType.name)) {
+ ignore = true
+ }
+ }
+}
+
+dependencies {
+ implementation("androidx.appcompat:appcompat:1.3.0")
+ implementation("com.google.android.material:material:1.4.0")
+ implementation("androidx.constraintlayout:constraintlayout:2.0.4")
+ implementation("androidx.navigation:navigation-fragment:2.3.5")
+ implementation("androidx.navigation:navigation-ui:2.3.5")
+ implementation(projects.sentryAndroid)
+}
diff --git a/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro b/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro
new file mode 100644
index 00000000000..2f9dc5a47ed
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.kts.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/AndroidManifest.xml b/sentry-android-integration-tests/test-app-sentry/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..f374d7805d5
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/AndroidManifest.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/FirstFragment.java b/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/FirstFragment.java
new file mode 100644
index 00000000000..99a4f4dfa17
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/FirstFragment.java
@@ -0,0 +1,42 @@
+package io.sentry.java.tests.perf.appsentry;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
+import io.sentry.java.tests.perf.appsentry.databinding.FragmentFirstBinding;
+
+public class FirstFragment extends Fragment {
+
+ private FragmentFirstBinding binding;
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ binding = FragmentFirstBinding.inflate(inflater, container, false);
+ return binding.getRoot();
+ }
+
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ binding.buttonFirst.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ NavHostFragment.findNavController(FirstFragment.this)
+ .navigate(R.id.action_FirstFragment_to_SecondFragment);
+ }
+ });
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+}
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/MainActivity.java b/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/MainActivity.java
new file mode 100644
index 00000000000..99e636c80b1
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/MainActivity.java
@@ -0,0 +1,73 @@
+package io.sentry.java.tests.perf.appsentry;
+
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.navigation.NavController;
+import androidx.navigation.Navigation;
+import androidx.navigation.ui.AppBarConfiguration;
+import androidx.navigation.ui.NavigationUI;
+import com.google.android.material.snackbar.Snackbar;
+import io.sentry.java.tests.perf.appsentry.databinding.ActivityMainBinding;
+
+public class MainActivity extends AppCompatActivity {
+
+ private AppBarConfiguration appBarConfiguration;
+ private ActivityMainBinding binding;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ binding = ActivityMainBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+
+ setSupportActionBar(binding.toolbar);
+
+ NavController navController =
+ Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
+ appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
+ NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
+
+ binding.fab.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
+ .setAction("Action", null)
+ .show();
+ }
+ });
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ //noinspection SimplifiableIfStatement
+ if (id == R.id.action_settings) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ NavController navController =
+ Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
+ return NavigationUI.navigateUp(navController, appBarConfiguration)
+ || super.onSupportNavigateUp();
+ }
+}
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/SecondFragment.java b/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/SecondFragment.java
new file mode 100644
index 00000000000..34f205c605a
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/java/io/sentry/java/tests/perf/appsentry/SecondFragment.java
@@ -0,0 +1,42 @@
+package io.sentry.java.tests.perf.appsentry;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
+import io.sentry.java.tests.perf.appsentry.databinding.FragmentSecondBinding;
+
+public class SecondFragment extends Fragment {
+
+ private FragmentSecondBinding binding;
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ binding = FragmentSecondBinding.inflate(inflater, container, false);
+ return binding.getRoot();
+ }
+
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ binding.buttonSecond.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ NavHostFragment.findNavController(SecondFragment.this)
+ .navigate(R.id.action_SecondFragment_to_FirstFragment);
+ }
+ });
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+}
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000000..2b068d11462
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/drawable/ic_launcher_background.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000000..07d5da9cbf1
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/activity_main.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000000..3c3ae17472c
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/activity_main.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/content_main.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/content_main.xml
new file mode 100644
index 00000000000..e416e1c18d5
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/content_main.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/fragment_first.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/fragment_first.xml
new file mode 100644
index 00000000000..fb44a3d9176
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/fragment_first.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/fragment_second.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/fragment_second.xml
new file mode 100644
index 00000000000..bd9052422ed
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/layout/fragment_second.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/menu/menu_main.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/menu/menu_main.xml
new file mode 100644
index 00000000000..cd5fb0c9f16
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/menu/menu_main.xml
@@ -0,0 +1,10 @@
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000000..eca70cfe52e
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000000..eca70cfe52e
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-hdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000000..898f3ed59ac
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..dffca3601eb
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-mdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000000..64ba76f75e9
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..dae5e082342
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xhdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000000..e5ed46597ea
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..14ed0af3502
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..b0907cac3bf
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..d8ae0315497
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..2c18de9e661
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..beed3cdd2c3
Binary files /dev/null and b/sentry-android-integration-tests/test-app-sentry/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/navigation/nav_graph.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/navigation/nav_graph.xml
new file mode 100644
index 00000000000..c2978769184
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/navigation/nav_graph.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values-land/dimens.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-land/dimens.xml
new file mode 100644
index 00000000000..22d7f004329
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-land/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values-night/themes.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-night/themes.xml
new file mode 100644
index 00000000000..156b6279864
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values-w1240dp/dimens.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-w1240dp/dimens.xml
new file mode 100644
index 00000000000..d73f4a359b5
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-w1240dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 200dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values-w600dp/dimens.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-w600dp/dimens.xml
new file mode 100644
index 00000000000..22d7f004329
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values-w600dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values/colors.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/colors.xml
new file mode 100644
index 00000000000..f8c6127d327
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values/dimens.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/dimens.xml
new file mode 100644
index 00000000000..125df871191
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/dimens.xml
@@ -0,0 +1,3 @@
+
+ 16dp
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values/strings.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/strings.xml
new file mode 100644
index 00000000000..ede49e1de33
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/strings.xml
@@ -0,0 +1,12 @@
+
+ TestAppSentry
+ Settings
+
+ First Fragment
+ Second Fragment
+ Next
+ Previous
+
+ Hello first fragment
+ Hello second fragment. Arg: %1$s
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/values/themes.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/themes.xml
new file mode 100644
index 00000000000..e52de0427cd
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/values/themes.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/xml/backup_rules.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/xml/backup_rules.xml
new file mode 100644
index 00000000000..fa0f996d2c2
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/sentry-android-integration-tests/test-app-sentry/src/main/res/xml/data_extraction_rules.xml b/sentry-android-integration-tests/test-app-sentry/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 00000000000..9ee9997b0b4
--- /dev/null
+++ b/sentry-android-integration-tests/test-app-sentry/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 7f223f91a4f..9c6d479c3af 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -41,7 +41,9 @@ include(
"sentry-samples:sentry-samples-spring-boot-webflux",
"sentry-samples:sentry-samples-netflix-dgs",
"sentry-android-integration-tests:sentry-uitest-android-benchmark",
- "sentry-android-integration-tests:sentry-uitest-android"
+ "sentry-android-integration-tests:sentry-uitest-android",
+ "sentry-android-integration-tests:test-app-plain",
+ "sentry-android-integration-tests:test-app-sentry",
)
gradle.beforeProject {