Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-land "Fix unable to find bundled Java version" #120107

Merged
merged 1 commit into from
Feb 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,5 @@ Jingyi Chen <jingyichen@link.cuhk.edu.cn>
Junhua Lin <1075209054@qq.com>
Tomasz Gucio <tgucio@gmail.com>
Jason C.H <ctrysbita@outlook.com>
Hubert Jóźwiak <hjozwiakdx@gmail.com>
Hubert Jóźwiak <hjozwiakdx@gmail.com>
Eli Albert <crasowas@gmail.com>
21 changes: 16 additions & 5 deletions packages/flutter_tools/lib/src/android/android_studio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -441,11 +441,22 @@ class AndroidStudio implements Comparable<AndroidStudio> {
return;
}

final String javaPath = globals.platform.isMacOS ?
version != null && version.major < 2020 ?
globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') :
globals.fs.path.join(directory, 'jre', 'Contents', 'Home') :
globals.fs.path.join(directory, 'jre');
final String javaPath;
if (globals.platform.isMacOS) {
if (version != null && version.major < 2020) {
javaPath = globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home');
} else if (version != null && version.major == 2022) {
javaPath = globals.fs.path.join(directory, 'jbr', 'Contents', 'Home');
} else {
javaPath = globals.fs.path.join(directory, 'jre', 'Contents', 'Home');
}
} else {
if (version != null && version.major == 2022) {
javaPath = globals.fs.path.join(directory, 'jbr');
} else {
javaPath = globals.fs.path.join(directory, 'jre');
}
}
final String javaExecutable = globals.fs.path.join(javaPath, 'bin', 'java');
if (!globals.processManager.canRun(javaExecutable)) {
_validationMessages.add('Unable to find bundled Java version.');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,19 @@ const Map<String, Object> macStudioInfoPlist2020_3 = <String, Object>{
},
};

const Map<String, Object> macStudioInfoPlist2022_1 = <String, Object>{
'CFBundleGetInfoString': 'Android Studio 2022.1, build AI-221.6008.13.2211.9477386. Copyright JetBrains s.r.o., (c) 2000-2023',
'CFBundleShortVersionString': '2022.1',
'CFBundleVersion': 'AI-221.6008.13.2211.9477386',
'JVMOptions': <String, Object>{
'Properties': <String, Object>{
'idea.vendor.name' : 'Google',
'idea.paths.selector': 'AndroidStudio2022.1',
'idea.platform.prefix': 'AndroidStudio',
},
},
};

const Map<String, Object> macStudioInfoPlistEAP = <String, Object>{
'CFBundleGetInfoString': 'Android Studio EAP AI-212.5712.43.2112.8233820, build AI-212.5712.43.2112.8233820. Copyright JetBrains s.r.o., (c) 2000-2022',
'CFBundleShortVersionString': 'EAP AI-212.5712.43.2112.8233820',
Expand Down Expand Up @@ -486,6 +499,84 @@ void main() {
Platform: () => platform,
PlistParser: () => plistUtils,
});

testUsingContext('Can find Android Studio 2020.3 bundled Java version on Mac', () {
final String studioInApplicationPlistFolder = globals.fs.path.join(
'/',
'Application',
'Android Studio.app',
'Contents',
);
globals.fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);

final String plistFilePath = globals.fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
plistUtils.fileContents[plistFilePath] = macStudioInfoPlist2020_3;
processManager.addCommand(FakeCommand(
command: <String>[
globals.fs.path.join(studioInApplicationPlistFolder, 'jre', 'Contents', 'Home', 'bin', 'java'),
'-version',
],
stderr: '123',
)
);
final AndroidStudio studio = AndroidStudio.fromMacOSBundle(
globals.fs.directory(studioInApplicationPlistFolder).parent.path,
)!;

expect(studio.javaPath, equals(globals.fs.path.join(
studioInApplicationPlistFolder,
'jre',
'Contents',
'Home',
)));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
ProcessManager: () => processManager,
// Custom home paths are not supported on macOS nor Windows yet,
// so we force the platform to fake Linux here.
Platform: () => platform,
PlistParser: () => plistUtils,
});

