Merge "Enhance tools/retrace.py to allow passing in hash for r8lib map"
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 1be9b3a..14dd1ae 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -75,7 +75,7 @@
if (!mainDexRootSet.checkDiscarded.isEmpty()) {
new DiscardedChecker(
- mainDexRootSet, mainDexClasses.getClasses(), appView.appInfo(), options)
+ mainDexRootSet, mainDexClasses.getClasses(), appView.appInfo(), options)
.run();
}
// Print -whyareyoukeeping results if any.
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 1b74e3b..709d27a 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -218,7 +218,7 @@
}
TextPosition optionStart = getPosition();
expectChar('-');
- if (parseIgnoredOption() ||
+ if (parseIgnoredOption(optionStart) ||
parseIgnoredOptionAndWarn(optionStart) ||
parseUnsupportedOptionAndErr(optionStart)) {
// Intentionally left empty.
@@ -447,13 +447,13 @@
return true;
}
- private boolean parseIgnoredOption() {
+ private boolean parseIgnoredOption(TextPosition optionStart) {
return Iterables.any(IGNORED_SINGLE_ARG_OPTIONS, this::skipOptionWithSingleArg)
|| Iterables.any(IGNORED_OPTIONAL_SINGLE_ARG_OPTIONS,
this::skipOptionWithOptionalSingleArg)
|| Iterables.any(IGNORED_FLAG_OPTIONS, this::skipFlag)
|| Iterables.any(IGNORED_CLASS_DESCRIPTOR_OPTIONS, this::skipOptionWithClassSpec)
- || parseOptimizationOption();
+ || parseOptimizationOption(optionStart);
}
private void parseInclude() throws ProguardRuleParserException {
@@ -542,10 +542,11 @@
}
- private boolean parseOptimizationOption() {
+ private boolean parseOptimizationOption(TextPosition optionStart) {
if (!acceptString("optimizations")) {
return false;
}
+ warnIgnoringOptions("optimizations", optionStart);
do {
skipWhitespace();
skipOptimizationName();
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
new file mode 100644
index 0000000..392a72b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+public class GenerateMainDexListResult
+ extends TestBaseResult<GenerateMainDexListResult, GenerateMainDexListRunResult> {
+
+ GenerateMainDexListResult(TestState state) {
+ super(state);
+ }
+
+ @Override
+ public GenerateMainDexListResult self() {
+ return this;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
new file mode 100644
index 0000000..b9842f2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8;
+
+import java.util.List;
+
+public class GenerateMainDexListRunResult extends TestRunResult<GenerateMainDexListRunResult> {
+
+ List<String> mainDexList;
+
+ public GenerateMainDexListRunResult(List<String> mainDexList) {
+ super(null, null);
+ this.mainDexList = mainDexList;
+ }
+
+ @Override
+ protected GenerateMainDexListRunResult self() {
+ return this;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
new file mode 100644
index 0000000..6eae670
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import com.android.tools.r8.GenerateMainDexListCommand.Builder;
+import com.android.tools.r8.debug.DebugTestConfig;
+import com.android.tools.r8.errors.Unimplemented;
+import com.android.tools.r8.origin.Origin;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+public class GenerateMainDexListTestBuilder
+ extends TestBaseBuilder<
+ GenerateMainDexListCommand,
+ Builder,
+ GenerateMainDexListResult,
+ GenerateMainDexListRunResult,
+ GenerateMainDexListTestBuilder> {
+
+ private GenerateMainDexListTestBuilder(TestState state, Builder builder) {
+ super(state, builder);
+ }
+
+ public static GenerateMainDexListTestBuilder create(TestState state) {
+ return new GenerateMainDexListTestBuilder(state, GenerateMainDexListCommand.builder());
+ }
+
+ @Override
+ GenerateMainDexListTestBuilder self() {
+ return this;
+ }
+
+ @Override
+ public GenerateMainDexListRunResult run(String mainClass)
+ throws IOException, CompilationFailedException {
+ throw new Unimplemented("No support for running with a main class");
+ }
+
+ @Override
+ public GenerateMainDexListRunResult run(Class mainClass)
+ throws IOException, CompilationFailedException {
+ throw new Unimplemented("No support for running with a main class");
+ }
+
+ public DebugTestConfig debugConfig() {
+ throw new Unimplemented("No support for debug configuration");
+ }
+
+ public GenerateMainDexListRunResult run() throws CompilationFailedException {
+ return new GenerateMainDexListRunResult(GenerateMainDexList.run(builder.build()));
+ }
+
+ public GenerateMainDexListTestBuilder addMainDexRules(Collection<String> rules) {
+ builder.addMainDexRules(new ArrayList<>(rules), Origin.unknown());
+ return self();
+ }
+
+ public GenerateMainDexListTestBuilder addMainDexRules(String... rules) {
+ return addMainDexRules(Arrays.asList(rules));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index c24ed3b..1df6808 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -103,6 +103,10 @@
return ProguardTestBuilder.create(new TestState(temp));
}
+ public static GenerateMainDexListTestBuilder testForMainDexListGenerator(TemporaryFolder temp) {
+ return GenerateMainDexListTestBuilder.create(new TestState(temp));
+ }
+
public R8TestBuilder testForR8(Backend backend) {
return testForR8(temp, backend);
}
@@ -131,6 +135,10 @@
return testForProguard(temp);
}
+ public GenerateMainDexListTestBuilder testForMainDexListGenerator() {
+ return testForMainDexListGenerator(temp);
+ }
+
public enum Backend {
CF,
DEX
diff --git a/src/test/java/com/android/tools/r8/TestBaseBuilder.java b/src/test/java/com/android/tools/r8/TestBaseBuilder.java
new file mode 100644
index 0000000..5fcd1b5
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestBaseBuilder.java
@@ -0,0 +1,50 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8;
+
+import com.android.tools.r8.origin.Origin;
+import java.nio.file.Path;
+import java.util.Collection;
+
+public abstract class TestBaseBuilder<
+ C extends BaseCommand,
+ B extends BaseCommand.Builder<C, B>,
+ CR extends TestBaseResult<CR, RR>,
+ RR extends TestRunResult,
+ T extends TestBaseBuilder<C, B, CR, RR, T>>
+ extends TestBuilder<RR, T> {
+
+ final B builder;
+
+ TestBaseBuilder(TestState state, B builder) {
+ super(state);
+ this.builder = builder;
+ }
+
+ @Override
+ public T addProgramClassFileData(Collection<byte[]> classes) {
+ for (byte[] clazz : classes) {
+ builder.addClassProgramData(clazz, Origin.unknown());
+ }
+ return self();
+ }
+
+ @Override
+ public T addProgramFiles(Collection<Path> files) {
+ builder.addProgramFiles(files);
+ return self();
+ }
+
+ @Override
+ public T addLibraryFiles(Collection<Path> files) {
+ builder.addLibraryFiles(files);
+ return self();
+ }
+
+ public T addMainDexListFiles(Collection<Path> files) {
+ builder.addMainDexListFiles(files);
+ return self();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/TestBaseResult.java b/src/test/java/com/android/tools/r8/TestBaseResult.java
new file mode 100644
index 0000000..e7623a3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestBaseResult.java
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8;
+
+public abstract class TestBaseResult<CR extends TestBaseResult<CR, RR>, RR extends TestRunResult> {
+ final TestState state;
+
+ TestBaseResult(TestState state) {
+ this.state = state;
+ }
+
+ public abstract CR self();
+}
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 9700d56..d74fab5 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -26,19 +26,17 @@
import org.hamcrest.Matcher;
public abstract class TestCompileResult<
- CR extends TestCompileResult<CR, RR>, RR extends TestRunResult> {
+ CR extends TestCompileResult<CR, RR>, RR extends TestRunResult>
+ extends TestBaseResult<CR, RR> {
- final TestState state;
public final AndroidApp app;
final List<Path> additionalRunClassPath = new ArrayList<>();
TestCompileResult(TestState state, AndroidApp app) {
- this.state = state;
+ super(state);
this.app = app;
}
- public abstract CR self();
-
public abstract Backend getBackend();
public abstract TestDiagnosticMessages getDiagnosticMessages();
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index cbd0cb9..77dc0df 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -5,7 +5,6 @@
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.debug.DebugTestConfig;
-import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -24,7 +23,7 @@
CR extends TestCompileResult<CR, RR>,
RR extends TestRunResult,
T extends TestCompilerBuilder<C, B, CR, RR, T>>
- extends TestBuilder<RR, T> {
+ extends TestBaseBuilder<C, B, CR, RR, T> {
public static final Consumer<InternalOptions> DEFAULT_OPTIONS =
new Consumer<InternalOptions>() {
@@ -32,7 +31,6 @@
public void accept(InternalOptions options) {}
};
- final B builder;
final Backend backend;
// Default initialized setup. Can be overwritten if needed.
@@ -44,8 +42,7 @@
private PrintStream stdout = null;
TestCompilerBuilder(TestState state, B builder, Backend backend) {
- super(state);
- this.builder = builder;
+ super(state, builder);
this.backend = backend;
defaultLibrary = TestBase.runtimeJar(backend);
programConsumer = TestBase.emptyConsumer(backend);
@@ -135,30 +132,10 @@
return self();
}
- public T addMainDexListFiles(Collection<Path> files) {
- builder.addMainDexListFiles(files);
- return self();
- }
-
- @Override
- public T addProgramClassFileData(Collection<byte[]> classes) {
- for (byte[] clazz : classes) {
- builder.addClassProgramData(clazz, Origin.unknown());
- }
- return self();
- }
-
- @Override
- public T addProgramFiles(Collection<Path> files) {
- builder.addProgramFiles(files);
- return self();
- }
-
@Override
public T addLibraryFiles(Collection<Path> files) {
defaultLibrary = null;
- builder.addLibraryFiles(files);
- return self();
+ return super.addLibraryFiles(files);
}
public T noDesugaring() {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java b/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
index 16958a6..125c364 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
@@ -5,16 +5,10 @@
package com.android.tools.r8.maindexlist.checkdiscard;
import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.GenerateMainDexList;
-import com.android.tools.r8.GenerateMainDexListCommand;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Assert;
@@ -54,33 +48,24 @@
this.command = command;
}
-
public void runTestWithR8(String checkDiscardRule) throws Exception {
- R8Command command =
- ToolHelper.prepareR8CommandBuilder(
- readClasses(HelloWorldMain.class, MainDexClass.class, NonMainDexClass.class))
- .addMainDexRules(
- ImmutableList.of(keepMainProguardConfiguration(HelloWorldMain.class)),
- Origin.unknown())
- .addMainDexRules(ImmutableList.of(checkDiscardRule), Origin.unknown())
- .setOutput(temp.getRoot().toPath(), OutputMode.DexIndexed)
- .setMode(CompilationMode.RELEASE)
- .setDisableTreeShaking(true)
- .setDisableMinification(true)
- .build();
- ToolHelper.runR8(command);
+ testForR8(Backend.DEX)
+ .addProgramClasses(CLASSES)
+ .setMinApi(AndroidApiLevel.K)
+ .addMainDexRules(keepMainProguardConfiguration(HelloWorldMain.class))
+ .addMainDexRules(checkDiscardRule)
+ .noTreeShaking()
+ .noMinification()
+ .compile();
}
public void runTestWithGenerator(String checkDiscardRule) throws Exception {
- GenerateMainDexListCommand.Builder builder =
- GenerateMainDexListCommand.builder()
- .addProgramFiles(ListUtils.map(CLASSES, ToolHelper::getClassFileForTestClass))
- .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
- .addMainDexRules(
- ImmutableList.of(keepMainProguardConfiguration(HelloWorldMain.class)),
- Origin.unknown())
- .addMainDexRules(ImmutableList.of(checkDiscardRule), Origin.unknown());
- GenerateMainDexList.run(builder.build());
+ testForMainDexListGenerator()
+ .addProgramClasses(CLASSES)
+ .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+ .addMainDexRules(keepMainProguardConfiguration(HelloWorldMain.class))
+ .addMainDexRules(checkDiscardRule)
+ .run();
}
public void runTest(String checkDiscardRule, boolean shouldFail) throws Exception {
diff --git a/tools/compare_apk_sizes.py b/tools/compare_apk_sizes.py
index 78327c2..a8137c2 100755
--- a/tools/compare_apk_sizes.py
+++ b/tools/compare_apk_sizes.py
@@ -64,6 +64,8 @@
# - Code: 264 / 4
splits = line.split(' ')
return int(splits[3])
+ # Some classes has no code.
+ return 0
class FileInfo:
def __init__(self, path, root, use_code_size):
diff --git a/tools/internal_test.py b/tools/internal_test.py
index be9779a..5bf1da2 100755
--- a/tools/internal_test.py
+++ b/tools/internal_test.py
@@ -67,6 +67,7 @@
def log(str):
print("%s: %s" % (time.strftime("%c"), str))
+ sys.stdout.flush()
def ParseOptions():
result = optparse.OptionParser()
@@ -90,6 +91,9 @@
def restart_if_new_version(original_content):
new_content = get_own_file_content()
+ log('Lengths %s %s' % (len(original_content), len(new_content)))
+ log('is master %s ' % utils.is_master())
+ # Restart if the script got updated.
if new_content != original_content:
log('Restarting tools/internal_test.py, content changed')
os.execv(sys.argv[0], sys.argv)
diff --git a/tools/utils.py b/tools/utils.py
index bd54dbc..f8b4469 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -87,6 +87,11 @@
sha1.update(chunk)
return sha1.hexdigest()
+def is_master():
+ remotes = subprocess.check_output(['git', 'branch', '-r', '--contains',
+ 'HEAD'])
+ return 'origin/master' in remotes
+
def get_HEAD_sha1():
cmd = ['git', 'rev-parse', 'HEAD']
PrintCmd(cmd)