diff --git a/src/main/java/com/android/tools/r8/BaseCommand.java b/src/main/java/com/android/tools/r8/BaseCommand.java
index a25d21c..57fc8f0 100644
--- a/src/main/java/com/android/tools/r8/BaseCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCommand.java
@@ -68,15 +68,6 @@
       this(AndroidApp.builder(), false);
     }
 
-    protected Builder(boolean ignoreDexInArchive) {
-      this(AndroidApp.builder(), ignoreDexInArchive);
-    }
-
-    // Internal constructor for testing.
-    Builder(AndroidApp app, CompilationMode mode) {
-      this(AndroidApp.builder(app), false);
-    }
-
     protected Builder(AndroidApp.Builder builder, boolean ignoreDexInArchive) {
       this.app = builder;
       app.setIgnoreDexInArchive(ignoreDexInArchive);
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 4806485..a5213c5 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -180,7 +180,7 @@
         return null;
       }
       Marker marker = getMarker(options);
-      new ApplicationWriter(app, appInfo, options, marker, null, NamingLens.getIdentityLens(), null)
+      new ApplicationWriter(app, options, marker, null, NamingLens.getIdentityLens(), null)
           .write(outputSink, executor);
       CompilationResult output = new CompilationResult(outputSink, app, appInfo);
       options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 941895a..ae6326e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.DexOverflowException;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.ClassAndMemberPublicizer;
 import com.android.tools.r8.graph.DexApplication;
@@ -86,8 +85,8 @@
   public static void writeApplication(
       ExecutorService executorService,
       DexApplication application,
-      AppInfo appInfo,
-      OutputSink outputSink, byte[] deadCode,
+      OutputSink outputSink,
+      byte[] deadCode,
       NamingLens namingLens,
       byte[] proguardSeedsData,
       InternalOptions options)
@@ -95,7 +94,7 @@
     try {
       Marker marker = getMarker(options);
       new ApplicationWriter(
-          application, appInfo, options, marker, deadCode, namingLens, proguardSeedsData)
+          application, options, marker, deadCode, namingLens, proguardSeedsData)
           .write(outputSink, executorService);
     } catch (IOException e) {
       throw new RuntimeException("Cannot write dex application", e);
@@ -342,7 +341,6 @@
       writeApplication(
           executorService,
           application,
-          appInfo,
           outputSink,
           application.deadCode,
           namingLens,
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java
index bd3a069..f99dc92 100644
--- a/src/main/java/com/android/tools/r8/bisect/Bisect.java
+++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.DexOverflowException;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.utils.AndroidApp;
@@ -178,9 +177,8 @@
   private static void writeApp(DexApplication app, Path output, ExecutorService executor)
       throws IOException, ExecutionException, DexOverflowException {
     InternalOptions options = new InternalOptions();
-    AppInfo appInfo = new AppInfo(app);
     AndroidAppOutputSink compatSink = new AndroidAppOutputSink();
-    ApplicationWriter writer = new ApplicationWriter(app, appInfo, options, null, null, null, null);
+    ApplicationWriter writer = new ApplicationWriter(app, options, null, null, null, null);
     writer.write(compatSink, executor);
     compatSink.build().writeToDirectory(output, OutputMode.Indexed);
   }
diff --git a/src/main/java/com/android/tools/r8/bisect/BisectState.java b/src/main/java/com/android/tools/r8/bisect/BisectState.java
index a9836aa..b9359a3 100644
--- a/src/main/java/com/android/tools/r8/bisect/BisectState.java
+++ b/src/main/java/com/android/tools/r8/bisect/BisectState.java
@@ -132,10 +132,6 @@
       range.write(writer);
     }
 
-    public boolean isGood() {
-      return good;
-    }
-
     public boolean isBad() {
       return !good;
     }
diff --git a/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java b/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
index d95de6f..93b1b24 100644
--- a/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
+++ b/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
@@ -31,7 +31,6 @@
   private String output = null;
   private int numberOfThreads = 8;
   private boolean noLocals = false;
-  private boolean verbose = false;
 
   public static void main(String[] args)
       throws IOException, InterruptedException, ExecutionException {
@@ -73,9 +72,6 @@
         case "--help":
           // Ignore
           break;
-        case "--verbose":
-          verbose = true;
-          break;
         case "--nolocals":
           noLocals = true;
           break;
diff --git a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
index 7da21b9..2789252 100644
--- a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
+++ b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
@@ -120,20 +120,6 @@
       }
     }
 
