handle android n in the android sdk
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index 0e605f4..6788135 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -11,16 +11,22 @@
import '../globals.dart';
// Android SDK layout:
-//
+
// $ANDROID_HOME/platform-tools/adb
+
// $ANDROID_HOME/build-tools/19.1.0/aapt, dx, zipalign
// $ANDROID_HOME/build-tools/22.0.1/aapt
// $ANDROID_HOME/build-tools/23.0.2/aapt
+// $ANDROID_HOME/build-tools/24.0.0-preview/aapt
+
// $ANDROID_HOME/platforms/android-22/android.jar
// $ANDROID_HOME/platforms/android-23/android.jar
+// $ANDROID_HOME/platforms/android-N/android.jar
-// TODO(devoncarew): We need a way to locate the Android SDK w/o using an environment variable.
-// Perhaps something like `flutter config --android-home=foo/bar`.
+// Special case some version names in the sdk.
+const Map<String, int> _namedVersionMap = const <String, int> {
+ 'android-N': 24
+};
/// Locate ADB. Prefer to use one from an Android SDK, if we can locate that.
String getAdbPath([AndroidSdk existingSdk]) {
@@ -47,8 +53,6 @@
AndroidSdkVersion _latestVersion;
static AndroidSdk locateAndroidSdk() {
- // TODO: Use explicit configuration information from a metadata file?
-
String androidHomeDir;
if (Platform.environment.containsKey('ANDROID_HOME')) {
androidHomeDir = Platform.environment['ANDROID_HOME'];
@@ -130,11 +134,11 @@
.toList();
}
- List<Version> buildToolsVersions = <Version>[]; // 19.1.0, 22.0.1, ...
+ List<Version> buildTools = <Version>[]; // 19.1.0, 22.0.1, ...
Directory buildToolsDir = new Directory(path.join(directory, 'build-tools'));
if (buildToolsDir.existsSync()) {
- buildToolsVersions = buildToolsDir
+ buildTools = buildToolsDir
.listSync()
.map((FileSystemEntity entity) {
try {
@@ -149,25 +153,32 @@
// Here we match up platforms with cooresponding build-tools. If we don't
// have a match, we don't return anything for that platform version. So if
- // the user only have 'android-22' and 'build-tools/19.0.0', we don't find
+ // the user only has 'android-22' and 'build-tools/19.0.0', we don't find
// an Android sdk.
- _sdkVersions = platforms.map((String platform) {
- int sdkVersion;
+ _sdkVersions = platforms.map((String platformName) {
+ int platformVersion;
try {
- sdkVersion = int.parse(platform.substring('android-'.length));
+ if (_namedVersionMap.containsKey(platformName))
+ platformVersion = _namedVersionMap[platformName];
+ else
+ platformVersion = int.parse(platformName.substring('android-'.length));
} catch (error) {
return null;
}
- Version buildToolsVersion = Version.primary(buildToolsVersions.where((Version version) {
- return version.major == sdkVersion;
+ Version buildToolsVersion = Version.primary(buildTools.where((Version version) {
+ return version.major == platformVersion;
}).toList());
if (buildToolsVersion == null)
return null;
- return new AndroidSdkVersion(this, platform, buildToolsVersion.toString());
+ return new AndroidSdkVersion(
+ this,
+ platformVersionName: platformName,
+ buildToolsVersionName: buildToolsVersion.toString()
+ );
}).where((AndroidSdkVersion version) => version != null).toList();
_sdkVersions.sort();
@@ -180,13 +191,21 @@
}
class AndroidSdkVersion implements Comparable<AndroidSdkVersion> {
- AndroidSdkVersion(this.sdk, this.androidVersion, this.buildToolsVersion);
+ AndroidSdkVersion(this.sdk, {
+ this.platformVersionName,
+ this.buildToolsVersionName
+ });
final AndroidSdk sdk;
- final String androidVersion;
- final String buildToolsVersion;
+ final String platformVersionName;
+ final String buildToolsVersionName;
- int get sdkLevel => int.parse(androidVersion.substring('android-'.length));
+ int get sdkLevel {
+ if (_namedVersionMap.containsKey(platformVersionName))
+ return _namedVersionMap[platformVersionName];
+ else
+ return int.parse(platformVersionName.substring('android-'.length));
+ }
String get androidJarPath => getPlatformsPath('android.jar');
@@ -205,20 +224,18 @@
}
String getPlatformsPath(String itemName) {
- return path.join(sdk.directory, 'platforms', androidVersion, itemName);
+ return path.join(sdk.directory, 'platforms', platformVersionName, itemName);
}
String getBuildToolsPath(String binaryName) {
- return path.join(sdk.directory, 'build-tools', buildToolsVersion, binaryName);
+ return path.join(sdk.directory, 'build-tools', buildToolsVersionName, binaryName);
}
@override
- int compareTo(AndroidSdkVersion other) {
- return sdkLevel - other.sdkLevel;
- }
+ int compareTo(AndroidSdkVersion other) => sdkLevel - other.sdkLevel;
@override
- String toString() => '[${sdk.directory}, SDK version $sdkLevel, build-tools $buildToolsVersion]';
+ String toString() => '[${sdk.directory}, SDK version $sdkLevel, build-tools $buildToolsVersionName]';
bool _exists(String path, { bool complain: false }) {
if (!FileSystemEntity.isFileSync(path)) {