build method

  1. @override
Future<String> build()
override

Release the app for the given platform release type. Returns the absolute output path.

Implementation

@override
Future<String> build() async {
  if (keyStoreFileBase64 != null &&
      keyStorePassword != null &&
      keyAlias != null &&
      keyPassword != null) {
    _logger.fine(
        'Prepare Signing credentials in file "$_androidDirectory/key.properties"');

    // Check if key signing is configured in build.gradle
    var buildGradleFile = File('$_androidDirectory/app/build.gradle.kts');
    if (!(await buildGradleFile.exists())) {
      buildGradleFile = File('$_androidDirectory/app/build.gradle');
    }
    final buildGradleFileContents = await buildGradleFile.readAsString();
    if (!(buildGradleFileContents.contains('key.properties') &&
        buildGradleFileContents.contains('keyAlias') &&
        buildGradleFileContents.contains('keyPassword') &&
        buildGradleFileContents.contains('storeFile') &&
        buildGradleFileContents.contains('storePassword'))) {
      throw Exception(
        'Signing is not configured for Android, please follow the instructions:\n'
        'https://docs.flutter.dev/deployment/android#configure-signing-in-gradle',
      );
    }

    // Save keystore file
    final keyStoreFile = File('$_androidDirectory/$_keyStoreFile');
    await keyStoreFile.writeAsBytes(base64.decode(keyStoreFileBase64!));

    final signingKeys = '''
storePassword=$keyStorePassword
keyPassword=$keyPassword
keyAlias=$keyAlias
storeFile=${keyStoreFile.absolute.path}
  ''';
    await File('$_androidDirectory/key.properties')
        .writeAsString(signingKeys);
  } else {
    _logger.fine('Skip signing.');
  }

  final buildMetadata =
      flutterBuild.buildVersion.build.map((b) => b.toString()).join('.');
  if (int.tryParse(buildMetadata) == null) {
    if (buildMetadata.isNotEmpty) {
      _logger.warning(
          'Non integer values for build metadata are not supported on Android. Omitting "$buildMetadata".');
    }
    flutterBuild.buildVersion =
        flutterBuild.buildVersion.copyWith(build: null);
  }

  return switch (buildType) {
    BuildType.aab => _buildAndroidAab(),
    BuildType.apk => _buildAndroidApk(),
    _ => throw UnsupportedError(
        'BuildType $buildType is not available for Android!'),
  };
}