From 61497b361e10061a6c6e98f905231693355eea08 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Thu, 3 Aug 2023 14:03:03 -0500 Subject: [PATCH] feat(shorebird_cli): `shorebird release android` support for `--split-per-abi` --- .../release/release_android_command.dart | 14 ++++++- .../lib/src/shorebird_build_mixin.dart | 7 +++- .../release/release_android_command_test.dart | 39 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart b/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart index d337a81ea..d3fadad6e 100644 --- a/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart +++ b/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart @@ -42,6 +42,12 @@ class ReleaseAndroidCommand extends ShorebirdCommand 'apk': 'Android Package Kit', }, ) + ..addFlag( + 'split-per-abi', + help: 'Whether to split the APKs per ABIs. ' + 'To learn more, see: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split', + negatable: false, + ) ..addFlag( 'force', abbr: 'f', @@ -79,7 +85,13 @@ make smaller updates to your app. final buildProgress = logger.progress('Building release'); try { await buildAppBundle(flavor: flavor, target: target); - if (generateApk) await buildApk(flavor: flavor, target: target); + if (generateApk) { + await buildApk( + flavor: flavor, + target: target, + splitPerAbi: results['split-per-abi'] == true, + ); + } buildProgress.complete(); } on ProcessException catch (error) { buildProgress.fail('Failed to build: ${error.message}'); diff --git a/packages/shorebird_cli/lib/src/shorebird_build_mixin.dart b/packages/shorebird_cli/lib/src/shorebird_build_mixin.dart index c250154fe..50a28b208 100644 --- a/packages/shorebird_cli/lib/src/shorebird_build_mixin.dart +++ b/packages/shorebird_cli/lib/src/shorebird_build_mixin.dart @@ -137,7 +137,11 @@ mixin ShorebirdBuildMixin on ShorebirdCommand { } } - Future buildApk({String? flavor, String? target}) async { + Future buildApk({ + String? flavor, + String? target, + bool? splitPerAbi, + }) async { const executable = 'flutter'; final arguments = [ 'build', @@ -145,6 +149,7 @@ mixin ShorebirdBuildMixin on ShorebirdCommand { '--release', if (flavor != null) '--flavor=$flavor', if (target != null) '--target=$target', + if (splitPerAbi != null) '--split-per-abi', ...results.rest, ]; diff --git a/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart b/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart index 17f6c4d6d..aa6bb73ca 100644 --- a/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart @@ -399,6 +399,45 @@ void main() { expect(exitCode, ExitCode.success.code); }); + test('succeeds when release is successful (with apk + split-per-abi)', + () async { + when(() => argResults['artifact']).thenReturn('apk'); + when(() => argResults['split-per-abi']).thenReturn(true); + final exitCode = await runWithOverrides(command.run); + verify(() => logger.success('\n✅ Published Release!')).called(1); + verify( + () => codePushClientWrapper.createAndroidReleaseArtifacts( + appId: appId, + releaseId: release.id, + platform: releasePlatform, + aabPath: any(named: 'aabPath'), + architectures: any(named: 'architectures'), + ), + ).called(1); + verify( + () => codePushClientWrapper.updateReleaseStatus( + appId: appId, + releaseId: release.id, + platform: releasePlatform, + status: ReleaseStatus.active, + ), + ).called(1); + final buildApkArguments = [ + 'build', + 'apk', + '--release', + '--split-per-abi' + ]; + verify( + () => shorebirdProcess.run( + 'flutter', + buildApkArguments, + runInShell: true, + ), + ).called(1); + expect(exitCode, ExitCode.success.code); + }); + test( 'succeeds when release is successful ' 'with flavors and target', () async {