From df465c7718b4b15055199c6bb5812108f172b6eb Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 7 Mar 2019 10:45:29 -0800 Subject: [PATCH] Fall-back to platform tools in Android SDK detection logic. (#28863) --- .../lib/src/android/android_sdk.dart | 8 ++++++ .../lib/src/application_package.dart | 3 +- .../lib/src/base/user_messages.dart | 2 ++ .../test/application_package_test.dart | 28 +++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart index 72545e0464..99bba9f3c4 100644 --- a/packages/flutter_tools/lib/src/android/android_sdk.dart +++ b/packages/flutter_tools/lib/src/android/android_sdk.dart @@ -365,6 +365,14 @@ class AndroidSdk { } static bool validSdkDirectory(String dir) { + return sdkDirectoryHasLicneses(dir) || sdkDirectoryHasPlatformTools(dir); + } + + static bool sdkDirectoryHasPlatformTools(String dir) { + return fs.isDirectorySync(fs.path.join(dir, 'platform-tools')); + } + + static bool sdkDirectoryHasLicneses(String dir) { return fs.isDirectorySync(fs.path.join(dir, 'licenses')); } diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart index 61a13bfaed..40067c2026 100644 --- a/packages/flutter_tools/lib/src/application_package.dart +++ b/packages/flutter_tools/lib/src/application_package.dart @@ -14,6 +14,7 @@ import 'base/context.dart'; import 'base/file_system.dart'; import 'base/os.dart' show os; import 'base/process.dart'; +import 'base/user_messages.dart'; import 'build_info.dart'; import 'globals.dart'; import 'ios/ios_workflow.dart'; @@ -94,7 +95,7 @@ class AndroidApk extends ApplicationPackage { factory AndroidApk.fromApk(File apk) { final String aaptPath = androidSdk?.latestVersion?.aaptPath; if (aaptPath == null) { - printError('Unable to locate the Android SDK; please run \'flutter doctor\'.'); + printError(userMessages.aaptNotFound); return null; } diff --git a/packages/flutter_tools/lib/src/base/user_messages.dart b/packages/flutter_tools/lib/src/base/user_messages.dart index b1778e489a..1c30cdd015 100644 --- a/packages/flutter_tools/lib/src/base/user_messages.dart +++ b/packages/flutter_tools/lib/src/base/user_messages.dart @@ -115,6 +115,8 @@ class UserMessages { String get androidStudioResetDir => 'Consider removing your android-studio-dir setting by running:\n' 'flutter config --android-studio-dir='; + String get aaptNotFound => + 'Could not locate aapt. Please ensure you have the Android buildtools installed.'; // Messages used in NoAndroidStudioValidator String androidStudioMissing(String location) => diff --git a/packages/flutter_tools/test/application_package_test.dart b/packages/flutter_tools/test/application_package_test.dart index 099e8a20f3..ff660ad3e1 100644 --- a/packages/flutter_tools/test/application_package_test.dart +++ b/packages/flutter_tools/test/application_package_test.dart @@ -65,6 +65,34 @@ void main() { ).path)..createSync(recursive: true); }); + testUsingContext('Licenses not available, platform and buildtools available, apk exists', () async { + const String aaptPath = 'aaptPath'; + final File apkFile = fs.file('app.apk'); + final AndroidSdkVersion sdkVersion = MockitoAndroidSdkVersion(); + when(sdkVersion.aaptPath).thenReturn(aaptPath); + when(sdk.latestVersion).thenReturn(sdkVersion); + when(sdk.platformToolsAvailable).thenReturn(true); + when(sdk.licensesAvailable).thenReturn(false); + when(mockProcessManager.runSync( + argThat(equals([ + aaptPath, + 'dump', + 'xmltree', + apkFile.path, + 'AndroidManifest.xml', + ])), + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + ), + ).thenReturn(ProcessResult(0, 0, _aaptDataWithDefaultEnabledAndMainLauncherActivity, null)); + + final ApplicationPackage applicationPackage = await ApplicationPackageFactory.instance.getPackageForPlatform( + TargetPlatform.android_arm, + applicationBinary: apkFile, + ); + expect(applicationPackage.name, 'app.apk'); + }, overrides: overrides); + testUsingContext('Licenses available, build tools not, apk exists', () async { when(sdk.latestVersion).thenReturn(null); final FlutterProject project = await FlutterProject.current();