diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart index 446bed76e9a..5f32f880723 100644 --- a/packages/flutter_tools/lib/src/android/android_studio.dart +++ b/packages/flutter_tools/lib/src/android/android_studio.dart @@ -5,6 +5,7 @@ import '../base/common.dart'; import '../base/context.dart'; import '../base/file_system.dart'; +import '../base/io.dart'; import '../base/os.dart'; import '../base/platform.dart'; import '../base/process_manager.dart'; @@ -45,6 +46,8 @@ String get gradleExecutable { return androidStudio?.gradleExecutable ?? os.which('gradle')?.path; } +String get javaPath => androidStudio?.javaPath; + class AndroidStudio implements Comparable { AndroidStudio(this.directory, {Version version, this.configured}) : this.version = version ?? Version.unknown { @@ -56,6 +59,7 @@ class AndroidStudio implements Comparable { final String configured; String _gradlePath; + String _javaPath; bool _isValid = false; List _validationMessages = []; @@ -99,6 +103,8 @@ class AndroidStudio implements Comparable { String get gradleExecutable => fs.path .join(_gradlePath, 'bin', platform.isWindows ? 'gradle.bat' : 'gradle'); + String get javaPath => _javaPath; + bool get isValid => _isValid; List get validationMessages => _validationMessages; @@ -272,6 +278,19 @@ class AndroidStudio implements Comparable { _validationMessages.add( 'Gradle version $latestGradleVersion at $_gradlePath is not executable.'); } + + final String javaPath = platform.isMacOS ? + fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') : + fs.path.join(directory, 'jre'); + final ProcessResult result = processManager.runSync([fs.path.join(javaPath, 'bin', 'java'), '-version']); + if (result.exitCode == 0) { + final List versionLines = result.stderr.split('\n'); + final String javaVersion = versionLines.length >= 2 ? versionLines[1] : versionLines[0]; + _validationMessages.add('Java version: $javaVersion'); + _javaPath = javaPath; + } else { + _validationMessages.add('Unable to find bundled Java version.'); + } } @override diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart index ba332f463c1..8ac011d1ffd 100644 --- a/packages/flutter_tools/lib/src/android/android_workflow.dart +++ b/packages/flutter_tools/lib/src/android/android_workflow.dart @@ -13,6 +13,7 @@ import '../base/process_manager.dart'; import '../doctor.dart'; import '../globals.dart'; import 'android_sdk.dart'; +import 'android_studio.dart' as android_studio; class AndroidWorkflow extends DoctorValidator implements Workflow { AndroidWorkflow() : super('Android toolchain - develop for Android devices'); @@ -30,9 +31,12 @@ class AndroidWorkflow extends DoctorValidator implements Workflow { static const String _kJavaExecutable = 'java'; static const String _kJdkDownload = 'https://www.oracle.com/technetwork/java/javase/downloads/'; - /// First sniff JAVA_HOME, then fallback to PATH. + /// First try Java bundled with Android Studio, then sniff JAVA_HOME, then fallback to PATH. String _findJavaBinary() { + if (android_studio.javaPath != null) + return fs.path.join(android_studio.javaPath, 'bin', 'java'); + final String javaHomeEnv = platform.environment[_kJavaHomeEnvironmentVariable]; if (javaHomeEnv != null) { // Trust JAVA_HOME. diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 48e3e8d1d7a..4c817743e2c 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -76,6 +76,7 @@ String get gradleAppOutDirV2 { [gradle, 'app:properties'], workingDirectory: 'android', hideStdout: true, + environment: _gradleEnv, ); String buildDir = properties .split('\n') @@ -179,7 +180,8 @@ Future buildGradleProjectV1(String gradle) async { final int exitcode = await runCommandAndStreamOutput( [fs.file(gradle).absolute.path, 'build'], workingDirectory: 'android', - allowReentrantFlutter: true + allowReentrantFlutter: true, + environment: _gradleEnv, ); status.stop(); @@ -214,7 +216,8 @@ Future buildGradleProjectV2(String gradle, String buildModeName, String ta final int exitcode = await runCommandAndStreamOutput( command, workingDirectory: 'android', - allowReentrantFlutter: true + allowReentrantFlutter: true, + environment: _gradleEnv, ); status.stop(); @@ -233,3 +236,12 @@ Future buildGradleProjectV2(String gradle, String buildModeName, String ta printStatus('Built ${apkFile.path} (${getSizeAsMB(apkFile.lengthSync())}).'); } + +Map get _gradleEnv { + final Map env = new Map.from(platform.environment); + if (javaPath != null) { + // Use java bundled with Android Studio. + env['JAVA_HOME'] = javaPath; + } + return env; +}