Debug mode implies keeping line numbers and locals.
Updated existing tests to run in release and assert that release never keeps
locals.
Bug: 112515155
Change-Id: Ie5cc9730abcc6000199dd8bd6231e203173c440d
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 96e1e99..7b24770 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -650,6 +650,9 @@
assert internal.enableVerticalClassMerging || !proguardConfiguration.isOptimizing();
if (internal.debug) {
+ internal.proguardConfiguration.getKeepAttributes().lineNumberTable = true;
+ internal.proguardConfiguration.getKeepAttributes().localVariableTable = true;
+ internal.proguardConfiguration.getKeepAttributes().localVariableTypeTable = true;
// TODO(zerny): Should we support inlining in debug mode? b/62937285
internal.enableInlining = false;
internal.enableClassInlining = false;
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
index 275d2e9..b518683 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
@@ -18,10 +17,11 @@
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.forceproguardcompatibility.keepattributes.TestKeepAttributes;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.AndroidAppConsumers;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
-import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
@@ -32,12 +32,24 @@
public static final Class CLASS = TestKeepAttributes.class;
@Test
+ public void keepAllAttributesInDebugMode()
+ throws ExecutionException, CompilationFailedException, IOException {
+ List<String> keepRules = ImmutableList.of(
+ "-keep class ** { *; }"
+ );
+ CodeInspector inspector = compile(keepRules, CompilationMode.DEBUG);
+ DebugInfoInspector debugInfo = debugInfoForMain(inspector);
+ checkLineNumbers(true, debugInfo);
+ checkLocals(true, debugInfo);
+ }
+
+ @Test
public void discardAllAttributes()
throws CompilationFailedException, IOException, ExecutionException {
List<String> keepRules = ImmutableList.of(
"-keep class ** { *; }"
);
- CodeInspector inspector = compile(keepRules);
+ CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
DebugInfoInspector debugInfo = debugInfoForMain(inspector);
checkLineNumbers(false, debugInfo);
checkLocals(false, debugInfo);
@@ -50,7 +62,7 @@
"-keep class ** { *; }",
"-keepattributes " + ProguardKeepAttributes.LINE_NUMBER_TABLE
);
- CodeInspector inspector = compile(keepRules);
+ CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
DebugInfoInspector debugInfo = debugInfoForMain(inspector);
checkLineNumbers(true, debugInfo);
checkLocals(false, debugInfo);
@@ -66,10 +78,11 @@
+ ", "
+ ProguardKeepAttributes.LOCAL_VARIABLE_TABLE
);
- CodeInspector inspector = compile(keepRules);
+ CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
DebugInfoInspector debugInfo = debugInfoForMain(inspector);
checkLineNumbers(true, debugInfo);
- checkLocals(true, debugInfo);
+ // Locals are never included in release builds.
+ checkLocals(false, debugInfo);
}
@Test
@@ -80,7 +93,7 @@
);
// Compiling with a keep rule for locals but no line results in an error in R8.
try {
- compile(keepRules);
+ compile(keepRules, CompilationMode.RELEASE);
} catch (CompilationFailedException e) {
assertTrue(e.getCause().getMessage().contains(ProguardKeepAttributes.LOCAL_VARIABLE_TABLE));
assertTrue(e.getCause().getMessage().contains(ProguardKeepAttributes.LINE_NUMBER_TABLE));
@@ -89,24 +102,29 @@
fail("Expected error");
}
- private CodeInspector compile(List<String> keepRules)
+ private CodeInspector compile(List<String> keepRules, CompilationMode mode)
throws CompilationFailedException, IOException, ExecutionException {
- Path dexOut = temp.getRoot().toPath().resolve("dex.zip");
- R8.run(R8Command.builder()
- .setMode(CompilationMode.DEBUG)
- .addProgramFiles(ToolHelper.getClassFileForTestClass(CLASS))
- .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
- .addProguardConfiguration(keepRules, Origin.unknown())
- .setProgramConsumer(new DexIndexedConsumer.ArchiveConsumer(dexOut))
- .build());
- ToolHelper.runArtRaw(dexOut.toString(), CLASS.getCanonicalName());
- return new CodeInspector(dexOut);
+ AndroidAppConsumers sink = new AndroidAppConsumers();
+ R8.run(
+ R8Command.builder()
+ .setMode(mode)
+ .addProgramFiles(
+ ToolHelper.getClassFilesForTestDirectory(
+ ToolHelper.getClassFileForTestClass(CLASS).getParent()))
+ .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+ .addProguardConfiguration(keepRules, Origin.unknown())
+ .setProgramConsumer(sink.wrapProgramConsumer(emptyConsumer(Backend.DEX)))
+ .build());
+ AndroidApp app = sink.build();
+ CodeInspector codeInspector = new CodeInspector(app);
+ runOnArt(app, CLASS.getTypeName());
+ return codeInspector;
}
private DebugInfoInspector debugInfoForMain(CodeInspector inspector) {
return new DebugInfoInspector(
inspector,
- CLASS.getCanonicalName(),
+ CLASS.getTypeName(),
new MethodSignature("main", "void", Collections.singleton("java.lang.String[]")));
}