Merge "Moved tracing initialisation to background thread" into androidx-main
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 3d26529..a7d4ab1 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
@@ -26,6 +26,9 @@
 import androidx.tracing.perfetto.Tracing.EnableTracingResponse
 import androidx.tracing.perfetto.TracingReceiver.Companion.ACTION_ENABLE_TRACING
 import java.io.File
+import java.util.concurrent.LinkedBlockingQueue
+import java.util.concurrent.ThreadPoolExecutor
+import java.util.concurrent.TimeUnit
 
 /** Allows for enabling tracing in an app using a broadcast. @see [ACTION_ENABLE_TRACING] */
 @RestrictTo(LIBRARY)
@@ -77,6 +80,16 @@
     )
     internal annotation class EnableTracingResultCode
 
+    private val executor by lazy {
+        ThreadPoolExecutor(
+            /* corePoolSize = */ 0,
+            /* maximumPoolSize = */ 1,
+            /* keepAliveTime = */ 10, // gives time for tooling to side-load the .so file
+            /* unit = */ TimeUnit.SECONDS,
+            /* workQueue = */ LinkedBlockingQueue()
+        )
+    }
+
     // TODO: check value on app start
     override fun onReceive(context: Context?, intent: Intent?) {
         if (intent == null || intent.action != ACTION_ENABLE_TRACING) return
@@ -85,7 +98,20 @@
         // will be used if present.
         val srcPath = intent.extras?.getString(KEY_PATH)
 
-        val response: EnableTracingResponse = when {
+        val pendingResult = goAsync()
+
+        executor.execute {
+            try {
+                val response = enableTracing(srcPath, context)
+                pendingResult.setResult(response.exitCode, response.toJsonString(), null)
+            } finally {
+                pendingResult.finish()
+            }
+        }
+    }
+
+    private fun enableTracing(srcPath: String?, context: Context?): EnableTracingResponse =
+        when {
             Build.VERSION.SDK_INT < Build.VERSION_CODES.R -> {
                 // TODO(234351579): Support API < 30
                 EnableTracingResponse(
@@ -118,9 +144,6 @@
             }
         }
 
-        setResult(response.exitCode, response.toJsonString(), null)
-    }
-
     private fun copyExternalLibraryFile(
         context: Context,
         srcPath: String