diff --git a/.github/workflows/integration-tests-size.yml b/.github/workflows/integration-tests-size.yml new file mode 100644 index 00000000000..44b705cd5c1 --- /dev/null +++ b/.github/workflows/integration-tests-size.yml @@ -0,0 +1,46 @@ +name: SDK Size Analysis + +on: + push: + branches: + - main + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build and Analyze SDK Size + runs-on: ubuntu-latest + + env: + GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }} + + steps: + - name: Checkout Repo + uses: actions/checkout@v5 + + - name: Setup Java Version + uses: actions/setup-java@v5 + with: + distribution: "temurin" + java-version: "17" + + # Workaround for https://github.com/gradle/actions/issues/21 to use config cache + - name: Cache buildSrc + uses: actions/cache@v4 + with: + path: buildSrc/build + key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }} + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 + with: + cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} + + - name: Size Analysis + run: ./gradlew :sentry-android-integration-tests:test-app-size:bundleRelease + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} diff --git a/.github/workflows/spring-boot-2-matrix.yml b/.github/workflows/spring-boot-2-matrix.yml index b21ef0ea64b..c2d34fcbac2 100644 --- a/.github/workflows/spring-boot-2-matrix.yml +++ b/.github/workflows/spring-boot-2-matrix.yml @@ -80,6 +80,7 @@ jobs: -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \ -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \ -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \ + -e '/.*"sentry-android-integration-tests:test-app-size",/d' \ -e '/.*"sentry-samples:sentry-samples-android",/d' \ -e '/.*"sentry-android-replay",/d' \ settings.gradle.kts @@ -91,6 +92,7 @@ jobs: -e '/.*"sentry-uitest-android-benchmark",/d' \ -e '/.*"sentry-uitest-android-critical",/d' \ -e '/.*"test-app-sentry",/d' \ + -e '/.*"test-app-size",/d' \ -e '/.*"sentry-samples-android",/d' \ build.gradle.kts diff --git a/.github/workflows/spring-boot-3-matrix.yml b/.github/workflows/spring-boot-3-matrix.yml index 6e23294ba81..0ce4798472e 100644 --- a/.github/workflows/spring-boot-3-matrix.yml +++ b/.github/workflows/spring-boot-3-matrix.yml @@ -80,6 +80,7 @@ jobs: -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \ -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \ -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \ + -e '/.*"sentry-android-integration-tests:test-app-size",/d' \ -e '/.*"sentry-samples:sentry-samples-android",/d' \ -e '/.*"sentry-android-replay",/d' \ settings.gradle.kts @@ -91,6 +92,7 @@ jobs: -e '/.*"sentry-uitest-android-benchmark",/d' \ -e '/.*"sentry-uitest-android-critical",/d' \ -e '/.*"test-app-sentry",/d' \ + -e '/.*"test-app-size",/d' \ -e '/.*"sentry-samples-android",/d' \ build.gradle.kts diff --git a/.github/workflows/spring-boot-4-matrix.yml b/.github/workflows/spring-boot-4-matrix.yml index 0e3ff39a35b..ddc84f39543 100644 --- a/.github/workflows/spring-boot-4-matrix.yml +++ b/.github/workflows/spring-boot-4-matrix.yml @@ -80,6 +80,7 @@ jobs: -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \ -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \ -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \ + -e '/.*"sentry-android-integration-tests:test-app-size",/d' \ -e '/.*"sentry-samples:sentry-samples-android",/d' \ -e '/.*"sentry-android-replay",/d' \ settings.gradle.kts @@ -91,6 +92,7 @@ jobs: -e '/.*"sentry-uitest-android-benchmark",/d' \ -e '/.*"sentry-uitest-android-critical",/d' \ -e '/.*"test-app-sentry",/d' \ + -e '/.*"test-app-size",/d' \ -e '/.*"sentry-samples-android",/d' \ build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 17b57291eb2..b89b7deed10 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,6 +30,7 @@ plugins { alias(libs.plugins.gradle.versions) apply false alias(libs.plugins.spring.dependency.management) apply false id("io.sentry.javadoc.aggregate") + alias(libs.plugins.sentry) apply false } buildscript { @@ -83,6 +84,7 @@ apiValidation { "sentry-uitest-android-critical", "test-app-plain", "test-app-sentry", + "test-app-size", "sentry-samples-netflix-dgs" ) ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 81ff765f50d..efd54795895 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -65,6 +65,7 @@ springboot4 = { id = "org.springframework.boot", version.ref = "springboot4" } spring-dependency-management = { id = "io.spring.dependency-management", version = "1.0.11.RELEASE" } gretty = { id = "org.gretty", version = "4.0.0" } animalsniffer = { id = "ru.vyarus.animalsniffer", version = "2.0.1" } +sentry = { id = "io.sentry.android.gradle", version = "6.0.0-alpha.6"} [libraries] apache-httpclient = { module = "org.apache.httpcomponents.client5:httpclient5", version = "5.0.4" } diff --git a/sentry-android-integration-tests/test-app-size/.gitignore b/sentry-android-integration-tests/test-app-size/.gitignore new file mode 100644 index 00000000000..796b96d1c40 --- /dev/null +++ b/sentry-android-integration-tests/test-app-size/.gitignore @@ -0,0 +1 @@ +/build diff --git a/sentry-android-integration-tests/test-app-size/build.gradle.kts b/sentry-android-integration-tests/test-app-size/build.gradle.kts new file mode 100644 index 00000000000..c27cb0e08cf --- /dev/null +++ b/sentry-android-integration-tests/test-app-size/build.gradle.kts @@ -0,0 +1,60 @@ +plugins { + id("com.android.application") + id("io.sentry.android.gradle") +} + +android { + namespace = "io.sentry.tests.size" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + applicationId = "io.sentry.tests.size" + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.targetSdk.get().toInt() + versionCode = 1 + versionName = project.version.toString() + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + ndk { + abiFilters.clear() + abiFilters.add("arm64-v8a") + } + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) + } +} + +configurations.configureEach { + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8") + exclude(group = "androidx.core") + exclude(group = "androidx.lifecycle") +} + +dependencies { + implementation(projects.sentryAndroidTimber) + implementation(projects.sentryAndroidSqlite) + implementation(projects.sentryOkhttp) + implementation(projects.sentryCompose) + implementation(projects.sentryAndroidFragment) +} + +sentry { + org.set("sentry-sdks") + projectName.set("sentry-android") + authToken.set(System.getenv("SENTRY_AUTH_TOKEN")) + includeProguardMapping.set(false) + tracingInstrumentation.enabled.set(false) + includeDependenciesReport.set(false) + telemetry.set(false) + sizeAnalysis.enabled.set(providers.environmentVariable("SENTRY_AUTH_TOKEN").isPresent) +} diff --git a/sentry-android-integration-tests/test-app-size/proguard-rules.pro b/sentry-android-integration-tests/test-app-size/proguard-rules.pro new file mode 100644 index 00000000000..4db0031ab00 --- /dev/null +++ b/sentry-android-integration-tests/test-app-size/proguard-rules.pro @@ -0,0 +1,51 @@ +# Rules to not warn about missing classes. We use them, but we only want to measure the SDK size overhead and not run the app, so we keep it lean +# This is generated automatically by the Android Gradle plugin. +-dontwarn kotlin.Lazy +-dontwarn kotlin.LazyKt +-dontwarn kotlin.LazyThreadSafetyMode +-dontwarn kotlin.Metadata +-dontwarn kotlin.NoWhenBranchMatchedException +-dontwarn kotlin.Pair +-dontwarn kotlin.TuplesKt +-dontwarn kotlin.Unit +-dontwarn kotlin.collections.CollectionsKt +-dontwarn kotlin.comparisons.ComparisonsKt +-dontwarn kotlin.enums.EnumEntries +-dontwarn kotlin.enums.EnumEntriesKt +-dontwarn kotlin.io.CloseableKt +-dontwarn kotlin.io.FilesKt +-dontwarn kotlin.io.TextStreamsKt +-dontwarn kotlin.jdk7.AutoCloseableKt +-dontwarn kotlin.jvm.functions.Function0 +-dontwarn kotlin.jvm.functions.Function1 +-dontwarn kotlin.jvm.internal.DefaultConstructorMarker +-dontwarn kotlin.jvm.internal.Intrinsics +-dontwarn kotlin.jvm.internal.Lambda +-dontwarn kotlin.jvm.internal.MutablePropertyReference1 +-dontwarn kotlin.jvm.internal.MutablePropertyReference1Impl +-dontwarn kotlin.jvm.internal.Ref$ObjectRef +-dontwarn kotlin.jvm.internal.Reflection +-dontwarn kotlin.jvm.internal.SourceDebugExtension +-dontwarn kotlin.jvm.internal.TypeIntrinsics +-dontwarn kotlin.properties.ReadWriteProperty +-dontwarn kotlin.ranges.LongProgression +-dontwarn kotlin.ranges.LongRange +-dontwarn kotlin.ranges.RangesKt +-dontwarn kotlin.reflect.KMutableProperty1 +-dontwarn kotlin.reflect.KProperty +-dontwarn kotlin.sequences.Sequence +-dontwarn kotlin.text.Charsets +-dontwarn kotlin.text.Regex +-dontwarn kotlin.text.StringsKt +-dontwarn timber.log.Timber$Tree +-dontwarn kotlin.Deprecated +-dontwarn kotlin.Function +-dontwarn kotlin.jvm.JvmStatic +-dontwarn kotlin.jvm.functions.Function2 +-dontwarn kotlin.jvm.functions.Function3 +-dontwarn kotlin.jvm.internal.Ref$BooleanRef +-dontwarn kotlin.math.MathKt +-dontwarn okhttp3.EventListener +-dontwarn okhttp3.Interceptor +# Assume all classes are used to not strip them out, e.g. integrations like Compose or Sqlite +-keep class io.sentry.** diff --git a/sentry-android-integration-tests/test-app-size/src/main/AndroidManifest.xml b/sentry-android-integration-tests/test-app-size/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..acdb622cbff --- /dev/null +++ b/sentry-android-integration-tests/test-app-size/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + diff --git a/settings.gradle.kts b/settings.gradle.kts index 26970de73c8..c19f1e1499f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -97,5 +97,6 @@ include( "sentry-android-integration-tests:sentry-uitest-android", "sentry-android-integration-tests:test-app-plain", "sentry-android-integration-tests:test-app-sentry", + "sentry-android-integration-tests:test-app-size", "sentry-samples:sentry-samples-openfeign" )