Commit 41edc1ac authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Use Java bundled with Android Studio for gradle (#8965)

* Use Java bundled with Android Studio for gradle

* review comments
parent d356b2d7
......@@ -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> {
AndroidStudio(this.directory, {Version version, this.configured})
: this.version = version ?? Version.unknown {
......@@ -56,6 +59,7 @@ class AndroidStudio implements Comparable<AndroidStudio> {
final String configured;
String _gradlePath;
String _javaPath;
bool _isValid = false;
List<String> _validationMessages = <String>[];
......@@ -99,6 +103,8 @@ class AndroidStudio implements Comparable<AndroidStudio> {
String get gradleExecutable => fs.path
.join(_gradlePath, 'bin', platform.isWindows ? 'gradle.bat' : 'gradle');
String get javaPath => _javaPath;
bool get isValid => _isValid;
List<String> get validationMessages => _validationMessages;
......@@ -272,6 +278,19 @@ class AndroidStudio implements Comparable<AndroidStudio> {
_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(<String>[fs.path.join(javaPath, 'bin', 'java'), '-version']);
if (result.exitCode == 0) {
final List<String> 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
......
......@@ -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.
......
......@@ -76,6 +76,7 @@ String get gradleAppOutDirV2 {
<String>[gradle, 'app:properties'],
workingDirectory: 'android',
hideStdout: true,
environment: _gradleEnv,
);
String buildDir = properties
.split('\n')
......@@ -179,7 +180,8 @@ Future<Null> buildGradleProjectV1(String gradle) async {
final int exitcode = await runCommandAndStreamOutput(
<String>[fs.file(gradle).absolute.path, 'build'],
workingDirectory: 'android',
allowReentrantFlutter: true
allowReentrantFlutter: true,
environment: _gradleEnv,
);
status.stop();
......@@ -214,7 +216,8 @@ Future<Null> 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<Null> buildGradleProjectV2(String gradle, String buildModeName, String ta
printStatus('Built ${apkFile.path} (${getSizeAsMB(apkFile.lengthSync())}).');
}
Map<String, String> get _gradleEnv {
final Map<String, String> env = new Map<String, String>.from(platform.environment);
if (javaPath != null) {
// Use java bundled with Android Studio.
env['JAVA_HOME'] = javaPath;
}
return env;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment