Reconvert the lambdas in AndroidDataConverter to anonymous inner classes.
Tag some static members with @AutoCodec.
Replace some lambdas with explicit functions or classes.

PiperOrigin-RevId: 200467500
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index e6a1261..d78ba32 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -29,6 +29,7 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact;
+import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact;
 import com.google.devtools.build.lib.actions.CommandLine;
 import com.google.devtools.build.lib.actions.FailAction;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
@@ -50,6 +51,7 @@
 import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate;
+import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate.OutputPathMapper;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.whitelisting.Whitelist;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -1370,7 +1372,14 @@
         new SpawnActionTemplate.Builder(inputTree, outputTree)
             .setExecutable(ruleContext.getExecutablePrerequisite("$dexmerger", Mode.HOST))
             .setMnemonics("DexShardsToMerge", "DexMerger")
-            .setOutputPathMapper(input -> input.getParentRelativePath());
+            .setOutputPathMapper(
+                // Use an anonymous inner class for serialization.
+                new OutputPathMapper() {
+                  @Override
+                  public PathFragment parentRelativeOutputPath(TreeFileArtifact input) {
+                    return input.getParentRelativePath();
+                  }
+                });
     CustomCommandLine.Builder commandLine =
         CustomCommandLine.builder()
             .addPlaceholderTreeArtifactExecPath("--input", inputTree)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDataConverter.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDataConverter.java
index 28d242c..0db9971 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDataConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDataConverter.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.errorprone.annotations.CompileTimeConstant;
 import java.util.Objects;
@@ -37,6 +38,7 @@
    * Converts Android data to the "SerializedAndroidData" format used by the Android data processing
    * actions.
    */
+  @AutoCodec
   static final AndroidDataConverter<MergableAndroidData> MERGABLE_DATA_CONVERTER =
       AndroidDataConverter.<MergableAndroidData>builder(JoinerType.SEMICOLON_AMPERSAND)
           .withRoots(MergableAndroidData::getResourceRoots)
@@ -137,24 +139,54 @@
     }
 
     Builder<T> withRoots(Function<T, ImmutableList<PathFragment>> rootsFunction) {
-      return with(t -> rootsToString(rootsFunction.apply(t)));
+      // Anonymous inner class for serialization.
+      return with(
+          new Function<T, String>() {
+            @Override
+            public String apply(T t) {
+              // Copied from rootsToString to get rid of internal Lambda.
+              return rootsFunction
+                  .apply(t)
+                  .stream()
+                  .map(PathFragment::toString)
+                  .collect(Collectors.joining("#"));
+            }
+          });
     }
 
     Builder<T> withArtifact(Function<T, Artifact> artifactFunction) {
-      return with(t -> artifactFunction.apply(t).getExecPathString());
+      // Anonymous inner class for serialization.
+      return with(
+          new Function<T, String>() {
+            @Override
+            public String apply(T t) {
+              return artifactFunction.apply(t).getExecPathString();
+            }
+          });
     }
 
     Builder<T> maybeWithArtifact(Function<T, Artifact> nullableArtifactFunction) {
+      // Anonymous inner class for serialization.
       return with(
-          t -> {
-            @Nullable Artifact artifact = nullableArtifactFunction.apply(t);
-            return artifact == null ? "" : artifact.getExecPathString();
+          new Function<T, String>() {
+            @Override
+            public String apply(T t) {
+              @Nullable Artifact artifact = nullableArtifactFunction.apply(t);
+              return artifact == null ? "" : artifact.getExecPathString();
+            }
           });
     }
 
     Builder<T> withLabel(Function<T, Label> labelFunction) {
       // Escape labels, since they are known to contain separating characters (specifically, ':').
-      return with(t -> joinerType.escape(labelFunction.apply(t).toString()));
+      // Anonymous inner class for serialization.
+      return with(
+          new Function<T, String>() {
+            @Override
+            public String apply(T t) {
+              return joinerType.escape(labelFunction.apply(t).toString());
+            }
+          });
     }
 
     Builder<T> with(Function<T, String> stringFunction) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
index af71893..e289c7e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
@@ -18,13 +18,16 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
 import com.google.devtools.build.lib.rules.android.AndroidDataConverter.JoinerType;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import java.util.Collections;
 import java.util.List;
 
 /** Builder for creating resource processing action. */
 public class AndroidResourcesProcessorBuilder {
 
-  private static final AndroidDataConverter<ParsedAndroidAssets> AAPT2_ASSET_DEP_TO_ARG =
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ParsedAndroidAssets> AAPT2_ASSET_DEP_TO_ARG =
       AndroidDataConverter.<ParsedAndroidAssets>builder(JoinerType.SEMICOLON_AMPERSAND)
           .withRoots(ParsedAndroidAssets::getResourceRoots)
           .withRoots(ParsedAndroidAssets::getAssetRoots)
@@ -32,7 +35,8 @@
           .withArtifact(ParsedAndroidAssets::getSymbols)
           .build();
 
-  private static final AndroidDataConverter<ParsedAndroidAssets> AAPT2_ASSET_DEP_TO_ARG_NO_PARSE =
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ParsedAndroidAssets> AAPT2_ASSET_DEP_TO_ARG_NO_PARSE =
       AndroidDataConverter.<ParsedAndroidAssets>builder(JoinerType.SEMICOLON_AMPERSAND)
           .withRoots(ParsedAndroidAssets::getResourceRoots)
           .withRoots(ParsedAndroidAssets::getAssetRoots)
@@ -40,7 +44,8 @@
           .withArtifact(ParsedAndroidAssets::getCompiledSymbols)
           .build();
 
-  private static final AndroidDataConverter<ValidatedAndroidData> AAPT2_RESOURCE_DEP_TO_ARG =
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ValidatedAndroidData> AAPT2_RESOURCE_DEP_TO_ARG =
       AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA)
           .withRoots(ValidatedAndroidData::getResourceRoots)
           .withRoots(ValidatedAndroidData::getAssetRoots)
@@ -50,17 +55,18 @@
           .maybeWithArtifact(ValidatedAndroidData::getSymbols)
           .build();
 
-  private static final AndroidDataConverter<ValidatedAndroidData>
-      AAPT2_RESOURCE_DEP_TO_ARG_NO_PARSE =
-          AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA)
-              .withRoots(ValidatedAndroidData::getResourceRoots)
-              .withRoots(ValidatedAndroidData::getAssetRoots)
-              .withArtifact(ValidatedAndroidData::getManifest)
-              .maybeWithArtifact(ValidatedAndroidData::getAapt2RTxt)
-              .maybeWithArtifact(ValidatedAndroidData::getCompiledSymbols)
-              .build();
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ValidatedAndroidData> AAPT2_RESOURCE_DEP_TO_ARG_NO_PARSE =
+      AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA)
+          .withRoots(ValidatedAndroidData::getResourceRoots)
+          .withRoots(ValidatedAndroidData::getAssetRoots)
+          .withArtifact(ValidatedAndroidData::getManifest)
+          .maybeWithArtifact(ValidatedAndroidData::getAapt2RTxt)
+          .maybeWithArtifact(ValidatedAndroidData::getCompiledSymbols)
+          .build();
 
