[go: nahoru, domu]

Disable userspace tracing in cold startup macrobenchmarks

Fixes: 246986194
Test: ./gradlew compose:integration-tests:macrobenchmark:cC -P android.testInstrumentationRunnerArguments.class=androidx.compose.integration.macrobenchmark.TrivialStartupBenchmark -P android.testInstrumentationRunnerArguments.androidx.benchmark.fullTracing.enable=true && cat ../../out/androidx/compose/integration-tests/macrobenchmark/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel\ 4a\ \(5G\)\ -\ 13/androidx.compose.integration.macrobenchmark.test-benchmarkData.json | grep median

The broadcast would wake up the target app, and turn it into a warm
startup.

Before, enable = false
    "median": 41.028624,
    "median": 35.607738,
    "median": 66.2474805,
    "median": 63.19248,
    "median": 211.976532,
    "median": 209.0342135,

Before, enable = true - note faster last numbers - cold startup speedup
    "median": 39.585291,
    "median": 35.7268785,
    "median": 62.4954745,
    "median": 58.4058915,
    "median": 150.565744,
    "median": 148.0306915,

After, enable = true - numbers back to what we expect
    "median": 43.004145,
    "median": 37.9692745,
    "median": 66.402819,
    "median": 62.890449000000004,
    "median": 216.687418,
    "median": 214.176037,

Change-Id: I72c43cabaa35e9e58695601c52b635fc50a74287
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt
index 92c1f32..c54e415 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt
@@ -46,6 +46,9 @@
     /**
      * Set to true to enable androidx.tracing.perfetto tracepoints (such as composition tracing)
      *
+     * Note this only affects Macrobenchmarks currently, and only when StartupMode.COLD is not used,
+     * since enabling the tracepoints wakes the target process
+     *
      * Currently internal/experimental
      */
     val fullTracingEnable: Boolean
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCaptureWrapper.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCaptureWrapper.kt
index 4e88608..166b3e9 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCaptureWrapper.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoCaptureWrapper.kt
@@ -20,7 +20,6 @@
 import android.util.Log
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
-import androidx.benchmark.Arguments
 import androidx.benchmark.Outputs
 import androidx.benchmark.Outputs.dateToFileName
 import androidx.benchmark.PropOverride
@@ -41,20 +40,22 @@
     }
 
     @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
