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)