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()