Set --android_sdk=@bazel_tools//tools/android:sdk by default and delete Constants.ANDROID_DEFAULT_SDK.

This CL also updates the test infrastructure to include a mock of @bazel_tools//tools/android:sdk.

--
MOS_MIGRATED_REVID=120815577
diff --git a/src/main/java/com/google/devtools/build/lib/Constants.java b/src/main/java/com/google/devtools/build/lib/Constants.java
index 0928dc9..556a742 100644
--- a/src/main/java/com/google/devtools/build/lib/Constants.java
+++ b/src/main/java/com/google/devtools/build/lib/Constants.java
@@ -28,9 +28,6 @@
   // Native Java deps are all linked into a single file, which is named with this value + ".so".
   public static final String NATIVE_DEPS_LIB_SUFFIX = "_nativedeps";
 
-  // Locations of implicit Android SDK dependencies.
-  public static final String ANDROID_DEFAULT_SDK = "//external:android/sdk";
-
   // Most other tools dependencies use this; we plan to split it into per-language repositories.
   public static final String TOOLS_REPOSITORY = "@bazel_tools";
 }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidRuleClasses.java
index f0af73a..ca5a669 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidRuleClasses.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.rules.android.AndroidRuleClasses;
+import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidSdkLabel;
 import com.google.devtools.build.lib.rules.android.AndroidToolsDefaultsJar;
 
 /** Rule class definitions for Android rules. */
@@ -36,7 +37,8 @@
           .add(
               attr(":android_sdk", LABEL)
                   .allowedRuleClasses("android_sdk", "filegroup")
-                  .value(AndroidRuleClasses.ANDROID_SDK))
+                  .value(new AndroidSdkLabel(
+                      environment.getToolsLabel(AndroidRuleClasses.DEFAULT_SDK))))
           .build();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
