Skip to content

Commit 3d205d0

Browse files
build: Add animalsniffer to check that source is compatible with Android API (#4705)
Add animalsniffer to check that Java packages are compatible with Android API level 21. Only targets packages that can be used in Android and ignores java.time.Instant and SentryWrapper. These are version gated and must be used explicitly, respectively. Closes #4679
1 parent 4c4fed9 commit 3d205d0

File tree

8 files changed

+53
-0
lines changed

8 files changed

+53
-0
lines changed

gradle/libs.versions.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ targetSdk = "34"
3737
compileSdk = "34"
3838
minSdk = "21"
3939
spotless = "7.0.4"
40+
gummyBears = "0.12.0"
4041

4142
[plugins]
4243
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
@@ -62,6 +63,7 @@ springboot3 = { id = "org.springframework.boot", version.ref = "springboot3" }
6263
springboot4 = { id = "org.springframework.boot", version.ref = "springboot4" }
6364
spring-dependency-management = { id = "io.spring.dependency-management", version = "1.0.11.RELEASE" }
6465
gretty = { id = "org.gretty", version = "4.0.0" }
66+
animalsniffer = { id = "ru.vyarus.animalsniffer", version = "2.0.1" }
6567

6668
[libraries]
6769
apache-httpclient = { module = "org.apache.httpcomponents.client5:httpclient5", version = "5.0.4" }
@@ -176,6 +178,9 @@ springboot4-starter-jdbc = { module = "org.springframework.boot:spring-boot-star
176178
springboot4-starter-actuator = { module = "org.springframework.boot:spring-boot-starter-actuator", version.ref = "springboot4" }
177179
timber = { module = "com.jakewharton.timber:timber", version = "4.7.1" }
178180

181+
# Animalsniffer signature
182+
gummy-bears-api21 = { module = "com.toasttab.android:gummy-bears-api-21", version.ref = "gummyBears" }
183+
179184
# tomcat libraries
180185
tomcat-catalina = { module = "org.apache.tomcat:tomcat-catalina", version = "9.0.108" }
181186
tomcat-embed-jasper = { module = "org.apache.tomcat.embed:tomcat-embed-jasper", version = "9.0.108" }

sentry-apollo-3/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.buildconfig)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
tasks.withType<KotlinCompile>().configureEach {
@@ -37,6 +38,9 @@ dependencies {
3738
testImplementation(libs.mockito.kotlin)
3839
testImplementation(libs.mockito.inline)
3940
testImplementation(libs.okhttp.mockwebserver)
41+
42+
val gummyBearsModule = libs.gummy.bears.api21.get().module
43+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
4044
}
4145

4246
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -57,6 +61,7 @@ tasks {
5761
check {
5862
dependsOn(jacocoTestCoverageVerification)
5963
dependsOn(jacocoTestReport)
64+
dependsOn(animalsnifferMain)
6065
}
6166
}
6267

sentry-apollo-4/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.buildconfig)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
configure<JavaPluginExtension> {
@@ -44,6 +45,9 @@ dependencies {
4445
testImplementation(libs.mockito.inline)
4546
testImplementation(libs.okhttp.mockwebserver)
4647
testImplementation("org.jetbrains.kotlin:kotlin-reflect:2.0.0")
48+
49+
val gummyBearsModule = libs.gummy.bears.api21.get().module
50+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
4751
}
4852

4953
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -64,6 +68,7 @@ tasks {
6468
check {
6569
dependsOn(jacocoTestCoverageVerification)
6670
dependsOn(jacocoTestReport)
71+
dependsOn(animalsnifferMain)
6772
}
6873
}
6974

sentry-apollo/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.buildconfig)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
tasks.withType<KotlinCompile>().configureEach {
@@ -38,6 +39,9 @@ dependencies {
3839
testImplementation(libs.mockito.kotlin)
3940
testImplementation(libs.mockito.inline)
4041
testImplementation(libs.okhttp.mockwebserver)
42+
43+
val gummyBearsModule = libs.gummy.bears.api21.get().module
44+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
4145
}
4246

4347
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -58,6 +62,7 @@ tasks {
5862
check {
5963
dependsOn(jacocoTestCoverageVerification)
6064
dependsOn(jacocoTestReport)
65+
dependsOn(animalsnifferMain)
6166
}
6267
}
6368

sentry-kotlin-extensions/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.detekt)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
tasks.withType<KotlinCompile>().configureEach {
@@ -32,6 +33,9 @@ dependencies {
3233
testImplementation(libs.kotlinx.coroutines)
3334
testImplementation(libs.kotlinx.coroutines.test)
3435
testImplementation(libs.mockito.kotlin)
36+
37+
val gummyBearsModule = libs.gummy.bears.api21.get().module
38+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
3539
}
3640

3741
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -52,6 +56,7 @@ tasks {
5256
check {
5357
dependsOn(jacocoTestCoverageVerification)
5458
dependsOn(jacocoTestReport)
59+
dependsOn(animalsnifferMain)
5560
}
5661
}
5762

sentry-ktor-client/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.buildconfig)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
tasks.withType<KotlinCompile>().configureEach {
@@ -39,6 +40,9 @@ dependencies {
3940
testImplementation(libs.ktor.client.core)
4041
testImplementation(libs.ktor.client.java)
4142
testImplementation(libs.okhttp.mockwebserver)
43+
44+
val gummyBearsModule = libs.gummy.bears.api21.get().module
45+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
4246
}
4347

4448
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -59,6 +63,7 @@ tasks {
5963
check {
6064
dependsOn(jacocoTestCoverageVerification)
6165
dependsOn(jacocoTestReport)
66+
dependsOn(animalsnifferMain)
6267
}
6368
}
6469

sentry-okhttp/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.buildconfig)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
tasks.withType<KotlinCompile>().configureEach {
@@ -38,6 +39,9 @@ dependencies {
3839
testImplementation(libs.mockito.inline)
3940
testImplementation(libs.okhttp)
4041
testImplementation(libs.okhttp.mockwebserver)
42+
43+
val gummyBearsModule = libs.gummy.bears.api21.get().module
44+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
4145
}
4246

4347
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -58,6 +62,7 @@ tasks {
5862
check {
5963
dependsOn(jacocoTestCoverageVerification)
6064
dependsOn(jacocoTestReport)
65+
dependsOn(animalsnifferMain)
6166
}
6267
}
6368

sentry/build.gradle.kts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
alias(libs.plugins.errorprone)
1010
alias(libs.plugins.gradle.versions)
1111
alias(libs.plugins.buildconfig)
12+
alias(libs.plugins.animalsniffer)
1213
}
1314

1415
tasks.withType<KotlinCompile>().configureEach {
@@ -31,6 +32,9 @@ dependencies {
3132
testImplementation(libs.msgpack)
3233
testImplementation(libs.okio)
3334
testImplementation(projects.sentryTestSupport)
35+
36+
val gummyBearsModule = libs.gummy.bears.api21.get().module
37+
signature("${gummyBearsModule}:${libs.versions.gummyBears.get()}@signature")
3438
}
3539

3640
configure<SourceSetContainer> { test { java.srcDir("src/test/java") } }
@@ -44,13 +48,27 @@ tasks.jacocoTestReport {
4448
}
4549
}
4650

51+
animalsniffer {
52+
ignore =
53+
listOf(
54+
// We manually check on Android if it's available (API 26+).
55+
"java.time.Instant"
56+
)
57+
}
58+
59+
tasks.animalsnifferMain {
60+
// Uses java.util.function.Supplier, but must be manually invoked.
61+
exclude("**/io/sentry/SentryWrapper.class")
62+
}
63+
4764
tasks {
4865
jacocoTestCoverageVerification {
4966
violationRules { rule { limit { minimum = Config.QualityPlugins.Jacoco.minimumCoverage } } }
5067
}
5168
check {
5269
dependsOn(jacocoTestCoverageVerification)
5370
dependsOn(jacocoTestReport)
71+
dependsOn(animalsnifferMain)
5472
}
5573
test {
5674
jvmArgs("--add-opens", "java.base/java.util.concurrent=ALL-UNNAMED")

0 commit comments

Comments
 (0)