Fix unable to find bundled Java version (#119244)

This commit is contained in:
crasowas 2023-02-04 10:04:04 +08:00 committed by GitHub
parent 909dc30090
commit 57fd50f84e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 182 additions and 6 deletions

View file

@ -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>

View file

@ -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.');

View file

@ -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',
@ -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;
@ -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;
@ -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(),
});
});
}