From e8cf929dc490298a4de71236af833f289c663424 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 15 Feb 2022 13:49:04 +0100 Subject: [PATCH 1/8] Add auto-installation for sentry-android SDK and okhttp-integration --- .../src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt index 9b56c06b..a86b46c2 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt @@ -295,6 +295,10 @@ class SentryPlugin : Plugin { project.installDependencies(extension) } + + if (extension.autoInstallation.enabled.get()) { + project.installDependencies(extension) + } } private fun isVariantAllowed( From 9f714fcb5eec034357f754cc201f0abd1f304932 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 17 Feb 2022 16:45:46 +0100 Subject: [PATCH 2/8] Add TimberInstallStrategyTest --- .../autoinstall/TimberInstallStrategyTest.kt | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt new file mode 100644 index 00000000..579ebc21 --- /dev/null +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt @@ -0,0 +1,104 @@ +package io.sentry.android.gradle.autoinstall + +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.check +import com.nhaarman.mockitokotlin2.doAnswer +import com.nhaarman.mockitokotlin2.doReturn +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.never +import com.nhaarman.mockitokotlin2.verify +import com.nhaarman.mockitokotlin2.whenever +import io.sentry.android.gradle.autoinstall.timber.TimberInstallStrategy +import io.sentry.android.gradle.instrumentation.fakes.CapturingTestLogger +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import org.gradle.api.Action +import org.gradle.api.artifacts.ComponentMetadataContext +import org.gradle.api.artifacts.ComponentMetadataDetails +import org.gradle.api.artifacts.DirectDependenciesMetadata +import org.gradle.api.artifacts.ModuleVersionIdentifier +import org.gradle.api.artifacts.VariantMetadata +import org.junit.Test +import org.slf4j.Logger + +class TimberInstallStrategyTest { + class Fixture { + val logger = CapturingTestLogger() + val dependencies = mock() + val metadataDetails = mock() + val metadataContext = mock { + whenever(it.details).thenReturn(metadataDetails) + val metadata = mock() + doAnswer { + (it.arguments[0] as Action).execute(dependencies) + }.whenever(metadata).withDependencies(any>()) + + doAnswer { + // trigger the callback registered in tests + (it.arguments[0] as Action).execute(metadata) + }.whenever(metadataDetails).allVariants(any>()) + } + + fun getSut(installTimber: Boolean = true, timberVersion: String = "4.7.1"): TimberInstallStrategy { + val id = mock { + whenever(it.version).doReturn(timberVersion) + } + whenever(metadataDetails.id).thenReturn(id) + + val autoInstallState = AutoInstallState.apply { + this.installTimber = installTimber + this.sentryVersion = "5.6.1" + } + return TimberInstallStrategyImpl(autoInstallState, logger) + } + } + + private val fixture = Fixture() + + @Test + fun `when sentry-android-timber is a direct dependency logs a message and does nothing`() { + val sut = fixture.getSut(installTimber = false) + sut.execute(fixture.metadataContext) + + assertTrue { + fixture.logger.capturedMessage == + "[sentry] sentry-android-timber won't be installed because it was already " + + "installed directly" + } + verify(fixture.metadataContext, never()).details + } + + @Test + fun `when timber version is unsupported logs a message and does nothing`() { + val sut = fixture.getSut(timberVersion = "4.5.0") + sut.execute(fixture.metadataContext) + + assertTrue { + fixture.logger.capturedMessage == + "[sentry] sentry-android-timber won't be installed because the current timber " + + "version is lower than the minimum supported version (4.6.0)" + } + verify(fixture.metadataDetails, never()).allVariants(any()) + } + + @Test + fun `installs sentry-android-timber with info message`() { + val sut = fixture.getSut() + sut.execute(fixture.metadataContext) + + assertTrue { + fixture.logger.capturedMessage == + "[sentry] sentry-android-timber is successfully installed with version: 5.6.1" + } + verify(fixture.dependencies).add( + check { + assertEquals("io.sentry:sentry-android-timber:5.6.1", it) + } + ) + } + + private class TimberInstallStrategyImpl( + autoInstallState: AutoInstallState, + logger: Logger + ) : TimberInstallStrategy(autoInstallState, logger) +} From 8e703f9415a1abdd939ee392f91df4aedf87c783 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 17 Feb 2022 16:52:28 +0100 Subject: [PATCH 3/8] Add FragmentInstallStrategyTest --- .../autoinstall/TimberInstallStrategyTest.kt | 104 ------------------ 1 file changed, 104 deletions(-) delete mode 100644 plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt deleted file mode 100644 index 579ebc21..00000000 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TimberInstallStrategyTest.kt +++ /dev/null @@ -1,104 +0,0 @@ -package io.sentry.android.gradle.autoinstall - -import com.nhaarman.mockitokotlin2.any -import com.nhaarman.mockitokotlin2.check -import com.nhaarman.mockitokotlin2.doAnswer -import com.nhaarman.mockitokotlin2.doReturn -import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.never -import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.whenever -import io.sentry.android.gradle.autoinstall.timber.TimberInstallStrategy -import io.sentry.android.gradle.instrumentation.fakes.CapturingTestLogger -import kotlin.test.assertEquals -import kotlin.test.assertTrue -import org.gradle.api.Action -import org.gradle.api.artifacts.ComponentMetadataContext -import org.gradle.api.artifacts.ComponentMetadataDetails -import org.gradle.api.artifacts.DirectDependenciesMetadata -import org.gradle.api.artifacts.ModuleVersionIdentifier -import org.gradle.api.artifacts.VariantMetadata -import org.junit.Test -import org.slf4j.Logger - -class TimberInstallStrategyTest { - class Fixture { - val logger = CapturingTestLogger() - val dependencies = mock() - val metadataDetails = mock() - val metadataContext = mock { - whenever(it.details).thenReturn(metadataDetails) - val metadata = mock() - doAnswer { - (it.arguments[0] as Action).execute(dependencies) - }.whenever(metadata).withDependencies(any>()) - - doAnswer { - // trigger the callback registered in tests - (it.arguments[0] as Action).execute(metadata) - }.whenever(metadataDetails).allVariants(any>()) - } - - fun getSut(installTimber: Boolean = true, timberVersion: String = "4.7.1"): TimberInstallStrategy { - val id = mock { - whenever(it.version).doReturn(timberVersion) - } - whenever(metadataDetails.id).thenReturn(id) - - val autoInstallState = AutoInstallState.apply { - this.installTimber = installTimber - this.sentryVersion = "5.6.1" - } - return TimberInstallStrategyImpl(autoInstallState, logger) - } - } - - private val fixture = Fixture() - - @Test - fun `when sentry-android-timber is a direct dependency logs a message and does nothing`() { - val sut = fixture.getSut(installTimber = false) - sut.execute(fixture.metadataContext) - - assertTrue { - fixture.logger.capturedMessage == - "[sentry] sentry-android-timber won't be installed because it was already " + - "installed directly" - } - verify(fixture.metadataContext, never()).details - } - - @Test - fun `when timber version is unsupported logs a message and does nothing`() { - val sut = fixture.getSut(timberVersion = "4.5.0") - sut.execute(fixture.metadataContext) - - assertTrue { - fixture.logger.capturedMessage == - "[sentry] sentry-android-timber won't be installed because the current timber " + - "version is lower than the minimum supported version (4.6.0)" - } - verify(fixture.metadataDetails, never()).allVariants(any()) - } - - @Test - fun `installs sentry-android-timber with info message`() { - val sut = fixture.getSut() - sut.execute(fixture.metadataContext) - - assertTrue { - fixture.logger.capturedMessage == - "[sentry] sentry-android-timber is successfully installed with version: 5.6.1" - } - verify(fixture.dependencies).add( - check { - assertEquals("io.sentry:sentry-android-timber:5.6.1", it) - } - ) - } - - private class TimberInstallStrategyImpl( - autoInstallState: AutoInstallState, - logger: Logger - ) : TimberInstallStrategy(autoInstallState, logger) -} From 5334983ea9a79899f3d526cd261b6709ea022087 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 18 Feb 2022 20:32:02 +0100 Subject: [PATCH 4/8] Use build service to share auto-install state --- .../android/gradle/autoinstall/InstallStrategyRegistrar.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt index 63863322..4ccbf8ce 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt @@ -1,7 +1,8 @@ package io.sentry.android.gradle.autoinstall import org.gradle.api.artifacts.dsl.ComponentMetadataHandler +import org.gradle.api.provider.Provider interface InstallStrategyRegistrar { - fun register(component: ComponentMetadataHandler) + fun register(component: ComponentMetadataHandler, autoInstallState: Provider) } From d6accf383714500a3ac411b4c683175bd9b4f742 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 18 Feb 2022 20:32:15 +0100 Subject: [PATCH 5/8] Add integration test --- .../android/gradle/autoinstall/TestAutoInstallState.kt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt new file mode 100644 index 00000000..fc5f61aa --- /dev/null +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt @@ -0,0 +1,7 @@ +package io.sentry.android.gradle.autoinstall + +import org.gradle.api.services.BuildServiceParameters + +class TestAutoInstallState : AutoInstallState() { + override fun getParameters(): BuildServiceParameters.None = TODO() +} From 5888e61c58188d3af1dd78aea724c9e8f8677be6 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 3 Mar 2022 13:11:25 +0100 Subject: [PATCH 6/8] Add SentryOkHttpInterceptor instrumentation --- buildSrc/src/main/java/Dependencies.kt | 7 +- .../samples/instrumentation/SampleApp.kt | 19 ---- .../instrumentation/network/TrackService.kt | 23 +++++ .../instrumentation/ui/MainActivity.kt | 32 +++++- .../samples/instrumentation/util/Lyrics.kt | 14 --- examples/android-room-lib/build.gradle.kts | 3 +- .../android/gradle/internal/ASMifyTask.kt | 2 +- .../TracingInstrumentationExtension.kt | 13 ++- .../SpanAddingClassVisitorFactory.kt | 9 ++ .../gradle/instrumentation/okhttp/OkHttp.kt | 49 +++++++++ ...sponseWithInterceptorChainMethodVisitor.kt | 96 ++++++++++++++++++ .../gradle/instrumentation/util/Types.kt | 19 +++- .../gradle/util/SentryAndroidSdkState.kt | 5 +- .../gradle/instrumentation/VisitorTest.kt | 6 +- .../GeneratingMissingClassesClassLoader.kt | 25 +++-- .../classloader/mapping/GmsMapping.kt | 18 ---- .../classloader/mapping/OkHttpMapping.kt | 9 ++ .../src/test/kotlin/okhttp3/Interceptor.kt | 5 + .../instrumentation/okhttp/v3/RealCall.class | Bin 0 -> 5764 bytes .../instrumentation/okhttp/v4/RealCall.class | Bin 0 -> 21913 bytes 20 files changed, 278 insertions(+), 76 deletions(-) create mode 100644 examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/network/TrackService.kt delete mode 100644 examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/util/Lyrics.kt create mode 100644 plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/OkHttp.kt create mode 100644 plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt delete mode 100644 plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/GmsMapping.kt create mode 100644 plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/OkHttpMapping.kt create mode 100644 plugin-build/src/test/kotlin/okhttp3/Interceptor.kt create mode 100644 plugin-build/src/test/resources/testFixtures/instrumentation/okhttp/v3/RealCall.class create mode 100644 plugin-build/src/test/resources/testFixtures/instrumentation/okhttp/v4/RealCall.class diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 0234b8d7..f7f40b61 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -61,9 +61,10 @@ object Samples { const val rxjava = "androidx.room:room-rxjava2:${version}" } - object OkHttp { - private const val version = "4.9.3" - const val okhttp = "com.squareup.okhttp3:okhttp:${version}" + object Retrofit { + private const val version = "2.9.0" + const val retrofit = "com.squareup.retrofit2:retrofit:${version}" + const val retrofitGson = "com.squareup.retrofit2:converter-gson:${version}" } object Timber { diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/SampleApp.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/SampleApp.kt index 26531d22..31eeab1f 100644 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/SampleApp.kt +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/SampleApp.kt @@ -5,12 +5,6 @@ import android.content.Context import android.content.SharedPreferences import androidx.room.Room import io.sentry.samples.instrumentation.data.TracksDatabase -import io.sentry.samples.instrumentation.util.DEFAULT_LYRICS -import java.io.File -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.launch class SampleApp : Application() { @@ -30,18 +24,5 @@ class SampleApp : Application() { .build() analytics = getSharedPreferences("analytics", Context.MODE_PRIVATE) - - GlobalScope.launch(Dispatchers.IO) { - database.tracksDao().all() - .collect { tracks -> - tracks.forEachIndexed { index, track -> - // add lyrics for every 2nd track - if (index % 2 == 0) { - val file = File(filesDir, "${track.id}.txt") - file.writeText(DEFAULT_LYRICS) - } - } - } - } } } diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/network/TrackService.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/network/TrackService.kt new file mode 100644 index 00000000..94fa424f --- /dev/null +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/network/TrackService.kt @@ -0,0 +1,23 @@ +package io.sentry.samples.instrumentation.network + +import io.sentry.samples.instrumentation.data.Track +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.create +import retrofit2.http.GET +import retrofit2.http.Path + +interface TrackService { + + @GET("v3/{uuid}") + suspend fun tracks(@Path("uuid") uuid: String): List + + companion object { + private val retrofit = Retrofit.Builder() + .baseUrl("https://run.mocky.io/") + .addConverterFactory(GsonConverterFactory.create()) + .build() + + val instance = retrofit.create() + } +} diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt index 6ebb669f..ba41e439 100644 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt @@ -1,7 +1,9 @@ package io.sentry.samples.instrumentation.ui import android.content.Intent +import android.os.Build import android.os.Bundle +import android.util.Log import androidx.activity.ComponentActivity import androidx.appcompat.widget.Toolbar import androidx.lifecycle.lifecycleScope @@ -11,8 +13,21 @@ import io.sentry.Sentry import io.sentry.SpanStatus import io.sentry.samples.instrumentation.R import io.sentry.samples.instrumentation.SampleApp +import io.sentry.samples.instrumentation.network.TrackService import io.sentry.samples.instrumentation.ui.list.TrackAdapter +import java.io.IOException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.scan +import kotlinx.coroutines.withContext +import okhttp3.Call +import okhttp3.Callback +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -24,14 +39,21 @@ class MainActivity : ComponentActivity() { list.adapter = TrackAdapter() lifecycleScope.launchWhenStarted { + Sentry.getSpan()?.finish() + val transaction = Sentry.startTransaction( + "Track Interaction", + "ui.action.load", + true + ) SampleApp.database.tracksDao() .all() + .map { + val remote = withContext(Dispatchers.IO) { + TrackService.instance.tracks("9365c2e9-906c-407c-851c-7204cc2975f7") + } + remote + it + } .collect { - val transaction = Sentry.startTransaction( - "Track Interaction", - "ui.action.load", - true - ) (list.adapter as TrackAdapter).populate(it) transaction.finish(SpanStatus.OK) } diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/util/Lyrics.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/util/Lyrics.kt deleted file mode 100644 index f4ec53b8..00000000 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/util/Lyrics.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.sentry.samples.instrumentation.util - -val DEFAULT_LYRICS = - """ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi dapibus elit vel commodo varius. Suspendisse eget tempus est. Pellentesque egestas mi vitae massa ultrices vulputate. Aenean tempor nec sem eu congue. Phasellus mollis tellus odio, ut tincidunt arcu ullamcorper at. Nunc quis lorem vel risus auctor ultricies. Quisque ornare congue sagittis. Donec sit amet arcu vitae mi sodales porta vitae et mi. Nullam eu viverra urna, quis elementum risus. In at accumsan justo. Nam hendrerit, lorem ac lacinia semper, diam dolor pulvinar turpis, non tincidunt dolor lacus non quam. Etiam tempus, dui ut rutrum ornare, quam eros feugiat nisi, et blandit nisi lacus nec neque. Mauris aliquam id tellus vel molestie. Quisque ultricies ante nec lacus condimentum, at aliquet diam volutpat. - -Vivamus fermentum eu ante non aliquam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum interdum semper orci, et auctor enim pharetra vel. Ut porttitor neque in blandit scelerisque. Cras fermentum urna sit amet metus tincidunt, eu porttitor nisi mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris pharetra leo vitae turpis commodo, sit amet cursus nunc varius. Etiam bibendum interdum dolor, a scelerisque massa mattis eu. Suspendisse consequat tortor ac tincidunt vulputate. - -Maecenas non lectus sit amet dui porta dapibus. Etiam vitae velit nibh. Morbi purus urna, cursus convallis feugiat vel, vulputate eget turpis. Vivamus et tincidunt lectus. Nullam id risus est. Sed ullamcorper pellentesque massa, dignissim ultricies urna maximus ac. Vivamus maximus eu ex quis ultricies. Donec facilisis diam arcu, id cursus sapien condimentum ac. Aenean suscipit, nibh ac tempus pharetra, ligula augue bibendum arcu, sed fringilla magna nisl vel felis. - -Cras lacinia efficitur elit, ac sagittis nulla commodo eu. Aliquam a est at augue imperdiet eleifend. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas luctus est non vulputate porta. Phasellus eros libero, auctor id justo ac, mollis eleifend enim. Suspendisse pulvinar mi lorem, a maximus massa tincidunt ac. Duis mattis nibh a mauris laoreet laoreet. Donec malesuada quis dui feugiat ultricies. Ut at sem consectetur, tincidunt massa in, bibendum metus. - -Sed fermentum eros ac odio venenatis, id varius est mollis. Fusce sollicitudin tellus risus, vel accumsan ante auctor in. Phasellus vel blandit massa. Suspendisse potenti. Donec vitae elementum enim, quis dictum mauris. Nullam consectetur enim at turpis bibendum, consequat facilisis sem ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eget nisl id libero tempus fringilla vitae eget urna. Etiam dui neque, vestibulum a mi vulputate, placerat interdum sem. Mauris sit amet aliquam felis. Suspendisse potenti. Nullam odio purus, ultricies in tincidunt sit amet, interdum ac orci. Nulla volutpat auctor velit, sed malesuada urna auctor sed. Suspendisse non sollicitudin tortor. Vivamus vulputate lacinia nisi, pellentesque sagittis sapien. - """.trimIndent() diff --git a/examples/android-room-lib/build.gradle.kts b/examples/android-room-lib/build.gradle.kts index a7168ada..125e5e21 100644 --- a/examples/android-room-lib/build.gradle.kts +++ b/examples/android-room-lib/build.gradle.kts @@ -24,5 +24,6 @@ dependencies { // this is here for test purposes, to ensure that transitive dependencies are also recognized // by our auto-installation - implementation(Samples.OkHttp.okhttp) + api(Samples.Retrofit.retrofit) + api(Samples.Retrofit.retrofitGson) } diff --git a/plugin-build/buildSrc/src/main/kotlin/io/sentry/android/gradle/internal/ASMifyTask.kt b/plugin-build/buildSrc/src/main/kotlin/io/sentry/android/gradle/internal/ASMifyTask.kt index 875bcc72..9bf0576d 100644 --- a/plugin-build/buildSrc/src/main/kotlin/io/sentry/android/gradle/internal/ASMifyTask.kt +++ b/plugin-build/buildSrc/src/main/kotlin/io/sentry/android/gradle/internal/ASMifyTask.kt @@ -45,7 +45,7 @@ abstract class ASMifyTask : Exec() { private val tmpDir: String get() = "${project.buildDir}/tmp/asmified" override fun exec() { - val asmJars = project.configurations.getByName("runtimeClasspath") + val asmJars = project.configurations.getByName("compileClasspath") .resolvedConfiguration .resolvedArtifacts .filter { diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/TracingInstrumentationExtension.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/TracingInstrumentationExtension.kt index ecc4a78d..7a0986db 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/TracingInstrumentationExtension.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/TracingInstrumentationExtension.kt @@ -41,7 +41,8 @@ open class TracingInstrumentationExtension @Inject constructor(objects: ObjectFa objects.setProperty(InstrumentationFeature::class.java).convention( setOf( InstrumentationFeature.DATABASE, - InstrumentationFeature.FILE_IO + InstrumentationFeature.FILE_IO, + InstrumentationFeature.OKHTTP ) ) } @@ -59,5 +60,13 @@ enum class InstrumentationFeature { * This feature uses bytecode manipulation and replaces the above * mentioned classes with Sentry-specific implementations. */ - FILE_IO + FILE_IO, + + /** + * When enabled the SDK will create spans for outgoing network requests and attach + * sentry-trace-header for distributed tracing. + * This feature uses bytecode manipulation and attaches SentryOkHttpInterceptor to all OkHttp + * clients in the project. + */ + OKHTTP } diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/SpanAddingClassVisitorFactory.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/SpanAddingClassVisitorFactory.kt index 12c8ba20..38aa275e 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/SpanAddingClassVisitorFactory.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/SpanAddingClassVisitorFactory.kt @@ -9,11 +9,13 @@ import io.sentry.android.gradle.extensions.InstrumentationFeature import io.sentry.android.gradle.instrumentation.androidx.room.AndroidXRoomDao import io.sentry.android.gradle.instrumentation.androidx.sqlite.database.AndroidXSQLiteDatabase import io.sentry.android.gradle.instrumentation.androidx.sqlite.statement.AndroidXSQLiteStatement +import io.sentry.android.gradle.instrumentation.okhttp.OkHttp import io.sentry.android.gradle.instrumentation.remap.RemappingInstrumentable import io.sentry.android.gradle.instrumentation.wrap.WrappingInstrumentable import io.sentry.android.gradle.services.SentrySdkStateHolder import io.sentry.android.gradle.util.SentryAndroidSdkState import io.sentry.android.gradle.util.SentryAndroidSdkState.FILE_IO +import io.sentry.android.gradle.util.SentryAndroidSdkState.OKHTTP import io.sentry.android.gradle.util.SentryAndroidSdkState.PERFORMANCE import io.sentry.android.gradle.util.debug import io.sentry.android.gradle.util.info @@ -82,6 +84,7 @@ abstract class SpanAddingClassVisitorFactory : isDatabaseInstrEnabled(sdkState, parameters.get()) }, AndroidXRoomDao().takeIf { isDatabaseInstrEnabled(sdkState, parameters.get()) }, + OkHttp().takeIf { isOkHttpInstrEnabled(sdkState, parameters.get()) }, ChainedInstrumentable( listOf(WrappingInstrumentable(), RemappingInstrumentable()) ).takeIf { isFileIOInstrEnabled(sdkState, parameters.get()) } @@ -107,6 +110,12 @@ abstract class SpanAddingClassVisitorFactory : sdkState.isAtLeast(FILE_IO) && parameters.features.get().contains(InstrumentationFeature.FILE_IO) + private fun isOkHttpInstrEnabled( + sdkState: SentryAndroidSdkState, + parameters: SpanAddingParameters + ): Boolean = sdkState.isAtLeast(OKHTTP) && + parameters.features.get().contains(InstrumentationFeature.OKHTTP) + override fun createClassVisitor( classContext: ClassContext, nextClassVisitor: ClassVisitor diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/OkHttp.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/OkHttp.kt new file mode 100644 index 00000000..e45e583b --- /dev/null +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/OkHttp.kt @@ -0,0 +1,49 @@ +package io.sentry.android.gradle.instrumentation.okhttp + +import com.android.build.api.instrumentation.ClassContext +import io.sentry.android.gradle.instrumentation.ClassInstrumentable +import io.sentry.android.gradle.instrumentation.CommonClassVisitor +import io.sentry.android.gradle.instrumentation.MethodContext +import io.sentry.android.gradle.instrumentation.MethodInstrumentable +import io.sentry.android.gradle.instrumentation.SpanAddingClassVisitorFactory +import io.sentry.android.gradle.instrumentation.okhttp.visitor.ResponseWithInterceptorChainMethodVisitor +import org.objectweb.asm.ClassVisitor +import org.objectweb.asm.MethodVisitor + +class OkHttp : ClassInstrumentable { + override val fqName: String get() = "okhttp3.internal.connection.RealCall" + + override fun getVisitor( + instrumentableContext: ClassContext, + apiVersion: Int, + originalVisitor: ClassVisitor, + parameters: SpanAddingClassVisitorFactory.SpanAddingParameters + ): ClassVisitor = CommonClassVisitor( + apiVersion = apiVersion, + classVisitor = originalVisitor, + className = fqName.substringAfterLast('.'), + methodInstrumentables = listOf(ResponseWithInterceptorChain()), + parameters = parameters + ) +} + +class ResponseWithInterceptorChain : MethodInstrumentable { + override val fqName: String get() = "getResponseWithInterceptorChain" + + override fun getVisitor( + instrumentableContext: MethodContext, + apiVersion: Int, + originalVisitor: MethodVisitor, + parameters: SpanAddingClassVisitorFactory.SpanAddingParameters + ): MethodVisitor = ResponseWithInterceptorChainMethodVisitor( + api = apiVersion, + originalVisitor = originalVisitor, + access = instrumentableContext.access, + name = instrumentableContext.name, + descriptor = instrumentableContext.descriptor + ) + + override fun isInstrumentable(data: MethodContext): Boolean { + return data.name?.startsWith(fqName) == true + } +} diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt new file mode 100644 index 00000000..170d5a21 --- /dev/null +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt @@ -0,0 +1,96 @@ +package io.sentry.android.gradle.instrumentation.okhttp.visitor + +import io.sentry.android.gradle.instrumentation.util.Types +import org.objectweb.asm.Label +import org.objectweb.asm.MethodVisitor +import org.objectweb.asm.Opcodes +import org.objectweb.asm.Type +import org.objectweb.asm.commons.GeneratorAdapter +import org.objectweb.asm.commons.Method + +class ResponseWithInterceptorChainMethodVisitor( + api: Int, + private val originalVisitor: MethodVisitor, + access: Int, + name: String?, + descriptor: String? +) : GeneratorAdapter(api, originalVisitor, access, name, descriptor) { + + private var shouldInstrument = false + + override fun visitMethodInsn( + opcode: Int, + owner: String?, + name: String?, + descriptor: String?, + isInterface: Boolean + ) { + if (opcode == Opcodes.INVOKEVIRTUAL && + owner == "okhttp3/OkHttpClient" && + name == "interceptors" + ) { + shouldInstrument = true + } + super.visitMethodInsn(opcode, owner, name, descriptor, isInterface) + } + + override fun visitInsn(opcode: Int) { + super.visitInsn(opcode) + if (opcode == Opcodes.POP && shouldInstrument) { + visitAddSentryInterceptor() + shouldInstrument = false + } + } + + /* + Roughly constructing this, but in Java: + + if (interceptors.find { it is SentryOkHttpInterceptor } != null) { + interceptors += SentryOkHttpInterceptor() + } + */ + private fun MethodVisitor.visitAddSentryInterceptor() { + originalVisitor.visitVarInsn(Opcodes.ALOAD, 1) // interceptors list + + checkCast(Types.ITERABLE) + invokeInterface(Types.ITERABLE, Method.getMethod("java.util.Iterator iterator ()")) + val iteratorIndex = newLocal(Types.ITERATOR) + storeLocal(iteratorIndex) + + val whileLabel = Label() + val endWhileLabel = Label() + visitLabel(whileLabel) + loadLocal(iteratorIndex) + invokeInterface(Types.ITERATOR, Method.getMethod("boolean hasNext ()")) + ifZCmp(EQ, endWhileLabel) + loadLocal(iteratorIndex) + invokeInterface(Types.ITERATOR, Method.getMethod("Object next ()")) + + val interceptorIndex = newLocal(Types.OBJECT) + storeLocal(interceptorIndex) + loadLocal(interceptorIndex) + checkCast(Types.OKHTTP_INTERCEPTOR) + instanceOf(Types.SENTRY_OKHTTP_INTERCEPTOR) + ifZCmp(EQ, whileLabel) + loadLocal(interceptorIndex) + val ifLabel = Label() + goTo(ifLabel) + + visitLabel(endWhileLabel) + originalVisitor.visitInsn(Opcodes.ACONST_NULL) + visitLabel(ifLabel) + val originalMethodLabel = Label() + ifNonNull(originalMethodLabel) + + originalVisitor.visitVarInsn(Opcodes.ALOAD, 1) + checkCast(Types.COLLECTION) + newInstance(Types.SENTRY_OKHTTP_INTERCEPTOR) + dup() + val sentryOkHttpCtor = Method.getMethod("void ()") + invokeConstructor(Types.SENTRY_OKHTTP_INTERCEPTOR, sentryOkHttpCtor) + val addInterceptor = Method.getMethod("boolean add (Object)") + invokeInterface(Types.COLLECTION, addInterceptor) + pop() + visitLabel(originalMethodLabel) + } +} diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/util/Types.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/util/Types.kt index b20a19fd..bc3a3eab 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/util/Types.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/util/Types.kt @@ -3,11 +3,22 @@ package io.sentry.android.gradle.instrumentation.util import org.objectweb.asm.Type object Types { - val SQL_EXCEPTION = Type.getType("Landroid/database/SQLException;") - val CURSOR = Type.getType("Landroid/database/Cursor;") - val SPAN = Type.getType("Lio/sentry/Span;") + // COMMON val OBJECT = Type.getType("Ljava/lang/Object;") val STRING = Type.getType("Ljava/lang/String;") - val EXCEPTION = Type.getType("Ljava/lang/Exception;") val INT = Type.INT_TYPE + val EXCEPTION = Type.getType("Ljava/lang/Exception;") + val ITERABLE = Type.getType("Ljava/lang/Iterable;") + val ITERATOR = Type.getType("Ljava/util/Iterator;") + val COLLECTION = Type.getType("Ljava/util/Collection;") + + // DB + val SQL_EXCEPTION = Type.getType("Landroid/database/SQLException;") + val CURSOR = Type.getType("Landroid/database/Cursor;") + val SPAN = Type.getType("Lio/sentry/Span;") + + // OKHTTP + val OKHTTP_INTERCEPTOR = Type.getType("Lokhttp3/Interceptor;") + val SENTRY_OKHTTP_INTERCEPTOR = + Type.getType("Lio/sentry/android/okhttp/SentryOkHttpInterceptor;") } diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/util/SentryAndroidSdkState.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/util/SentryAndroidSdkState.kt index 6196cce2..02d834a8 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/util/SentryAndroidSdkState.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/util/SentryAndroidSdkState.kt @@ -7,6 +7,8 @@ enum class SentryAndroidSdkState(val minVersion: SemVer) : Serializable { PERFORMANCE(SemVer(4, 0, 0)), + OKHTTP(SemVer(5, 0, 0)), + FILE_IO(SemVer(5, 5, 0)); fun isAtLeast(state: SentryAndroidSdkState): Boolean = this.ordinal >= state.ordinal @@ -20,7 +22,8 @@ enum class SentryAndroidSdkState(val minVersion: SemVer) : Serializable { val semVer = SemVer.parse(version) return when { semVer < PERFORMANCE.minVersion -> MISSING - semVer >= PERFORMANCE.minVersion && semVer < FILE_IO.minVersion -> PERFORMANCE + semVer >= PERFORMANCE.minVersion && semVer < OKHTTP.minVersion -> PERFORMANCE + semVer >= OKHTTP.minVersion && semVer < FILE_IO.minVersion -> OKHTTP semVer >= FILE_IO.minVersion -> FILE_IO else -> error("Unknown version $version of sentry-android") } diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt index 1538ace1..2671398b 100644 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt @@ -8,8 +8,10 @@ import io.sentry.android.gradle.instrumentation.classloader.GeneratingMissingCla import io.sentry.android.gradle.instrumentation.fakes.TestClassContext import io.sentry.android.gradle.instrumentation.fakes.TestClassData import io.sentry.android.gradle.instrumentation.fakes.TestSpanAddingParameters +import io.sentry.android.gradle.instrumentation.okhttp.OkHttp import io.sentry.android.gradle.instrumentation.remap.RemappingInstrumentable import io.sentry.android.gradle.instrumentation.wrap.WrappingInstrumentable +import java.io.File import java.io.FileInputStream import java.io.PrintWriter import java.io.StringWriter @@ -134,7 +136,9 @@ class VisitorTest( "zzhm", ChainedInstrumentable(listOf(WrappingInstrumentable(), RemappingInstrumentable())), null - ) + ), + arrayOf("okhttp/v3", "RealCall", OkHttp(), null), + arrayOf("okhttp/v4", "RealCall", OkHttp(), null) ) private fun roomDaoTestParameters(suffix: String = "") = arrayOf( diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/GeneratingMissingClassesClassLoader.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/GeneratingMissingClassesClassLoader.kt index 6781366c..a9d2323c 100644 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/GeneratingMissingClassesClassLoader.kt +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/GeneratingMissingClassesClassLoader.kt @@ -1,8 +1,8 @@ package io.sentry.android.gradle.instrumentation.classloader import io.sentry.android.gradle.instrumentation.classloader.mapping.deletionDaoMissingClasses -import io.sentry.android.gradle.instrumentation.classloader.mapping.gmsMapping import io.sentry.android.gradle.instrumentation.classloader.mapping.insertionDaoMissingClasses +import io.sentry.android.gradle.instrumentation.classloader.mapping.okHttpMissingClasses import io.sentry.android.gradle.instrumentation.classloader.mapping.selectDaoMissingClasses import io.sentry.android.gradle.instrumentation.classloader.mapping.sqliteCopyOpenHelperMissingClasses import io.sentry.android.gradle.instrumentation.classloader.mapping.updateDaoMissingClasses @@ -16,17 +16,28 @@ class GeneratingMissingClassesClassLoader : ClassLoader(getSystemClassLoader()) *updateDaoMissingClasses, *selectDaoMissingClasses, *sqliteCopyOpenHelperMissingClasses, - *gmsMapping + *okHttpMissingClasses ) } override fun findClass(name: String): Class<*> { if (name in missingClasses) { - val fqName = name.replace('.', '/') - val source = missingClasses[name]!!.invoke(name) - val bytes = compileClass(fqName, source) - return defineClass(name, bytes.toByteArray(), 0, bytes.size()) + return generateClass(name, missingClasses[name]!!.invoke(name)) } - return super.findClass(name) + + return try { + super.findClass(name) + } catch (e: ClassNotFoundException) { + generateClass(name) + } + } + + private fun generateClass( + name: String, + source: String = standardClassSource(name) + ): Class<*> { + val fqName = name.replace('.', '/') + val bytes = compileClass(fqName, source) + return defineClass(name, bytes.toByteArray(), 0, bytes.size()) } } diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/GmsMapping.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/GmsMapping.kt deleted file mode 100644 index 87db19fd..00000000 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/GmsMapping.kt +++ /dev/null @@ -1,18 +0,0 @@ -package io.sentry.android.gradle.instrumentation.classloader.mapping - -import io.sentry.android.gradle.instrumentation.classloader.standardClassSource - -val gmsMapping = arrayOf String>>( - "com.google.android.gms.internal.measurement.zzhz" to { name -> - standardClassSource( - name, - interfaces = arrayOf("android.app.Application.ActivityLifecycleCallbacks") - ) - }, - "com.google.android.gms.internal.measurement.zzhi" to { name -> - standardClassSource( - name, - interfaces = arrayOf("java.lang.Runnable") - ) - } -) diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/OkHttpMapping.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/OkHttpMapping.kt new file mode 100644 index 00000000..ce874db7 --- /dev/null +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/classloader/mapping/OkHttpMapping.kt @@ -0,0 +1,9 @@ +package io.sentry.android.gradle.instrumentation.classloader.mapping + +import io.sentry.android.gradle.instrumentation.classloader.standardClassSource + +val okHttpMissingClasses = arrayOf String>>( + "okhttp3.internal.http.RealInterceptorChain" to { name -> + standardClassSource(name, interfaces = arrayOf("okhttp3.Interceptor.Chain")) + } +) diff --git a/plugin-build/src/test/kotlin/okhttp3/Interceptor.kt b/plugin-build/src/test/kotlin/okhttp3/Interceptor.kt new file mode 100644 index 00000000..bd703cd7 --- /dev/null +++ b/plugin-build/src/test/kotlin/okhttp3/Interceptor.kt @@ -0,0 +1,5 @@ +package okhttp3 + +interface Interceptor { + interface Chain +} diff --git a/plugin-build/src/test/resources/testFixtures/instrumentation/okhttp/v3/RealCall.class b/plugin-build/src/test/resources/testFixtures/instrumentation/okhttp/v3/RealCall.class new file mode 100644 index 0000000000000000000000000000000000000000..f6672d789b9b2c871437e8f679d10db5db10d0e9 GIT binary patch literal 5764 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 W{RXJvuR1#WJkA$aGPrLnulNrGyQM4u literal 0 HcmV?d00001 diff --git a/plugin-build/src/test/resources/testFixtures/instrumentation/okhttp/v4/RealCall.class b/plugin-build/src/test/resources/testFixtures/instrumentation/okhttp/v4/RealCall.class new file mode 100644 index 0000000000000000000000000000000000000000..c84967a16056a055923cb5e206a6071379ce1c63 GIT binary patch literal 21913 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 WzGU*NrkZ7{K2v?!ROe0gmH!7}uo0X9 literal 0 HcmV?d00001 From f7fa89b46fb6a9860ab354a25bce069f5a179efe Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 3 Mar 2022 13:15:02 +0100 Subject: [PATCH 7/8] ktlint --- .../sentry/samples/instrumentation/ui/MainActivity.kt | 11 ----------- .../ResponseWithInterceptorChainMethodVisitor.kt | 1 - .../android/gradle/instrumentation/VisitorTest.kt | 1 - 3 files changed, 13 deletions(-) diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt index ba41e439..3819b171 100644 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/MainActivity.kt @@ -1,9 +1,7 @@ package io.sentry.samples.instrumentation.ui import android.content.Intent -import android.os.Build import android.os.Bundle -import android.util.Log import androidx.activity.ComponentActivity import androidx.appcompat.widget.Toolbar import androidx.lifecycle.lifecycleScope @@ -15,19 +13,10 @@ import io.sentry.samples.instrumentation.R import io.sentry.samples.instrumentation.SampleApp import io.sentry.samples.instrumentation.network.TrackService import io.sentry.samples.instrumentation.ui.list.TrackAdapter -import java.io.IOException import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.scan import kotlinx.coroutines.withContext -import okhttp3.Call -import okhttp3.Callback -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt index 170d5a21..dfff1a8f 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/instrumentation/okhttp/visitor/ResponseWithInterceptorChainMethodVisitor.kt @@ -4,7 +4,6 @@ import io.sentry.android.gradle.instrumentation.util.Types import org.objectweb.asm.Label import org.objectweb.asm.MethodVisitor import org.objectweb.asm.Opcodes -import org.objectweb.asm.Type import org.objectweb.asm.commons.GeneratorAdapter import org.objectweb.asm.commons.Method diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt index 2671398b..e477a15f 100644 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/instrumentation/VisitorTest.kt @@ -11,7 +11,6 @@ import io.sentry.android.gradle.instrumentation.fakes.TestSpanAddingParameters import io.sentry.android.gradle.instrumentation.okhttp.OkHttp import io.sentry.android.gradle.instrumentation.remap.RemappingInstrumentable import io.sentry.android.gradle.instrumentation.wrap.WrappingInstrumentable -import java.io.File import java.io.FileInputStream import java.io.PrintWriter import java.io.StringWriter From 37a19dd7577877a4bb28302f815f64acc40f46bb Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 9 Mar 2022 12:14:31 +0100 Subject: [PATCH 8/8] Merge cleanups --- .../main/kotlin/io/sentry/android/gradle/SentryPlugin.kt | 4 ---- .../android/gradle/autoinstall/InstallStrategyRegistrar.kt | 3 +-- .../android/gradle/autoinstall/TestAutoInstallState.kt | 7 ------- 3 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt index a86b46c2..9b56c06b 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt @@ -295,10 +295,6 @@ class SentryPlugin : Plugin { project.installDependencies(extension) } - - if (extension.autoInstallation.enabled.get()) { - project.installDependencies(extension) - } } private fun isVariantAllowed( diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt index 4ccbf8ce..63863322 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/autoinstall/InstallStrategyRegistrar.kt @@ -1,8 +1,7 @@ package io.sentry.android.gradle.autoinstall import org.gradle.api.artifacts.dsl.ComponentMetadataHandler -import org.gradle.api.provider.Provider interface InstallStrategyRegistrar { - fun register(component: ComponentMetadataHandler, autoInstallState: Provider) + fun register(component: ComponentMetadataHandler) } diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt deleted file mode 100644 index fc5f61aa..00000000 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/autoinstall/TestAutoInstallState.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.sentry.android.gradle.autoinstall - -import org.gradle.api.services.BuildServiceParameters - -class TestAutoInstallState : AutoInstallState() { - override fun getParameters(): BuildServiceParameters.None = TODO() -}