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