Add resource size tracking to benchmarks

Fixed: b/368282141
Change-Id: Ia71c179a29b6aeb9706ca2e30cca4df43c4a2e10
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
index 752726b..bb462ed 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
@@ -186,6 +186,11 @@
       return this;
     }
 
+    public Builder measureResourceSize() {
+      metrics.add(BenchmarkMetric.ResourceSize);
+      return this;
+    }
+
     public Builder measureWarmup() {
       measureWarmup = true;
       return this;
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
index 22fbf4a..55d34c2 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
@@ -35,8 +35,9 @@
   private final LongList codeSizeResults = new LongArrayList();
   private final LongList instructionCodeSizeResults = new LongArrayList();
   private final LongList composableInstructionCodeSizeResults = new LongArrayList();
-  private final LongList dex2OatSizeResult = new LongArrayList();
+  private final LongList dex2OatSizeResults = new LongArrayList();
   private final List<Int2ReferenceMap<SegmentInfo>> dexSegmentsSizeResults = new ArrayList<>();
+  private final LongList resourceSizeResults = new LongArrayList();
 
   public BenchmarkResultsSingle(String name, Set<BenchmarkMetric> metrics) {
     this.name = name;
@@ -63,14 +64,18 @@
     return dexSegmentsSizeResults;
   }
 
-  public LongList getDex2OatSizeResult() {
-    return dex2OatSizeResult;
+  public LongList getDex2OatSizeResults() {
+    return dex2OatSizeResults;
   }
 
   public LongList getRuntimeResults() {
     return runtimeResults;
   }
 
+  public LongList getResourceSizeResults() {
+    return resourceSizeResults;
+  }
+
   @Override
   public void addRuntimeResult(long result) {
     verifyMetric(BenchmarkMetric.RunTimeRaw, metrics.contains(BenchmarkMetric.RunTimeRaw), true);
@@ -114,12 +119,14 @@
   public void addDex2OatSizeResult(long result) {
     verifyMetric(
         BenchmarkMetric.Dex2OatCodeSize, metrics.contains(BenchmarkMetric.Dex2OatCodeSize), true);
-    dex2OatSizeResult.add(result);
+    dex2OatSizeResults.add(result);
   }
 
   @Override
   public void addResourceSizeResult(long result) {
-    addCodeSizeResult(result);
+    verifyMetric(
+        BenchmarkMetric.ResourceSize, true, metrics.contains(BenchmarkMetric.ResourceSize));
+    resourceSizeResults.add(result);
   }
 
   @Override
@@ -133,8 +140,9 @@
     assertTrue(codeSizeResults.isEmpty());
     assertTrue(instructionCodeSizeResults.isEmpty());
     assertTrue(composableInstructionCodeSizeResults.isEmpty());
-    assertTrue(dex2OatSizeResult.isEmpty());
+    assertTrue(dex2OatSizeResults.isEmpty());
     assertTrue(dexSegmentsSizeResults.isEmpty());
+    assertTrue(resourceSizeResults.isEmpty());
   }
 
   @Override
@@ -179,7 +187,7 @@
     verifyMetric(
         BenchmarkMetric.Dex2OatCodeSize,
         isBenchmarkingCodeSize() && metrics.contains(BenchmarkMetric.Dex2OatCodeSize),
-        !dex2OatSizeResult.isEmpty());
+        !dex2OatSizeResults.isEmpty());
   }
 
   private void printRunTime(long duration) {
@@ -213,6 +221,10 @@
     System.out.println(BenchmarkResults.prettyMetric(name, BenchmarkMetric.Dex2OatCodeSize, bytes));
   }
 
+  private void printResourceSize(long bytes) {
+    System.out.println(BenchmarkResults.prettyMetric(name, BenchmarkMetric.ResourceSize, bytes));
+  }
+
   @Override
   public void printResults(ResultMode mode, boolean failOnCodeSizeDifferences) {
     verifyConfigAndResults();
@@ -235,7 +247,8 @@
           failOnCodeSizeDifferences,
           result -> printDexSegmentSize(section, result));
     }
-    printCodeSizeResults(dex2OatSizeResult, failOnCodeSizeDifferences, this::printDex2OatSize);
+    printCodeSizeResults(dex2OatSizeResults, failOnCodeSizeDifferences, this::printDex2OatSize);
+    printCodeSizeResults(resourceSizeResults, failOnCodeSizeDifferences, this::printResourceSize);
   }
 
   private static void printCodeSizeResults(
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java
index 7e62cfc..6ae91ef 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java
@@ -54,8 +54,8 @@
           resultObject,
           "oat_code_size",
           iteration,
-          result.getDex2OatSizeResult(),
-          i -> result.getDex2OatSizeResult().getLong(i));
+          result.getDex2OatSizeResults(),
+          i -> result.getDex2OatSizeResults().getLong(i));
       addPropertyIfValueDifferentFromRepresentative(
           resultObject,
           "runtime",
@@ -63,6 +63,13 @@
           result.getRuntimeResults(),
           i -> result.getRuntimeResults().getLong(i));
           resultsArray.add(resultObject);