-  private static final AndroidDataConverter<ValidatedAndroidData> RESOURCE_DEP_TO_ARG =
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ValidatedAndroidData> RESOURCE_DEP_TO_ARG =
       AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA)
           .withRoots(ValidatedAndroidData::getResourceRoots)
           .withRoots(ValidatedAndroidData::getAssetRoots)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
index c4e33f1..7798f01 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
@@ -16,16 +16,21 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
 import com.google.devtools.build.lib.rules.android.AndroidDataConverter.JoinerType;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import java.util.function.Function;
 
 /** Builds up the spawn action for $android_rclass_generator. */
 public class RClassGeneratorActionBuilder {
 
-  private static final AndroidDataConverter<ValidatedAndroidData> AAPT_CONVERTER =
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ValidatedAndroidData> AAPT_CONVERTER =
       AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA)
           .with(chooseDepsToArg(AndroidAaptVersion.AAPT))
           .build();
-  private static final AndroidDataConverter<ValidatedAndroidData> AAPT2_CONVERTER =
+
+  @AutoCodec @VisibleForSerialization
+  static final AndroidDataConverter<ValidatedAndroidData> AAPT2_CONVERTER =
       AndroidDataConverter.<ValidatedAndroidData>builder(JoinerType.COLON_COMMA)
           .with(chooseDepsToArg(AndroidAaptVersion.AAPT2))
           .build();
@@ -92,12 +97,16 @@
 
   private static Function<ValidatedAndroidData, String> chooseDepsToArg(
       final AndroidAaptVersion version) {
-    return container -> {
-      Artifact rTxt =
-          version == AndroidAaptVersion.AAPT2 ? container.getAapt2RTxt() : container.getRTxt();
-      return (rTxt != null ? rTxt.getExecPath() : "")
-          + ","
-          + (container.getManifest() != null ? container.getManifest().getExecPath() : "");
+    // Use an anonymous inner class for serialization.
+    return new Function<ValidatedAndroidData, String>() {
+      @Override
+      public String apply(ValidatedAndroidData container) {
+        Artifact rTxt =
+            version == AndroidAaptVersion.AAPT2 ? container.getAapt2RTxt() : container.getRTxt();
+        return (rTxt != null ? rTxt.getExecPath() : "")
+            + ","
+            + (container.getManifest() != null ? container.getManifest().getExecPath() : "");
+      }
     };
   }
 }