updateMinSdk method

OperationResult updateMinSdk(
  1. int version
)

Updates the minSdkVersion in the Android Gradle build file.

This method automatically detects whether the project uses:

  • Groovy DSL (build.gradle)
  • Kotlin DSL (build.gradle.kts)

Supported Formats

Groovy DSL:

minSdkVersion 21
minSdkVersion flutter.minSdkVersion
minSdkVersion = 21

Kotlin DSL:

minSdk = 21
minSdk = flutter.minSdkVersion
minSdkVersion(21)

Parameters

  • version: The Android API level to set (e.g., 21, 23, 26). Must be between 1 and 99.

Returns

  • Success if the version was updated or was already set
  • Failure if the file was not found or could not be modified

Example

final manager = AndroidManager('/path/to/project');
final result = manager.updateMinSdk(23);

switch (result) {
  case Success(:final message):
    print(message); // "Successfully updated minSdkVersion to 23"
  case Failure(:final error):
    print('Error: $error');
}

Implementation

OperationResult updateMinSdk(int version) {
  // Locate the Gradle build file (Groovy DSL first, then Kotlin DSL)
  final gradleFile = File(_buildGradlePath);
  final gradleKtsFile = File(_buildGradleKtsPath);

  File targetFile;
  bool isKotlinDsl = false;

  if (gradleFile.existsSync()) {
    targetFile = gradleFile;
  } else if (gradleKtsFile.existsSync()) {
    targetFile = gradleKtsFile;
    isKotlinDsl = true;
  } else {
    return const Failure(
      'Could not find build.gradle or build.gradle.kts. '
      'Are you in a Flutter project root directory?',
    );
  }

  try {
    String content = targetFile.readAsStringSync();
    final originalContent = content;

    // Define regex patterns for different minSdkVersion formats
    final patterns = isKotlinDsl
        ? [
            RegExp(r'minSdk\s*=\s*\d+'),
            RegExp(r'minSdk\s*=\s*[\w.]+'),
            RegExp(r'minSdkVersion\s*\(\s*\d+\s*\)'),
            RegExp(r'minSdkVersion\s*\(\s*[\w.]+\s*\)'),
          ]
        : [
            RegExp(r'minSdkVersion\s+\d+'),
            RegExp(r'minSdkVersion\s+[\w.]+'),
            RegExp(r"minSdkVersion\s*=\s*\d+"),
            RegExp(r"minSdkVersion\s*=\s*[\w.]+"),
          ];

    // Try to find and replace using each pattern
    bool replaced = false;
    for (final pattern in patterns) {
      if (pattern.hasMatch(content)) {
        final replacement = isKotlinDsl
            ? 'minSdk = $version'
            : 'minSdkVersion $version';
        content = content.replaceFirst(pattern, replacement);
        replaced = true;
        break;
      }
    }

    if (!replaced) {
      return const Failure(
        'Could not find minSdkVersion in build.gradle. '
        'Please ensure the file has a valid Android configuration.',
      );
    }

    // Check if content actually changed (avoid unnecessary writes)
    if (content == originalContent) {
      return Success('minSdkVersion is already set to $version.');
    }

    targetFile.writeAsStringSync(content);
    return Success(
      'Successfully updated minSdkVersion to $version in '
      '${isKotlinDsl ? "build.gradle.kts" : "build.gradle"}.',
    );
  } on FileSystemException catch (e) {
    return Failure('Failed to update build.gradle: ${e.message}');
  }
}