+      addPropertyIfValueDifferentFromRepresentative(
+          resultObject,
+          "resource_size",
+          iteration,
+          result.getResourceSizeResults(),
+          i -> result.getResourceSizeResults().getLong(i));
+      resultsArray.add(resultObject);
     }
 
     JsonObject benchmarkObject = new JsonObject();
diff --git a/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java b/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
index 706ad2b..dc7a609 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
@@ -164,6 +164,9 @@
           .measureComposableInstructionCodeSize()
           .measureDexSegmentsCodeSize()
           .measureDex2OatCodeSize();
+      if (enableResourceShrinking) {
+        builder.measureResourceSize();
+      }
     }
     return builder.build();
   }
@@ -181,50 +184,26 @@
       ThrowableConsumer<? super R8PartialTestBuilder> configuration,
       ThrowableConsumer<? super R8PartialTestCompileResult> compileResultConsumer) {
     verify();
-    return BenchmarkConfig.builder()
-        .setName(name)
-        .setTarget(BenchmarkTarget.R8)
-        .setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
-        .setMethod(runR8WithPartialShrinking(this, configuration, compileResultConsumer))
-        .setFromRevision(fromRevision)
-        .addDependency(dumpDependency)
-        .measureRunTime()
-        .measureCodeSize()
-        .measureInstructionCodeSize()
-        .measureComposableInstructionCodeSize()
-        .measureDexSegmentsCodeSize()
-        .measureDex2OatCodeSize()
-        // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
-        //  on SystemUI.
-        .setEnableDex2OatVerification(!name.equals("SystemUIAppPartialShrinking"))
-        .setTimeout(10, TimeUnit.MINUTES)
-        .build();
-  }
-
-  public BenchmarkConfig buildR8WithResourceShrinking(
-      ThrowableConsumer<? super R8FullTestBuilder> configuration) {
-    verify();
     BenchmarkConfig.Builder builder =
         BenchmarkConfig.builder()
             .setName(name)
             .setTarget(BenchmarkTarget.R8)
             .setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
-            .setMethod(runR8(this, configuration))
+            .setMethod(runR8WithPartialShrinking(this, configuration, compileResultConsumer))
             .setFromRevision(fromRevision)
             .addDependency(dumpDependency)
-            // TODO(b/368282141): Also measure resource size.
             .measureRunTime()
+            .measureCodeSize()
+            .measureInstructionCodeSize()
+            .measureComposableInstructionCodeSize()
+            .measureDexSegmentsCodeSize()
+            .measureDex2OatCodeSize()
             // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
             //  on SystemUI.
-            .setEnableDex2OatVerification(!name.equals("SystemUIApp"))
+            .setEnableDex2OatVerification(!name.equals("SystemUIAppPartialShrinking"))
             .setTimeout(10, TimeUnit.MINUTES);
-    if (!runtimeOnly) {
-      builder
-          .measureCodeSize()
-          .measureInstructionCodeSize()
-          .measureComposableInstructionCodeSize()
-          .measureDexSegmentsCodeSize()
-          .measureDex2OatCodeSize();
+    if (enableResourceShrinking) {
+      builder.measureResourceSize();
     }
     return builder.build();
   }
@@ -386,14 +365,18 @@
                       .apply(
                           r -> {
                             try {
-                              // TODO(b/368282141): Also emit resource size.
                               r.benchmarkCompile(results)
                                   .benchmarkCodeSize(results)
                                   .benchmarkInstructionCodeSize(results)
                                   .benchmarkDexSegmentsCodeSize(results)
                                   .benchmarkDex2OatCodeSize(
                                       results,
-                                      environment.getConfig().isDex2OatVerificationEnabled());
+                                      environment.getConfig().isDex2OatVerificationEnabled())
+                                  .applyIf(
+                                      environment
+                                          .getConfig()
+                                          .containsMetric(BenchmarkMetric.ResourceSize),
+                                      cr -> cr.benchmarkResourceSize(results));
                             } catch (CompilationFailedException e) {
                               if (!(e.getCause() instanceof AbortBenchmarkException)) {
                                 throw e;
@@ -468,6 +451,11 @@
                                   .benchmarkDex2OatCodeSize(
                                       results,
                                       environment.getConfig().isDex2OatVerificationEnabled())
+                                  .applyIf(
+                                      environment
+                                          .getConfig()
+                                          .containsMetric(BenchmarkMetric.ResourceSize),
+                                      cr -> cr.benchmarkResourceSize(results))
                                   .apply(compileResultConsumer));
                 });
   }
diff --git a/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
index 11ffbcd..ff81615 100644
--- a/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
+++ b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
@@ -10,7 +10,8 @@
   ComposableInstructionCodeSize,
   DexSegmentsCodeSize,
   Dex2OatCodeSize,
-  StartupTime;
+  StartupTime,
+  ResourceSize;
 
   public String getDartType() {
     return "Metric." + name();