Merge "Don't mark identifier name strings if not minifying"
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java b/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
index 7777147..14fc568 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
@@ -42,7 +42,8 @@
@Override
public void collectIndexedItems(IndexedItemCollection indexedItems) {
// This instance should not exist when collecting indexed items.
- // {@link IdentifierMinifier} will replace this with an appropriate {@link DexString}.
+ // {@link com.android.tools.r8.naming.IdentifierMinifier} will replace this with an appropriate
+ // {@link DexString}.
throw new Unreachable("Remaining DexItemBasedString: " + this.toString());
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index b466315..8547206 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -113,7 +113,7 @@
this.lensCodeRewriter = new LensCodeRewriter(graphLense, appInfo.withSubtyping());
if (appInfo.hasLiveness()) {
this.protoLiteRewriter = new ProtoLitePruner(appInfo.withLiveness());
- if (!appInfo.withLiveness().identifierNameStrings.isEmpty()) {
+ if (!appInfo.withLiveness().identifierNameStrings.isEmpty() && !options.skipMinification) {
this.identifierNameStringMarker = new IdentifierNameStringMarker(appInfo.withLiveness());
} else {
this.identifierNameStringMarker = null;
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
index 168b794..f6e1ef0 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -5,36 +5,33 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import com.android.tools.r8.CompilationException;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.code.ConstString;
import com.android.tools.r8.code.InvokeStatic;
import com.android.tools.r8.code.ReturnVoid;
import com.android.tools.r8.graph.DexCode;
-import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
import com.android.tools.r8.smali.SmaliTestBase;
+import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.DexInspector.MethodSubject;
import com.google.common.collect.ImmutableList;
-import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
-import java.util.concurrent.ExecutionException;
-import org.antlr.runtime.RecognitionException;
import org.junit.Test;
public class ForNameTest extends SmaliTestBase {
+ private final String CLASS_NAME = "Example";
private final static String BOO = "Boo";
@Test
public void forName_renamed() throws Exception {
- SmaliBuilder builder = new SmaliBuilder("Example");
- MethodSignature main = builder.addMainMethod(
+ SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
+ builder.addMainMethod(
1,
"const-string v0, \"" + BOO + "\"",
"invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;",
@@ -44,16 +41,19 @@
builder.addClass(BOO);
List<String> pgConfigs = ImmutableList.of(
- "-keep class Example { *; }",
+ "-keep class " + CLASS_NAME + " { *; }",
"-keep,allowobfuscation class " + BOO,
"-dontshrink",
"-dontoptimize");
- Path processedApp = runCompatProguard(builder, pgConfigs);
- DexEncodedMethod method = getMethod(processedApp, main);
- assertNotNull(method);
+ DexInspector inspector = runCompatProguard(builder, pgConfigs);
- DexCode code = method.getCode().asDexCode();
+ ClassSubject clazz = inspector.clazz(CLASS_NAME);
+ assertTrue(clazz.isPresent());
+ MethodSubject method = clazz.method(DexInspector.MAIN);
+ assertTrue(method.isPresent());
+
+ DexCode code = method.getMethod().getCode().asDexCode();
// TODO(b/36799092): DeadCodeRemover should be able to remove this instruction.
assertTrue(code.instructions[0] instanceof ConstString);
ConstString constString = (ConstString) code.instructions[0];
@@ -65,20 +65,49 @@
assertTrue(code.instructions[3] instanceof ReturnVoid);
}
- private Path runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations) {
- try {
- Path dexOutputDir = temp.newFolder().toPath();
- R8Command command =
- new CompatProguardCommandBuilder(true, true)
- .addDexProgramData(builder.compile())
- .setOutputPath(dexOutputDir)
- .addProguardConfiguration(proguardConfigurations)
- .build();
- ToolHelper.runR8(command);
- return dexOutputDir.resolve("classes.dex");
- } catch (CompilationException | IOException | RecognitionException | ExecutionException e) {
- throw new RuntimeException(e);
- }
+ @Test
+ public void forName_noMinification() throws Exception {
+ SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
+ builder.addMainMethod(
+ 1,
+ "const-string v0, \"" + BOO + "\"",
+ "invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;",
+ "move-result-object v0",
+ "return-void");
+
+ builder.addClass(BOO);
+
+ List<String> pgConfigs = ImmutableList.of(
+ "-keep class " + CLASS_NAME +" { *; }",
+ "-keep class " + BOO,
+ "-dontshrink",
+ "-dontoptimize",
+ "-dontobfuscate");
+
+ DexInspector inspector = runCompatProguard(builder, pgConfigs);
+
+ ClassSubject clazz = inspector.clazz(CLASS_NAME);
+ assertTrue(clazz.isPresent());
+ MethodSubject method = clazz.method(DexInspector.MAIN);
+ assertTrue(method.isPresent());
+
+ DexCode code = method.getMethod().getCode().asDexCode();
+ assertTrue(code.instructions[0] instanceof ConstString);
+ ConstString constString = (ConstString) code.instructions[0];
+ assertEquals(BOO, constString.getString().toString());
+ assertTrue(code.instructions[1] instanceof InvokeStatic);
+ assertTrue(code.instructions[2] instanceof ReturnVoid);
}
+ private DexInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
+ throws Exception{
+ Path dexOutputDir = temp.newFolder().toPath();
+ R8Command command =
+ new CompatProguardCommandBuilder(true, true)
+ .addDexProgramData(builder.compile())
+ .setOutputPath(dexOutputDir)
+ .addProguardConfiguration(proguardConfigurations)
+ .build();
+ return new DexInspector(ToolHelper.runR8(command));
+ }
}