Don't outline <clinint> for android.graphics.SurfaceTexture

R=christofferqa@google.com

Fixes: b/441137561
Change-Id: I9a5693987f7bc3cfad8db76124415e17b608a87f
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java b/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java
index 17676ef..0fd6b03 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java
@@ -36,6 +36,7 @@
 import com.android.tools.r8.ir.synthetic.NewInstanceSourceCode;
 import com.android.tools.r8.shaking.ComputeApiLevelUseRegistry;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -50,10 +51,15 @@
 public class InstanceInitializerOutliner extends CodeRewriterPass<AppInfo> {
 
   private final DexItemFactory factory;
+  private final Set<DexType> neverOutlineClinit;
 
   public InstanceInitializerOutliner(AppView<?> appView) {
     super(appView);
     this.factory = appView.dexItemFactory();
+    // android.graphics.SurfaceTexture has a finalizer which crash in native code if an instance is
+    // created without calling an initializer, see b/441137561.
+    this.neverOutlineClinit =
+        ImmutableSet.of(factory.createType("Landroid/graphics/SurfaceTexture;"));
   }
 
   @Override
@@ -171,6 +177,9 @@
 
   private boolean canSkipClInit(
       InstructionListIterator iterator, NewInstance newInstance, Value newInstanceOutValue) {
+    if (neverOutlineClinit.contains(newInstance.clazz)) {
+      return true;
+    }
     InvokeStatic definition = newInstanceOutValue.getDefinition().asInvokeStatic();
     assert definition != null;
     Position currentPosition = newInstance.getPosition();
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningInSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningInSynchronizedMethodTest.java
index 3d28108..a75fe65 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningInSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningInSynchronizedMethodTest.java
@@ -49,7 +49,7 @@
         .inspect(
             inspector ->
                 assertEquals(
-                    2,
+                    1, // Only one for android.graphics.SurfaceTexture.
                     inspector
                         .clazz(TestClass.class)
                         .uniqueMethodWithOriginalName("constructorArgumentInSynchronizedMethod")
@@ -99,7 +99,7 @@
               // As android.graphics.SurfaceTexture was introduced in API level 11 the <clinit>
               // outline is inlined.
               assertEquals(
-                  1,
+                  0,
                   constructorArgumentInSynchronizedMethod
                       .streamInstructions()
                       .filter(InstructionSubject::isNewInstance)
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningWhereArgumentsCouldCauseSideEffectsTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningWhereArgumentsCouldCauseSideEffectsTest.java
index 1a76b6d..4776b59 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningWhereArgumentsCouldCauseSideEffectsTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelExcludeClinitOutliningWhereArgumentsCouldCauseSideEffectsTest.java
@@ -39,8 +39,11 @@
     return getTestParameters().withDexRuntimes().withApiLevel(AndroidApiLevel.L).build();
   }
 
+  // The expected output should be:
+  //   StringUtils.lines("SurfaceTexture <clinit>", "getArgument", "DONE");
+  // See b/441137561 for details on why the <clinit> is not called until after getArgument.
   private static final String EXPECTED_OUTPUT =
-      StringUtils.lines("SurfaceTexture <clinit>", "getArgument", "DONE");
+      StringUtils.lines("getArgument", "SurfaceTexture <clinit>", "DONE");
 
   @Test
   public void testD8() throws Exception {
@@ -50,7 +53,7 @@
         .inspect(
             inspector ->
                 assertEquals(
-                    2,
+                    1, // Only one for android.graphics.SurfaceTexture.
                     inspector
                         .clazz(TestClass.class)
                         .uniqueMethodWithOriginalName("constructorArgumentCouldCauseSideEffects")
@@ -100,7 +103,7 @@
               // As android.graphics.SurfaceTexture was introduced in API level 11 the <clinit>
               // outline is inlined.
               assertEquals(
-                  1,
+                  0,
                   constructorArgumentCouldCauseSideEffects
                       .streamInstructions()
                       .filter(InstructionSubject::isNewInstance)