Relocator should keep all attributes
Bug: 155303677
Change-Id: I676b1ebe4bb5aac0fd1580083da11ce9d7010e29
diff --git a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
index 4a19677..6b561d8 100644
--- a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
+++ b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
@@ -26,6 +26,7 @@
import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.ThreadUtils;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -140,7 +141,10 @@
// We are using the proguard configuration for adapting resources.
InternalOptions options =
new InternalOptions(
- ProguardConfiguration.builder(factory, getReporter()).build(), getReporter());
+ ProguardConfiguration.builder(factory, getReporter())
+ .addKeepAttributePatterns(ImmutableList.of("*"))
+ .build(),
+ getReporter());
assert options.threadCount == ThreadUtils.NOT_SPECIFIED;
options.relocatorCompilation = true;
options.threadCount = getThreadCount();
diff --git a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
index 5e66581..7d9dadb 100644
--- a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
+++ b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
@@ -27,6 +27,9 @@
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.LocalVariableTable;
+import com.android.tools.r8.utils.codeinspector.LocalVariableTable.LocalVariableTableEntry;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
@@ -65,8 +68,7 @@
}
@Test
- public void testRelocatorEmptyToSomething()
- throws IOException, CompilationFailedException, ExecutionException {
+ public void testRelocatorEmptyToSomething() throws IOException, CompilationFailedException {
String originalPrefix = "";
String newPrefix = "foo.bar.baz";
Path output = temp.newFile("output.jar").toPath();
@@ -82,8 +84,7 @@
}
@Test
- public void testRelocatorSomethingToEmpty()
- throws IOException, CompilationFailedException, ExecutionException {
+ public void testRelocatorSomethingToEmpty() throws IOException {
String originalPrefix = "com.android.tools.r8";
String newPrefix = "";
Path output = temp.newFile("output.jar").toPath();
@@ -99,6 +100,50 @@
}
@Test
+ public void testRelocateKeepsDebugInfo()
+ throws IOException, CompilationFailedException, ExecutionException {
+ String originalPrefix = "com.android.tools.r8";
+ String newPrefix = "com.android.tools.r8";
+ Path output = temp.newFile("output.jar").toPath();
+ Map<String, String> mapping = new HashMap<>();
+ mapping.put(originalPrefix, newPrefix);
+ runRelocator(ToolHelper.R8_JAR, mapping, output);
+ // Assert that all classes are the same, have the same methods and debug info:
+ CodeInspector originalInspector = new CodeInspector(ToolHelper.R8_JAR);
+ CodeInspector relocatedInspector = new CodeInspector(output);
+ for (FoundClassSubject clazz : originalInspector.allClasses()) {
+ ClassSubject relocatedClass = relocatedInspector.clazz(clazz.getFinalName());
+ assertThat(relocatedClass, isPresent());
+ assertEquals(clazz.getDexClass().sourceFile, relocatedClass.getDexClass().sourceFile);
+ for (FoundMethodSubject originalMethod : clazz.allMethods()) {
+ MethodSubject relocatedMethod = relocatedClass.method(originalMethod.asMethodReference());
+ assertThat(relocatedMethod, isPresent());
+ assertEquals(originalMethod.hasLineNumberTable(), relocatedMethod.hasLineNumberTable());
+ if (originalMethod.hasLineNumberTable()) {
+ // TODO(b/155303677): Figure out why we cannot assert the same lines.
+ // assertEquals(
+ // originalMethod.getLineNumberTable().getLines().size(),
+ // relocatedMethod.getLineNumberTable().getLines().size());
+ }
+ assertEquals(
+ originalMethod.hasLocalVariableTable(), relocatedMethod.hasLocalVariableTable());
+ if (originalMethod.hasLocalVariableTable()) {
+ LocalVariableTable originalVariableTable = originalMethod.getLocalVariableTable();
+ LocalVariableTable relocatedVariableTable = relocatedMethod.getLocalVariableTable();
+ assertEquals(originalVariableTable.size(), relocatedVariableTable.size());
+ for (int i = 0; i < originalVariableTable.getEntries().size(); i++) {
+ LocalVariableTableEntry originalEntry = originalVariableTable.get(i);
+ LocalVariableTableEntry relocatedEntry = relocatedVariableTable.get(i);
+ assertEquals(originalEntry.name, relocatedEntry.name);
+ assertEquals(originalEntry.signature, relocatedEntry.signature);
+ assertEquals(originalEntry.type.toString(), relocatedEntry.type.toString());
+ }
+ }
+ }
+ }
+ }
+
+ @Test
public void testRelocateAll() throws IOException, CompilationFailedException, ExecutionException {
String originalPrefix = "com.android.tools.r8";
String newPrefix = "foo.bar.baz";
@@ -181,7 +226,7 @@
@Test
public void testPartialPrefix()
- throws IOException, CompilationFailedException, ExecutionException {
+ throws CompilationFailedException, IOException, ExecutionException {
String originalPrefix = "com.android.tools.r";
String newPrefix = "i_cannot_w";
Map<String, String> mapping = new LinkedHashMap<>();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index fe574e4..782bbf0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -229,6 +229,9 @@
@Override
public boolean hasLocalVariableTable() {
Code code = getMethod().getCode();
+ if (code == null) {
+ return false;
+ }
if (code.isDexCode()) {
DexCode dexCode = code.asDexCode();
if (dexCode.getDebugInfo() != null) {
@@ -254,6 +257,9 @@
@Override
public LineNumberTable getLineNumberTable() {
Code code = getMethod().getCode();
+ if (code == null) {
+ return null;
+ }
if (code.isDexCode()) {
return getDexLineNumberTable(code.asDexCode());
}