in src/tools/android/java/com/google/devtools/build/android/r8/CompatDx.java [482:628]
private static void run(String[] args)
throws DxUsageMessage, IOException, CompilationFailedException {
DxCompatOptions dexArgs = DxCompatOptions.parse(args);
if (dexArgs.version) {
System.out.println("CompatDx " + Version.getVersionString());
return;
}
CompilationMode mode = CompilationMode.RELEASE;
Path output = null;
List<Path> inputs = new ArrayList<>();
boolean singleDexFile = !dexArgs.multiDex;
Path mainDexList = null;
int numberOfThreads = 1;
for (String path : dexArgs.inputs) {
processPath(Paths.get(path), inputs);
}
if (inputs.isEmpty()) {
if (dexArgs.noFiles) {
return;
}
throw new DxUsageMessage("No input files specified");
}
if (dexArgs.dump && dexArgs.verbose) {
System.out.println("Warning: dump is not supported");
}
if (dexArgs.verboseDump) {
throw new CompatDxUnimplemented("verbose dump file not yet supported");
}
if (dexArgs.methodToDump != null) {
throw new CompatDxUnimplemented("method-dump not yet supported");
}
if (dexArgs.output != null) {
output = Paths.get(dexArgs.output);
if (FileUtils.isDexFile(output)) {
if (!singleDexFile) {
throw new DxUsageMessage("Cannot output to a single dex-file when running with multidex");
}
} else if (!FileUtils.isArchive(output)
&& (!output.toFile().exists() || !output.toFile().isDirectory())) {
throw new DxUsageMessage(
"Unsupported output file or output directory does not exist. "
+ "Output must be a directory or a file of type dex, apk, jar or zip.");
}
}
if (dexArgs.dumpTo != null && dexArgs.verbose) {
System.out.println("dump-to file not yet supported");
}
if (dexArgs.positions == PositionInfo.NONE && dexArgs.verbose) {
System.out.println("Warning: no support for positions none.");
}
if (dexArgs.positions == PositionInfo.LINES && !dexArgs.noLocals) {
mode = CompilationMode.DEBUG;
}
if (dexArgs.incremental) {
throw new CompatDxUnimplemented("incremental merge not supported yet");
}
if (dexArgs.forceJumbo && dexArgs.verbose) {
System.out.println(
"Warning: no support for forcing jumbo-strings.\n"
+ "Strings will only use jumbo-string indexing if necessary.\n"
+ "Make sure that any dex merger subsequently used "
+ "supports correct handling of jumbo-strings (eg, D8/R8 does).");
}
if (dexArgs.noOptimize && dexArgs.verbose) {
System.out.println("Warning: no support for not optimizing");
}
if (dexArgs.optimizeList != null) {
throw new CompatDxUnimplemented("no support for optimize-method list");
}
if (dexArgs.noOptimizeList != null) {
throw new CompatDxUnimplemented("no support for dont-optimize-method list");
}
if (dexArgs.statistics && dexArgs.verbose) {
System.out.println("Warning: no support for printing statistics");
}
if (dexArgs.numThreads > 1) {
numberOfThreads = dexArgs.numThreads;
}
if (dexArgs.mainDexList != null) {
mainDexList = Paths.get(dexArgs.mainDexList);
}
if (dexArgs.noStrict) {
if (dexArgs.verbose) {
System.out.println("Warning: conservative main-dex list not yet supported");
}
} else {
if (dexArgs.verbose) {
System.out.println("Warning: strict name checking not yet supported");
}
}
if (dexArgs.minimalMainDex && dexArgs.verbose) {
if (dexArgs.debug) {
System.out.println(
"Info: minimal main-dex generation is always done for D8 debug builds."
+ " Please remove option --minimal-main-dex");
} else {
throw new DxUsageMessage("Error: minimal main-dex is not supported for D8 release builds");
}
}
if (dexArgs.maxIndexNumber != 0 && dexArgs.verbose) {
System.out.println("Warning: internal maximum-index setting is not supported");
}
if (numberOfThreads < 1) {
throw new DxUsageMessage("Invalid numThreads value of " + numberOfThreads);
}
ExecutorService executor = Executors.newWorkStealingPool(numberOfThreads);
try {
D8Command.Builder builder = D8Command.builder();
inputs.forEach(
input ->
builder.addProgramResourceProvider(ArchiveResourceProvider.fromArchive(input, true)));
builder
// .addProgramFiles(inputs)
.setProgramConsumer(createConsumer(inputs, output, singleDexFile, dexArgs.keepClasses))
.setMode(mode)
.setDisableDesugaring(true) // DX does not desugar.
.setMinApiLevel(dexArgs.minApiLevel);
if (mainDexList != null) {
builder.addMainDexListFiles(mainDexList);
}
D8.run(builder.build());
} finally {
executor.shutdown();
}
}