Remove more references to deprecated package:usage (executable, runner) (#160369)
Helps https://github.com/flutter/flutter/issues/150575 <details> <summary> Pre-launch checklist </summary> - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. </details> <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
98e5ce7ed7
commit
c803c1346f
@ -169,7 +169,7 @@ List<FlutterCommand> generateCommands({
|
|||||||
platform: globals.platform,
|
platform: globals.platform,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
suppressAnalytics: globals.flutterUsage.suppressAnalytics,
|
suppressAnalytics: !globals.analytics.okToSend,
|
||||||
),
|
),
|
||||||
AssembleCommand(verboseHelp: verboseHelp, buildSystem: globals.buildSystem),
|
AssembleCommand(verboseHelp: verboseHelp, buildSystem: globals.buildSystem),
|
||||||
AttachCommand(
|
AttachCommand(
|
||||||
|
@ -23,7 +23,6 @@ import 'src/doctor.dart';
|
|||||||
import 'src/features.dart';
|
import 'src/features.dart';
|
||||||
import 'src/globals.dart' as globals;
|
import 'src/globals.dart' as globals;
|
||||||
import 'src/reporting/crash_reporting.dart';
|
import 'src/reporting/crash_reporting.dart';
|
||||||
import 'src/reporting/reporting.dart';
|
|
||||||
import 'src/runner/flutter_command.dart';
|
import 'src/runner/flutter_command.dart';
|
||||||
import 'src/runner/flutter_command_runner.dart';
|
import 'src/runner/flutter_command_runner.dart';
|
||||||
|
|
||||||
@ -97,18 +96,6 @@ Future<int> run(
|
|||||||
globals.printStatus('Analytics reporting enabled.');
|
globals.printStatus('Analytics reporting enabled.');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send an event to GA3 for any users that are opted into GA3
|
|
||||||
// analytics but have opted out of GA4 (package:unified_analytics)
|
|
||||||
// TODO(eliasyishak): remove once GA3 sunset, https://github.com/flutter/flutter/issues/128251
|
|
||||||
if (!globals.analytics.telemetryEnabled &&
|
|
||||||
globals.flutterUsage.enabled) {
|
|
||||||
UsageEvent(
|
|
||||||
'ga4_and_ga3_status_mismatch',
|
|
||||||
'opted_out_of_ga4',
|
|
||||||
flutterUsage: globals.flutterUsage,
|
|
||||||
).send();
|
|
||||||
}
|
|
||||||
|
|
||||||
await runner.run(args);
|
await runner.run(args);
|
||||||
|
|
||||||
// Triggering [runZoned]'s error callback does not necessarily mean that
|
// Triggering [runZoned]'s error callback does not necessarily mean that
|
||||||
@ -188,8 +175,6 @@ Future<int> _handleToolError(
|
|||||||
return exitWithHooks(1, shutdownHooks: shutdownHooks);
|
return exitWithHooks(1, shutdownHooks: shutdownHooks);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Report to both [Usage] and [CrashReportSender].
|
|
||||||
globals.flutterUsage.sendException(error);
|
|
||||||
globals.analytics.send(Event.exception(exception: error.runtimeType.toString()));
|
globals.analytics.send(Event.exception(exception: error.runtimeType.toString()));
|
||||||
await asyncGuard(() async {
|
await asyncGuard(() async {
|
||||||
final CrashReportSender crashReportSender = CrashReportSender(
|
final CrashReportSender crashReportSender = CrashReportSender(
|
||||||
|
@ -9,7 +9,6 @@ import 'package:process/process.dart';
|
|||||||
|
|
||||||
import '../convert.dart';
|
import '../convert.dart';
|
||||||
import '../globals.dart' as globals;
|
import '../globals.dart' as globals;
|
||||||
import '../reporting/first_run.dart';
|
|
||||||
import 'io.dart';
|
import 'io.dart';
|
||||||
import 'logger.dart';
|
import 'logger.dart';
|
||||||
|
|
||||||
@ -677,56 +676,12 @@ class _DefaultProcessUtils implements ProcessUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<int> exitWithHooks(int code, {required ShutdownHooks shutdownHooks}) async {
|
Future<int> exitWithHooks(int code, {required ShutdownHooks shutdownHooks}) async {
|
||||||
// Need to get the boolean returned from `messenger.shouldDisplayLicenseTerms()`
|
|
||||||
// before invoking the print welcome method because the print welcome method
|
|
||||||
// will set `messenger.shouldDisplayLicenseTerms()` to false
|
|
||||||
final FirstRunMessenger messenger =
|
|
||||||
FirstRunMessenger(persistentToolState: globals.persistentToolState!);
|
|
||||||
final bool legacyAnalyticsMessageShown =
|
|
||||||
messenger.shouldDisplayLicenseTerms();
|
|
||||||
|
|
||||||
// Prints the welcome message if needed for legacy analytics.
|
|
||||||
if (!(await globals.isRunningOnBot)) {
|
|
||||||
globals.flutterUsage.printWelcome();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure that the consent message has been displayed for unified analytics
|
|
||||||
if (globals.analytics.shouldShowMessage) {
|
if (globals.analytics.shouldShowMessage) {
|
||||||
globals.logger.printStatus(globals.analytics.getConsentMessage);
|
globals.logger.printStatus(globals.analytics.getConsentMessage);
|
||||||
if (!globals.flutterUsage.enabled) {
|
|
||||||
globals.printStatus(
|
|
||||||
'Please note that analytics reporting was already disabled, '
|
|
||||||
'and will continue to be disabled.\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Because the legacy analytics may have also sent a message,
|
|
||||||
// the conditional below will print additional messaging informing
|
|
||||||
// users that the two consent messages they are receiving is not a
|
|
||||||
// bug
|
|
||||||
if (legacyAnalyticsMessageShown) {
|
|
||||||
globals.logger
|
|
||||||
.printStatus('You have received two consent messages because '
|
|
||||||
'the flutter tool is migrating to a new analytics system. '
|
|
||||||
'Disabling analytics collection will disable both the legacy '
|
|
||||||
'and new analytics collection systems. '
|
|
||||||
'You can disable analytics reporting by running `flutter --disable-analytics`\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invoking this will onboard the flutter tool onto
|
|
||||||
// the package on the developer's machine and will
|
|
||||||
// allow for events to be sent to Google Analytics
|
|
||||||
// on subsequent runs of the flutter tool (ie. no events
|
|
||||||
// will be sent on the first run to allow developers to
|
|
||||||
// opt out of collection)
|
|
||||||
globals.analytics.clientShowedMessage();
|
globals.analytics.clientShowedMessage();
|
||||||
}
|
|
||||||
|
|
||||||
// Send any last analytics calls that are in progress without overly delaying
|
// This trace is searched for in tests.
|
||||||
// the tool's exit (we wait a maximum of 250ms).
|
globals.logger.printTrace('Showed analytics consent message.');
|
||||||
if (globals.flutterUsage.enabled) {
|
|
||||||
final Stopwatch stopwatch = Stopwatch()..start();
|
|
||||||
await globals.flutterUsage.ensureAnalyticsSent();
|
|
||||||
globals.printTrace('ensureAnalyticsSent: ${stopwatch.elapsedMilliseconds}ms');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run shutdown hooks before flushing logs
|
// Run shutdown hooks before flushing logs
|
||||||
@ -734,10 +689,6 @@ Future<int> exitWithHooks(int code, {required ShutdownHooks shutdownHooks}) asyn
|
|||||||
|
|
||||||
final Completer<void> completer = Completer<void>();
|
final Completer<void> completer = Completer<void>();
|
||||||
|
|
||||||
// Allow any pending analytics events to send and close the http connection
|
|
||||||
//
|
|
||||||
// By default, we will wait 250 ms before canceling any pending events, we
|
|
||||||
// can change the [delayDuration] in the close method if it needs to be changed
|
|
||||||
await globals.analytics.close();
|
await globals.analytics.close();
|
||||||
|
|
||||||
// Give the task / timer queue one cycle through before we hard exit.
|
// Give the task / timer queue one cycle through before we hard exit.
|
||||||
|
@ -18,7 +18,6 @@ import 'package:flutter_tools/src/base/user_messages.dart';
|
|||||||
import 'package:flutter_tools/src/cache.dart';
|
import 'package:flutter_tools/src/cache.dart';
|
||||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||||
import 'package:flutter_tools/src/reporting/crash_reporting.dart';
|
import 'package:flutter_tools/src/reporting/crash_reporting.dart';
|
||||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
|
||||||
import 'package:flutter_tools/src/runner/flutter_command.dart';
|
import 'package:flutter_tools/src/runner/flutter_command.dart';
|
||||||
import 'package:test/fake.dart';
|
import 'package:test/fake.dart';
|
||||||
import 'package:unified_analytics/unified_analytics.dart';
|
import 'package:unified_analytics/unified_analytics.dart';
|
||||||
@ -99,8 +98,6 @@ void main() {
|
|||||||
// exception on the first attempt, the second attempt tries to report the
|
// exception on the first attempt, the second attempt tries to report the
|
||||||
// *original* crash, and not the crash from the first crash report
|
// *original* crash, and not the crash from the first crash report
|
||||||
// attempt.
|
// attempt.
|
||||||
final CrashingUsage crashingUsage = globals.flutterUsage as CrashingUsage;
|
|
||||||
expect(crashingUsage.sentException.toString(), 'Exception: an exception % --');
|
|
||||||
expect(fakeAnalytics.sentEvents, contains(Event.exception(exception: '_Exception')));
|
expect(fakeAnalytics.sentEvents, contains(Event.exception(exception: '_Exception')));
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Platform: () => FakePlatform(environment: <String, String>{
|
Platform: () => FakePlatform(environment: <String, String>{
|
||||||
@ -109,7 +106,6 @@ void main() {
|
|||||||
}),
|
}),
|
||||||
FileSystem: () => fileSystem,
|
FileSystem: () => fileSystem,
|
||||||
ProcessManager: () => FakeProcessManager.any(),
|
ProcessManager: () => FakeProcessManager.any(),
|
||||||
Usage: () => CrashingUsage(),
|
|
||||||
Artifacts: () => Artifacts.test(),
|
Artifacts: () => Artifacts.test(),
|
||||||
HttpClientFactory: () => () => FakeHttpClient.any(),
|
HttpClientFactory: () => () => FakeHttpClient.any(),
|
||||||
Analytics: () => fakeAnalytics,
|
Analytics: () => fakeAnalytics,
|
||||||
@ -411,13 +407,16 @@ void main() {
|
|||||||
shutdownHooks: ShutdownHooks(),
|
shutdownHooks: ShutdownHooks(),
|
||||||
);
|
);
|
||||||
|
|
||||||
expect((globals.flutterUsage as TestUsage).printedWelcome, false);
|
expect(
|
||||||
|
(globals.logger as BufferLogger).traceText,
|
||||||
|
isNot(contains('Showed analytics consent message.')),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
overrides: <Type, Generator>{
|
overrides: <Type, Generator>{
|
||||||
|
Logger: () => BufferLogger.test(),
|
||||||
FileSystem: () => MemoryFileSystem.test(),
|
FileSystem: () => MemoryFileSystem.test(),
|
||||||
ProcessManager: () => FakeProcessManager.any(),
|
ProcessManager: () => FakeProcessManager.any(),
|
||||||
BotDetector: () => const FakeBotDetector(true),
|
BotDetector: () => const FakeBotDetector(true),
|
||||||
Usage: () => TestUsage(),
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -425,7 +424,6 @@ void main() {
|
|||||||
group('unified_analytics', () {
|
group('unified_analytics', () {
|
||||||
late FakeAnalytics fakeAnalytics;
|
late FakeAnalytics fakeAnalytics;
|
||||||
late MemoryFileSystem fs;
|
late MemoryFileSystem fs;
|
||||||
late TestUsage testUsage;
|
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
fs = MemoryFileSystem.test();
|
fs = MemoryFileSystem.test();
|
||||||
@ -434,7 +432,6 @@ void main() {
|
|||||||
fs: fs,
|
fs: fs,
|
||||||
fakeFlutterVersion: FakeFlutterVersion(),
|
fakeFlutterVersion: FakeFlutterVersion(),
|
||||||
);
|
);
|
||||||
testUsage = TestUsage();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
testUsingContext(
|
testUsingContext(
|
||||||
@ -461,85 +458,6 @@ void main() {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
testUsingContext(
|
|
||||||
'runner sends mismatch event to ga3 if user opted in to ga3 but out of ga4 analytics',
|
|
||||||
() async {
|
|
||||||
io.setExitFunctionForTests((int exitCode) {});
|
|
||||||
|
|
||||||
// Begin by opting out of telemetry for package:unified_analytics
|
|
||||||
// and leaving legacy analytics opted in
|
|
||||||
await fakeAnalytics.setTelemetry(false);
|
|
||||||
expect(fakeAnalytics.telemetryEnabled, false);
|
|
||||||
expect(testUsage.enabled, true);
|
|
||||||
|
|
||||||
await runner.run(
|
|
||||||
<String>[],
|
|
||||||
() => <FlutterCommand>[],
|
|
||||||
// This flutterVersion disables crash reporting.
|
|
||||||
flutterVersion: '[user-branch]/',
|
|
||||||
shutdownHooks: ShutdownHooks(),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
|
||||||
testUsage.events,
|
|
||||||
contains(const TestUsageEvent(
|
|
||||||
'ga4_and_ga3_status_mismatch',
|
|
||||||
'opted_out_of_ga4',
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
expect(fakeAnalytics.telemetryEnabled, false);
|
|
||||||
expect(testUsage.enabled, true);
|
|
||||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
|
||||||
|
|
||||||
},
|
|
||||||
overrides: <Type, Generator>{
|
|
||||||
Analytics: () => fakeAnalytics,
|
|
||||||
FileSystem: () => MemoryFileSystem.test(),
|
|
||||||
ProcessManager: () => FakeProcessManager.any(),
|
|
||||||
Usage: () => testUsage,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testUsingContext(
|
|
||||||
'runner does not send mismatch event to ga3 if user opted out of ga3 & ga4 analytics',
|
|
||||||
() async {
|
|
||||||
io.setExitFunctionForTests((int exitCode) {});
|
|
||||||
|
|
||||||
// Begin by opting out of telemetry for package:unified_analytics
|
|
||||||
// and legacy analytics
|
|
||||||
await fakeAnalytics.setTelemetry(false);
|
|
||||||
testUsage.enabled = false;
|
|
||||||
expect(fakeAnalytics.telemetryEnabled, false);
|
|
||||||
expect(testUsage.enabled, false);
|
|
||||||
|
|
||||||
await runner.run(
|
|
||||||
<String>[],
|
|
||||||
() => <FlutterCommand>[],
|
|
||||||
// This flutterVersion disables crash reporting.
|
|
||||||
flutterVersion: '[user-branch]/',
|
|
||||||
shutdownHooks: ShutdownHooks(),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
|
||||||
testUsage.events,
|
|
||||||
isNot(contains(const TestUsageEvent(
|
|
||||||
'ga4_and_ga3_status_mismatch',
|
|
||||||
'opted_out_of_ga4',
|
|
||||||
))),
|
|
||||||
);
|
|
||||||
expect(fakeAnalytics.telemetryEnabled, false);
|
|
||||||
expect(testUsage.enabled, false);
|
|
||||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
|
||||||
|
|
||||||
},
|
|
||||||
overrides: <Type, Generator>{
|
|
||||||
Analytics: () => fakeAnalytics,
|
|
||||||
FileSystem: () => MemoryFileSystem.test(),
|
|
||||||
ProcessManager: () => FakeProcessManager.any(),
|
|
||||||
Usage: () => testUsage,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testUsingContext(
|
testUsingContext(
|
||||||
'--enable-analytics and --disable-analytics enables/disables telemetry',
|
'--enable-analytics and --disable-analytics enables/disables telemetry',
|
||||||
() async {
|
() async {
|
||||||
@ -721,85 +639,6 @@ class _GitNotFoundFlutterCommand extends FlutterCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CrashingUsage implements Usage {
|
|
||||||
CrashingUsage() : _impl = Usage(
|
|
||||||
versionOverride: '[user-branch]',
|
|
||||||
runningOnBot: true,
|
|
||||||
);
|
|
||||||
|
|
||||||
final Usage _impl;
|
|
||||||
|
|
||||||
dynamic get sentException => _sentException;
|
|
||||||
dynamic _sentException;
|
|
||||||
|
|
||||||
bool _firstAttempt = true;
|
|
||||||
|
|
||||||
// Crash while crashing.
|
|
||||||
@override
|
|
||||||
void sendException(dynamic exception) {
|
|
||||||
if (_firstAttempt) {
|
|
||||||
_firstAttempt = false;
|
|
||||||
throw Exception('CrashingUsage.sendException');
|
|
||||||
}
|
|
||||||
_sentException = exception;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool get suppressAnalytics => _impl.suppressAnalytics;
|
|
||||||
|
|
||||||
@override
|
|
||||||
set suppressAnalytics(bool value) {
|
|
||||||
_impl.suppressAnalytics = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool get enabled => _impl.enabled;
|
|
||||||
|
|
||||||
@override
|
|
||||||
set enabled(bool value) {
|
|
||||||
_impl.enabled = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get clientId => _impl.clientId;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void sendCommand(String command, {CustomDimensions? parameters}) =>
|
|
||||||
_impl.sendCommand(command, parameters: parameters);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void sendEvent(
|
|
||||||
String category,
|
|
||||||
String parameter, {
|
|
||||||
String? label,
|
|
||||||
int? value,
|
|
||||||
CustomDimensions? parameters,
|
|
||||||
}) => _impl.sendEvent(
|
|
||||||
category,
|
|
||||||
parameter,
|
|
||||||
label: label,
|
|
||||||
value: value,
|
|
||||||
parameters: parameters,
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void sendTiming(
|
|
||||||
String category,
|
|
||||||
String variableName,
|
|
||||||
Duration duration, {
|
|
||||||
String? label,
|
|
||||||
}) => _impl.sendTiming(category, variableName, duration, label: label);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Stream<Map<String, dynamic>> get onSend => _impl.onSend;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> ensureAnalyticsSent() => _impl.ensureAnalyticsSent();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void printWelcome() => _impl.printWelcome();
|
|
||||||
}
|
|
||||||
|
|
||||||
class CustomBugInstructions extends UserMessages {
|
class CustomBugInstructions extends UserMessages {
|
||||||
@override
|
@override
|
||||||
String get flutterToolBugInstructions => kCustomBugInstructions;
|
String get flutterToolBugInstructions => kCustomBugInstructions;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user