anchor.diff:      return studios;
     }
   
  +  static String extractStudioPlistValueWithMatcher(String plistValue, RegExp keyMatcher) {
  +    if (plistValue == null || keyMatcher == null) {
  +      return null;
  +    }
  +    return keyMatcher?.stringMatch(plistValue)?.split('=')?.last?.trim()?.replaceAll('"', '');
  +  }
  +
     void _init() {
       _isValid = false;
       _validationMessages.clear();
  
positive.code: 
  final RegExp _dotHomeStudioVersionMatcher =
      RegExp(r'^\.(AndroidStudio[^\d]*)([\d.]+)');
  final RegExp _pathsSelectorMatcher =
      RegExp(r'"idea.paths.selector" = "AndroidStudio[^;]+"');
  
  String get javaPath => androidStudio?.javaPath;
  
  class AndroidStudio implements Comparable<AndroidStudio> {
    AndroidStudio(this.directory,
        {Version version, this.configured, this.studioAppName = 'AndroidStudio', this.pathsSelectorPath})
        : version = version ?? Version.unknown {
      _init();
    }
  
    factory AndroidStudio.fromMacOSBundle(String bundlePath) {
      final String studioPath = fs.path.join(bundlePath, 'Contents');
      final String plistFile = fs.path.join(studioPath, 'Info.plist');
      final String versionString = iosWorkflow.getPlistValueFromFile(
        plistFile,
        plist.kCFBundleShortVersionStringKey,
  
negative.code:   bool get isValid => _isValid;
  
    String get pluginsPath {
      if (presetPluginsPath != null) {
        return presetPluginsPath;
      }
      final int major = version?.major;
      final int minor = version?.minor;
      if (platform.isMacOS) {
        return fs.path.join(
            homeDirPath,
            'Library',
            'Application Support',
            'AndroidStudio$major.$minor');
      } else {
        return fs.path.join(homeDirPath,
            '.$studioAppName$major.$minor',
            'config',
            'plugins');
      }
    }
  
    List<String> get validationMessages => _validationMessages;
  