build method
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!'),
};
}