Change MIN_BUILD_TOOLS_REVISION to 30.0.0

Bazel's Android tools requires Android Build Tools 30.0.0 or newer.

See https://github.com/bazelbuild/bazel/issues/13409

RELNOTES: The minimum Android build tools version for the Android rules is now 30.0.0
PiperOrigin-RevId: 378014192
diff --git a/site/docs/tutorial/android-app.md b/site/docs/tutorial/android-app.md
index 36be5b4..dbfc7c7 100644
--- a/site/docs/tutorial/android-app.md
+++ b/site/docs/tutorial/android-app.md
@@ -176,7 +176,7 @@
     name = "androidsdk",
     path = "/path/to/Android/sdk",
     api_level = 25,
-    build_tools_version = "26.0.1"
+    build_tools_version = "30.0.3"
 )
 ```
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
index 2938a55..3d3df25 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
@@ -159,7 +159,7 @@
   private static final PathFragment BUILD_TOOLS_DIR = PathFragment.create("build-tools");
   private static final PathFragment PLATFORMS_DIR = PathFragment.create("platforms");
   private static final PathFragment SYSTEM_IMAGES_DIR = PathFragment.create("system-images");
-  private static final AndroidRevision MIN_BUILD_TOOLS_REVISION = AndroidRevision.parse("26.0.1");
+  private static final AndroidRevision MIN_BUILD_TOOLS_REVISION = AndroidRevision.parse("30.0.0");
   private static final String PATH_ENV_VAR = "ANDROID_HOME";
   private static final ImmutableList<String> PATH_ENV_VAR_AS_LIST = ImmutableList.of(PATH_ENV_VAR);
   private static final ImmutableList<String> LOCAL_MAVEN_REPOSITORIES =
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java
index b8ec9bf..c947c92 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java
@@ -72,7 +72,7 @@
         The version of the Android build tools to use from within the Android SDK. If not specified,
         the latest build tools version installed will be used.
 
-        <p>Bazel requires build tools version 26.0.1 or later.
+        <p>Bazel requires build tools version 30.0.0 or later.
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
         .add(attr("build_tools_version", STRING).nonconfigurable("WORKSPACE rule"))
         /* <!-- #BLAZE_RULE(android_sdk_repository).ATTRIBUTE(api_level) -->
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java
index b66547b..65c7ce3 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java
@@ -76,6 +76,11 @@
   }
 
   private void scratchBuildToolsDirectories(String... versions) throws Exception {
+    if (versions.length == 0) {
+      // Use a large version number here so that we don't have to update this test as
+      // AndroidSdkRepositoryFunction.MIN_BUILD_TOOLS_REVISION increases.
+      versions = new String[] {"400.0.0"};
+    }
     for (String version : versions) {
       scratch.dir("/sdk/build-tools/" + version);
     }
@@ -103,7 +108,7 @@
   @Test
   public void testGeneratedAarImport() throws Exception {
     scratchPlatformsDirectories(25);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     scratchExtrasLibrary("extras/google/m2repository", "com.google.android", "foo", "1.0.0", "aar");
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
@@ -125,7 +130,7 @@
   @Test
   public void testExportsExtrasLibraryArtifacts() throws Exception {
     scratchPlatformsDirectories(25);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     scratchExtrasLibrary("extras/google/m2repository", "com.google.android", "foo", "1.0.0", "aar");
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
@@ -145,7 +150,7 @@
   @Test
   public void testKnownSdkMavenRepositories() throws Exception {
     scratchPlatformsDirectories(25);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     scratchExtrasLibrary("extras/google/m2repository", "com.google.android", "a", "1.0.0", "jar");
     scratchExtrasLibrary("extras/android/m2repository", "com.android.support", "b", "1.0.0", "aar");
     scratchExtrasLibrary("extras/m2repository", "com.android.support", "c", "1.0.1", "aar");
@@ -176,7 +181,7 @@
   @Test
   public void testSystemImageDirectoriesAreFound() throws Exception {
     scratchPlatformsDirectories(25);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
         scratch.resolve("WORKSPACE"),
@@ -211,7 +216,7 @@
   @Test
   public void testMalformedSystemImageDirectories() throws Exception {
     scratchPlatformsDirectories(25, 26);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     scratchSystemImagesDirectories("android-25/default/armeabi-v7a", "android-O/google_apis/x86");
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
@@ -226,9 +231,34 @@
   }
 
   @Test
+  public void testBuildToolsVersion() throws Exception {
+    scratchPlatformsDirectories(25);
+    // Use large version numbers here so that we don't have to update this test as
+    // AndroidSdkRepositoryFunction.MIN_BUILD_TOOLS_REVISION increases.
+    scratchBuildToolsDirectories("400.0.1", "400.0.2", "400.0.3");
+    String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
+    FileSystemUtils.appendIsoLatin1(
+        scratch.resolve("WORKSPACE"),
+        "local_repository(name = 'bazel_tools', path = '" + bazelToolsWorkspace + "')",
+        "android_sdk_repository(",
+        "    name = 'androidsdk',",
+        "    path = '/sdk',",
+        "    build_tools_version = '400.0.2',",
+        ")");
+    invalidatePackages();
+
+    ConfiguredTarget androidSdk = getConfiguredTarget("@androidsdk//:sdk");
+    assertThat(androidSdk).isNotNull();
+    assertThat(androidSdk.get(AndroidSdkProvider.PROVIDER).getBuildToolsVersion())
+        .isEqualTo("400.0.2");
+  }
+
+  @Test
   public void testBuildToolsHighestVersionDetection() throws Exception {
     scratchPlatformsDirectories(25);
-    scratchBuildToolsDirectories("26.0.1", "26.0.2");
+    // Use large version numbers here so that we don't have to update this test as
+    // AndroidSdkRepositoryFunction.MIN_BUILD_TOOLS_REVISION increases.
+    scratchBuildToolsDirectories("400.0.1", "400.0.2");
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
         scratch.resolve("WORKSPACE"),
@@ -243,13 +273,13 @@
     ConfiguredTarget androidSdk = getConfiguredTarget("@androidsdk//:sdk");
     assertThat(androidSdk).isNotNull();
     assertThat(androidSdk.get(AndroidSdkProvider.PROVIDER).getBuildToolsVersion())
-        .isEqualTo("26.0.2");
+        .isEqualTo("400.0.2");
   }
 
   @Test
   public void testApiLevelHighestVersionDetection() throws Exception {
     scratchPlatformsDirectories(24, 25, 23);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
         scratch.resolve("WORKSPACE"),
@@ -257,7 +287,6 @@
         "android_sdk_repository(",
         "    name = 'androidsdk',",
         "    path = '/sdk',",
-        "    build_tools_version = '26.0.1',",
         ")");
     invalidatePackages();
 
@@ -271,7 +300,7 @@
   public void testMultipleAndroidSdkApiLevels() throws Exception {
     int[] apiLevels = {23, 24, 25};
     scratchPlatformsDirectories(apiLevels);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
         scratch.resolve("WORKSPACE"),
@@ -280,7 +309,6 @@
         "    name = 'androidsdk',",
         "    path = '/sdk',",
         "    api_level = 24,",
-        "    build_tools_version = '26.0.1',",
         ")");
     invalidatePackages();
 
@@ -296,7 +324,7 @@
   @Test
   public void testMissingApiLevel() throws Exception {
     scratchPlatformsDirectories(24);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
         scratch.resolve("WORKSPACE"),
@@ -305,7 +333,6 @@
         "    name = 'androidsdk',",
         "    path = '/sdk',",
         "    api_level = 25,",
-        "    build_tools_version = '26.0.1',",
         ")");
     invalidatePackages();
     reporter.removeHandler(failFastHandler);
@@ -326,7 +353,7 @@
   @Test
   public void testFilesInSystemImagesDirectories() throws Exception {
     scratchPlatformsDirectories(24);
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     scratch.file("/sdk/system-images/.DS_Store");
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
@@ -343,7 +370,7 @@
 
   @Test
   public void testMissingPlatformsDirectory() throws Exception {
-    scratchBuildToolsDirectories("26.0.1");
+    scratchBuildToolsDirectories();
     String bazelToolsWorkspace = scratch.dir("bazel_tools_workspace").getPathString();
     FileSystemUtils.appendIsoLatin1(
         scratch.resolve("WORKSPACE"),