From ae6d79336e4b5428b34b1b3c21d6886c17a04887 Mon Sep 17 00:00:00 2001 From: Mikhail Novoseltsev <51940183+Sameri11@users.noreply.github.com> Date: Wed, 16 Oct 2024 20:56:31 +0500 Subject: [PATCH] [tool] fix android studio preview's version parsing (#156293) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR willing to fix issue when `flutter doctor` validator can't determine version of Android Studio EAP. These are before/after outputs of `flutter doctor -v` showcasing change in behaviour of validator. Each output has 3 `Android Studio` sections, 1 for stable and 2 for different EAP versions.
before, (stable, 3.24.3), 2 issues related to versions of Android Studio ```console [✓] Flutter (Channel stable, 3.24.3, on macOS 14.7 23H124 darwin-arm64, locale en-RU) • Flutter version 3.24.3 on channel stable at /Users/samer/fvm/versions/stable • Upstream repository https://github.com/flutter/flutter.git • Framework revision 2663184aa7 (4 weeks ago), 2024-09-11 16:27:48 -0500 • Engine revision 36335019a8 • Dart version 3.5.3 • DevTools version 2.37.3 [✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) • Android SDK at /Users/samer/Library/Android/sdk • Platform android-35, build-tools 34.0.0 • Java binary at: /Users/samer/Library/Java/JavaVirtualMachines/jbr-17.0.7/Contents/Home/bin/java • Java version OpenJDK Runtime Environment JBR-17.0.7+7-964.1-nomod (build 17.0.7+7-b964.1) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 16.0) • Xcode at /Applications/Xcode-16.0.app/Contents/Developer • Build 16A242d • CocoaPods version 1.15.2 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 2024.1) • Android Studio at /Users/samer/Applications/Android Studio Koala Feature Drop 2024.1.2.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.11+0-17.0.11b1207.24-11852314) [!] Android Studio (version unknown) • Android Studio at /Users/samer/Applications/Android Studio Ladybug Feature Drop 2024.2.2 Canary 2.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart ✗ Unable to determine Android Studio version. • Java version OpenJDK Runtime Environment (build 21.0.3+-79915917-b509.11) [!] Android Studio (version unknown) • Android Studio at /Users/samer/Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart ✗ Unable to determine Android Studio version. • Java version OpenJDK Runtime Environment (build 21.0.3+-79915917-b509.11) [✓] IntelliJ IDEA Ultimate Edition (version EAP IU-243.12818.47) • IntelliJ at /Users/samer/Applications/IntelliJ IDEA Ultimate.app • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart [✓] VS Code (version 1.94.0) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.98.0 [✓] Connected device (5 available) • sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 15 (API 35) (emulator) • iPhone (Михаил) (mobile) • 00008020-001254DA1E39002E • ios • iOS 17.6.1 21G93 • macOS (desktop) • macos • darwin-arm64 • macOS 14.7 23H124 darwin-arm64 • Mac Designed for iPad (desktop) • mac-designed-for-ipad • darwin • macOS 14.7 23H124 darwin-arm64 • Chrome (web) • chrome • web-javascript • Google Chrome 129.0.6668.90 ! Error: Browsing on the local area network for Михаил Новосельцев’s iPad. Ensure the device is unlocked and attached with a cable or associated with the same local area network as this Mac. The device must be opted into Developer Mode to connect wirelessly. (code -27) [✓] Network resources • All expected network resources are available. ! Doctor found issues in 2 categories. ```
after, no issues regarding Android Studio ```console [!] Flutter (Channel [user-branch], 3.26.0-1.0.pre.383, on macOS 14.7 23H124 darwin-arm64, locale en-RU) ! Flutter version 3.26.0-1.0.pre.383 on channel [user-branch] at /Users/samer/projects/flutter Currently on an unknown channel. Run `flutter channel` to switch to an official channel. If that doesn't fix the issue, reinstall Flutter by following instructions at https://flutter.dev/setup. • Upstream repository git@github.com:Sameri11/flutter.git • FLUTTER_GIT_URL = git@github.com:Sameri11/flutter.git • Framework revision 852508425d (20 minutes ago), 2024-10-07 21:22:45 +0500 • Engine revision 683a14c1f1 • Dart version 3.6.0 (build 3.6.0-326.0.dev) • DevTools version 2.40.0 • If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades. [✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) • Android SDK at /Users/samer/Library/Android/sdk • Platform android-35, build-tools 34.0.0 • Java binary at: /Users/samer/Library/Java/JavaVirtualMachines/jbr-17.0.7/Contents/Home/bin/java • Java version OpenJDK Runtime Environment JBR-17.0.7+7-964.1-nomod (build 17.0.7+7-b964.1) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 16.0) • Xcode at /Applications/Xcode-16.0.app/Contents/Developer • Build 16A242d • CocoaPods version 1.15.2 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 2024.1) • Android Studio at /Users/samer/Applications/Android Studio Koala Feature Drop 2024.1.2.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.11+0-17.0.11b1207.24-11852314) [✓] Android Studio (version 2024.2.2) • Android Studio at /Users/samer/Applications/Android Studio Ladybug Feature Drop 2024.2.2 Canary 2.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 21.0.3+-79915917-b509.11) [✓] Android Studio (version 2024.2.1) • Android Studio at /Users/samer/Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 21.0.3+-79915917-b509.11) [✓] IntelliJ IDEA Ultimate Edition (version EAP IU-243.12818.47) • IntelliJ at /Users/samer/Applications/IntelliJ IDEA Ultimate.app • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart [✓] VS Code (version 1.94.0) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.98.0 [✓] Connected device (5 available) • sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 15 (API 35) (emulator) • iPhone (Михаил) (mobile) • 00008020-001254DA1E39002E • ios • iOS 17.6.1 21G93 • macOS (desktop) • macos • darwin-arm64 • macOS 14.7 23H124 darwin-arm64 • Mac Designed for iPad (desktop) • mac-designed-for-ipad • darwin • macOS 14.7 23H124 darwin-arm64 • Chrome (web) • chrome • web-javascript • Google Chrome 129.0.6668.90 ! Error: Browsing on the local area network for Михаил Новосельцев’s iPad. Ensure the device is unlocked and attached with a cable or associated with the same local area network as this Mac. The device must be opted into Developer Mode to connect wirelessly. (code -27) [✓] Network resources • All expected network resources are available. ! Doctor found issues in 1 category. ```
Logic behind these changes explained in https://github.com/flutter/flutter/issues/121925#issuecomment-2352826925 fixes #121925 **Tests**: updated existing tests by adding version checking, but I don't mind writing new ones if necessary – please tell me if so. --- .../lib/src/android/android_studio.dart | 31 ++++++++++++++++++- .../android/android_studio_test.dart | 5 +++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart index c22ddaad641..b93d8913d94 100644 --- a/packages/flutter_tools/lib/src/android/android_studio.dart +++ b/packages/flutter_tools/lib/src/android/android_studio.dart @@ -56,7 +56,7 @@ class AndroidStudio { Version? version; if (versionString != null) { - version = Version.parse(versionString); + version = _parseVersion(versionString); } String? pathsSelectorValue; @@ -565,6 +565,35 @@ the configured path by running this command: flutter config --android-studio-dir } } + static Version? _parseVersion(String text) { + // Matches the version string for Preview builds on macOS. + // Example match: EAP AI-242.21829.142.2422.12358220 + // We try to capture "2422" here, which can be translated to a + // more human-friendly "24.2.2". + final RegExp eapVersionPattern = RegExp(r'EAP\s+[A-Z]{2}-\d+\.\d+\.\d+\.(\d+)\.\d+'); + final Match? eapVersionMatch = eapVersionPattern.firstMatch(text); + + if (eapVersionMatch == null) { + return Version.parse(text); + } + + final String? rawVersionMatch = eapVersionMatch.group(1); + + // length of 4 is because that how version is encrypted: first two digits + // for year (part of major version), third for minor version, fourth for patch. + if (rawVersionMatch == null || rawVersionMatch.length != 4) { + return null; + } + + final int? major = int.tryParse('20${rawVersionMatch[0]}${rawVersionMatch[1]}'); + final int? minor = int.tryParse(rawVersionMatch[2]); + final int? patch = int.tryParse(rawVersionMatch[3]); + if (major == null || minor == null || patch == null) { + return null; + } + return Version(major, minor, patch); + } + @override String toString() => 'Android Studio ($version)'; } 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 b703dbf0c03..8a8a6b823e2 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 @@ -131,6 +131,7 @@ void main() { fileSystem.directory(studioInApplicationPlistFolder).parent.path, )!; + expect(studio.version, equals(Version(4, 1, null))); expect(studio, isNotNull); expect(studio.pluginsPath, equals(fileSystem.path.join( homeMac, @@ -173,6 +174,7 @@ void main() { fileSystem.directory(studioInApplicationPlistFolder).parent.path, )!; + expect(studio.version, equals(Version(2020, 3, null))); expect(studio, isNotNull); expect(studio.pluginsPath, equals(fileSystem.path.join( homeMac, @@ -215,6 +217,7 @@ void main() { fileSystem.directory(studioInApplicationPlistFolder).parent.path, )!; + expect(studio.version, equals(Version(3, 3, null))); expect(studio, isNotNull); expect(studio.pluginsPath, equals(fileSystem.path.join( homeMac, @@ -256,11 +259,13 @@ void main() { fileSystem.directory(studioInApplicationPlistFolder).parent.path, )!; + expect(studio.version, equals(Version(2022, 3, 1))); expect(studio, isNotNull); expect(studio.pluginsPath, equals(fileSystem.path.join( homeMac, 'Library', 'Application Support', + 'Google', 'AndroidStudioPreview2022.3', ))); expect(studio.validationMessages, ['Java version 123']);