Introduce AutoCloseable#close overrides in lint backport

Bug: b/401147877
Change-Id: I111ab901ed333bf56fe33da4e19dec95f3e2e4a5
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 4b1f7ea..0743777 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -66,6 +66,7 @@
 import com.android.tools.r8.ir.desugar.backports.SparseArrayMethodRewrites;
 import com.android.tools.r8.ir.desugar.backports.TypedArrayMethodRewrites;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.LibraryDesugaringOptions;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.AutoCloseableRetargeterHelper;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeter;
 import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
@@ -220,6 +221,8 @@
         new BackportedMethodRewriter.RewritableMethods(appView);
     rewritableMethods.visit(methods);
     new DesugaredLibraryRetargeter(appView).visit(methods);
+    new AutoCloseableRetargeterHelper(options.getMinApiLevel(), options.dexItemFactory())
+        .visit(methods);
     rewritableMethods.visitFields(fields);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
index 9107e31..a986672 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
@@ -284,4 +284,16 @@
         .appInfoForDesugaring()
         .lookupMaximallySpecificMethod(context.getContextClass(), target);
   }
+
+  public void visit(Consumer<DexMethod> methods) {
+    if (minApiLevel.isLessThan(AndroidApiLevel.K)) {
+      return;
+    }
+    forEachAutoCloseableMissingSubimplementation(
+        type -> {
+          if (!isFinalClassImplementingAutoCloseable(type)) {
+            methods.accept(createCloseMethod(type));
+          }
+        });
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
index 37f266a..dc9c64e 100644
--- a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
+++ b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
@@ -75,6 +75,11 @@
         apiLevel < AndroidApiLevel.O.getLevel(),
         backports.contains("java/lang/Short#toUnsignedLong(S)J"));
 
+    // ExecutorService#close up to api level V.
+    assertEquals(
+        apiLevel <= AndroidApiLevel.V.getLevel(),
+        backports.contains("java/util/concurrent/ExecutorService#close()V"));
+
     // Java 9, 10 and 11 Optional methods added at API level T
     // They require Android N or library desugaring to be backported.
     // The methods are not backported in desugared library JDK 11 (already present).