Skip to content

Commit dce8f71

Browse files
author
Jonah Williams
authored
[flutter_tools] do not use context logger in gradle (flutter#75940)
1 parent 835c7fa commit dce8f71

File tree

8 files changed

+90
-56
lines changed

8 files changed

+90
-56
lines changed

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

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import '../build_info.dart';
2121
import '../cache.dart';
2222
import '../convert.dart';
2323
import '../flutter_manifest.dart';
24-
import '../globals.dart' as globals;
24+
import '../globals.dart' as globals hide logger, printStatus, printTrace, printError;
2525
import '../project.dart';
2626
import '../reporting/reporting.dart';
2727
import 'android_builder.dart';
@@ -136,8 +136,8 @@ Future<File> getGradleAppOut(AndroidProject androidProject) async {
136136

137137
/// Runs `gradlew dependencies`, ensuring that dependencies are resolved and
138138
/// potentially downloaded.
139-
Future<void> checkGradleDependencies() async {
140-
final Status progress = globals.logger.startProgress(
139+
Future<void> checkGradleDependencies(Logger logger) async {
140+
final Status progress = logger.startProgress(
141141
'Ensuring gradle dependencies are up to date...',
142142
);
143143
final FlutterProject flutterProject = FlutterProject.current();
@@ -157,7 +157,7 @@ Future<void> checkGradleDependencies() async {
157157
/// from the existing `settings.gradle` file. This operation will fail if the existing
158158
/// `settings.gradle` file has local edits.
159159
@visibleForTesting
160-
void createSettingsAarGradle(Directory androidDirectory) {
160+
void createSettingsAarGradle(Directory androidDirectory, Logger logger) {
161161
final File newSettingsFile = androidDirectory.childFile('settings_aar.gradle');
162162
if (newSettingsFile.existsSync()) {
163163
return;
@@ -169,7 +169,7 @@ void createSettingsAarGradle(Directory androidDirectory) {
169169
final String currentFileContent = currentSettingsFile.readAsStringSync();
170170

171171
final String newSettingsRelativeFile = globals.fs.path.relative(newSettingsFile.path);
172-
final Status status = globals.logger.startProgress('✏️ Creating `$newSettingsRelativeFile`...');
172+
final Status status = logger.startProgress('✏️ Creating `$newSettingsRelativeFile`...');
173173

174174
final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
175175
final File legacySettingsDotGradleFiles = globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools',
@@ -191,20 +191,26 @@ void createSettingsAarGradle(Directory androidDirectory) {
191191
}
192192
if (!exactMatch) {
193193
status.cancel();
194-
globals.printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.');
194+
logger.printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.');
195195
// Print how to manually update the file.
196-
globals.printStatus(globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools',
196+
logger.printStatus(globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools',
197197
'gradle', 'manual_migration_settings.gradle.md')).readAsStringSync());
198198
throwToolExit('Please create the file and run this command again.');
199199
}
200200
// Copy the new file.
201201
newSettingsFile.writeAsStringSync(settingsAarContent);
202202
status.stop();
203-
globals.printStatus('$successMark `$newSettingsRelativeFile` created successfully.');
203+
logger.printStatus('$successMark `$newSettingsRelativeFile` created successfully.');
204204
}
205205

206206
/// An implementation of the [AndroidBuilder] that delegates to gradle.
207207
class AndroidGradleBuilder implements AndroidBuilder {
208+
AndroidGradleBuilder({
209+
@required Logger logger,
210+
}) : _logger = logger;
211+
212+
final Logger _logger;
213+
208214
/// Builds the AAR and POM files for the current Flutter module or plugin.
209215
@override
210216
Future<void> buildAar({
@@ -238,7 +244,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
238244
androidPackage: project.manifest.androidPackage,
239245
repoDirectory: getRepoDirectory(outputDirectory),
240246
buildNumber: buildNumber,
241-
logger: globals.logger,
247+
logger: _logger,
242248
fileSystem: globals.fs,
243249
);
244250
} finally {
@@ -326,8 +332,8 @@ class AndroidGradleBuilder implements AndroidBuilder {
326332
BuildEvent('app-using-android-x', flutterUsage: globals.flutterUsage).send();
327333
} else if (!usesAndroidX) {
328334
BuildEvent('app-not-using-android-x', flutterUsage: globals.flutterUsage).send();
329-
globals.printStatus("$warningMark Your app isn't using AndroidX.", emphasis: true);
330-
globals.printStatus(
335+
_logger.printStatus("$warningMark Your app isn't using AndroidX.", emphasis: true);
336+
_logger.printStatus(
331337
'To avoid potential build failures, you can quickly migrate your app '
332338
'by following the steps on https://goo.gl/CP92wY .',
333339
indent: 4,
@@ -339,7 +345,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
339345

340346
if (shouldBuildPluginAsAar) {
341347
// Create a settings.gradle that doesn't import the plugins as subprojects.
342-
createSettingsAarGradle(project.android.hostAppGradleRoot);
348+
createSettingsAarGradle(project.android.hostAppGradleRoot, _logger);
343349
await buildPluginsAsAar(
344350
project,
345351
androidBuildInfo,
@@ -352,15 +358,15 @@ class AndroidGradleBuilder implements AndroidBuilder {
352358
? getBundleTaskFor(buildInfo)
353359
: getAssembleTaskFor(buildInfo);
354360

355-
final Status status = globals.logger.startProgress(
361+
final Status status = _logger.startProgress(
356362
"Running Gradle task '$assembleTask'...",
357363
multilineOutput: true,
358364
);
359365

360366
final List<String> command = <String>[
361367
gradleUtils.getExecutable(project),
362368
];
363-
if (globals.logger.isVerbose) {
369+
if (_logger.isVerbose) {
364370
command.add('-Pverbose=true');
365371
} else {
366372
command.add('-q');
@@ -374,7 +380,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
374380
engineOutPath: localEngineArtifacts.engineOutPath,
375381
androidBuildInfo: androidBuildInfo,
376382
);
377-
globals.printTrace(
383+
_logger.printTrace(
378384
'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
379385
'Local Maven repo: ${localEngineRepo.path}'
380386
);
@@ -528,7 +534,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
528534
await _performCodeSizeAnalysis('aab', bundleFile, androidBuildInfo);
529535
}
530536

531-
globals.printStatus(
537+
_logger.printStatus(
532538
'$successMark Built ${globals.fs.path.relative(bundleFile.path)}$appSize.',
533539
color: TerminalColor.green,
534540
);
@@ -552,15 +558,15 @@ class AndroidGradleBuilder implements AndroidBuilder {
552558
apkFile.copySync(apkDirectory
553559
.childFile('app.apk')
554560
.path);
555-
globals.printTrace('calculateSha: $apkDirectory/app.apk');
561+
_logger.printTrace('calculateSha: $apkDirectory/app.apk');
556562

557563
final File apkShaFile = apkDirectory.childFile('app.apk.sha1');
558564
apkShaFile.writeAsStringSync(_calculateSha(apkFile));
559565

560566
final String appSize = (buildInfo.mode == BuildMode.debug)
561567
? '' // Don't display the size when building a debug variant.
562568
: ' (${getSizeAsMB(apkFile.lengthSync())})';
563-
globals.printStatus(
569+
_logger.printStatus(
564570
'$successMark Built ${globals.fs.path.relative(apkFile.path)}$appSize.',
565571
color: TerminalColor.green,
566572
);
@@ -575,7 +581,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
575581
AndroidBuildInfo androidBuildInfo,) async {
576582
final SizeAnalyzer sizeAnalyzer = SizeAnalyzer(
577583
fileSystem: globals.fs,
578-
logger: globals.logger,
584+
logger: _logger,
579585
flutterUsage: globals.flutterUsage,
580586
);
581587
final String archName = getNameForAndroidArch(androidBuildInfo.targetArchs.single);
@@ -597,7 +603,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
597603
)
598604
..writeAsStringSync(jsonEncode(output));
599605
// This message is used as a sentinel in analyze_apk_size_test.dart
600-
globals.printStatus(
606+
_logger.printStatus(
601607
'A summary of your ${kind.toUpperCase()} analysis can be found at: ${outputFile.path}',
602608
);
603609

@@ -606,7 +612,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
606612
.split('.flutter-devtools/')
607613
.last
608614
.trim();
609-
globals.printStatus(
615+
_logger.printStatus(
610616
'\nTo analyze your app size in Dart DevTools, run the following command:\n'
611617
'flutter pub global activate devtools; flutter pub global run devtools '
612618
'--appSizeBase=$relativeAppSizePath'
@@ -639,7 +645,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
639645

640646
final BuildInfo buildInfo = androidBuildInfo.buildInfo;
641647
final String aarTask = getAarTaskFor(buildInfo);
642-
final Status status = globals.logger.startProgress(
648+
final Status status = _logger.startProgress(
643649
"Running Gradle task '$aarTask'...",
644650
multilineOutput: true,
645651
);
@@ -660,7 +666,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
660666
'-Pis-plugin=${manifest.isPlugin}',
661667
'-PbuildNumber=$buildNumber'
662668
];
663-
if (globals.logger.isVerbose) {
669+
if (_logger.isVerbose) {
664670
command.add('-Pverbose=true');
665671
} else {
666672
command.add('-q');
@@ -674,7 +680,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
674680
}
675681
command.addAll(androidBuildInfo.buildInfo.toGradleConfig());
676682
if (buildInfo.dartObfuscation && buildInfo.mode != BuildMode.release) {
677-
globals.printStatus(
683+
_logger.printStatus(
678684
'Dart obfuscation is not supported in ${toTitleCase(buildInfo.friendlyModeName)}'
679685
' mode, building as un-obfuscated.',
680686
);
@@ -686,9 +692,9 @@ class AndroidGradleBuilder implements AndroidBuilder {
686692
engineOutPath: localEngineArtifacts.engineOutPath,
687693
androidBuildInfo: androidBuildInfo,
688694
);
689-
globals.printTrace(
690-
'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
691-
'Local Maven repo: ${localEngineRepo.path}'
695+
_logger.printTrace(
696+
'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
697+
'Local Maven repo: ${localEngineRepo.path}'
692698
);
693699
command.add('-Plocal-engine-repo=${localEngineRepo.path}');
694700
command.add('-Plocal-engine-build-mode=${buildInfo.modeName}');
@@ -732,23 +738,23 @@ class AndroidGradleBuilder implements AndroidBuilder {
732738
globals.flutterUsage.sendTiming('build', 'gradle-aar', sw.elapsed);
733739

734740
if (result.exitCode != 0) {
735-
globals.printStatus(result.stdout, wrap: false);
736-
globals.printError(result.stderr, wrap: false);
741+
_logger.printStatus(result.stdout, wrap: false);
742+
_logger.printError(result.stderr, wrap: false);
737743
throwToolExit(
738744
'Gradle task $aarTask failed with exit code ${result.exitCode}.',
739745
exitCode: result.exitCode,
740746
);
741747
}
742748
final Directory repoDirectory = getRepoDirectory(outputDirectory);
743749
if (!repoDirectory.existsSync()) {
744-
globals.printStatus(result.stdout, wrap: false);
745-
globals.printError(result.stderr, wrap: false);
750+
_logger.printStatus(result.stdout, wrap: false);
751+
_logger.printError(result.stderr, wrap: false);
746752
throwToolExit(
747753
'Gradle task $aarTask failed to produce $repoDirectory.',
748754
exitCode: exitCode,
749755
);
750756
}
751-
globals.printStatus(
757+
_logger.printStatus(
752758
'$successMark Built ${globals.fs.path.relative(repoDirectory.path)}.',
753759
color: TerminalColor.green,
754760
);
@@ -777,10 +783,10 @@ class AndroidGradleBuilder implements AndroidBuilder {
777783
final String pluginName = pluginParts.first;
778784
final File buildGradleFile = pluginDirectory.childDirectory('android').childFile('build.gradle');
779785
if (!buildGradleFile.existsSync()) {
780-
globals.printTrace("Skipping plugin $pluginName since it doesn't have a android/build.gradle file");
786+
_logger.printTrace("Skipping plugin $pluginName since it doesn't have a android/build.gradle file");
781787
continue;
782788
}
783-
globals.logger.printStatus('Building plugin $pluginName...');
789+
_logger.printStatus('Building plugin $pluginName...');
784790
try {
785791
await buildGradleAar(
786792
project: FlutterProject.fromDirectory(pluginDirectory),
@@ -876,15 +882,8 @@ String _hex(List<int> bytes) {
876882
}
877883

878884
String _calculateSha(File file) {
879-
final Stopwatch sw = Stopwatch()..start();
880885
final List<int> bytes = file.readAsBytesSync();
881-
globals.printTrace('calculateSha: reading file took ${sw.elapsedMilliseconds}us');
882-
globals.flutterUsage.sendTiming('build', 'apk-sha-read', sw.elapsed);
883-
sw.reset();
884-
final String sha = _hex(sha1.convert(bytes).bytes);
885-
globals.printTrace('calculateSha: computing sha took ${sw.elapsedMilliseconds}us');
886-
globals.flutterUsage.sendTiming('build', 'apk-sha-calc', sw.elapsed);
887-
return sha;
886+
return _hex(sha1.convert(bytes).bytes);
888887
}
889888

890889
void _exitWithUnsupportedProjectMessage() {

packages/flutter_tools/lib/src/application_package.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class ApplicationPackageFactory {
6565
case TargetPlatform.android_x64:
6666
case TargetPlatform.android_x86:
6767
if (_androidSdk?.licensesAvailable == true && _androidSdk?.latestVersion == null) {
68-
await checkGradleDependencies();
68+
await checkGradleDependencies(_logger);
6969
}
7070
if (applicationBinary == null) {
7171
return await AndroidApk.fromAndroidProject(

packages/flutter_tools/lib/src/base/logger.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,15 +413,15 @@ class WindowsStdoutLogger extends StdoutLogger {
413413

414414
@override
415415
void writeToStdOut(String message) {
416-
// TODO(jcollins-g): wrong abstraction layer for this, move to [Stdio].
417416
final String windowsMessage = _terminal.supportsEmoji
418417
? message
419418
: message.replaceAll('🔥', '')
420419
.replaceAll('🖼️', '')
421420
.replaceAll('✗', 'X')
422421
.replaceAll('✓', '√')
423422
.replaceAll('🔨', '')
424-
.replaceAll('💪', '');
423+
.replaceAll('💪', '')
424+
.replaceAll('✏️', '');
425425
_stdio.stdoutWrite(windowsMessage);
426426
}
427427
}

packages/flutter_tools/lib/src/base/terminal.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ abstract class Terminal {
8484
/// Create a new test [Terminal].
8585
///
8686
/// If not specified, [supportsColor] defaults to `false`.
87-
factory Terminal.test({bool supportsColor}) = _TestTerminal;
87+
factory Terminal.test({bool supportsColor, bool supportsEmoji}) = _TestTerminal;
8888

8989
/// Whether the current terminal supports color escape codes.
9090
bool get supportsColor;
@@ -317,7 +317,7 @@ class AnsiTerminal implements Terminal {
317317
}
318318

319319
class _TestTerminal implements Terminal {
320-
_TestTerminal({this.supportsColor = false});
320+
_TestTerminal({this.supportsColor = false, this.supportsEmoji = false});
321321

322322
@override
323323
bool usesTerminalUi;
@@ -351,7 +351,7 @@ class _TestTerminal implements Terminal {
351351
final bool supportsColor;
352352

353353
@override
354-
bool get supportsEmoji => false;
354+
final bool supportsEmoji;
355355

356356
@override
357357
bool get stdinHasTerminal => false;

packages/flutter_tools/lib/src/context_runner.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ Future<T> runInContext<T>(
7979
body: runnerWrapper,
8080
overrides: overrides,
8181
fallbacks: <Type, Generator>{
82-
AndroidBuilder: () => AndroidGradleBuilder(),
82+
AndroidBuilder: () => AndroidGradleBuilder(
83+
logger: globals.logger,
84+
),
8385
AndroidLicenseValidator: () => AndroidLicenseValidator(
8486
operatingSystemUtils: globals.os,
8587
platform: globals.platform,

packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:flutter_tools/src/artifacts.dart';
1414
import 'package:flutter_tools/src/base/context.dart';
1515
import 'package:flutter_tools/src/base/file_system.dart';
1616
import 'package:flutter_tools/src/base/io.dart';
17+
import 'package:flutter_tools/src/base/logger.dart';
1718
import 'package:flutter_tools/src/base/platform.dart';
1819
import 'package:flutter_tools/src/build_info.dart';
1920
import 'package:flutter_tools/src/cache.dart';
@@ -29,6 +30,7 @@ import '../../src/mocks.dart';
2930

3031
void main() {
3132
group('gradle build', () {
33+
BufferLogger logger;
3234
TestUsage testUsage;
3335
MockAndroidSdk mockAndroidSdk;
3436
MockAndroidStudio mockAndroidStudio;
@@ -41,6 +43,7 @@ void main() {
4143
AndroidGradleBuilder builder;
4244

4345
setUp(() {
46+
logger = BufferLogger.test();
4447
testUsage = TestUsage();
4548
fileSystem = MemoryFileSystem.test();
4649
fileSystemUtils = MockFileSystemUtils();
@@ -49,7 +52,9 @@ void main() {
4952
mockArtifacts = MockLocalEngineArtifacts();
5053
mockProcessManager = MockProcessManager();
5154
android = fakePlatform('android');
52-
builder = AndroidGradleBuilder();
55+
builder = AndroidGradleBuilder(
56+
logger: logger,
57+
);
5358

5459
when(mockAndroidSdk.directory).thenReturn('irrelevant');
5560

@@ -660,7 +665,7 @@ void main() {
660665
);
661666

662667
expect(
663-
testLogger.statusText,
668+
logger.statusText,
664669
contains('Built build/app/outputs/flutter-apk/app-release.apk (0.0MB)'),
665670
);
666671

@@ -708,11 +713,11 @@ void main() {
708713
);
709714

710715
expect(
711-
testLogger.statusText,
716+
logger.statusText,
712717
contains('Built build/outputs/repo'),
713718
);
714719
expect(
715-
testLogger.statusText.contains('Consuming the Module'),
720+
logger.statusText.contains('Consuming the Module'),
716721
isFalse,
717722
);
718723

0 commit comments

Comments
 (0)