index 7127331..606a35e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
@@ -18,11 +18,11 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
-import com.google.devtools.build.lib.Constants;
+import com.google.devtools.build.lib.analysis.RedirectChaser;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration.DefaultLabelConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.EmptyToNullLabelConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
@@ -48,13 +48,6 @@
 @Immutable
 public class AndroidConfiguration extends BuildConfiguration.Fragment {
 
-  /** Converter for --android_sdk. */
-  public static class AndroidSdkConverter extends DefaultLabelConverter {
-    public AndroidSdkConverter() {
-      super(Constants.ANDROID_DEFAULT_SDK);
-    }
-  }
-
   /**
    * Converter for {@link com.google.devtools.build.lib.rules.android.AndroidConfiguration.ConfigurationDistinguisher}
    */
@@ -198,9 +191,9 @@
     // Label of filegroup combining all Android tools used as implicit dependencies of
     // android_* rules
     @Option(name = "android_sdk",
-            defaultValue = "",
+            defaultValue = "@bazel_tools//tools/android:sdk",
             category = "version",
-            converter = AndroidSdkConverter.class,
+            converter = LabelConverter.class,
             help = "Specifies Android SDK/platform that is used to build Android applications.")
     public Label sdk;
 
@@ -300,6 +293,7 @@
     public FragmentOptions getHost(boolean fallback) {
       Options host = (Options) super.getHost(fallback);
       host.androidCrosstoolTop = androidCrosstoolTop;
+      host.sdk = sdk;
       return host;
     }
 
@@ -321,7 +315,13 @@
     @Override
     public Fragment create(ConfigurationEnvironment env, BuildOptions buildOptions)
         throws InvalidConfigurationException {
-      return new AndroidConfiguration(buildOptions.get(Options.class));
+      AndroidConfiguration.Options androidOptions =
+          buildOptions.get(AndroidConfiguration.Options.class);
+      Label androidSdk = RedirectChaser.followRedirects(env, androidOptions.sdk, "android_sdk");
+      if (androidSdk == null) {
+        return null;
+      }
+      return new AndroidConfiguration(buildOptions.get(Options.class), androidSdk);
     }
 
     @Override
@@ -349,8 +349,8 @@
   private final boolean allowAndroidLibraryDepsWithoutSrcs;
   private final boolean useAndroidResourceShrinking;
 
-  AndroidConfiguration(Options options) {
-    this.sdk = options.sdk;
+  AndroidConfiguration(Options options, Label androidSdk) {
+    this.sdk = androidSdk;
     this.incrementalNativeLibs = options.incrementalNativeLibs;
     this.strictDeps = options.strictDeps;
     this.legacyNativeSupport = options.legacyNativeSupport;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 7cd976d..0cb5c90 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -28,7 +28,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Lists;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
@@ -169,19 +168,20 @@
   public static final String DEFAULT_RESOURCE_SHRINKER =
       "//tools/android:resource_shrinker";
   public static final String DEFAULT_AAR_GENERATOR = "//tools/android:aar_generator";
+  public static final String DEFAULT_SDK = "//tools/android:sdk";
 
-  public static final Label DEFAULT_ANDROID_SDK =
-      Label.parseAbsoluteUnchecked(
-          Constants.ANDROID_DEFAULT_SDK);
-
-  public static final LateBoundLabel<BuildConfiguration> ANDROID_SDK =
-      new LateBoundLabel<BuildConfiguration>(DEFAULT_ANDROID_SDK, AndroidConfiguration.class) {
-        @Override
-        public Label resolve(Rule rule, AttributeMap attributes,
-            BuildConfiguration configuration) {
-          return configuration.getFragment(AndroidConfiguration.class).getSdk();
-        }
-      };
+  /**
+   * The default label of android_sdk option
+   */
+  public static final class AndroidSdkLabel extends LateBoundLabel<BuildConfiguration> {
+    public AndroidSdkLabel(Label androidSdk) {
+      super(androidSdk, AndroidConfiguration.class);
+    }
+    @Override
+    public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
+      return configuration.getFragment(AndroidConfiguration.class).getSdk();
+    }
+  }
 
   public static final SplitTransition<BuildOptions> ANDROID_SPLIT_TRANSITION =
       new SplitTransition<BuildOptions>() {
@@ -496,7 +496,7 @@
       return builder
           .add(attr(":android_sdk", LABEL)
               .allowedRuleClasses("android_sdk", "filegroup")
-              .value(ANDROID_SDK))
+              .value(new AndroidSdkLabel(env.getToolsLabel(AndroidRuleClasses.DEFAULT_SDK))))
           /* <!-- #BLAZE_RULE($android_base).ATTRIBUTE(plugins) -->
           Java compiler plugins to run at compile-time.
           Every <code>java_plugin</code> specified in
@@ -780,3 +780,4 @@
     }
   }
 }
+
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
index 60a912d..cceff8a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
@@ -19,6 +19,7 @@
 import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
 
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
@@ -26,13 +27,15 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory;
+import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidSdkLabel;
 import com.google.devtools.build.lib.rules.java.JavaCommon;
 import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import java.util.List;
 
 /** Aspect to provide Jack support to rules which have java sources. */
@@ -41,11 +44,18 @@
 
   @Override
   public AspectDefinition getDefinition(AspectParameters params) {
+    Label androidSdk;
+    try {
+      androidSdk = Label.parseAbsolute(Constants.TOOLS_REPOSITORY + AndroidRuleClasses.DEFAULT_SDK);
+    } catch (LabelSyntaxException e) {
+      throw new IllegalStateException(e);
+    }
+
     return new AspectDefinition.Builder("JackAspect")
         .requireProvider(JavaSourceInfoProvider.class)
         .add(attr(":android_sdk", LABEL)
               .allowedRuleClasses("android_sdk")
-              .value(AndroidRuleClasses.ANDROID_SDK))
+              .value(new AndroidSdkLabel(androidSdk)))
         .attributeAspect("deps", JackAspect.class)
         .attributeAspect("exports", JackAspect.class)
         .attributeAspect("runtime_deps", JackAspect.class)
diff --git a/tools/android/BUILD b/tools/android/BUILD
index 3b0cc44..b6e7cb4 100644
--- a/tools/android/BUILD
+++ b/tools/android/BUILD
@@ -1,6 +1,9 @@
 package(default_visibility = ["//visibility:public"])
 
-filegroup(name = "sdk")
+filegroup(
+    name = "sdk",
+    srcs = ["//external:android/sdk"],
+)
 
 android_library(
     name = "incremental_stub_application",