Don't parse class initializers for library classes and never rename them.
Bug: 129455984
Change-Id: I5aec69acf7983922333a5a638fe1944cc9640f3e
diff --git a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
index 5e25fa9..2bd517e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.kotlin.KotlinInfo;
import com.android.tools.r8.origin.Origin;
+import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
@@ -46,6 +47,7 @@
annotations,
origin,
skipNameValidationForTesting);
+ assert Arrays.stream(directMethods).noneMatch(DexEncodedMethod::isClassInitializer);
// Set all static field values to unknown. We don't want to use the value from the library
// at compile time, as it can be different at runtime.
for (DexEncodedField staticField : staticFields) {
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index e788222..eb8d1ce 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -296,6 +296,12 @@
@Override
public MethodVisitor visitMethod(
int access, String name, String desc, String signature, String[] exceptions) {
+ if (classKind == ClassKind.LIBRARY) {
+ MethodAccessFlags flags = createMethodAccessFlags(name, access);
+ if (flags.isStatic() && flags.isConstructor()) {
+ return null;
+ }
+ }
return new CreateMethodVisitor(access, name, desc, signature, exceptions, this);
}
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
index 5065b18..69e9141 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
@@ -187,9 +187,11 @@
if (encodedMethod.accessFlags.isPrivate() != doPrivates) {
return;
}
+ if (encodedMethod.accessFlags.isConstructor()) {
+ return;
+ }
DexMethod method = encodedMethod.method;
- if (!state.isReserved(method.name, method.proto)
- && !encodedMethod.accessFlags.isConstructor()) {
+ if (!state.isReserved(method.name, method.proto)) {
DexString renamedName =
renamingAtThisLevel.computeIfAbsent(
equivalence.wrap(method),
@@ -249,7 +251,9 @@
for (DexEncodedMethod method : shuffleMethods(holder.methods(), appView.options())) {
// TODO(christofferqa): Wouldn't it be sufficient only to reserve names for non-private
// methods?
- if (keepAll || rootSet.noObfuscation.contains(method.method)) {
+ if (keepAll
+ || method.accessFlags.isConstructor()
+ || rootSet.noObfuscation.contains(method.method)) {
reserveNamesForMethod(method.method, state);
}
}
diff --git a/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java b/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java
index e333b63..b2ed534 100644
--- a/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.naming;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.ArchiveClassFileProvider;
@@ -73,8 +74,7 @@
Collections.emptyList(),
null));
assertTrue(clinit.isPresent());
- // TODO(b/129455984): Assert false. <clinit> should never be renamed!
- assertTrue(clinit.isRenamed());
+ assertFalse(clinit.isRenamed());
return compileResult;
}
@@ -86,11 +86,9 @@
@Test
public void test() throws Throwable {
- R8TestCompileResult compileResult = compile(parameters.getBackend());
- // TODO(b/129455984): Run once fixed!
- if (false) {
- compileResult.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput(EXPECTED);
- }
+ compile(parameters.getBackend())
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED);
}
public interface TestInterface {