Merge "Remove and hide non-API procedures on R8."
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index dc6ebee..032c07a 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -46,7 +46,6 @@
import com.android.tools.r8.shaking.protolite.ProtoLiteExtension;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.AndroidAppConsumers;
import com.android.tools.r8.utils.CfgPrinter;
import com.android.tools.r8.utils.ExceptionUtils;
import com.android.tools.r8.utils.FileUtils;
@@ -168,7 +167,7 @@
return marker;
}
- public static void writeApplication(
+ static void writeApplication(
ExecutorService executorService,
DexApplication application,
String deadCode,
@@ -496,28 +495,6 @@
}
}
- /** TODO(sgjesse): Get rid of this. */
- public static AndroidApp runInternal(R8Command command) throws IOException, CompilationException {
- InternalOptions options = command.getInternalOptions();
- ExecutorService executorService = ThreadUtils.getExecutorService(options);
- try {
- return runInternal(command, executorService);
- } finally {
- executorService.shutdown();
- }
- }
-
- /**
- * TODO(sgjesse): Get rid of this.
- */
- public static AndroidApp runInternal(R8Command command, ExecutorService executor)
- throws IOException, CompilationException {
- InternalOptions options = command.getInternalOptions();
- AndroidAppConsumers compatConsumers = new AndroidAppConsumers(options);
- run(command.getInputApp(), options, executor);
- return compatConsumers.build();
- }
-
private static void run(String[] args) throws CompilationFailedException {
R8Command command = R8Command.parse(args, CommandLineOrigin.INSTANCE).build();
if (command.isPrintHelp()) {
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 7c50696..17c4706 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -6,18 +6,20 @@
import com.android.tools.r8.CompilationException;
import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.Version;
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.origin.CommandLineOrigin;
import com.android.tools.r8.utils.AbortException;
-import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.OutputMode;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;
+import java.util.Set;
/**
* Proguard + dx compatibility interface for r8.
@@ -170,10 +172,16 @@
if (options.mainDexList != null) {
builder.addMainDexListFiles(Paths.get(options.mainDexList));
}
- AndroidApp result = R8.runInternal(builder.build());
+
+ // Wrap the output consumer so we can count the number of output files.
+ CountOutputConsumer outputConsumer =
+ new CountOutputConsumer((DexIndexedConsumer) builder.getProgramConsumer());
+ builder.setProgramConsumer(outputConsumer);
+
+ R8.run(builder.build());
if (!options.multiDex) {
- if (result.getDexProgramResources().size() > 1) {
+ if (outputConsumer.count > 1) {
throw new CompilationError(
"Compilation result could not fit into a single dex file. "
+ "Reduce the input-program size or run with --multi-dex enabled");
@@ -193,4 +201,20 @@
System.exit(1);
}
}
+
+ private static class CountOutputConsumer extends DexIndexedConsumer.ForwardingConsumer {
+
+ int count = 0;
+
+ public CountOutputConsumer(DexIndexedConsumer consumer) {
+ super(consumer);
+ }
+
+ @Override
+ public synchronized void accept(int fileIndex, byte[] data, Set<String> descriptors,
+ DiagnosticsHandler handler) {
+ super.accept(fileIndex, data, descriptors, handler);
+ count++;
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index b58aa45..7d3dbe2 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -11,9 +11,11 @@
import com.android.tools.r8.DeviceRunner.DeviceRunnerConfigurationException;
import com.android.tools.r8.ToolHelper.DexVm.Kind;
import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.errors.DexOverflowException;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.ProguardConfiguration;
import com.android.tools.r8.shaking.ProguardConfigurationParser;
import com.android.tools.r8.shaking.ProguardRuleParserException;
@@ -53,6 +55,7 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import joptsimple.internal.Strings;
@@ -1153,4 +1156,16 @@
});
return builder;
}
+
+ public static void writeApplication(DexApplication application, InternalOptions options)
+ throws ExecutionException, DexOverflowException {
+ R8.writeApplication(
+ Executors.newSingleThreadExecutor(),
+ application,
+ null,
+ NamingLens.getIdentityLens(),
+ null,
+ options,
+ null);
+ }
}
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index 0e97b13..074c704 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir;
-import com.android.tools.r8.R8;
+import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.errors.DexOverflowException;
import com.android.tools.r8.graph.AppInfo;
@@ -15,7 +15,6 @@
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.ValueNumberGenerator;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.smali.SmaliBuilder;
import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
@@ -29,7 +28,6 @@
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
import org.antlr.runtime.RecognitionException;
public class IrInjectionTestBase extends SmaliTestBase {
@@ -123,14 +121,7 @@
private AndroidApp writeDex(DexApplication application, InternalOptions options)
throws DexOverflowException {
try {
- R8.writeApplication(
- Executors.newSingleThreadExecutor(),
- application,
- null,
- NamingLens.getIdentityLens(),
- null,
- options,
- null);
+ ToolHelper.writeApplication(application, options);
options.signalFinishedToProgramConsumer();
return consumers.build();
} catch (ExecutionException e) {
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index cefa888..8e2242d 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -6,7 +6,6 @@
import com.android.tools.r8.CompilationException;
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.D8Command;
-import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.graph.DexAnnotationElement;
@@ -60,7 +59,7 @@
private AndroidApp compileWithR8(Path inputPath, Path outputPath, Path keepRulesPath)
throws IOException, CompilationException, CompilationFailedException {
- return R8.runInternal(
+ return ToolHelper.runR8(
R8Command.builder()
.addProgramFiles(inputPath)
.addLibraryFiles(Paths.get(ToolHelper.getDefaultAndroidJar()))