Skip to content

Commit 70456f5

Browse files
authored
Unified analytics events migration for BuildEvent (flutter#137562)
Related to tracker issue: - flutter#128251
1 parent 01b8854 commit 70456f5

File tree

18 files changed

+313
-33
lines changed

18 files changed

+313
-33
lines changed

packages/flutter_tools/lib/src/android/gradle.dart

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:math';
77
import 'package:crypto/crypto.dart';
88
import 'package:meta/meta.dart';
99
import 'package:process/process.dart';
10+
import 'package:unified_analytics/unified_analytics.dart';
1011
import 'package:xml/xml.dart';
1112

1213
import '../artifacts.dart';
@@ -149,6 +150,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
149150
required FileSystem fileSystem,
150151
required Artifacts artifacts,
151152
required Usage usage,
153+
required Analytics analytics,
152154
required GradleUtils gradleUtils,
153155
required Platform platform,
154156
required AndroidStudio? androidStudio,
@@ -157,6 +159,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
157159
_fileSystem = fileSystem,
158160
_artifacts = artifacts,
159161
_usage = usage,
162+
_analytics = analytics,
160163
_gradleUtils = gradleUtils,
161164
_androidStudio = androidStudio,
162165
_fileSystemUtils = FileSystemUtils(fileSystem: fileSystem, platform: platform),
@@ -168,6 +171,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
168171
final FileSystem _fileSystem;
169172
final Artifacts _artifacts;
170173
final Usage _usage;
174+
final Analytics _analytics;
171175
final GradleUtils _gradleUtils;
172176
final FileSystemUtils _fileSystemUtils;
173177
final AndroidStudio? _androidStudio;
@@ -300,7 +304,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
300304
@visibleForTesting int? maxRetries,
301305
}) async {
302306
if (!project.android.isSupportedVersion) {
303-
_exitWithUnsupportedProjectMessage(_usage, _logger.terminal);
307+
_exitWithUnsupportedProjectMessage(_usage, _logger.terminal, analytics: _analytics);
304308
}
305309

306310
final List<ProjectMigrator> migrators = <ProjectMigrator>[
@@ -318,8 +322,11 @@ class AndroidGradleBuilder implements AndroidBuilder {
318322
final bool usesAndroidX = isAppUsingAndroidX(project.android.hostAppGradleRoot);
319323
if (usesAndroidX) {
320324
BuildEvent('app-using-android-x', type: 'gradle', flutterUsage: _usage).send();
325+
_analytics.send(Event.flutterBuildInfo(label: 'app-using-android-x', buildType: 'gradle'));
321326
} else if (!usesAndroidX) {
322327
BuildEvent('app-not-using-android-x', type: 'gradle', flutterUsage: _usage).send();
328+
_analytics.send(Event.flutterBuildInfo(label: 'app-not-using-android-x', buildType: 'gradle'));
329+
323330
_logger.printStatus("${_logger.terminal.warningMark} Your app isn't using AndroidX.", emphasis: true);
324331
_logger.printStatus(
325332
'To avoid potential build failures, you can quickly migrate your app '
@@ -488,6 +495,8 @@ class AndroidGradleBuilder implements AndroidBuilder {
488495
if (exitCode != 0) {
489496
if (detectedGradleError == null) {
490497
BuildEvent('gradle-unknown-failure', type: 'gradle', flutterUsage: _usage).send();
498+
_analytics.send(Event.flutterBuildInfo(label: 'gradle-unknown-failure', buildType: 'gradle'));
499+
491500
throwToolExit(
492501
'Gradle task $assembleTask failed with exit code $exitCode',
493502
exitCode: exitCode,
@@ -520,21 +529,27 @@ class AndroidGradleBuilder implements AndroidBuilder {
520529
configOnly: configOnly,
521530
);
522531
final String successEventLabel = 'gradle-${detectedGradleError!.eventLabel}-success';
532+
523533
BuildEvent(successEventLabel, type: 'gradle', flutterUsage: _usage).send();
534+
_analytics.send(Event.flutterBuildInfo(label: successEventLabel, buildType: 'gradle'));
535+
524536
return;
525537
case GradleBuildStatus.exit:
526538
// Continue and throw tool exit.
527539
}
528540
}
529-
BuildEvent('gradle-${detectedGradleError?.eventLabel}-failure', type: 'gradle', flutterUsage: _usage).send();
541+
final String usageLabel = 'gradle-${detectedGradleError?.eventLabel}-failure';
542+
BuildEvent(usageLabel, type: 'gradle', flutterUsage: _usage).send();
543+
_analytics.send(Event.flutterBuildInfo(label: usageLabel, buildType: 'gradle'));
544+
530545
throwToolExit(
531546
'Gradle task $assembleTask failed with exit code $exitCode',
532547
exitCode: exitCode,
533548
);
534549
}
535550

536551
if (isBuildingBundle) {
537-
final File bundleFile = findBundleFile(project, buildInfo, _logger, _usage);
552+
final File bundleFile = findBundleFile(project, buildInfo, _logger, _usage, _analytics);
538553
final String appSize = (buildInfo.mode == BuildMode.debug)
539554
? '' // Don't display the size when building a debug variant.
540555
: ' (${getSizeAsMB(bundleFile.lengthSync())})';
@@ -551,7 +566,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
551566
}
552567
// Gradle produced APKs.
553568
final Iterable<String> apkFilesPaths = project.isModule
554-
? findApkFilesModule(project, androidBuildInfo, _logger, _usage)
569+
? findApkFilesModule(project, androidBuildInfo, _logger, _usage, _analytics)
555570
: listApkPaths(androidBuildInfo);
556571
final Directory apkDirectory = getApkDirectory(project);
557572

@@ -563,6 +578,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
563578
fileExtension: '.apk',
564579
logger: _logger,
565580
usage: _usage,
581+
analytics: _analytics,
566582
);
567583
}
568584

@@ -886,8 +902,14 @@ String _calculateSha(File file) {
886902
return _hex(sha1.convert(bytes).bytes);
887903
}
888904

889-
void _exitWithUnsupportedProjectMessage(Usage usage, Terminal terminal) {
905+
void _exitWithUnsupportedProjectMessage(Usage usage, Terminal terminal, {required Analytics analytics}) {
890906
BuildEvent('unsupported-project', type: 'gradle', eventError: 'gradle-plugin', flutterUsage: usage).send();
907+
analytics.send(Event.flutterBuildInfo(
908+
label: 'unsupported-project',
909+
buildType: 'gradle',
910+
error: 'gradle-plugin',
911+
));
912+
891913
throwToolExit(
892914
'${terminal.warningMark} Your app is using an unsupported Gradle project. '
893915
'To fix this problem, create a new project by running `flutter create -t app <app-directory>` '
@@ -913,6 +935,7 @@ Iterable<String> findApkFilesModule(
913935
AndroidBuildInfo androidBuildInfo,
914936
Logger logger,
915937
Usage usage,
938+
Analytics analytics,
916939
) {
917940
final Iterable<String> apkFileNames = _apkFilesFor(androidBuildInfo);
918941
final Directory apkDirectory = getApkDirectory(project);
@@ -948,6 +971,7 @@ Iterable<String> findApkFilesModule(
948971
fileExtension: '.apk',
949972
logger: logger,
950973
usage: usage,
974+
analytics: analytics,
951975
);
952976
}
953977
return apks.map((File file) => file.path);
@@ -986,7 +1010,7 @@ Iterable<String> listApkPaths(
9861010
}
9871011

9881012
@visibleForTesting
989-
File findBundleFile(FlutterProject project, BuildInfo buildInfo, Logger logger, Usage usage) {
1013+
File findBundleFile(FlutterProject project, BuildInfo buildInfo, Logger logger, Usage usage, Analytics analytics) {
9901014
final List<File> fileCandidates = <File>[
9911015
getBundleDirectory(project)
9921016
.childDirectory(camelCase(buildInfo.modeName))
@@ -1043,6 +1067,7 @@ File findBundleFile(FlutterProject project, BuildInfo buildInfo, Logger logger,
10431067
fileExtension: '.aab',
10441068
logger: logger,
10451069
usage: usage,
1070+
analytics: analytics,
10461071
);
10471072
}
10481073

@@ -1052,17 +1077,25 @@ Never _exitWithExpectedFileNotFound({
10521077
required String fileExtension,
10531078
required Logger logger,
10541079
required Usage usage,
1080+
required Analytics analytics,
10551081
}) {
10561082

10571083
final String androidGradlePluginVersion =
10581084
getGradleVersionForAndroidPlugin(project.android.hostAppGradleRoot, logger);
1085+
final String gradleBuildSettings = 'androidGradlePluginVersion: $androidGradlePluginVersion, '
1086+
'fileExtension: $fileExtension';
1087+
10591088
BuildEvent('gradle-expected-file-not-found',
10601089
type: 'gradle',
1061-
settings:
1062-
'androidGradlePluginVersion: $androidGradlePluginVersion, '
1063-
'fileExtension: $fileExtension',
1090+
settings: gradleBuildSettings,
10641091
flutterUsage: usage,
10651092
).send();
1093+
analytics.send(Event.flutterBuildInfo(
1094+
label: 'gradle-expected-file-not-found',
1095+
buildType: 'gradle',
1096+
settings: gradleBuildSettings,
1097+
));
1098+
10661099
throwToolExit(
10671100
'Gradle build failed to produce an $fileExtension file. '
10681101
"It's likely that this file was generated under ${project.android.buildDirectory.path}, "

packages/flutter_tools/lib/src/android/gradle_utils.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:meta/meta.dart';
66
import 'package:process/process.dart';
7+
import 'package:unified_analytics/unified_analytics.dart';
78

89
import '../base/common.dart';
910
import '../base/file_system.dart';
@@ -741,6 +742,11 @@ void exitWithNoSdkMessage() {
741742
eventError: 'android-sdk-not-found',
742743
flutterUsage: globals.flutterUsage)
743744
.send();
745+
globals.analytics.send(Event.flutterBuildInfo(
746+
label: 'unsupported-project',
747+
buildType: 'gradle',
748+
error: 'android-sdk-not-found',
749+
));
744750
throwToolExit('${globals.logger.terminal.warningMark} No Android SDK found. '
745751
'Try setting the ANDROID_HOME environment variable.');
746752
}

packages/flutter_tools/lib/src/commands/build_ios.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:typed_data';
77
import 'package:crypto/crypto.dart';
88
import 'package:file/file.dart';
99
import 'package:meta/meta.dart';
10+
import 'package:unified_analytics/unified_analytics.dart';
1011

1112
import '../base/analyze_size.dart';
1213
import '../base/common.dart';
@@ -669,7 +670,7 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand {
669670
xcodeBuildResult = result;
670671

671672
if (!result.success) {
672-
await diagnoseXcodeBuildFailure(result, globals.flutterUsage, globals.logger);
673+
await diagnoseXcodeBuildFailure(result, globals.flutterUsage, globals.logger, globals.analytics);
673674
final String presentParticiple = xcodeBuildAction == XcodeBuildAction.build ? 'building' : 'archiving';
674675
throwToolExit('Encountered error while $presentParticiple for $logTarget.');
675676
}
@@ -739,13 +740,19 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand {
739740
final bool? impellerEnabled = globals.plistParser.getValueFromFile<bool>(
740741
plistPath, PlistParser.kFLTEnableImpellerKey,
741742
);
742-
BuildEvent(
743-
impellerEnabled == false
743+
744+
final String buildLabel = impellerEnabled == false
744745
? 'plist-impeller-disabled'
745-
: 'plist-impeller-enabled',
746+
: 'plist-impeller-enabled';
747+
BuildEvent(
748+
buildLabel,
746749
type: 'ios',
747750
flutterUsage: globals.flutterUsage,
748751
).send();
752+
globals.analytics.send(Event.flutterBuildInfo(
753+
label: buildLabel,
754+
buildType: 'ios',
755+
));
749756

750757
return FlutterCommandResult.success();
751758
}

packages/flutter_tools/lib/src/commands/build_web.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ class BuildWebCommand extends BuildSubCommand {
195195
fileSystem: globals.fs,
196196
flutterVersion: globals.flutterVersion,
197197
usage: globals.flutterUsage,
198+
analytics: globals.analytics,
198199
);
199200
await webBuilder.buildWeb(
200201
flutterProject,

packages/flutter_tools/lib/src/context_runner.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ Future<T> runInContext<T>(
101101
fileSystem: globals.fs,
102102
artifacts: globals.artifacts!,
103103
usage: globals.flutterUsage,
104+
analytics: globals.analytics,
104105
gradleUtils: globals.gradleUtils!,
105106
platform: globals.platform,
106107
androidStudio: globals.androidStudio,
@@ -387,6 +388,7 @@ Future<T> runInContext<T>(
387388
platform: globals.platform,
388389
fileSystem: globals.fs,
389390
usage: globals.flutterUsage,
391+
analytics: globals.analytics,
390392
),
391393
},
392394
);

packages/flutter_tools/lib/src/ios/devices.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ class IOSDevice extends Device {
505505
);
506506
if (!buildResult.success) {
507507
_logger.printError('Could not build the precompiled application for the device.');
508-
await diagnoseXcodeBuildFailure(buildResult, globals.flutterUsage, _logger);
508+
await diagnoseXcodeBuildFailure(buildResult, globals.flutterUsage, _logger, globals.analytics);
509509
_logger.printError('');
510510
return LaunchResult.failed();
511511
}

packages/flutter_tools/lib/src/ios/mac.dart

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:async';
66

77
import 'package:meta/meta.dart';
88
import 'package:process/process.dart';
9+
import 'package:unified_analytics/unified_analytics.dart';
910

1011
import '../artifacts.dart';
1112
import '../base/file_system.dart';
@@ -581,17 +582,35 @@ return result.exitCode != 0 &&
581582
result.stdout.contains(kConcurrentRunFailureMessage2);
582583
}
583584

584-
Future<void> diagnoseXcodeBuildFailure(XcodeBuildResult result, Usage flutterUsage, Logger logger) async {
585+
Future<void> diagnoseXcodeBuildFailure(
586+
XcodeBuildResult result,
587+
Usage flutterUsage,
588+
Logger logger,
589+
Analytics analytics,
590+
) async {
585591
final XcodeBuildExecution? xcodeBuildExecution = result.xcodeBuildExecution;
586592
if (xcodeBuildExecution != null
587593
&& xcodeBuildExecution.environmentType == EnvironmentType.physical
588594
&& (result.stdout?.toUpperCase().contains('BITCODE') ?? false)) {
589-
BuildEvent('xcode-bitcode-failure',
590-
type: 'ios',
591-
command: xcodeBuildExecution.buildCommands.toString(),
592-
settings: xcodeBuildExecution.buildSettings.toString(),
595+
596+
const String label = 'xcode-bitcode-failure';
597+
const String buildType = 'ios';
598+
final String command = xcodeBuildExecution.buildCommands.toString();
599+
final String settings = xcodeBuildExecution.buildSettings.toString();
600+
601+
BuildEvent(
602+
label,
603+
type: buildType,
604+
command: command,
605+
settings: settings,
593606
flutterUsage: flutterUsage,
594607
).send();
608+
analytics.send(Event.flutterBuildInfo(
609+
label: label,
610+
buildType: buildType,
611+
command: command,
612+
settings: settings,
613+
));
595614
}
596615

597616
// Handle errors.

packages/flutter_tools/lib/src/ios/simulators.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ class IOSSimulator extends Device {
567567
deviceID: id,
568568
);
569569
if (!buildResult.success) {
570-
await diagnoseXcodeBuildFailure(buildResult, globals.flutterUsage, globals.logger);
570+
await diagnoseXcodeBuildFailure(buildResult, globals.flutterUsage, globals.logger, globals.analytics);
571571
throwToolExit('Could not build the application for the simulator.');
572572
}
573573

0 commit comments

Comments
 (0)