diff --git a/tools/android_lint/bin/main.dart b/tools/android_lint/bin/main.dart index f64b5a9e9e7..f9a9e4359dc 100644 --- a/tools/android_lint/bin/main.dart +++ b/tools/android_lint/bin/main.dart @@ -102,7 +102,15 @@ Future runLint(ArgParser argParser, ArgResults argResults) async { if (argResults['html']) { lintArgs.addAll(['--html', argResults['out']]); } - final Process lintProcess = await processManager.start(lintArgs); + final String javaHome = await getJavaHome(); + final Process lintProcess = await processManager.start( + lintArgs, + environment: javaHome != null + ? { + 'JAVA_HOME': javaHome, + } + : null, + ); lintProcess.stdout.pipe(stdout); lintProcess.stderr.pipe(stderr); return await lintProcess.exitCode; @@ -154,11 +162,36 @@ ArgParser setupOptions() { return argParser; } +/// On macOS, we can try to find Java 1.8. +/// +/// Otherwise, default to whatever JAVA_HOME is already. +Future getJavaHome() async { + if (Platform.isMacOS) { + final ProcessResult result = await processManager.run( + ['/usr/libexec/java_home', '-v', '1.8', '-F'], + ); + if (result.exitCode == 0) { + return result.stdout.trim(); + } + } + return Platform.environment['JAVA_HOME']; +} + /// Checks that `java` points to Java 1.8. /// /// The SDK lint tool may not work with Java > 1.8. Future checkJava1_8() async { print('Checking Java version...'); + + if (Platform.isMacOS) { + final ProcessResult result = await processManager.run( + ['/usr/libexec/java_home', '-v', '1.8', '-F'], + ); + if (result.exitCode != 0) { + print('Java 1.8 not available - the linter may not work properly.'); + } + return; + } final ProcessResult javaResult = await processManager.run( ['java', '-version'], ); @@ -167,8 +200,9 @@ Future checkJava1_8() async { 'Ensure Java is installed and available on your path.'); print(javaResult.stderr); } - final String javaVersionStdout = javaResult.stdout; - if (javaVersionStdout.contains('"1.8')) { + // `java -version` writes to stderr. + final String javaVersionStdout = javaResult.stderr; + if (!javaVersionStdout.contains('"1.8')) { print('The Android SDK tools may not work properly with your Java version. ' 'If this process fails, please retry using Java 1.8.'); }