Automated rollback of commit b98ad776b4d79f41e59631ddf7e1e135f8566df5.

*** Reason for rollback ***

Broke Android build on Windows
https://github.com/bazelbuild/bazel/issues/9102

*** Original change description ***

Default Bazel to use aapt2 and fix native tests to use aapt2.

This CL sets --incompatible_use_aapt2_by_default=true and --android_aapt=aapt2. It also adds aapt2 to the mock SDK for Android analysis and integration tests.

For the tests that assume and depend on AAPT, we explicitly pin them to use AAPT.

Fixes https://github.com/bazelbuild/bazel/issues/6907
Fixes https://github.com/bazelbuild/bazel/issues/4103

RELNOTES: Bazel Android builds now use aapt2 by default. To revert to aapt, set `--an...

***

ROLLBACK_OF=261424350

RELNOTES: None
PiperOrigin-RevId: 262099198
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 cab5710..515d534 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
@@ -708,7 +708,7 @@
 
     @Option(
         name = "android_aapt",
-        defaultValue = "aapt2",
+        defaultValue = "auto",
         documentationCategory = OptionDocumentationCategory.TOOLCHAIN,
         effectTags = {
           OptionEffectTag.AFFECTS_OUTPUTS,
@@ -968,7 +968,7 @@
           OptionMetadataTag.INCOMPATIBLE_CHANGE,
           OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
         },
-        defaultValue = "true",
+        defaultValue = "false",
         help =
             "Switch the Android rules to use aapt2 by default for resource processing. "
                 + "To resolve issues when migrating your app to build with aapt2, see "
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 8c083a4..df2a7a8 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
@@ -856,9 +856,6 @@
           .add(attr("manifest_values", STRING_DICT))
           /* <!-- #BLAZE_RULE(android_binary).ATTRIBUTE(aapt_version) -->
           Select the version of aapt for this rule.<br/>
-
-          This attribute only takes effect if you set `--android_aapt=auto`.<br/>
-
           Possible values:
           <ul>
               <li><code>aapt_version = "aapt"</code>: Use aapt (deprecated).</li>
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index f654df6..adc614c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -307,7 +307,6 @@
         "android_sdk(",
         "    name = 'sdk',",
         "    aapt = ':static_aapt_tool',",
-        "    aapt2 = ':static_aapt2_tool',",
         "    adb = ':static_adb_tool',",
         "    aidl = ':static_aidl_tool',",
         "    android_jar = ':android_runtime_jar',",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidAssetsTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidAssetsTest.java
index d714a3de..3d47cb9 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidAssetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidAssetsTest.java
@@ -57,6 +57,9 @@
 
   @Test
   public void testParseAapt2() throws Exception {
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk");
+
     RuleContext ruleContext = getRuleContext();
     AndroidAssets assets = getLocalAssets();
 
@@ -155,6 +158,9 @@
 
   @Test
   public void testMergeAapt2() throws Exception {
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk");
+
     RuleContext ruleContext = getRuleContext();
     ParsedAndroidAssets parsed =
         getLocalAssets().parse(AndroidDataContext.forNative(ruleContext), AndroidAaptVersion.AAPT2);
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index e1d5140..ed7a490 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -877,8 +877,6 @@
 
   @Test
   public void testResourceShrinkingAction() throws Exception {
-    useConfiguration("--android_aapt=aapt");
-
     scratch.file("java/com/google/android/hello/BUILD",
         "android_binary(name = 'hello',",
         "               srcs = ['Foo.java'],",
@@ -935,9 +933,8 @@
   }
 
   @Test
-  public void testResourceCycleShrinkingWithAapt() throws Exception {
-    useConfiguration("--android_aapt=aapt", "--experimental_android_resource_cycle_shrinking=true");
-
+  public void testResourceCycleShrinking() throws Exception {
+    useConfiguration("--experimental_android_resource_cycle_shrinking=true");
     checkError(
         "java/a",
         "a",
@@ -1329,9 +1326,6 @@
 
   @Test
   public void testFilteredResourcesInvalidFilter() throws Exception {
-    // This test is an analysis-time check with aapt.
-    useConfiguration("--android_aapt=aapt");
-
     String badQualifier = "invalid-qualifier";
 
     checkError(
@@ -1346,9 +1340,6 @@
 
   @Test
   public void testFilteredResourcesInvalidResourceDir() throws Exception {
-    // This test is an analysis-time check with aapt.
-    useConfiguration("--android_aapt=aapt");
-
     String badQualifierDir = "values-invalid-qualifier";
 
     checkError(
@@ -1368,6 +1359,10 @@
         ImmutableList.of("res/values/foo.xml", "res/values-en/foo.xml", "res/values-fr/foo.xml");
     String dir = "java/r/android";
 
+    mockAndroidSdkWithAapt2();
+
+    useConfiguration("--android_sdk=//sdk:sdk");
+
     ConfiguredTarget binary =
         scratchConfiguredTarget(
             dir,
@@ -1395,8 +1390,6 @@
 
   @Test
   public void testFilteredResourcesSimple() throws Exception {
-    useConfiguration("--android_aapt=aapt");
-
     testDirectResourceFiltering(
         "en",
         /* unexpectedQualifiers= */ ImmutableList.of("fr"),
@@ -1685,8 +1678,6 @@
       String folderType,
       String suffix)
       throws Exception {
-    // Filtering is done at the analysis time for aapt.
-    useConfiguration("--android_aapt=aapt");
 
     List<String> unexpectedResources = new ArrayList<>();
     for (String qualifier : unexpectedQualifiers) {
@@ -1766,9 +1757,6 @@
 
   @Test
   public void testFilteredTransitiveResources() throws Exception {
-    // Filtering is done at analysis time for aapt.
-    useConfiguration("--android_aapt=aapt");
-
     String matchingResource = "res/values-en/foo.xml";
     String unqualifiedResource = "res/values/foo.xml";
     String notMatchingResource = "res/values-fr/foo.xml";
@@ -1811,9 +1799,6 @@
 
   @Test
   public void testFilteredTransitiveResourcesDifferentDensities() throws Exception {
-    // Filtering is done at analysis time for aapt.
-    useConfiguration("--android_aapt=aapt");
-
     String dir = "java/r/android";
 
     ConfiguredTarget binary =
@@ -1861,9 +1846,6 @@
 
   @Test
   public void testFilteredResourcesAllFilteredOut() throws Exception {
-    // Filtering is done at analysis time for aapt.
-    useConfiguration("--android_aapt=aapt");
-
     String dir = "java/r/android";
 
     final String keptBaseDir = "partly_filtered_dir";
@@ -2099,9 +2081,6 @@
 
   @Test
   public void testUseRClassGeneratorMultipleDeps() throws Exception {
-    // This test assumes using aapt.
-    useConfiguration("--android_aapt=aapt");
-
     scratch.file(
         "java/r/android/BUILD",
         "android_library(name = 'lib1',",
@@ -2536,7 +2515,6 @@
         "android_sdk(",
         "    name = 'sdk',",
         "    aapt = 'aapt',",
-        "    aapt2 = 'aapt2',",
         "    adb = 'adb',",
         "    aidl = 'aidl',",
         "    android_jar = 'android.jar',",
@@ -2575,7 +2553,6 @@
         "    name = 'sdk',",
         "    build_tools_version = '24.0.0',",
         "    aapt = 'aapt',",
-        "    aapt2 = 'aapt2',",
         "    adb = 'adb',",
         "    aidl = 'aidl',",
         "    android_jar = 'android.jar',",
@@ -3586,7 +3563,39 @@
   }
 
   @Test
+  public void testAapt2WithoutAndroidSdk() throws Exception {
+    useConfiguration("--android_aapt=aapt2");
+    checkError(
+        "java/a",
+        "a",
+        "aapt2 processing requested but not available on the android_sdk",
+        "android_binary(",
+        "    name = 'a',",
+        "    srcs = ['A.java'],",
+        "    manifest = 'AndroidManifest.xml',",
+        "    resource_files = [ 'res/values/values.xml' ], ",
+        "    aapt_version = 'aapt2'",
+        ")");
+  }
+
+  @Test
+  public void testAapt2FlagWithoutAndroidSdk() throws Exception {
+    useConfiguration("--android_aapt=aapt2");
+    checkError(
+        "java/a",
+        "a",
+        "aapt2 processing requested but not available on the android_sdk",
+        "android_binary(",
+        "    name = 'a',",
+        "    srcs = ['A.java'],",
+        "    manifest = 'AndroidManifest.xml',",
+        "    resource_files = [ 'res/values/values.xml' ], ",
+        ")");
+  }
+
+  @Test
   public void testAapt2WithAndroidSdk() throws Exception {
+    mockAndroidSdkWithAapt2();
     scratch.file(
         "java/a/BUILD",
         "android_binary(",
@@ -3597,20 +3606,17 @@
         "    aapt_version = 'aapt2'",
         ")");
 
+    useConfiguration("--android_sdk=//sdk:sdk");
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     Artifact apk = getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_APK);
 
     assertThat(getGeneratingSpawnActionArgs(apk))
-        .containsAtLeast(
-            "--aapt2",
-            // The path to aapt2 is different between Blaze and Bazel, so we omit it here.
-            // It's safe to do so as we've already checked for the `--aapt2` flag.
-            "--tool",
-            "AAPT2_PACKAGE");
+        .containsAtLeast("--aapt2", "sdk/aapt2", "--tool", "AAPT2_PACKAGE");
   }
 
   @Test
   public void testAapt2WithAndroidSdkAndDependencies() throws Exception {
+    mockAndroidSdkWithAapt2();
     scratch.file(
         "java/b/BUILD",
         "android_library(",
@@ -3631,6 +3637,7 @@
         "    aapt_version = 'aapt2'",
         ")");
 
+    useConfiguration("--android_sdk=//sdk:sdk");
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     ConfiguredTarget b = getDirectPrerequisite(a, "//java/b:b");
 
@@ -3641,12 +3648,7 @@
 
     SpawnAction apkAction = getGeneratingSpawnAction(apk);
     assertThat(getGeneratingSpawnActionArgs(apk))
-        .containsAtLeast(
-            "--aapt2",
-            // The path to aapt2 is different between Blaze and Bazel, so we omit it here.
-            // It's safe to do so as we've already checked for the `--aapt2` flag.
-            "--tool",
-            "AAPT2_PACKAGE");
+        .containsAtLeast("--aapt2", "sdk/aapt2", "--tool", "AAPT2_PACKAGE");
 
     assertThat(apkAction.getInputs())
         .contains(
@@ -3660,6 +3662,7 @@
 
   @Test
   public void testAapt2ResourceShrinkingAction() throws Exception {
+    mockAndroidSdkWithAapt2();
     scratch.file(
         "java/com/google/android/hello/BUILD",
         "android_binary(name = 'hello',",
@@ -3671,6 +3674,7 @@
         "               shrink_resources = 1,",
         "               proguard_specs = ['proguard-spec.pro'],)");
 
+    useConfiguration("--android_sdk=//sdk:sdk");
     ConfiguredTargetAndData targetAndData =
         getConfiguredTargetAndData("//java/com/google/android/hello:hello");
     ConfiguredTarget binary = targetAndData.getConfiguredTarget();
@@ -3722,7 +3726,9 @@
 
   @Test
   public void testAapt2ResourceCycleShrinking() throws Exception {
-    useConfiguration("--experimental_android_resource_cycle_shrinking=true");
+    mockAndroidSdkWithAapt2();
+    useConfiguration(
+        "--android_sdk=//sdk:sdk", "--experimental_android_resource_cycle_shrinking=true");
     scratch.file(
         "java/com/google/android/hello/BUILD",
         "android_binary(name = 'hello',",
@@ -3753,7 +3759,9 @@
 
   @Test
   public void testAapt2ResourceCycleShinkingWithoutResourceShrinking() throws Exception {
-    useConfiguration("--experimental_android_resource_cycle_shrinking=true");
+    mockAndroidSdkWithAapt2();
+    useConfiguration(
+        "--android_sdk=//sdk:sdk", "--experimental_android_resource_cycle_shrinking=true");
     checkError(
         "java/a",
         "a",
@@ -4316,6 +4324,7 @@
 
   @Test
   public void testSkipParsingActionFlagGetsPropagated() throws Exception {
+    mockAndroidSdkWithAapt2();
     scratch.file(
         "java/b/BUILD",
         "android_library(",
@@ -4336,7 +4345,7 @@
         "    aapt_version = 'aapt2'",
         ")");
 
-    useConfiguration("--experimental_skip_parsing_action");
+    useConfiguration("--android_sdk=//sdk:sdk", "--experimental_skip_parsing_action");
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     ConfiguredTarget b = getDirectPrerequisite(a, "//java/b:b");
 
@@ -4359,6 +4368,7 @@
 
   @Test
   public void alwaysSkipParsingActionWithAapt2() throws Exception {
+    mockAndroidSdkWithAapt2();
     scratch.file(
         "java/b/BUILD",
         "android_library(",
@@ -4379,6 +4389,7 @@
         "    aapt_version = 'aapt2'",
         ")");
 
+    useConfiguration("--android_sdk=//sdk:sdk");
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     ConfiguredTarget b = getDirectPrerequisite(a, "//java/b:b");
 
@@ -4401,6 +4412,7 @@
 
   @Test
   public void testAapt1BuildsWithAapt2Sdk() throws Exception {
+    mockAndroidSdkWithAapt2();
     scratch.file(
         "java/b/BUILD",
         "android_library(",
@@ -4421,7 +4433,7 @@
         "    aapt_version = 'aapt'",
         ")");
 
-    useConfiguration("--android_aapt=aapt", "--experimental_skip_parsing_action");
+    useConfiguration("--android_sdk=//sdk:sdk", "--experimental_skip_parsing_action");
     ConfiguredTarget a = getConfiguredTarget("//java/a:a");
     ConfiguredTarget b = getDirectPrerequisite(a, "//java/b:b");
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
index 4cc956a..a321f3c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -52,10 +52,19 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import org.junit.Before;
 
 /** Common methods shared between Android related {@link BuildViewTestCase}s. */
 public abstract class AndroidBuildViewTestCase extends BuildViewTestCase {
 
+  @Before
+  public void setup() throws Exception {
+    // Force tests to use aapt to unblock global aapt2 migration, until these
+    // tests are migrated to use aapt2.
+    // TODO(jingwen): https://github.com/bazelbuild/bazel/issues/6907
+    useConfiguration("--android_aapt=aapt");
+  }
+
   protected Iterable<Artifact> getNativeLibrariesInApk(ConfiguredTarget target) {
     return Iterables.filter(
         getGeneratingAction(getCompressedUnsignedApk(target)).getInputs(),
@@ -446,4 +455,31 @@
         .isNull();
   }
 
+  /**
+   * Creates a mock SDK with aapt2.
+   *
+   * <p>You'll need to use a configuration pointing to it, such as "--android_sdk=//sdk:sdk", to use
+   * it.
+   */
+  public void mockAndroidSdkWithAapt2() throws Exception {
+    scratch.file(
+        "sdk/BUILD",
+        "android_sdk(",
+        "    name = 'sdk',",
+        "    aapt = 'aapt',",
+        "    aapt2 = 'aapt2',",
+        "    adb = 'adb',",
+        "    aidl = 'aidl',",
+        "    android_jar = 'android.jar',",
+        "    apksigner = 'apksigner',",
+        "    dx = 'dx',",
+        "    framework_aidl = 'framework_aidl',",
+        "    main_dex_classes = 'main_dex_classes',",
+        "    main_dex_list_creator = 'main_dex_list_creator',",
+        "    proguard = 'proguard',",
+        "    shrinked_android_jar = 'shrinked_android_jar',",
+        "    zipalign = 'zipalign',",
+        "    tags = ['__ANDROID_RULES_MIGRATION__'],",
+        ")");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java
index 81de74d..c317b42 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java
@@ -38,6 +38,14 @@
     scratch.file("java/srcs/a.properties", "foo");
   }
 
+  @Before
+  public void setup() throws Exception {
+    // Force tests to use aapt to unblock global aapt2 migration, until these
+    // tests are migrated to use aapt2.
+    // TODO(jingwen): https://github.com/bazelbuild/bazel/issues/6907
+    useConfiguration("--android_aapt=aapt");
+  }
+
   // regression test for #3169099
   @Test
   public void testLibrarySrcs() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
index 974e135..96dd324 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -842,7 +842,6 @@
         "android_sdk(",
         "    name = 'sdk',",
         "    aapt = 'aapt',",
-        "    aapt2 = 'aapt2',",
         "    adb = 'adb',",
         "    aidl = 'aidl',",
         "    aidl_lib = ':aidl_lib',",
@@ -1393,7 +1392,7 @@
                 .getActionForArtifactEndingWith(artifacts,
                     "/" + resources.getJavaSourceJar().getFilename());
     assertThat(resourceParserAction.getMnemonic()).isEqualTo("AndroidResourceParser");
-    assertThat(resourceClassJarAction.getMnemonic()).isEqualTo("AndroidCompiledResourceMerger");
+    assertThat(resourceClassJarAction.getMnemonic()).isEqualTo("AndroidResourceMerger");
     assertThat(resourceSrcJarAction.getMnemonic()).isEqualTo("AndroidResourceValidator");
     // Validator also generates an R.txt.
     assertThat(resourceSrcJarAction.getOutputs()).contains(resources.getRTxt());
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
index 6b4f2a3..08b79d0 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
@@ -230,14 +230,15 @@
 
   @Test
   public void testParseNoCompile() throws Exception {
+    useConfiguration("--android_aapt=aapt");
+
     RuleContext ruleContext = getRuleContext();
     ParsedAndroidResources parsed =
         assertParse(
             ruleContext,
             DataBinding.contextFrom(
                 ruleContext,
-                ruleContext.getConfiguration().getFragment(AndroidConfiguration.class)),
-            AndroidAaptVersion.AAPT);
+                ruleContext.getConfiguration().getFragment(AndroidConfiguration.class)));
 
     // Since we are not using aapt2, there should be no compiled symbols
     assertThat(parsed.getCompiledSymbols()).isNull();
@@ -251,8 +252,11 @@
 
   @Test
   public void testParseAndCompile() throws Exception {
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk", "--android_aapt=aapt2");
+
     RuleContext ruleContext = getRuleContext();
-    ParsedAndroidResources parsed = assertParse(ruleContext, AndroidAaptVersion.AAPT2);
+    ParsedAndroidResources parsed = assertParse(ruleContext);
 
     assertThat(parsed.getCompiledSymbols()).isNotNull();
 
@@ -272,9 +276,12 @@
 
   @Test
   public void testParseWithDataBinding() throws Exception {
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk", "--android_aapt=aapt2");
+
     RuleContext ruleContext = getRuleContextWithDataBinding();
 
-    ParsedAndroidResources parsed = assertParse(ruleContext, AndroidAaptVersion.AAPT2);
+    ParsedAndroidResources parsed = assertParse(ruleContext);
 
     // The parse action should take resources and busybox artifacts in and output symbols
     assertActionArtifacts(
@@ -297,13 +304,15 @@
 
   @Test
   public void testMergeDataBinding() throws Exception {
+    useConfiguration("--android_aapt=aapt");
+
     RuleContext ruleContext = getRuleContextWithDataBinding();
-    ParsedAndroidResources parsed = assertParse(ruleContext, AndroidAaptVersion.AAPT);
+    ParsedAndroidResources parsed = assertParse(ruleContext);
     MergedAndroidResources merged =
         parsed.merge(
             AndroidDataContext.forNative(ruleContext),
             ResourceDependencies.empty(),
-            AndroidAaptVersion.AAPT);
+            AndroidAaptVersion.chooseTargetAaptVersion(ruleContext));
 
     // Besides processed manifest, inherited values should be equal
     assertThat(parsed).isEqualTo(new ParsedAndroidResources(merged, parsed.getStampedManifest()));
@@ -329,10 +338,12 @@
 
   @Test
   public void testMergeCompiled() throws Exception {
-    useConfiguration("--experimental_skip_parsing_action");
+    mockAndroidSdkWithAapt2();
+    useConfiguration(
+        "--android_sdk=//sdk:sdk", "--android_aapt=aapt2", "--experimental_skip_parsing_action");
 
     RuleContext ruleContext = getRuleContext();
-    ParsedAndroidResources parsed = assertParse(ruleContext, AndroidAaptVersion.AAPT2);
+    ParsedAndroidResources parsed = assertParse(ruleContext);
     MergedAndroidResources merged =
         parsed.merge(
             AndroidDataContext.forNative(ruleContext),
@@ -371,11 +382,14 @@
 
   @Test
   public void testValidateAapt() throws Exception {
+    useConfiguration("--android_aapt=aapt");
     RuleContext ruleContext = getRuleContext();
 
-    MergedAndroidResources merged = makeMergedResources(ruleContext, AndroidAaptVersion.AAPT);
+    MergedAndroidResources merged = makeMergedResources(ruleContext);
     ValidatedAndroidResources validated =
-        merged.validate(AndroidDataContext.forNative(ruleContext), AndroidAaptVersion.AAPT);
+        merged.validate(
+            AndroidDataContext.forNative(ruleContext),
+            AndroidAaptVersion.chooseTargetAaptVersion(ruleContext));
 
     // Inherited values should be equal
     assertThat(merged).isEqualTo(new MergedAndroidResources(validated));
@@ -396,11 +410,15 @@
 
   @Test
   public void testValidateAapt2() throws Exception {
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk", "--android_aapt=aapt2");
     RuleContext ruleContext = getRuleContext();
 
-    MergedAndroidResources merged = makeMergedResources(ruleContext, AndroidAaptVersion.AAPT2);
+    MergedAndroidResources merged = makeMergedResources(ruleContext);
     ValidatedAndroidResources validated =
-        merged.validate(AndroidDataContext.forNative(ruleContext), AndroidAaptVersion.AAPT2);
+        merged.validate(
+            AndroidDataContext.forNative(ruleContext),
+            AndroidAaptVersion.chooseTargetAaptVersion(ruleContext));
 
     // Inherited values should be equal
     assertThat(merged).isEqualTo(new MergedAndroidResources(validated));
@@ -440,12 +458,12 @@
 
     ProcessedAndroidData processedData =
         ProcessedAndroidData.of(
-            makeParsedResources(ruleContext, AndroidAaptVersion.AAPT),
+            makeParsedResources(ruleContext),
             AndroidAssets.from(ruleContext)
                 .process(
                     AndroidDataContext.forNative(ruleContext),
                     AssetDependencies.empty(),
-                    AndroidAaptVersion.AAPT),
+                    AndroidAaptVersion.chooseTargetAaptVersion(ruleContext)),
             manifest,
             rTxt,
             ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR),
@@ -500,7 +518,8 @@
 
   @Test
   public void test_incompatibleUseAapt2ByDefaultEnabled_targetsAapt2() throws Exception {
-    useConfiguration("--incompatible_use_aapt2_by_default");
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk", "--incompatible_use_aapt2_by_default");
     RuleContext ruleContext =
         getRuleContext(
             "android_binary", "aapt_version = 'auto',", "manifest = 'AndroidManifest.xml',");
@@ -508,24 +527,30 @@
         .isEqualTo(AndroidAaptVersion.AAPT2);
   }
 
+  @Test
+  public void test_incompatibleUseAapt2ByDefaultDisabled_targetsAapt() throws Exception {
+    mockAndroidSdkWithAapt2();
+    useConfiguration("--android_sdk=//sdk:sdk", "--noincompatible_use_aapt2_by_default");
+    RuleContext ruleContext =
+        getRuleContext(
+            "android_binary", "aapt_version = 'auto',", "manifest = 'AndroidManifest.xml',");
+    assertThat(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
+        .isEqualTo(AndroidAaptVersion.AAPT);
+  }
+
   /**
    * Validates that a parse action was invoked correctly. Returns the {@link ParsedAndroidResources}
    * for further validation.
    */
-  private ParsedAndroidResources assertParse(
-      RuleContext ruleContext, AndroidAaptVersion aaptVersion) throws Exception {
+  private ParsedAndroidResources assertParse(RuleContext ruleContext) throws Exception {
     return assertParse(
         ruleContext,
         DataBinding.contextFrom(
-            ruleContext, ruleContext.getConfiguration().getFragment(AndroidConfiguration.class)),
-        aaptVersion);
+            ruleContext, ruleContext.getConfiguration().getFragment(AndroidConfiguration.class)));
   }
 
   private ParsedAndroidResources assertParse(
-      RuleContext ruleContext,
-      DataBindingContext dataBindingContext,
-      AndroidAaptVersion aaptVersion)
-      throws Exception {
+      RuleContext ruleContext, DataBindingContext dataBindingContext) throws Exception {
     ImmutableList<Artifact> resources = getResources("values-en/foo.xml", "drawable-hdpi/bar.png");
     AndroidResources raw =
         new AndroidResources(
@@ -534,7 +559,10 @@
 
     ParsedAndroidResources parsed =
         raw.parse(
-            AndroidDataContext.forNative(ruleContext), manifest, aaptVersion, dataBindingContext);
+            AndroidDataContext.forNative(ruleContext),
+            manifest,
+            AndroidAaptVersion.chooseTargetAaptVersion(ruleContext),
+            dataBindingContext);
 
     // Inherited values should be equal
     assertThat(raw).isEqualTo(new AndroidResources(parsed));
@@ -545,29 +573,25 @@
     return parsed;
   }
 
-  private MergedAndroidResources makeMergedResources(
-      RuleContext ruleContext, AndroidAaptVersion aaptVersion)
+  private MergedAndroidResources makeMergedResources(RuleContext ruleContext)
       throws RuleErrorException, InterruptedException {
-    return makeParsedResources(ruleContext, aaptVersion)
+    return makeParsedResources(ruleContext)
         .merge(
             AndroidDataContext.forNative(ruleContext),
             ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false),
-            aaptVersion);
+            AndroidAaptVersion.chooseTargetAaptVersion(ruleContext));
   }
 
-  private ParsedAndroidResources makeParsedResources(
-      RuleContext ruleContext, AndroidAaptVersion aaptVersion)
+  private ParsedAndroidResources makeParsedResources(RuleContext ruleContext)
       throws RuleErrorException, InterruptedException {
     DataBindingContext dataBindingContext =
         DataBinding.contextFrom(ruleContext,
             ruleContext.getConfiguration().getFragment(AndroidConfiguration.class));
-    return makeParsedResources(ruleContext, dataBindingContext, aaptVersion);
+    return makeParsedResources(ruleContext, dataBindingContext);
   }
 
   private ParsedAndroidResources makeParsedResources(
-      RuleContext ruleContext,
-      DataBindingContext dataBindingContext,
-      AndroidAaptVersion aaptVersion)
+      RuleContext ruleContext, DataBindingContext dataBindingContext)
       throws RuleErrorException, InterruptedException {
     ImmutableList<Artifact> resources = getResources("values-en/foo.xml", "drawable-hdpi/bar.png");
     return new AndroidResources(
@@ -575,7 +599,7 @@
         .parse(
             AndroidDataContext.forNative(ruleContext),
             getManifest(),
-            aaptVersion,
+            AndroidAaptVersion.chooseTargetAaptVersion(ruleContext),
             dataBindingContext);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/ResourceTestBase.java b/src/test/java/com/google/devtools/build/lib/rules/android/ResourceTestBase.java
index c74f52c..31ec55b 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/ResourceTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/ResourceTestBase.java
@@ -57,7 +57,6 @@
           "static_aapt_tool",
           "aapt.static",
           "aapt",
-          "static_aapt2_tool",
           "aapt2",
           "empty.sh",
           "android_blaze.jar",
@@ -183,11 +182,17 @@
   public FileSystem fileSystem;
   public ArtifactRoot root;
 
+  @Override
   @Before
   public void setup() throws Exception {
     errorConsumer = new FakeRuleErrorConsumer();
     fileSystem = new InMemoryFileSystem();
     root = ArtifactRoot.asSourceRoot(Root.fromPath(fileSystem.getPath("/")));
+
+    // Force tests to use aapt to unblock global aapt2 migration, until these
+    // tests are migrated to use aapt2.
+    // TODO(jingwen): https://github.com/bazelbuild/bazel/issues/6907
+    useConfiguration("--android_aapt=aapt");
   }
 
   @After
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
index c39d3c2..143749e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
@@ -349,7 +349,10 @@
         "java/a/BUILD",
         "cc_library(name = 'lib', srcs = ['lib.cc'])",
         "android_binary(name='a', manifest = 'AndroidManifest.xml', deps = [':lib'])");
-    useConfiguration("--fat_apk_cpu=k8,armeabi-v7a");
+    // Force tests to use aapt to unblock global aapt2 migration, until these
+    // tests are migrated to use aapt2.
+    // TODO(jingwen): https://github.com/bazelbuild/bazel/issues/6907
+    useConfiguration("--fat_apk_cpu=k8,armeabi-v7a", "--android_aapt=aapt");
     List<ConfiguredTarget> deps = getConfiguredDeps("//java/a:a", "deps");
     assertThat(deps).hasSize(2);
     ConfiguredTarget dep1 = deps.get(0);
diff --git a/src/test/shell/bazel/android/aidl_integration_test.sh b/src/test/shell/bazel/android/aidl_integration_test.sh
index e4f6052..9e7482a 100755
--- a/src/test/shell/bazel/android/aidl_integration_test.sh
+++ b/src/test/shell/bazel/android/aidl_integration_test.sh
@@ -42,7 +42,7 @@
 )
 EOF
   cat > java/com/example/AndroidManifest.xml <<EOF
-<manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.example' />
+<manifest package="com.example"/>
 EOF
   cat > java/com/example/ILib.aidl <<EOF
 package com.example;
diff --git a/src/test/shell/bazel/android/proguard_integration_test.sh b/src/test/shell/bazel/android/proguard_integration_test.sh
index 081c7f2..8c6ee8a 100755
--- a/src/test/shell/bazel/android/proguard_integration_test.sh
+++ b/src/test/shell/bazel/android/proguard_integration_test.sh
@@ -52,7 +52,7 @@
 )
 EOF
   cat > java/com/bin/AndroidManifest.xml <<EOF
-<manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.bin' />
+<manifest package='com.bin' />
 EOF
   cat > java/com/bin/Bin.java <<EOF
 package com.bin;