tracing-perfetto: Restricting SDK to R+

Restricting tracing-perfetto to API 30+ due to using sideloaded tracebox
in Benchmark on APIs below 30 and different configuration requirements
as a result (e.g. socket address).

Bug: 234351579
Bug: 233890537
Test: n/a

Change-Id: Ib6ce8cec75c7d555492ff076c38c25e79fbc056a
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt
index 9e6a901..395b23e 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt
@@ -94,6 +94,7 @@
      * Enables Perfetto SDK tracing in an app if present. Provides required binary dependencies to
      * the app if they're missing and the [provideBinariesIfMissing] parameter is set to `true`.
      */
+    @RequiresApi(Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
     fun enableAndroidxTracingPerfetto(
         targetPackage: String,
         provideBinariesIfMissing: Boolean
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
index 2a06a94..cc5cb21 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.benchmark.macro.perfetto
 
+import android.os.Build
+import androidx.annotation.RequiresApi
 import androidx.benchmark.Shell
 import androidx.benchmark.macro.MacrobenchmarkScope
 import androidx.benchmark.macro.Packages
@@ -33,12 +35,14 @@
 import org.junit.runners.Parameterized.Parameters
 
 private const val tracingPerfettoVersion = "1.0.0-alpha01" // TODO(224510255): get by 'reflection'
+private const val minSupportedSdk = Build.VERSION_CODES.R // TODO(234351579): Support API < 30
 
 @RunWith(Parameterized::class)
 /**
  * End-to-end test verifying the process of enabling Perfetto SDK tracing using a broadcast.
  * @see [androidx.tracing.perfetto.TracingReceiver]
  */
+@RequiresApi(Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
 class PerfettoSdkHandshakeTest(private val testConfig: TestConfig) {
     private val perfettoCapture = PerfettoCapture()
     private val targetPackage = Packages.TARGET
@@ -78,6 +82,7 @@
     @Test
     fun test_enable() {
         assumeTrue(isAbiSupported())
+        assumeTrue(Build.VERSION.SDK_INT >= minSupportedSdk)
 
         // start the process if required to already be running when the handshake starts
         if (testConfig.packageAlive) enablePackage()
@@ -107,8 +112,9 @@
     }
 
     @Test
-    fun test_detectUnsupported() {
+    fun test_detectUnsupported_abi() {
         assumeTrue(!isAbiSupported())
+        assumeTrue(Build.VERSION.SDK_INT >= minSupportedSdk)
 
         if (testConfig.packageAlive) enablePackage()
 
@@ -118,10 +124,26 @@
                 shouldProvideBinaries(testConfig.sdkDelivery)
             )
         } catch (e: IllegalStateException) {
-            assertThat(e.message).contains("Unsupported ABI")
+            assertThat(e.message).ignoringCase().contains("Unsupported ABI")
         }
     }
 
+    @Test
+    fun test_detectUnsupported_sdk() {
+        assumeTrue(isAbiSupported())
+        assumeTrue(Build.VERSION.SDK_INT < minSupportedSdk)
+
+        if (testConfig.packageAlive) enablePackage()
+
+        val response =
+            perfettoCapture.enableAndroidxTracingPerfetto(
+                targetPackage,
+                shouldProvideBinaries(testConfig.sdkDelivery)
+            )
+
+        assertThat(response).ignoringCase().contains("SDK version not supported")
+    }
+
     private fun enablePackage() {
         scope.pressHome()
         scope.startActivityAndWait()
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt
index 2da52f3..60e7dc3 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt
@@ -39,7 +39,7 @@
     @get:Rule
     val benchmarkRule = MacrobenchmarkRule()
 
-    @RequiresApi(Build.VERSION_CODES.Q)
+    @RequiresApi(Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
     @OptIn(ExperimentalMetricApi::class)
     @Test
     fun test_composable_names_present_in_trace() {
diff --git a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/test/TracingTest.kt b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/test/TracingTest.kt
index b14f359..05d31ff 100644
--- a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/test/TracingTest.kt
+++ b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/test/TracingTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.tracing.perfetto.test
 
+import android.os.Build
+import androidx.annotation.RequiresApi
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.tracing.perfetto.Tracing
@@ -25,6 +27,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
+@RequiresApi(Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
 class TracingTest {
     @Test
     fun test_endToEnd_binaryDependenciesPresent() {
diff --git a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/Tracing.kt b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/Tracing.kt
index 8bde634..95ac19f 100644
--- a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/Tracing.kt
+++ b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/Tracing.kt
@@ -15,7 +15,9 @@
  */
 package androidx.tracing.perfetto
 
+import android.os.Build
 import android.util.JsonWriter
+import androidx.annotation.RequiresApi
 import androidx.tracing.perfetto.TracingReceiver.Companion.KEY_ERROR_MESSAGE
 import androidx.tracing.perfetto.TracingReceiver.Companion.KEY_EXIT_CODE
 import androidx.tracing.perfetto.TracingReceiver.Companion.KEY_REQUIRED_VERSION
@@ -50,6 +52,7 @@
      */
     private val enableTracingLock = ReentrantReadWriteLock()
 
+    @RequiresApi(Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
     fun enable(path: String? = null): EnableTracingResponse {
         enableTracingLock.readLock().withLock {
             if (isEnabled) return EnableTracingResponse(RESULT_CODE_ALREADY_ENABLED)
diff --git a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/TracingReceiver.kt b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/TracingReceiver.kt
index 5334ceb..6204fd0 100644
--- a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/TracingReceiver.kt
+++ b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/TracingReceiver.kt
@@ -19,6 +19,7 @@
 import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
+import android.os.Build
 import androidx.annotation.IntDef
 import androidx.annotation.RestrictTo
 import androidx.annotation.RestrictTo.Scope.LIBRARY
@@ -85,6 +86,14 @@
         val srcPath = intent.extras?.getString(KEY_PATH)
 
         val response: EnableTracingResponse = when {
+            Build.VERSION.SDK_INT < Build.VERSION_CODES.R -> {
+                // TODO(234351579): Support API < 30
+                EnableTracingResponse(
+                    exitCode = RESULT_CODE_ERROR_OTHER,
+                    errorMessage = "SDK version not supported. " +
+                        "Current minimum SDK = ${Build.VERSION_CODES.R}"
+                )
+            }
             srcPath != null && context != null -> {
                 try {
                     val dstFile = copyExternalLibraryFile(context, srcPath)