Experimental flag to not make the fields in lambda classes final

Bug: 182065081
Change-Id: Ie4a344838fef0a5cbbfb6e25162daa9dea3cf499
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java b/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java
index 29e68bf..95b2a6f 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java
@@ -81,6 +81,10 @@
         Constants.ACC_PUBLIC | Constants.ACC_FINAL | Constants.ACC_SYNTHETIC);
   }
 
+  public static FieldAccessFlags createPublicSynthetic() {
+    return fromSharedAccessFlags(Constants.ACC_PUBLIC | Constants.ACC_SYNTHETIC);
+  }
+
   public static FieldAccessFlags fromSharedAccessFlags(int access) {
     assert (access & FLAGS) == access;
     return new FieldAccessFlags(access & FLAGS);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index bbc30e8..cd17565 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -236,7 +236,10 @@
       fields.add(
           DexEncodedField.syntheticBuilder()
               .setField(getCaptureField(i))
-              .setAccessFlags(FieldAccessFlags.createPublicFinalSynthetic())
+              .setAccessFlags(
+                  appView.options().desugarSpecificOptions().lambdaClassFieldsFinal
+                      ? FieldAccessFlags.createPublicFinalSynthetic()
+                      : FieldAccessFlags.createPublicSynthetic())
               // The api level is computed when tracing.
               .disableAndroidApiLevelCheck()
               .build());
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index b5235d2..9449f1b 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1203,6 +1203,9 @@
     // See b/191469661 for why this is here.
     public boolean noCfMarkerForDesugaredCode =
         System.getProperty("com.android.tools.r8.noCfMarkerForDesugaredCode") != null;
+    // See b/182065081 for why this is here.
+    public boolean lambdaClassFieldsFinal =
+        System.getProperty("com.android.tools.r8.lambdaClassFieldsNotFinal") == null;
   }
 
   public class CallSiteOptimizationOptions {