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 {