Move Android doctor SDK check to 29 and Cirrus images to 30 (#63517)

diff --git a/.cirrus.yml b/.cirrus.yml
index 4aea662..fba45ba 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -261,7 +261,7 @@
 # WINDOWS SHARDS
 task:
   windows_container:
-    image: cirrusci/android-sdk:28-windowsservercore-2019
+    image: cirrusci/android-sdk:30-windowsservercore-2019
     os_version: 2019
     cpu: $CPU
     memory: $MEMORY
diff --git a/dev/ci/docker_linux/Dockerfile b/dev/ci/docker_linux/Dockerfile
index 9cfd321..06b3313 100644
--- a/dev/ci/docker_linux/Dockerfile
+++ b/dev/ci/docker_linux/Dockerfile
@@ -10,7 +10,7 @@
 # for performing pushes to production, and so this image is quite a bit larger
 # than strictly needed for just building Flutter apps.
 
-# Last manual update 2020-08-05 (changing this comment will re-build image)
+# Last manual update 2020-08-11 (changing this comment will re-build image)
 
 # Note: updating past stretch (Debian 9) will bump Java past version 8,
 # which will break the Android SDK.
@@ -80,7 +80,7 @@
 # (it prints install progress WAY too often).
 RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "tools" > /dev/null
 RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "build-tools;28.0.3" > /dev/null
-RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "platforms;android-28" > /dev/null
+RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "platforms;android-30" > /dev/null
 RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "platform-tools" > /dev/null
 RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "extras;android;m2repository" > /dev/null
 RUN yes "y" | "${ANDROID_TOOLS_ROOT}/tools/bin/sdkmanager" "extras;google;m2repository" > /dev/null
diff --git a/packages/flutter_tools/ide_templates/intellij/dev/manual_tests/android.iml.copy.tmpl b/packages/flutter_tools/ide_templates/intellij/dev/manual_tests/android.iml.copy.tmpl
index 462b903..79f6223 100644
--- a/packages/flutter_tools/ide_templates/intellij/dev/manual_tests/android.iml.copy.tmpl
+++ b/packages/flutter_tools/ide_templates/intellij/dev/manual_tests/android.iml.copy.tmpl
@@ -5,7 +5,7 @@
     <content url="file://$MODULE_DIR$/android">
       <sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Flutter for Android" level="project" />
   </component>
diff --git a/packages/flutter_tools/ide_templates/intellij/examples/flutter_gallery/android.iml.copy.tmpl b/packages/flutter_tools/ide_templates/intellij/examples/flutter_gallery/android.iml.copy.tmpl
index 462b903..79f6223 100644
--- a/packages/flutter_tools/ide_templates/intellij/examples/flutter_gallery/android.iml.copy.tmpl
+++ b/packages/flutter_tools/ide_templates/intellij/examples/flutter_gallery/android.iml.copy.tmpl
@@ -5,7 +5,7 @@
     <content url="file://$MODULE_DIR$/android">
       <sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Flutter for Android" level="project" />
   </component>
diff --git a/packages/flutter_tools/ide_templates/intellij/examples/hello_world/android.iml.copy.tmpl b/packages/flutter_tools/ide_templates/intellij/examples/hello_world/android.iml.copy.tmpl
index 462b903..79f6223 100644
--- a/packages/flutter_tools/ide_templates/intellij/examples/hello_world/android.iml.copy.tmpl
+++ b/packages/flutter_tools/ide_templates/intellij/examples/hello_world/android.iml.copy.tmpl
@@ -5,7 +5,7 @@
     <content url="file://$MODULE_DIR$/android">
       <sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Flutter for Android" level="project" />
   </component>
diff --git a/packages/flutter_tools/ide_templates/intellij/examples/platform_channel/android.iml.copy.tmpl b/packages/flutter_tools/ide_templates/intellij/examples/platform_channel/android.iml.copy.tmpl
index 462b903..79f6223 100644
--- a/packages/flutter_tools/ide_templates/intellij/examples/platform_channel/android.iml.copy.tmpl
+++ b/packages/flutter_tools/ide_templates/intellij/examples/platform_channel/android.iml.copy.tmpl
@@ -5,7 +5,7 @@
     <content url="file://$MODULE_DIR$/android">
       <sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Flutter for Android" level="project" />
   </component>
diff --git a/packages/flutter_tools/ide_templates/intellij/examples/platform_view/android.iml.copy.tmpl b/packages/flutter_tools/ide_templates/intellij/examples/platform_view/android.iml.copy.tmpl
index 1c0f432..5f07b2c 100644
--- a/packages/flutter_tools/ide_templates/intellij/examples/platform_view/android.iml.copy.tmpl
+++ b/packages/flutter_tools/ide_templates/intellij/examples/platform_view/android.iml.copy.tmpl
@@ -19,7 +19,7 @@
       <sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/android/gen" isTestSource="false" generated="true" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Flutter for Android" level="project" />
   </component>
diff --git a/packages/flutter_tools/ide_templates/intellij/examples/stocks/android.iml.copy.tmpl b/packages/flutter_tools/ide_templates/intellij/examples/stocks/android.iml.copy.tmpl
index 462b903..79f6223 100644
--- a/packages/flutter_tools/ide_templates/intellij/examples/stocks/android.iml.copy.tmpl
+++ b/packages/flutter_tools/ide_templates/intellij/examples/stocks/android.iml.copy.tmpl
@@ -5,7 +5,7 @@
     <content url="file://$MODULE_DIR$/android">
       <sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Flutter for Android" level="project" />
   </component>
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index a48801a..c22cae8 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -22,9 +22,6 @@
 final RegExp _numberedAndroidPlatformRe = RegExp(r'^android-([0-9]+)$');
 final RegExp _sdkVersionRe = RegExp(r'^ro.build.version.sdk=([0-9]+)$');
 
-/// The minimum Android SDK version we support.
-const int minimumAndroidSdkVersion = 25;
-
 /// Locate ADB. Prefer to use one from an Android SDK, if we can locate that.
 /// This should be used over accessing androidSdk.adbPath directly because it
 /// will work for those users who have Android Platform Tools installed but
diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart
index 5c2e1af..4b1cf53 100644
--- a/packages/flutter_tools/lib/src/android/android_workflow.dart
+++ b/packages/flutter_tools/lib/src/android/android_workflow.dart
@@ -25,7 +25,7 @@
 import 'android_sdk.dart';
 import 'android_studio.dart';
 
-const int kAndroidSdkMinVersion = 28;
+const int kAndroidSdkMinVersion = 29;
 final Version kAndroidJavaMinVersion = Version(1, 8, 0);
 final Version kAndroidSdkBuildToolsMinVersion = Version(28, 0, 3);
 
@@ -178,7 +178,7 @@
 
     String sdkVersionText;
     if (_androidSdk.latestVersion != null) {
-      if (_androidSdk.latestVersion.sdkLevel < 28 || _androidSdk.latestVersion.buildToolsVersion < kAndroidSdkBuildToolsMinVersion) {
+      if (_androidSdk.latestVersion.sdkLevel < kAndroidSdkMinVersion || _androidSdk.latestVersion.buildToolsVersion < kAndroidSdkBuildToolsMinVersion) {
         messages.add(ValidationMessage.error(
           _userMessages.androidSdkBuildToolsOutdated(
             _androidSdk.sdkManagerPath,
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 94ab4bc9..e81d3d4 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -9,7 +9,7 @@
 import 'package:yaml/yaml.dart';
 
 import '../android/android.dart' as android_common;
-import '../android/android_sdk.dart' as android_sdk;
+import '../android/android_workflow.dart';
 import '../android/gradle_utils.dart' as gradle;
 import '../base/common.dart';
 import '../base/context.dart';
@@ -764,7 +764,7 @@
       'description': projectDescription,
       'dartSdk': '$flutterRoot/bin/cache/dart-sdk',
       'androidMinApiLevel': android_common.minApiLevel,
-      'androidSdkVersion': android_sdk.minimumAndroidSdkVersion,
+      'androidSdkVersion': kAndroidSdkMinVersion,
       'withDriverTest': renderDriverTest,
       'pluginClass': pluginClass,
       'pluginClassSnakeCase': pluginClassSnakeCase,
diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
index b591015..7df4f1e 100755
--- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
@@ -2007,6 +2007,24 @@
     expect(env['flutter'].allows(Version(1, 19, 0)), false);
   });
 
+  testUsingContext('default app uses Android sdk 29', () async {
+    Cache.flutterRoot = '../..';
+    when(mockFlutterVersion.frameworkRevision).thenReturn(frameworkRevision);
+    when(mockFlutterVersion.channel).thenReturn(frameworkChannel);
+
+    final CreateCommand command = CreateCommand();
+    final CommandRunner<void> runner = createTestCommandRunner(command);
+
+    await runner.run(<String>['create', '--no-pub', projectDir.path]);
+
+    expect(globals.fs.isFileSync('${projectDir.path}/android/app/build.gradle'), true);
+
+    final String buildContent = await globals.fs.file(projectDir.path + '/android/app/build.gradle').readAsString();
+
+    expect(buildContent.contains('compileSdkVersion 29'), true);
+    expect(buildContent.contains('targetSdkVersion 29'), true);
+  });
+
 }
 
 Future<void> _createProject(
diff --git a/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart b/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
index 159b17b..6ea70c4 100644
--- a/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
@@ -219,7 +219,7 @@
     when(sdk.platformToolsAvailable).thenReturn(true);
 
     // Test with invalid SDK and build tools
-    when(mockSdkVersion.sdkLevel).thenReturn(26);
+    when(mockSdkVersion.sdkLevel).thenReturn(28);
     when(mockSdkVersion.buildToolsVersion).thenReturn(Version(26, 0, 3));
     when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
     when(sdk.latestVersion).thenReturn(mockSdkVersion);
@@ -250,7 +250,7 @@
     );
 
     // Test with valid SDK but invalid build tools
-    when(mockSdkVersion.sdkLevel).thenReturn(28);
+    when(mockSdkVersion.sdkLevel).thenReturn(29);
     when(mockSdkVersion.buildToolsVersion).thenReturn(Version(28, 0, 2));
 
     validationResult = await androidValidator.validate();
@@ -279,7 +279,7 @@
     // Mock a pass through scenario to reach _checkJavaVersion()
     when(sdk.licensesAvailable).thenReturn(true);
     when(sdk.platformToolsAvailable).thenReturn(true);
-    when(mockSdkVersion.sdkLevel).thenReturn(28);
+    when(mockSdkVersion.sdkLevel).thenReturn(29);
     when(mockSdkVersion.buildToolsVersion).thenReturn(Version(28, 0, 3));
     when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
     when(sdk.latestVersion).thenReturn(mockSdkVersion);