Merge "Fix method tracing affecting measurements when art built from source on API 34" into androidx-main
diff --git a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/DeviceInfoTest.kt b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/DeviceInfoTest.kt
index 456635c..61d9775 100644
--- a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/DeviceInfoTest.kt
+++ b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/DeviceInfoTest.kt
@@ -62,6 +62,26 @@
}
@Test
+ fun willMethodTracingAffectMeasurements() {
+ // first clause - 26 through 30 (inclusive) affected
+ assertFalse(DeviceInfo.willMethodTracingAffectMeasurements(25, -1))
+ assertTrue(DeviceInfo.willMethodTracingAffectMeasurements(26, -1L))
+ assertTrue(DeviceInfo.willMethodTracingAffectMeasurements(30, -1L))
+ assertFalse(DeviceInfo.willMethodTracingAffectMeasurements(31, 310000000L))
+
+ // second clause - art API 34 regression
+ assertFalse(DeviceInfo.willMethodTracingAffectMeasurements(33, 330000000L))
+ assertTrue(DeviceInfo.willMethodTracingAffectMeasurements(33, 340000000L))
+ assertTrue(DeviceInfo.willMethodTracingAffectMeasurements(33, 341513000L - 1))
+ assertFalse(DeviceInfo.willMethodTracingAffectMeasurements(33, 341513000L))
+
+ // third clause - art API 34 regression and internal build ID
+ assertFalse(DeviceInfo.willMethodTracingAffectMeasurements(33, 990090000L))
+ assertTrue(DeviceInfo.willMethodTracingAffectMeasurements(34, 990090000L))
+ assertFalse(DeviceInfo.willMethodTracingAffectMeasurements(35, 990090000L))
+ }
+
+ @Test
fun artMainlineVersion() =
validateArtMainlineVersion(artMainlineVersion = DeviceInfo.artMainlineVersion)
}
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt
index 3083747..002ab09 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt
@@ -302,6 +302,16 @@
private const val ART_MAINLINE_MIN_VERSION_VERIFY_CLEARS_RUNTIME_IMAGE = 350800000L
/**
+ * ART mainline 990090000 means the module is built from source in the system image and isn't
+ * updatable, and thus expectations should be conservative - assume that any potential bug on
+ * the current SDK version may be present on this device.
+ *
+ * Ideally, we'd have a minimum release build ID, but these may not be consistently and easily
+ * sortable.
+ */
+ private const val ART_MAINLINE_INTERNAL_BUILD_MIN = 990000000
+
+ /**
* Used when mainline version failed to detect, but this is accepted due to low API level (<34)
* where presence isn't guaranteed (e.g. go devices)
*/
@@ -320,15 +330,18 @@
else -> ART_MAINLINE_VERSION_UNDETECTED
}
- val methodTracingAffectsMeasurements =
- Build.VERSION.SDK_INT in 26..30 || // b/313868903
- artMainlineVersion in ART_MAINLINE_VERSIONS_AFFECTING_METHOD_TRACING // b/303660864
+ fun willMethodTracingAffectMeasurements(sdkInt: Int, artVersion: Long): Boolean =
+ sdkInt in 26..30 || // b/313868903
+ artVersion in ART_MAINLINE_VERSIONS_AFFECTING_METHOD_TRACING || // b/303660864
+ (sdkInt == 34 && artVersion >= ART_MAINLINE_INTERNAL_BUILD_MIN) // b/303686344#comment31
- fun isClassLoadTracingAvailable(targetApiLevel: Int, targetArtMainlineVersion: Long?): Boolean =
- targetApiLevel >= 35 ||
- (targetApiLevel >= 31 &&
- (targetArtMainlineVersion == null ||
- targetArtMainlineVersion >= ART_MAINLINE_MIN_VERSION_CLASS_LOAD_TRACING))
+ val methodTracingAffectsMeasurements =
+ willMethodTracingAffectMeasurements(Build.VERSION.SDK_INT, artMainlineVersion)
+
+ fun isClassLoadTracingAvailable(sdkInt: Int, artVersion: Long?): Boolean =
+ sdkInt >= 35 ||
+ (sdkInt >= 31 &&
+ (artVersion == null || artVersion >= ART_MAINLINE_MIN_VERSION_CLASS_LOAD_TRACING))
val supportsClassLoadTracing =
isClassLoadTracingAvailable(Build.VERSION.SDK_INT, artMainlineVersion)
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
index 4810691..aaa9668 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
@@ -23,9 +23,7 @@
import androidx.benchmark.Shell
import androidx.benchmark.macro.BatteryCharge.hasMinimumCharge
import androidx.benchmark.macro.PowerMetric.Companion.deviceSupportsHighPrecisionTracking
-import androidx.benchmark.macro.PowerMetric.Type
import androidx.benchmark.macro.PowerRail.hasMetrics
-import androidx.benchmark.macro.TraceSectionMetric.Mode
import androidx.benchmark.macro.perfetto.BatteryDischargeQuery
import androidx.benchmark.macro.perfetto.FrameTimingQuery
import androidx.benchmark.macro.perfetto.FrameTimingQuery.SubMetric
@@ -730,8 +728,8 @@
.asMeasurements("artVerifyClass") +
if (
DeviceInfo.isClassLoadTracingAvailable(
- targetApiLevel = captureInfo.apiLevel,
- targetArtMainlineVersion = captureInfo.artMainlineVersion
+ sdkInt = captureInfo.apiLevel,
+ artVersion = captureInfo.artMainlineVersion
)
) {
traceSession