-    // Exception thrown on options parse error.
-    private static class DxParseError extends DxUsageMessage {
-      private final OptionParser parser;
-
-      private DxParseError(OptionParser parser) {
-        this.parser = parser;
-      }
-
-      @Override
-      public void printHelpOn(PrintStream sink) throws IOException {
-        parser.printHelpOn(sink);
-      }
-    }
-
     // Parsing specification.
     private static class Spec {
       final OptionParser parser;
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 3bedf08..b18f907 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.ApiLevelException;
 import com.android.tools.r8.OutputSink;
 import com.android.tools.r8.errors.DexOverflowException;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationDirectory;
 import com.android.tools.r8.graph.DexAnnotationSet;
@@ -44,7 +43,6 @@
 public class ApplicationWriter {
 
   public final DexApplication application;
-  public final AppInfo appInfo;
   public final byte[] deadCode;
   public final NamingLens namingLens;
   public final byte[] proguardSeedsData;
@@ -110,7 +108,6 @@
 
   public ApplicationWriter(
       DexApplication application,
-      AppInfo appInfo,
       InternalOptions options,
       Marker marker,
       byte[] deadCode,
@@ -118,7 +115,6 @@
       byte[] proguardSeedsData) {
     assert application != null;
     this.application = application;
-    this.appInfo = appInfo;
     assert options != null;
     this.options = options;
     this.markerString = (marker == null)
@@ -259,7 +255,7 @@
 
   private byte[] writeDexFile(ObjectToOffsetMapping mapping)
       throws ApiLevelException {
-    FileWriter fileWriter = new FileWriter(mapping, application, appInfo, options, namingLens);
+    FileWriter fileWriter = new FileWriter(mapping, application, options, namingLens);
     // Collect the non-fixed sections.
     fileWriter.collect();
     // Generate and write the bytes.
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 0bfe0a8..da3722f 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.ApiLevelException;
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.Descriptor;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationDirectory;
@@ -78,7 +77,6 @@
 
   private final ObjectToOffsetMapping mapping;
   private final DexApplication application;
-  private final AppInfo appInfo;
   private final InternalOptions options;
   private final NamingLens namingLens;
   private final DexOutputBuffer dest = new DexOutputBuffer();
@@ -87,12 +85,10 @@
   public FileWriter(
       ObjectToOffsetMapping mapping,
       DexApplication application,
-      AppInfo appinfo,
       InternalOptions options,
       NamingLens namingLens) {
     this.mapping = mapping;
     this.application = application;
-    this.appInfo = appinfo;
     this.options = options;
     this.namingLens = namingLens;
     this.mixedSectionOffsets = new MixedSectionOffsets();
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 6890147..5408676 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -614,10 +614,6 @@
           && types.isEmpty() && strings.isEmpty();
     }
 
-    int getNumberOfStrings() {
-      return strings.size() + base.getNumberOfStrings();
-    }
-
     int getNumberOfClasses() {
       return classes.size() + base.classes.size();
     }
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 3552cf7..99325f9 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -275,9 +275,8 @@
   public void setCode(
       IRCode ir,
       RegisterAllocator registerAllocator,
-      DexItemFactory dexItemFactory,
       InternalOptions options) {
-    final DexBuilder builder = new DexBuilder(ir, registerAllocator, dexItemFactory, options);
+    final DexBuilder builder = new DexBuilder(ir, registerAllocator, options);
     code = builder.build(method.getArity());
   }
 
@@ -690,18 +689,6 @@
       this.method = method;
     }
 
-    public void setAccessFlags(DexAccessFlags accessFlags) {
-      this.accessFlags = accessFlags;
-    }
-
-    public void setAnnotations(DexAnnotationSet annotations) {
-      this.annotations = annotations;
-    }
-
-    public void setParameterAnnotations(DexAnnotationSetRefList parameterAnnotations) {
-      this.parameterAnnotations = parameterAnnotations;
-    }
-
     public void setCode(Code code) {
       this.code = code;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index f6a860d..9c8ed1c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -83,8 +83,6 @@
   // The register allocator providing register assignments for the code to build.
   private final RegisterAllocator registerAllocator;
 
-  private final DexItemFactory dexItemFactory;
-
   private final InternalOptions options;
 
   // List of information about switch payloads that have to be created at the end of the
@@ -118,14 +116,11 @@
   public DexBuilder(
       IRCode ir,
       RegisterAllocator registerAllocator,
-      DexItemFactory dexItemFactory,
       InternalOptions options) {
     assert ir != null;
     assert registerAllocator != null;
-    assert dexItemFactory != null;
     this.ir = ir;
     this.registerAllocator = registerAllocator;
-    this.dexItemFactory = dexItemFactory;
     this.options = options;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index b8324d9..063bee1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -410,7 +410,7 @@
     }
     assert code.isConsistentSSA();
     RegisterAllocator registerAllocator = performRegisterAllocation(code, method);
-    method.setCode(code, registerAllocator, appInfo.dexItemFactory, options);
+    method.setCode(code, registerAllocator, options);
     if (Log.ENABLED) {
       Log.debug(getClass(), "Resulting dex code for %s:\n%s",
           method.toSourceString(), logCode(options, method));
@@ -584,7 +584,7 @@
 
     // Perform register allocation.
     RegisterAllocator registerAllocator = performRegisterAllocation(code, method);
-    method.setCode(code, registerAllocator, appInfo.dexItemFactory, options);
+    method.setCode(code, registerAllocator, options);
     updateHighestSortingStrings(method);
     if (Log.ENABLED) {
       Log.debug(getClass(), "Resulting dex code for %s:\n%s",
diff --git a/src/main/java/com/android/tools/r8/utils/ThreadUtils.java b/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
index 8fe3af6..59abfdb 100644
--- a/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
@@ -3,9 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import java.util.Iterator;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -13,17 +11,26 @@
 
 public class ThreadUtils {
 
-  public static <T> List<T> awaitFutures(Collection<? extends Future<? extends T>> futures)
+  public static void awaitFutures(Iterable<? extends Future<?>> futures)
       throws ExecutionException {
-    ArrayList<T> result = new ArrayList<>(futures.size());
-    for (Future<? extends T> f : futures) {
+    Iterator<? extends Future<?>> it = futures.iterator();
+    try {
+      while (it.hasNext()) {
+        it.next().get();
+      }
+    } catch (InterruptedException e) {
+      throw new RuntimeException("Interrupted while waiting for future.", e);
+    } finally {
+      // In case we get interrupted or one of the threads throws an exception, abort all further
+      // work, if possible.
       try {
-        result.add(f.get());
-      } catch (InterruptedException e) {
-        throw new RuntimeException("Interrupted while waiting for future.", e);
+        while (it.hasNext()) {
+          it.next().cancel(true);
+        }
+      } catch (Throwable t) {
+        // Ignore the new Exception.
       }
     }
-    return result;
   }
 
   public static ExecutorService getExecutorService(int threads) {
diff --git a/src/main/java/com/android/tools/r8/utils/VersionProperties.java b/src/main/java/com/android/tools/r8/utils/VersionProperties.java
index c2253de..57aea8b 100644
--- a/src/main/java/com/android/tools/r8/utils/VersionProperties.java
+++ b/src/main/java/com/android/tools/r8/utils/VersionProperties.java
@@ -13,7 +13,6 @@
  * A class describing version properties.
  */
 public class VersionProperties {
-  private static final int VERSION_CODE = 1;
 
   private static final String VERSION_CODE_KEY = "version-file.version.code";
   private static final String SHA_KEY = "version.sha";
diff --git a/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java b/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java
index 38cca7e..d765174 100644
--- a/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java
+++ b/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.errors.DexOverflowException;
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexAccessFlags;
 import com.android.tools.r8.graph.DexAnnotationSet;
 import com.android.tools.r8.graph.DexAnnotationSetRefList;
@@ -124,7 +123,7 @@
 
     InternalOptions options = new InternalOptions(dexItemFactory);
     options.outputMode = OutputMode.FilePerInputClass;
-    ApplicationWriter writer = new ApplicationWriter(application, new AppInfo(application),
+    ApplicationWriter writer = new ApplicationWriter(application,
         options, null, null, NamingLens.getIdentityLens(), null);
     ExecutorService executorService = ThreadUtils.getExecutorService(options);
     CollectInfoOutputSink sink = new CollectInfoOutputSink();
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index eb87524..6962f97 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.errors.DexOverflowException;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
@@ -95,12 +94,10 @@
       throws Exception {
     DexApplication app = builder.read();
     app = process(app, options);
-    AppInfo info = new AppInfo(app);
     AndroidAppOutputSink compatSink = new AndroidAppOutputSink();
     R8.writeApplication(
         Executors.newSingleThreadExecutor(),
         app,
-        info,
         compatSink,
         null,
         NamingLens.getIdentityLens(),
@@ -187,13 +184,11 @@
 
   public AndroidApp writeDex(DexApplication application, InternalOptions options)
       throws DexOverflowException, IOException {
-    AppInfo appInfo = new AppInfo(application);
     try {
       AndroidAppOutputSink compatSink = new AndroidAppOutputSink();
       R8.writeApplication(
           Executors.newSingleThreadExecutor(),
           application,
-          appInfo,
           compatSink,
           null,
           NamingLens.getIdentityLens(),
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index 4e58b9f..a358e26 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -594,7 +594,7 @@
                 code);
         IRCode ir = code.buildIR(method, options);
         RegisterAllocator allocator = new LinearScanRegisterAllocator(ir, options);
-        method.setCode(ir, allocator, factory, options);
+        method.setCode(ir, allocator, options);
         directMethods[i] = method;
       }
       builder.addProgramClass(
@@ -613,9 +613,8 @@
               DexEncodedMethod.EMPTY_ARRAY));
     }
     DirectMappedDexApplication application = builder.build().toDirect();
-    AppInfoWithSubtyping appInfo = new AppInfoWithSubtyping(application);
     ApplicationWriter writer = new ApplicationWriter(
-        application, appInfo, options, null, null, NamingLens.getIdentityLens(), null);
+        application, options, null, null, NamingLens.getIdentityLens(), null);
     ExecutorService executor = ThreadUtils.getExecutorService(options);
     AndroidAppOutputSink compatSink = new AndroidAppOutputSink();
     try {
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 ddab789..2d2f887 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -669,13 +669,11 @@
 
   public AndroidApp writeDex(DexApplication application, InternalOptions options)
       throws DexOverflowException {
-    AppInfo appInfo = new AppInfo(application);
     try {
       AndroidAppOutputSink compatSink = new AndroidAppOutputSink();
       R8.writeApplication(
           Executors.newSingleThreadExecutor(),
           application,
-          appInfo,
           compatSink,
           null,
           NamingLens.getIdentityLens(),
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index f6e5c44..d432532 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -105,7 +105,7 @@
       DexApplication dexApp = new ApplicationReader(
           app, options, new Timing("smali")).read(executor);
       ApplicationWriter writer = new ApplicationWriter(
-          dexApp, null, options, null, null, NamingLens.getIdentityLens(), null);
+          dexApp, options, null, null, NamingLens.getIdentityLens(), null);
       SingleFileSink sink = new SingleFileSink();
       writer.write(sink, executor);
       return sink.contents;
