diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart index c15cad0a19e..485c77da2b9 100644 --- a/packages/flutter_tools/lib/src/android/android_studio.dart +++ b/packages/flutter_tools/lib/src/android/android_studio.dart @@ -37,7 +37,7 @@ class AndroidStudio implements Comparable { this.studioAppName = 'AndroidStudio', this.presetPluginsPath, }) : version = version ?? Version.unknown { - _init(); + _init(version: version); } factory AndroidStudio.fromMacOSBundle(String bundlePath) { @@ -435,7 +435,7 @@ class AndroidStudio implements Comparable { return keyMatcher.stringMatch(plistValue)?.split('=').last.trim().replaceAll('"', ''); } - void _init() { + void _init({Version? version}) { _isValid = false; _validationMessages.clear(); @@ -449,6 +449,8 @@ class AndroidStudio implements Comparable { } final String javaPath = globals.platform.isMacOS ? + version != null && version.major >= 2020 ? + globals.fs.path.join(directory, 'jre', 'Contents', 'Home') : globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') : globals.fs.path.join(directory, 'jre'); final String javaExecutable = globals.fs.path.join(javaPath, 'bin', 'java'); diff --git a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart index 7ccecee05a9..cadf6887560 100644 --- a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart @@ -45,6 +45,19 @@ const Map macStudioInfoPlist4_1 = { }, }; +const Map macStudioInfoPlist2020_3 = { + 'CFBundleGetInfoString': 'Android Studio 2020.3, build AI-203.7717.56.2031.7583922. Copyright JetBrains s.r.o., (c) 2000-2021', + 'CFBundleShortVersionString': '2020.3', + 'CFBundleVersion': 'AI-203.7717.56.2031.7583922', + 'JVMOptions': { + 'Properties': { + 'idea.vendor.name' : 'Google', + 'idea.paths.selector': 'AndroidStudio2020.3', + 'idea.platform.prefix': 'AndroidStudio', + }, + }, +}; + final Platform linuxPlatform = FakePlatform( operatingSystem: 'linux', environment: {'HOME': homeLinux}, @@ -144,6 +157,38 @@ void main() { Platform: () => platform, PlistParser: () => plistUtils, }); + testUsingContext('Can discover Android Studio >=2020.3 location 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; + final AndroidStudio studio = AndroidStudio.fromMacOSBundle( + globals.fs.directory(studioInApplicationPlistFolder)?.parent?.path, + ); + + expect(studio, isNotNull); + expect(studio.pluginsPath, equals(globals.fs.path.join( + homeMac, + 'Library', + 'Application Support', + 'Google', + 'AndroidStudio2020.3', + ))); + }, overrides: { + FileSystem: () => fileSystem, + FileSystemUtils: () => fsUtils, + ProcessManager: () => FakeProcessManager.any(), + // 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 discover Android Studio <4.1 location on Mac', () { final String studioInApplicationPlistFolder = globals.fs.path.join(