diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart index 1f2de22656..69fc1432a6 100644 --- a/packages/flutter_tools/lib/src/commands/assemble.dart +++ b/packages/flutter_tools/lib/src/commands/assemble.dart @@ -310,6 +310,14 @@ class AssembleCommand extends FlutterCommand { "Try re-running 'flutter build ios' or the appropriate build command." ); } + if (deferredTargets.isNotEmpty) { + // Record to analytics that DeferredComponents is being used. + globals.analytics.send(Event.flutterBuildInfo( + label: 'assemble-deferred-components', + buildType: 'android', + settings: deferredTargets.map((Target t) => t.name).join(','), + )); + } if (_flutterProject.manifest.deferredComponents != null && decodedDefines.contains('validate-deferred-components=true') && deferredTargets.isNotEmpty diff --git a/packages/flutter_tools/lib/src/commands/build_appbundle.dart b/packages/flutter_tools/lib/src/commands/build_appbundle.dart index d0a6188293..ca58c4a2e2 100644 --- a/packages/flutter_tools/lib/src/commands/build_appbundle.dart +++ b/packages/flutter_tools/lib/src/commands/build_appbundle.dart @@ -143,6 +143,13 @@ class BuildAppBundleCommand extends BuildSubCommand { // Do all setup verification that doesn't involve loading units. Checks that // require generated loading units are done after gen_snapshot in assemble. final List? deferredComponents = FlutterProject.current().manifest.deferredComponents; + if (deferredComponents != null && boolArg('deferred-components')) { + // Record to analytics that DeferredComponents is being used. + globals.analytics.send(Event.flutterBuildInfo( + label: 'build-appbundle-deferred-components', + buildType: 'android', + )); + } if (deferredComponents != null && boolArg('deferred-components') && boolArg('validate-deferred-components') && !boolArg('debug')) { final DeferredComponentsPrebuildValidator validator = DeferredComponentsPrebuildValidator( project.directory, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart index f62d92d9aa..831dcbe05e 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart @@ -94,6 +94,35 @@ void main() { FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); + testUsingContext('flutter assemble sends assemble-deferred-components', () async { + final AssembleCommand command = AssembleCommand( + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + ); + final CommandRunner commandRunner = createTestCommandRunner(command); + await commandRunner.run([ + 'assemble', + '-o Output', + '-dTargetPlatform=android', + '-dBuildMode=release', + 'android_aot_deferred_components_bundle_release_android-arm64', + ]); + expect( + fakeAnalytics.sentEvents, + contains( + Event.flutterBuildInfo( + label: 'assemble-deferred-components', + buildType: 'android', + settings: 'android_aot_deferred_components_bundle_release_android-arm64', + ), + ), + ); + }, overrides: { + Analytics: () => fakeAnalytics, + Cache: () => Cache.test(processManager: FakeProcessManager.any()), + FileSystem: () => MemoryFileSystem.test(), + ProcessManager: () => FakeProcessManager.any(), + }); + testUsingContext('flutter assemble sends usage values correctly with platform', () async { final AssembleCommand command = AssembleCommand( buildSystem: TestBuildSystem.all(BuildResult(success: true))); diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart index 861d03a6e9..d843983a58 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart @@ -148,6 +148,49 @@ void main() { Analytics: () => fakeAnalytics, ProcessInfo: () => processInfo, }); + + testUsingContext('use of the deferred components feature sends a build info event indicating so', () async { + final String projectPath = await createProject( + tempDir, + arguments: [ + '--empty', + '--no-pub', + '--template=app', + ], + ); + + // Add deferred manifest. + final File pubspec = globals.localFileSystem + .directory(projectPath) + .childFile('pubspec.yaml'); + final String modifiedContents = pubspec + .readAsStringSync() + .replaceAll('flutter:', 'flutter:\n deferred-components:'); + pubspec.writeAsStringSync(modifiedContents); + printOnFailure(pubspec.readAsStringSync()); + + final Directory oldCwd = globals.localFileSystem.currentDirectory; + try { + globals.localFileSystem.currentDirectory = globals.localFileSystem.directory(projectPath); + await runBuildAppBundleCommand(projectPath); + } finally { + globals.localFileSystem.currentDirectory = oldCwd; + } + + expect( + fakeAnalytics.sentEvents, + contains( + Event.flutterBuildInfo( + label: 'build-appbundle-deferred-components', + buildType: 'android', + ), + ), + ); + }, overrides: { + AndroidBuilder: () => FakeAndroidBuilder(), + Analytics: () => fakeAnalytics, + ProcessInfo: () => processInfo, + }); }); group('Gradle', () {