diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index c5be500d0f88d..4bb612bf9b0e3 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -799,6 +799,16 @@ class AndroidGradleBuilder implements AndroidBuilder { final String aarTask = getAarTaskFor(buildInfo); final Status status = _logger.startProgress("Running Gradle task '$aarTask'..."); + // When a caller runs `flutter build aar` multiple modes in one + // invocation (debug + profile + release), each iteration's trace + // overwrites the previous one. Shorebird's release flow only + // builds release mode, so this isn't a concern in practice. + final AndroidBuildTraceSession? traceSession = AndroidBuildTraceSession.maybeStart( + androidBuildInfo, + _fileSystem, + project.android.buildDirectory, + ); + final String flutterRoot = _fileSystem.path.absolute(Cache.flutterRoot!); final String initScript = _fileSystem.path.join( flutterRoot, @@ -872,8 +882,10 @@ class AndroidGradleBuilder implements AndroidBuilder { command.add('-Ptarget-platform=$targetPlatforms'); } + command.addAll(traceSession?.extraGradleOptions(aarTask) ?? const []); command.add(aarTask); + traceSession?.onGradleAboutToStart(); final sw = Stopwatch()..start(); RunResult result; try { @@ -895,7 +907,10 @@ class AndroidGradleBuilder implements AndroidBuilder { ), ); + traceSession?.onGradleFinished(aarTask); + if (result.exitCode != 0) { + traceSession?.abortOnGradleFailure(); _logger.printStatus(result.stdout, wrap: false); _logger.printError(result.stderr, wrap: false); throwToolExit( @@ -905,10 +920,12 @@ class AndroidGradleBuilder implements AndroidBuilder { } final Directory repoDirectory = getRepoDirectory(outputDirectory); if (!repoDirectory.existsSync()) { + traceSession?.abortOnGradleFailure(); _logger.printStatus(result.stdout, wrap: false); _logger.printError(result.stderr, wrap: false); throwToolExit('Gradle task $aarTask failed to produce $repoDirectory.', exitCode: exitCode); } + traceSession?.finish(buildTarget: 'aar', printStatus: _logger.printStatus); _logger.printStatus( '${_logger.terminal.successMark} ' 'Built ${_fileSystem.path.relative(repoDirectory.path)}', diff --git a/packages/flutter_tools/lib/src/commands/build_aar.dart b/packages/flutter_tools/lib/src/commands/build_aar.dart index e0572a8ea898d..cba41830217db 100644 --- a/packages/flutter_tools/lib/src/commands/build_aar.dart +++ b/packages/flutter_tools/lib/src/commands/build_aar.dart @@ -49,6 +49,7 @@ class BuildAarCommand extends BuildSubCommand { usesExtraDartFlagOptions(verboseHelp: verboseHelp); usesTrackWidgetCreation(verboseHelp: false); addEnableExperimentation(hide: !verboseHelp); + usesShorebirdTraceOption(hide: !verboseHelp); addAndroidSpecificBuildOptions(hide: !verboseHelp); argParser.addMultiOption( 'target-platform', diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart index b594d152740eb..adfc53f90d8f2 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart @@ -47,6 +47,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand { addDartObfuscationOption(); usesExtraDartFlagOptions(verboseHelp: verboseHelp); addEnableExperimentation(hide: !verboseHelp); + usesShorebirdTraceOption(hide: !verboseHelp); argParser ..addFlag( diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index bfffcbbed3bcb..56d5fb215ae28 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -1163,6 +1163,7 @@ abstract class FlutterCommand extends Command { usesDartDefineOption(); usesExtraDartFlagOptions(verboseHelp: verboseHelp); usesPubOption(); + usesShorebirdTraceOption(hide: !verboseHelp); usesTargetOption(); usesTrackWidgetCreation(verboseHelp: verboseHelp); usesBuildNumberOption();