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