-    private fun start(packages: List<String>): Boolean {
+    private fun start(
+        appTagPackages: List<String>,
+        userspaceTracingPackage: String?
+    ): Boolean {
         capture?.apply {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                 Log.d(PerfettoHelper.LOG_TAG, "Recording perfetto trace")
-                if (Arguments.fullTracingEnable &&
-                    packages.isNotEmpty() &&
+                if (userspaceTracingPackage != null &&
                     Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
                 ) {
                     enableAndroidxTracingPerfetto(
-                        targetPackage = packages.first(),
+                        targetPackage = userspaceTracingPackage,
                         provideBinariesIfMissing = true
                     )
                 }
-                start(packages)
+                start(appTagPackages)
             }
         }
 
@@ -80,7 +81,8 @@
 
     fun record(
         benchmarkName: String,
-        packages: List<String>,
+        appTagPackages: List<String>,
+        userspaceTracingPackage: String?,
         iteration: Int? = null,
         block: () -> Unit
     ): String? {
@@ -97,7 +99,7 @@
         } else null
         try {
             propOverride?.forceValue()
-            start(packages)
+            start(appTagPackages, userspaceTracingPackage)
             val path: String
             try {
                 block()
diff --git a/benchmark/benchmark-junit4/api/restricted_current.ignore b/benchmark/benchmark-junit4/api/restricted_current.ignore
new file mode 100644
index 0000000..7b0440e
--- /dev/null
+++ b/benchmark/benchmark-junit4/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.benchmark.junit4.PerfettoRule#PerfettoRule():
+    Removed constructor androidx.benchmark.junit4.PerfettoRule()
diff --git a/benchmark/benchmark-junit4/api/restricted_current.txt b/benchmark/benchmark-junit4/api/restricted_current.txt
index d3bf38c..e6624c1 100644
--- a/benchmark/benchmark-junit4/api/restricted_current.txt
+++ b/benchmark/benchmark-junit4/api/restricted_current.txt
@@ -21,8 +21,12 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class PerfettoRule implements org.junit.rules.TestRule {
-    ctor public PerfettoRule();
+    ctor public PerfettoRule(optional boolean enableAppTagTracing, optional boolean enableUserspaceTracing);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public boolean getEnableAppTagTracing();
+    method public boolean getEnableUserspaceTracing();
+    property public final boolean enableAppTagTracing;
+    property public final boolean enableUserspaceTracing;
   }
 
 }
diff --git a/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/BenchmarkRule.kt b/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/BenchmarkRule.kt
index cd65676..9a33fe9 100644
--- a/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/BenchmarkRule.kt
+++ b/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/BenchmarkRule.kt
@@ -213,7 +213,8 @@
 
             val tracePath = PerfettoCaptureWrapper().record(
                 benchmarkName = uniqueName,
-                packages = packages,
+                appTagPackages = packages,
+                userspaceTracingPackage = null
             ) {
                 UserspaceTracing.commitToTrace() // clear buffer
 
diff --git a/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/PerfettoRule.kt b/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/PerfettoRule.kt
index 0b8c6a6..97fd9d6 100644
--- a/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/PerfettoRule.kt
+++ b/benchmark/benchmark-junit4/src/main/java/androidx/benchmark/junit4/PerfettoRule.kt
@@ -46,15 +46,30 @@
  * ```
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class PerfettoRule : TestRule {
+public class PerfettoRule(
+    /**
+     * Pass false to disable android.os.Trace API tracing in this process
+     *
+     * Defaults to true.
+     */
+    val enableAppTagTracing: Boolean = true,
+    /**
+     * Pass true to enable userspace tracing (androidx.tracing.tracing-perfetto APIs)
+     *
+     * Defaults to false.
+     */
+    val enableUserspaceTracing: Boolean = false
+) : TestRule {
     override fun apply(
         base: Statement,
         description: Description
     ): Statement = object : Statement() {
         override fun evaluate() {
+            val thisPackage = InstrumentationRegistry.getInstrumentation().context.packageName
             PerfettoCaptureWrapper().record(
                 benchmarkName = "${description.className}_${description.methodName}",
-                packages = listOf(InstrumentationRegistry.getInstrumentation().context.packageName)
+                appTagPackages = if (enableAppTagTracing) listOf(thisPackage) else emptyList(),
+                userspaceTracingPackage = if (enableUserspaceTracing) thisPackage else null
             ) {
                 base.evaluate()
             }
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
index f206893..c3fbdc2 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
@@ -278,11 +278,12 @@
         benchmarkName = packageName,
         // note - packageName may be this package, so we convert to set then list to make unique
         // and on API 23 and below, we use reflection to trace instead within this process
-        packages = if (Build.VERSION.SDK_INT >= 24 && packageName != Packages.TEST) {
+        appTagPackages = if (Build.VERSION.SDK_INT >= 24 && packageName != Packages.TEST) {
             listOf(packageName, Packages.TEST)
         } else {
             listOf(packageName)
         },
+        userspaceTracingPackage = packageName,
         block = measureBlock
     )!!
 
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
index 16a6787..e63fb5f 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
@@ -111,6 +111,7 @@
     iterations: Int,
     launchWithClearTask: Boolean,
     startupModeMetricHint: StartupMode?,
+    userspaceTracingPackage: String?,
     setupBlock: MacrobenchmarkScope.() -> Unit,
     measureBlock: MacrobenchmarkScope.() -> Unit
 ) {
@@ -180,11 +181,12 @@
                      *
                      * @see androidx.benchmark.macro.perfetto.ForceTracing
                      */
-                    packages = if (Build.VERSION.SDK_INT >= 24) {
+                    appTagPackages = if (Build.VERSION.SDK_INT >= 24) {
                         listOf(packageName, macrobenchPackageName)
                     } else {
                         listOf(packageName)
-                    }
+                    },
+                    userspaceTracingPackage = userspaceTracingPackage
                 ) {
                     try {
                         trace("start metrics") {
@@ -312,6 +314,13 @@
     setupBlock: MacrobenchmarkScope.() -> Unit,
     measureBlock: MacrobenchmarkScope.() -> Unit
 ) {
+    val userspaceTracingPackage = if (Arguments.fullTracingEnable &&
+        startupMode != StartupMode.COLD // can't use with COLD, since the broadcast wakes up target
+    ) {
+        packageName
+    } else {
+        null
+    }
     macrobenchmark(
         uniqueName = uniqueName,
         className = className,
@@ -321,6 +330,7 @@
         compilationMode = compilationMode,
         iterations = iterations,
         startupModeMetricHint = startupMode,
+        userspaceTracingPackage = userspaceTracingPackage,
         setupBlock = {
             if (startupMode == StartupMode.COLD) {
                 killProcess()