Merge "Remove and hide non-API procedures on R8."
diff --git a/.gitignore b/.gitignore
index 0661690..b66a429 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,6 +20,8 @@
 tools/*/art-7.0.0.tar.gz
 tools/*/dalvik
 tools/*/dalvik.tar.gz
+tools/*/dalvik-4.0.4
+tools/*/dalvik-4.0.4.tar.gz
 tools/*/dx
 tools/*/dx.tar.gz
 third_party/android_jar/lib
diff --git a/build.gradle b/build.gradle
index 4e7562c..2d98276 100644
--- a/build.gradle
+++ b/build.gradle
@@ -271,6 +271,8 @@
                 "android_jar/lib-v15",
                 "android_jar/lib-v19",
                 "android_jar/lib-v21",
+                "android_jar/lib-v22",
+                "android_jar/lib-v23",
                 "android_jar/lib-v24",
                 "android_jar/lib-v25",
                 "android_jar/lib-v26",
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 0424e2a..f65b4eb 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -191,20 +191,6 @@
     }
 
     /**
-     * Add and/or chain proguard configuration consumer(s) for testing.
-     */
-    public Builder addProguardConfigurationConsumer(Consumer<ProguardConfiguration.Builder> c) {
-      Consumer<ProguardConfiguration.Builder> oldConsumer = proguardConfigurationConsumer;
-      proguardConfigurationConsumer = builder -> {
-        if (oldConsumer != null) {
-          oldConsumer.accept(builder);
-        }
-        c.accept(builder);
-      };
-      return self();
-    }
-
-    /**
      * Set an output destination to which proguard-map content should be written.
      *
      * <p>This is a short-hand for setting a {@link StringConsumer.FileConsumer} using {@link
@@ -336,6 +322,18 @@
 
       return command;
     }
+
+    // Internal for-testing method to add post-processors of the proguard configuration.
+    void addProguardConfigurationConsumerForTesting(Consumer<ProguardConfiguration.Builder> c) {
+      Consumer<ProguardConfiguration.Builder> oldConsumer = proguardConfigurationConsumer;
+      proguardConfigurationConsumer =
+          builder -> {
+            if (oldConsumer != null) {
+              oldConsumer.accept(builder);
+            }
+            c.accept(builder);
+          };
+    }
   }
 
   // Internal state to verify parsing properties not enforced by the builder.
diff --git a/src/main/java/com/android/tools/r8/dex/Constants.java b/src/main/java/com/android/tools/r8/dex/Constants.java
index 03f2ad5..77a82df 100644
--- a/src/main/java/com/android/tools/r8/dex/Constants.java
+++ b/src/main/java/com/android/tools/r8/dex/Constants.java
@@ -15,8 +15,8 @@
   public static final int MIN_VDEX_VERSION = 10;
   public static final int MAX_VDEX_VERSION = 11;
 
-  // We apply Java 7 class file constraints on DEX files.
-  public static final int CORRESPONDING_CLASS_FILE_VERSION = 51;
+  // We apply Java 6 class file constraints on DEX files.
+  public static final int CORRESPONDING_CLASS_FILE_VERSION = 50;
 
   public static final int DEX_MAGIC_SIZE = 8;
 
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
index 363b80c..4e080b7 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
@@ -97,18 +97,19 @@
       throw new RuntimeException("Must supply main-dex-list inputs");
     }
 
-    useProgramFileBuilder(CompilationMode.DEBUG, minApiLevel, libraries, classpath, inputs);
-    useProgramFileBuilder(CompilationMode.RELEASE, minApiLevel, libraries, classpath, inputs);
-    useProgramDataBuilder(minApiLevel, libraries, classpath, inputs);
-    useProgramProvider(minApiLevel, libraries, classpath, inputs);
+    useProgramFileList(CompilationMode.DEBUG, minApiLevel, libraries, classpath, inputs);
+    useProgramFileList(CompilationMode.RELEASE, minApiLevel, libraries, classpath, inputs);
+    useProgramData(minApiLevel, libraries, classpath, inputs);
+    useProgramResourceProvider(minApiLevel, libraries, classpath, inputs);
     useLibraryAndClasspathProvider(minApiLevel, libraries, classpath, inputs);
     useMainDexListFiles(minApiLevel, libraries, classpath, inputs, mainDexList);
     useMainDexClasses(minApiLevel, libraries, classpath, inputs, mainDexList);
+    useVArgVariants(minApiLevel, libraries, classpath, inputs, mainDexList);
     incrementalCompileAndMerge(minApiLevel, libraries, classpath, inputs);
   }
 
   // Check API support for compiling Java class-files from the file system.
-  private static void useProgramFileBuilder(
+  private static void useProgramFileList(
       CompilationMode mode,
       int minApiLevel,
       Collection<Path> libraries,
@@ -130,7 +131,7 @@
   }
 
   // Check API support for compiling Java class-files from byte content.
-  private static void useProgramDataBuilder(
+  private static void useProgramData(
       int minApiLevel,
       Collection<Path> libraries,
       Collection<Path> classpath,
@@ -145,6 +146,11 @@
       for (ClassFileContent classfile : readClassFiles(inputs)) {
         builder.addClassProgramData(classfile.data, classfile.origin);
       }
+      for (Path input : inputs) {
+        if (isDexFile(input)) {
+          builder.addDexProgramData(Files.readAllBytes(input), new PathOrigin(input));
+        }
+      }
       D8.run(builder.build());
     } catch (CompilationFailedException e) {
       throw new RuntimeException("Unexpected compilation exceptions", e);
@@ -154,7 +160,7 @@
   }
 
   // Check API support for compiling Java class-files from a program provider abstraction.
-  private static void useProgramProvider(
+  private static void useProgramResourceProvider(
       int minApiLevel,
       Collection<Path> libraries,
       Collection<Path> classpath,
@@ -171,7 +177,7 @@
           builder.addProgramResourceProvider(
               ArchiveProgramResourceProvider.fromArchive(
                   input, ArchiveProgramResourceProvider::includeClassFileEntries));
-        } else {
+        } else if (isClassFile(input)) {
           builder.addProgramResourceProvider(
               new ProgramResourceProvider() {
                 @Override
@@ -179,6 +185,14 @@
                   return Collections.singleton(ProgramResource.fromFile(Kind.CF, input));
                 }
               });
+        } else if (isDexFile(input)) {
+          builder.addProgramResourceProvider(
+              new ProgramResourceProvider() {
+                @Override
+                public Collection<ProgramResource> getProgramResources() throws ResourceException {
+                  return Collections.singleton(ProgramResource.fromFile(Kind.DEX, input));
+                }
+              });
         }
       }
       D8.run(builder.build());
@@ -266,6 +280,32 @@
     }
   }
 
+  // Check API support for all the varg variants.
+  private static void useVArgVariants(
+      int minApiLevel,
+      List<Path> libraries,
+      List<Path> classpath,
+      List<Path> inputs,
+      List<Path> mainDexList) {
+    try {
+      D8.run(
+          D8Command.builder(handler)
+              .setMinApiLevel(minApiLevel)
+              .setProgramConsumer(new EnsureOutputConsumer())
+              .addLibraryFiles(libraries.get(0))
+              .addLibraryFiles(libraries.stream().skip(1).toArray(Path[]::new))
+              .addClasspathFiles(classpath.get(0))
+              .addClasspathFiles(classpath.stream().skip(1).toArray(Path[]::new))
+              .addProgramFiles(inputs.get(0))
+              .addProgramFiles(inputs.stream().skip(1).toArray(Path[]::new))
+              .addMainDexListFiles(mainDexList.get(0))
+              .addMainDexListFiles(mainDexList.stream().skip(1).toArray(Path[]::new))
+              .build());
+    } catch (CompilationFailedException e) {
+      throw new RuntimeException("Unexpected compilation exceptions", e);
+    }
+  }
+
   private static void incrementalCompileAndMerge(
       int minApiLevel,
       Collection<Path> libraries,
@@ -380,6 +420,15 @@
     return file.endsWith(".class");
   }
 
+  private static boolean isDexFile(Path file) {
+    return isDexFile(file.toString());
+  }
+
+  private static boolean isDexFile(String file) {
+    file = file.toLowerCase();
+    return file.endsWith(".dex");
+  }
+
   private static boolean isArchive(Path file) {
     return isArchive(file.toString());
   }
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java
index d069d05..7230f55 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java
@@ -101,21 +101,22 @@
       throw new RuntimeException("Must supply pg-conf inputs");
     }
 
-    useProgramFileBuilder(CompilationMode.DEBUG, minApiLevel, libraries, inputs);
-    useProgramFileBuilder(CompilationMode.RELEASE, minApiLevel, libraries, inputs);
-    useProgramDataBuilder(minApiLevel, libraries, inputs);
-    useProgramProvider(minApiLevel, libraries, inputs);
-    useLibraryProvider(minApiLevel, libraries, inputs);
+    useProgramFileList(CompilationMode.DEBUG, minApiLevel, libraries, inputs);
+    useProgramFileList(CompilationMode.RELEASE, minApiLevel, libraries, inputs);
+    useProgramData(minApiLevel, libraries, inputs);
+    useProgramResourceProvider(minApiLevel, libraries, inputs);
+    useLibraryResourceProvider(minApiLevel, libraries, inputs);
     useMainDexListFiles(minApiLevel, libraries, inputs, mainDexList);
     useMainDexClasses(minApiLevel, libraries, inputs, mainDexList);
     useMainDexRulesFiles(minApiLevel, libraries, inputs, mainDexRules);
     useMainDexRules(minApiLevel, libraries, inputs, mainDexRules);
     useProguardConfigFiles(minApiLevel, libraries, inputs, mainDexList, pgConf);
     useProguardConfigLines(minApiLevel, libraries, inputs, mainDexList, pgConf);
+    useVArgVariants(minApiLevel, libraries, inputs, mainDexList, mainDexRules, pgConf);
   }
 
   // Check API support for compiling Java class-files from the file system.
-  private static void useProgramFileBuilder(
+  private static void useProgramFileList(
       CompilationMode mode, int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8.run(
@@ -132,7 +133,7 @@
   }
 
   // Check API support for compiling Java class-files from byte content.
-  private static void useProgramDataBuilder(
+  private static void useProgramData(
       int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8Command.Builder builder =
@@ -152,7 +153,7 @@
   }
 
   // Check API support for compiling Java class-files from a program provider abstraction.
-  private static void useProgramProvider(
+  private static void useProgramResourceProvider(
       int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8Command.Builder builder =
@@ -181,7 +182,7 @@
     }
   }
 
-  private static void useLibraryProvider(
+  private static void useLibraryResourceProvider(
       int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8Command.Builder builder =
@@ -339,6 +340,35 @@
     }
   }
 
+  // Check API support for all the varg variants.
+  private static void useVArgVariants(
+      int minApiLevel,
+      List<Path> libraries,
+      List<Path> inputs,
+      List<Path> mainDexList,
+      List<Path> mainDexRules,
+      List<Path> pgConf) {
+    try {
+      R8.run(
+          R8Command.builder(handler)
+              .setMinApiLevel(minApiLevel)
+              .setProgramConsumer(new EnsureOutputConsumer())
+              .addLibraryFiles(libraries.get(0))
+              .addLibraryFiles(libraries.stream().skip(1).toArray(Path[]::new))
+              .addProgramFiles(inputs.get(0))
+              .addProgramFiles(inputs.stream().skip(1).toArray(Path[]::new))
+              .addMainDexListFiles(mainDexList.get(0))
+              .addMainDexListFiles(mainDexList.stream().skip(1).toArray(Path[]::new))
+              .addMainDexRulesFiles(mainDexRules.get(0))
+              .addMainDexRulesFiles(mainDexRules.stream().skip(1).toArray(Path[]::new))
+              .addProguardConfigurationFiles(pgConf.get(0))
+              .addProguardConfigurationFiles(pgConf.stream().skip(1).toArray(Path[]::new))
+              .build());
+    } catch (CompilationFailedException e) {
+      throw new RuntimeException("Unexpected compilation exceptions", e);
+    }
+  }
+
   // Helpers for tests.
   // Some of this reimplements stuff in R8 utils, but that is not public API and we should not
   // rely on it.
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index f2a84d9..c3327d9 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -897,12 +897,8 @@
           .put("800-smali", TestCondition.match(TestCondition.R8_COMPILER))
           // Contains a loop in the class hierarchy.
           .put("804-class-extends-itself", TestCondition.any())
-          // It is not possible to compute target of method call due to ambiguous methods, thus fail
-          // to generate one dex from several dex inputs that represent an invalid program.
-          .put("004-JniTest", TestCondition.match(TestCondition.R8_COMPILER))
           // These tests have illegal class flag combinations, so we reject them.
           .put("161-final-abstract-class", TestCondition.any())
-          .put("004-JniTest", TestCondition.any())
           .build();
 
   // Tests that does not have dex input for some toolchains.
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 60ebe5f..7d3dbe2 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -483,9 +483,12 @@
       // TODO(mikaelpeltier) Android P does not yet have his android.jar use the O version
       minSdkVersion = AndroidApiLevel.O.getLevel();
     }
-    return String.format(
+    String jar = String.format(
         ANDROID_JAR_PATTERN,
         minSdkVersion == AndroidApiLevel.getDefault().getLevel() ? DEFAULT_MIN_SDK : minSdkVersion);
+    assert Files.exists(Paths.get(jar))
+        : "Expected android jar to exist for API level " + minSdkVersion;
+    return jar;
   }
 
   public static Path getJdwpTestsCfJarPath(int minSdk) {
@@ -1127,6 +1130,12 @@
     return new ProcessResult(p.exitValue(), stdoutReader.getResult(), stderrReader.getResult());
   }
 
+  public static R8Command.Builder addProguardConfigurationConsumer(
+      R8Command.Builder builder, Consumer<ProguardConfiguration.Builder> consumer) {
+    builder.addProguardConfigurationConsumerForTesting(consumer);
+    return builder;
+  }
+
   public static AndroidApp getApp(BaseCommand command) {
     return command.getInputApp();
   }
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index d4745b4..049a05e 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -93,10 +93,12 @@
       builder.setMode(mode);
       builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
       builder.setMinApiLevel(AndroidApiLevel.L.getLevel());
-      builder.addProguardConfigurationConsumer(b -> {
-        b.setPrintSeeds(false);
-        b.setIgnoreWarnings(true);
-      });
+      ToolHelper.addProguardConfigurationConsumer(
+          builder,
+          pgConfig -> {
+            pgConfig.setPrintSeeds(false);
+            pgConfig.setIgnoreWarnings(true);
+          });
       outputApp = ToolHelper.runR8(builder.build(), optionsConsumer);
     } else {
       assert compiler == CompilerUnderTest.D8;
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
index 070b6da..4c9bbd1 100644
--- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
@@ -76,12 +76,12 @@
     }
     ProguardMapConsumer mapConsumer = new ProguardMapConsumer();
     runR8(
-        getCommandForApps(out, flagForObfuscation, NAMING044_JAR)
-            .setProguardMapConsumer(mapConsumer)
-            .addProguardConfigurationConsumer(
-                c -> {
-                  c.setPrintMapping(true);
-                  c.setPrintMappingFile(proguardMap);
+        ToolHelper.addProguardConfigurationConsumer(
+                getCommandForApps(out, flagForObfuscation, NAMING044_JAR)
+                    .setProguardMapConsumer(mapConsumer),
+                pgConfig -> {
+                  pgConfig.setPrintMapping(true);
+                  pgConfig.setPrintMappingFile(proguardMap);
                 })
             .build());
 
@@ -92,13 +92,13 @@
 
     Path instrOut = temp.newFolder("instr").toPath();
     Path flag = Paths.get(ToolHelper.EXAMPLES_DIR, "applymapping044", "keep-rules.txt");
-    AndroidApp instrApp = runR8(
-        getCommandForInstrumentation(instrOut, flag, NAMING044_JAR, APPLYMAPPING044_JAR)
-            .addProguardConfigurationConsumer(c -> {
-              c.setApplyMappingFile(proguardMap);
-            })
-            .setMinification(false)
-            .build());
+    AndroidApp instrApp =
+        runR8(
+            ToolHelper.addProguardConfigurationConsumer(
+                    getCommandForInstrumentation(instrOut, flag, NAMING044_JAR, APPLYMAPPING044_JAR)
+                        .setMinification(false),
+                    pgConfig -> pgConfig.setApplyMappingFile(proguardMap))
+                .build());
 
     DexInspector inspector = new DexInspector(instrApp);
     MethodSubject main = inspector.clazz("applymapping044.Main").method(DexInspector.MAIN);
@@ -181,14 +181,15 @@
     // keep rules to reserve D and E, along with a proguard map.
     Path flag = Paths.get(ToolHelper.EXAMPLES_DIR, "naming001", "keep-rules-105.txt");
     Path proguardMap = out.resolve(MAPPING);
-    AndroidApp outputApp = runR8(
-        getCommandForApps(out, flag, NAMING001_JAR)
-            .addProguardConfigurationConsumer(c -> {
-              c.setPrintMapping(true);
-              c.setPrintMappingFile(proguardMap);
-            })
-            .setMinification(false)
-            .build());
+    AndroidApp outputApp =
+        runR8(
+            ToolHelper.addProguardConfigurationConsumer(
+                    getCommandForApps(out, flag, NAMING001_JAR).setMinification(false),
+                    pgConfig -> {
+                      pgConfig.setPrintMapping(true);
+                      pgConfig.setPrintMappingFile(proguardMap);
+                    })
+                .build());
 
     // Make sure the given proguard map is indeed applied.
     DexInspector inspector = new DexInspector(outputApp);
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 9442559..c044d12 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -65,15 +65,15 @@
   public void generateR8ProcessedApp() throws Exception {
     Path out = temp.getRoot().toPath();
     R8Command command =
-        R8Command.builder()
+        ToolHelper.addProguardConfigurationConsumer(
+                R8Command.builder(),
+                pgConfig -> {
+                  pgConfig.setPrintMapping(true);
+                  pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
+                })
             .setOutput(out, OutputMode.DexIndexed)
             .addProgramFiles(Paths.get(appFileName))
             .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addProguardConfigurationConsumer(
-                builder -> {
-                  builder.setPrintMapping(true);
-                  builder.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
-                })
             .addLibraryFiles(Paths.get(ToolHelper.getDefaultAndroidJar()))
             .build();
     ToolHelper.runR8(command);
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
index 34f2b76..d5bb4bb 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
@@ -32,18 +32,19 @@
     Path outjar = outdir.resolve("r8_compiled.jar");
     Path proguardMapPath = outdir.resolve("proguard.map");
     ToolHelper.runR8(
-        R8Command.builder()
+        ToolHelper.addProguardConfigurationConsumer(
+                R8Command.builder(),
+                pgConfig -> {
+                  pgConfig.setRenameSourceFileAttribute(TEST_FILE);
+                  pgConfig.addKeepAttributePatterns(
+                      ImmutableList.of("SourceFile", "LineNumberTable"));
+                })
             .addProgramFiles(DEBUGGEE_JAR)
             .setMinApiLevel(minSdk)
             .addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(minSdk)))
             .setMode(CompilationMode.DEBUG)
             .setOutput(outjar, OutputMode.DexIndexed)
             .setProguardMapOutput(proguardMapPath)
-            .addProguardConfigurationConsumer(
-                pg -> {
-                  pg.setRenameSourceFileAttribute(TEST_FILE);
-                  pg.addKeepAttributePatterns(ImmutableList.of("SourceFile", "LineNumberTable"));
-                })
             .build());
     config = new DexDebugTestConfig(outjar);
     config.setProguardMap(proguardMapPath);
diff --git a/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java b/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
index dafd45e..3446242 100644
--- a/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
@@ -66,14 +66,15 @@
   public void runR8andGetPrintUsage() throws Exception {
     Path out = temp.getRoot().toPath();
     R8Command command =
-        R8Command.builder()
+        ToolHelper.addProguardConfigurationConsumer(
+                R8Command.builder(),
+                pgConfig -> {
+                  pgConfig.setPrintUsage(true);
+                  pgConfig.setPrintUsageFile(out.resolve(test + PRINT_USAGE_FILE_SUFFIX));
+                })
             .setOutput(out, OutputMode.DexIndexed)
             .addProgramFiles(Paths.get(programFile))
             .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addProguardConfigurationConsumer(builder -> {
-              builder.setPrintUsage(true);
-              builder.setPrintUsageFile(out.resolve(test + PRINT_USAGE_FILE_SUFFIX));
-            })
             .addLibraryFiles(Paths.get(ANDROID_JAR))
             .build();
     ToolHelper.runR8(command, options -> {
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index 2f5805a..3670c0b 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -131,17 +131,17 @@
     boolean inline = programFile.contains("inlining");
 
     R8Command command =
-        R8Command.builder()
+        ToolHelper.addProguardConfigurationConsumer(
+                R8Command.builder(),
+                pgConfig -> {
+                  pgConfig.setPrintMapping(true);
+                  pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
+                  pgConfig.setOverloadAggressively(minify == MinifyMode.AGGRESSIVE);
+                  pgConfig.setObfuscating(minify.isMinify());
+                })
             .setOutput(out, OutputMode.DexIndexed)
             .addProgramFiles(Paths.get(programFile))
             .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addProguardConfigurationConsumer(
-                builder -> {
-                  builder.setPrintMapping(true);
-                  builder.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
-                  builder.setOverloadAggressively(minify == MinifyMode.AGGRESSIVE);
-                  builder.setObfuscating(minify.isMinify());
-                })
             .addLibraryFiles(JAR_LIBRARIES)
             .build();
     ToolHelper.runR8(command, options -> {
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index ceb14cc..d997139 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -97,13 +97,12 @@
     try {
       Path dexOutputDir = temp.newFolder().toPath();
       R8Command command =
-          R8Command.builder()
+          ToolHelper.addProguardConfigurationConsumer(R8Command.builder(), pgConsumer)
               .addDexProgramData(builder.compile(), EmbeddedOrigin.INSTANCE)
               .setOutput(dexOutputDir, OutputMode.DexIndexed)
               .setMode(CompilationMode.DEBUG)
               .addLibraryFiles(Paths.get(ToolHelper.getDefaultAndroidJar()))
               .addProguardConfiguration(proguardConfigurations, Origin.unknown())
-              .addProguardConfigurationConsumer(pgConsumer)
               .build();
       ToolHelper.runR8WithFullResult(command, optionsConsumer);
       return dexOutputDir.resolve("classes.dex");
diff --git a/tests/d8_api_usage_sample.jar b/tests/d8_api_usage_sample.jar
index 3f78a93..4f01870 100644
--- a/tests/d8_api_usage_sample.jar
+++ b/tests/d8_api_usage_sample.jar
Binary files differ
diff --git a/tests/r8_api_usage_sample.jar b/tests/r8_api_usage_sample.jar
index e0456f6..5c66037 100644
--- a/tests/r8_api_usage_sample.jar
+++ b/tests/r8_api_usage_sample.jar
Binary files differ
diff --git a/third_party/android_jar/lib-v22.tar.gz.sha1 b/third_party/android_jar/lib-v22.tar.gz.sha1
new file mode 100644
index 0000000..9993d73
--- /dev/null
+++ b/third_party/android_jar/lib-v22.tar.gz.sha1
@@ -0,0 +1 @@
+1b29ed8eff486944080c2e75d1835f88ead804ef
\ No newline at end of file
diff --git a/third_party/android_jar/lib-v23.tar.gz.sha1 b/third_party/android_jar/lib-v23.tar.gz.sha1
new file mode 100644
index 0000000..e3ce8c7
--- /dev/null
+++ b/third_party/android_jar/lib-v23.tar.gz.sha1
@@ -0,0 +1 @@
+961bf14c97ab2880998b9f6c6b74f9e459e474fe
\ No newline at end of file