diff --git a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
index f0e758d..c710ed2 100644
--- a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
@@ -8,6 +8,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
@@ -31,11 +32,24 @@
     }
 
     @Override
+    R8CFTestRunner withKeepAll() {
+      return withBuilderTransformation(
+          builder ->
+              builder
+                  .setMode(CompilationMode.DEBUG)
+                  .setDisableTreeShaking(true)
+                  .setDisableMinification(true)
+                  .addProguardConfiguration(
+                      ImmutableList.of("-keepattributes *"), Origin.unknown()));
+    }
+
+    @Override
     void build(Path inputFile, Path out) throws Throwable {
       R8Command.Builder builder = R8Command.builder();
       for (UnaryOperator<R8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
       }
+      // TODO(b/124041175): We should not be linking against the Java 8 runtime for Java 9 inputs.
       builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       R8Command command =
           builder.addProgramFiles(inputFile).setOutput(out, OutputMode.ClassFile).build();
@@ -67,7 +81,7 @@
         }
       }
 
-      execute(testName, qualifiedMainClass, new Path[] {inputFile}, new Path[] {out});
+      execute(testName, qualifiedMainClass, new Path[] {inputFile}, new Path[] {out}, args);
 
       if (expectedToThrow) {
         System.out.println("Did not throw ApiLevelException as expected");
@@ -85,15 +99,23 @@
     return new R8CFTestRunner(testName, packageName, mainClass);
   }
 
-  void execute(String testName, String qualifiedMainClass, Path[] inputJars, Path[] outputJars)
+  @Override
+  void execute(
+      String testName,
+      String qualifiedMainClass,
+      Path[] inputJars,
+      Path[] outputJars,
+      List<String> args)
       throws IOException {
     boolean expectedToFail = expectedToFailCf(testName);
     if (expectedToFail) {
       thrown.expect(Throwable.class);
     }
-    ProcessResult outputResult = ToolHelper.runJava(Arrays.asList(outputJars), qualifiedMainClass);
+    String[] mainAndArgs =
+        ImmutableList.builder().add(qualifiedMainClass).addAll(args).build().toArray(new String[0]);
+    ProcessResult outputResult = ToolHelper.runJava(Arrays.asList(outputJars), mainAndArgs);
     ToolHelper.ProcessResult inputResult =
-        ToolHelper.runJava(ImmutableList.copyOf(inputJars), qualifiedMainClass);
+        ToolHelper.runJava(ImmutableList.copyOf(inputJars), mainAndArgs);
     assertEquals(inputResult.toString(), outputResult.toString());
     if (inputResult.exitCode != 0) {
       System.out.println(inputResult);
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index c95d8a6..f3f5339 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -10,6 +10,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
@@ -274,6 +275,7 @@
 
   @Test
   public void desugaredPrivateInterfaceMethods() throws Throwable {
+    assumeFalse("CF backend does not desugar", this instanceof R8CFRunExamplesJava9Test);
     final String iName = "privateinterfacemethods.I";
     test("desugared-private-interface-methods",
         "privateinterfacemethods", "PrivateInterfaceMethods")
@@ -297,6 +299,7 @@
   public void varHandle() throws Throwable {
     test("varhandle", "varhandle", "VarHandleTests")
         .withMinApiLevel(AndroidApiLevel.P.getLevel())
+        .withKeepAll()
         .run();
   }
 
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 55c8857..2889d74 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -222,7 +222,7 @@
 def UninstallApkOnEmulator(app, config, options):
   app_id = config.get('app_id')
   process = subprocess.Popen(
-      ['adb', 'uninstall', app_id],
+      ['adb', '-s', emulator_id, 'uninstall', app_id],
       stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   stdout, stderr = process.communicate()
 