testUsingContext('Can find Android Studio 2022.1 bundled Java version on Mac', () {
final String studioInApplicationPlistFolder = globals.fs.path.join(
'/',
'Application',
'Android Studio.app',
'Contents',
);
globals.fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);

final String plistFilePath = globals.fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
plistUtils.fileContents[plistFilePath] = macStudioInfoPlist2022_1;
processManager.addCommand(FakeCommand(
command: <String>[
globals.fs.path.join(studioInApplicationPlistFolder, 'jbr', 'Contents', 'Home', 'bin', 'java'),
'-version',
],
stderr: '123',
)
);
final AndroidStudio studio = AndroidStudio.fromMacOSBundle(
globals.fs.directory(studioInApplicationPlistFolder).parent.path,
)!;

expect(studio.javaPath, equals(globals.fs.path.join(
studioInApplicationPlistFolder,
'jbr',
'Contents',
'Home',
)));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
ProcessManager: () => processManager,
// Custom home paths are not supported on macOS nor Windows yet,
// so we force the platform to fake Linux here.
Platform: () => platform,
PlistParser: () => plistUtils,
});
});

late FileSystem windowsFileSystem;
Expand Down Expand Up @@ -596,6 +687,38 @@ void main() {
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2020.3 bundled Java version on Windows', () {
windowsFileSystem.file(r'C:\Users\Dash\AppData\Local\Google\AndroidStudio2020.3\.home')
..createSync(recursive: true)
..writeAsStringSync(r'C:\Program Files\AndroidStudio');
windowsFileSystem.directory(r'C:\Program Files\AndroidStudio')
.createSync(recursive: true);

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals(r'C:\Program Files\AndroidStudio\jre'));
}, overrides: <Type, Generator>{
Platform: () => windowsPlatform,
FileSystem: () => windowsFileSystem,
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2022.1 bundled Java version on Windows', () {
windowsFileSystem.file(r'C:\Users\Dash\AppData\Local\Google\AndroidStudio2022.1\.home')
..createSync(recursive: true)
..writeAsStringSync(r'C:\Program Files\AndroidStudio');
windowsFileSystem.directory(r'C:\Program Files\AndroidStudio')
.createSync(recursive: true);

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals(r'C:\Program Files\AndroidStudio\jbr'));
}, overrides: <Type, Generator>{
Platform: () => windowsPlatform,
FileSystem: () => windowsFileSystem,
ProcessManager: () => FakeProcessManager.any(),
});

group('Installation detection on Linux', () {
late FileSystemUtils fsUtils;

Expand Down Expand Up @@ -686,6 +809,47 @@ void main() {
Platform: () => linuxPlatform,
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2020.3 bundled Java version on Linux', () {
const String studioHomeFilePath = '$homeLinux/.cache/Google/AndroidStudio2020.3/.home';
const String studioInstallPath = '$homeLinux/AndroidStudio';

globals.fs.file(studioHomeFilePath)
..createSync(recursive: true)
..writeAsStringSync(studioInstallPath);

globals.fs.directory(studioInstallPath).createSync();

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals('$studioInstallPath/jre'));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
Platform: () => linuxPlatform,
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2022.1 bundled Java version on Linux', () {
const String studioHomeFilePath =
'$homeLinux/.cache/Google/AndroidStudio2022.1/.home';
const String studioInstallPath = '$homeLinux/AndroidStudio';

globals.fs.file(studioHomeFilePath)
..createSync(recursive: true)
..writeAsStringSync(studioInstallPath);

globals.fs.directory(studioInstallPath).createSync();

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals('$studioInstallPath/jbr'));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
Platform: () => linuxPlatform,
ProcessManager: () => FakeProcessManager.any(),
});
});
}

Expand Down