Skip to content

Commit d8a5f3d

Browse files
authored
Improves output file path logic in Android analyze (#136981)
1 parent 2dc8111 commit d8a5f3d

File tree

9 files changed

+39
-22
lines changed

9 files changed

+39
-22
lines changed

packages/flutter_tools/gradle/src/main/groovy/flutter.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,7 @@ class FlutterPlugin implements Plugin<Project> {
752752
//
753753
// See https://developer.android.com/training/app-links/ for more information about app link.
754754
//
755-
// The json will be stored in <project>/build/app/app-link-settings-<variant>.json
755+
// The json will be saved in path stored in outputPath parameter.
756756
//
757757
// An example json:
758758
// {
@@ -830,7 +830,7 @@ class FlutterPlugin implements Plugin<Project> {
830830
}
831831
}
832832
def generator = new JsonGenerator.Options().build()
833-
new File(project.buildDir, "app-link-settings-${variant.name}.json").write(generator.toJson(appLinkSettings))
833+
new File(project.getProperty("outputPath")).write(generator.toJson(appLinkSettings))
834834
}
835835
}
836836
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ abstract class AndroidBuilder {
4444
Future<List<String>> getBuildVariants({required FlutterProject project});
4545

4646
/// Outputs app link related project settings into a json file.
47-
Future<void> outputsAppLinkSettings(
47+
///
48+
/// The return future resolves to the path of the json file.
49+
Future<String> outputsAppLinkSettings(
4850
String buildVariant, {
4951
required FlutterProject project,
5052
});

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,24 +810,32 @@ class AndroidGradleBuilder implements AndroidBuilder {
810810
}
811811

812812
@override
813-
Future<void> outputsAppLinkSettings(
813+
Future<String> outputsAppLinkSettings(
814814
String buildVariant, {
815815
required FlutterProject project,
816816
}) async {
817817
final String taskName = _getOutputAppLinkSettingsTaskFor(buildVariant);
818+
final Directory directory = await project.buildDirectory
819+
.childDirectory('deeplink_data').create(recursive: true);
820+
final String outputPath = globals.fs.path.join(
821+
directory.absolute.path,
822+
'app-link-settings-$buildVariant.json',
823+
);
818824
final Stopwatch sw = Stopwatch()
819825
..start();
820826
final RunResult result = await _runGradleTask(
821827
taskName,
822-
options: const <String>['-q'],
828+
options: <String>['-q', '-PoutputPath=$outputPath'],
823829
project: project,
824830
);
825831
_usage.sendTiming('outputs', 'app link settings', sw.elapsed);
826832

827833
if (result.exitCode != 0) {
828834
_logger.printStatus(result.stdout, wrap: false);
829835
_logger.printError(result.stderr, wrap: false);
836+
throwToolExit(result.stderr);
830837
}
838+
return outputPath;
831839
}
832840
}
833841

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ class AndroidAnalyze {
4848
logger.printStatus(jsonEncode(await project.android.getBuildVariants()));
4949
case AndroidAnalyzeOption.outputAppLinkSettings:
5050
assert(buildVariant != null);
51-
await project.android.outputsAppLinkSettings(variant: buildVariant!);
52-
final String filePath = fileSystem.path.join(project.directory.path, 'build', 'app', 'app-link-settings-$buildVariant.json`');
51+
final String filePath = await project.android.outputsAppLinkSettings(variant: buildVariant!);
5352
logger.printStatus('result saved in $filePath');
5453
}
5554
}

packages/flutter_tools/lib/src/project.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,14 @@ class AndroidProject extends FlutterProjectPlatform {
501501

502502
/// Outputs app link related settings into a json file.
503503
///
504-
/// The file is stored in
505-
/// `<project>/build/app/app-link-settings-<variant>.json`.
506-
Future<void> outputsAppLinkSettings({required String variant}) async {
504+
/// The return future resolves to the path of the json file.
505+
///
506+
/// The future resolves to null if it fails to retrieve app link settings.
507+
Future<String> outputsAppLinkSettings({required String variant}) async {
507508
if (!existsSync() || androidBuilder == null) {
508-
return;
509+
throwToolExit('Target directory $hostAppGradleRoot is not an Android project');
509510
}
510-
await androidBuilder!.outputsAppLinkSettings(variant, project: parent);
511+
return androidBuilder!.outputsAppLinkSettings(variant, project: parent);
511512
}
512513

513514
bool _computeSupportedVersion() {

packages/flutter_tools/test/commands.shard/hermetic/android_analyze_test.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ void main() {
9494
const String buildVariant = 'release';
9595
await runner.run(<String>['analyze', '--android', '--output-app-link-settings', '--build-variant=$buildVariant', tempDir.path]);
9696
expect(builder.outputVariant, buildVariant);
97+
expect(logger.statusText, contains(builder.outputPath));
9798
}, overrides: <Type, Generator>{
9899
AndroidBuilder: () => builder,
99100
});
@@ -116,14 +117,16 @@ void main() {
116117
class FakeAndroidBuilder extends Fake implements AndroidBuilder {
117118
List<String> variants = const <String>[];
118119
String? outputVariant;
120+
final String outputPath = '/';
119121

120122
@override
121123
Future<List<String>> getBuildVariants({required FlutterProject project}) async {
122124
return variants;
123125
}
124126

125127
@override
126-
Future<void> outputsAppLinkSettings(String buildVariant, {required FlutterProject project}) async {
128+
Future<String> outputsAppLinkSettings(String buildVariant, {required FlutterProject project}) async {
127129
outputVariant = buildVariant;
130+
return outputPath;
128131
}
129132
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,9 @@ Gradle Crashed
914914
AndroidStudio: () => FakeAndroidStudio(),
915915
});
916916

917-
testUsingContext('can call custom gradle task getApplicationIdForVariant and parse the result', () async {
917+
testUsingContext('can call custom gradle task outputFreeDebugAppLinkSettings and parse the result', () async {
918+
final String expectedOutputPath;
919+
expectedOutputPath = fileSystem.path.join('/build/deeplink_data', 'app-link-settings-freeDebug.json');
918920
final AndroidGradleBuilder builder = AndroidGradleBuilder(
919921
java: FakeJava(),
920922
logger: logger,
@@ -927,10 +929,11 @@ Gradle Crashed
927929
platform: FakePlatform(),
928930
androidStudio: FakeAndroidStudio(),
929931
);
930-
processManager.addCommand(const FakeCommand(
932+
processManager.addCommand(FakeCommand(
931933
command: <String>[
932934
'gradlew',
933935
'-q',
936+
'-PoutputPath=$expectedOutputPath',
934937
'outputFreeDebugAppLinkSettings',
935938
],
936939
));
@@ -940,6 +943,8 @@ Gradle Crashed
940943
);
941944
}, overrides: <Type, Generator>{
942945
AndroidStudio: () => FakeAndroidStudio(),
946+
FileSystem: () => fileSystem,
947+
ProcessManager: () => processManager,
943948
});
944949

945950
testUsingContext("doesn't indicate how to consume an AAR when printHowToConsumeAar is false", () async {

packages/flutter_tools/test/integration.shard/android_gradle_outputs_app_link_settings_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,16 +175,16 @@ void main() {
175175
expect(result, const ProcessResultMatcher());
176176

177177
final Directory androidApp = tempDir.childDirectory('android');
178+
final io.File fileDump = tempDir.childDirectory('build').childDirectory('app').childFile('app-link-settings-debug.json');
178179
result = await processManager.run(<String>[
179180
'.${platform.pathSeparator}${getGradlewFileName(platform)}',
180181
...getLocalEngineArguments(),
181182
'-q', // quiet output.
183+
'-PoutputPath=${fileDump.path}',
182184
'outputDebugAppLinkSettings',
183185
], workingDirectory: androidApp.path);
184186

185187
expect(result, const ProcessResultMatcher());
186-
187-
final io.File fileDump = tempDir.childDirectory('build').childDirectory('app').childFile('app-link-settings-debug.json');
188188
expect(fileDump.existsSync(), true);
189189
final Map<String, dynamic> json = jsonDecode(fileDump.readAsStringSync()) as Map<String, dynamic>;
190190
expect(json['applicationId'], 'com.example.testapp');
@@ -220,16 +220,16 @@ void main() {
220220
expect(result, const ProcessResultMatcher());
221221

222222
final Directory androidApp = tempDir.childDirectory('android');
223+
final io.File fileDump = tempDir.childDirectory('build').childDirectory('app').childFile('app-link-settings-debug.json');
223224
result = await processManager.run(<String>[
224225
'.${platform.pathSeparator}${getGradlewFileName(platform)}',
225226
...getLocalEngineArguments(),
226227
'-q', // quiet output.
228+
'-PoutputPath=${fileDump.path}',
227229
'outputDebugAppLinkSettings',
228230
], workingDirectory: androidApp.path);
229231

230232
expect(result, const ProcessResultMatcher());
231-
232-
final io.File fileDump = tempDir.childDirectory('build').childDirectory('app').childFile('app-link-settings-debug.json');
233233
expect(fileDump.existsSync(), true);
234234
final Map<String, dynamic> json = jsonDecode(fileDump.readAsStringSync()) as Map<String, dynamic>;
235235
expect(json['applicationId'], 'com.example.testapp');

packages/flutter_tools/test/src/android_common.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,10 @@ class FakeAndroidBuilder implements AndroidBuilder {
4141
Future<List<String>> getBuildVariants({required FlutterProject project}) async => const <String>[];
4242

4343
@override
44-
Future<void> outputsAppLinkSettings(
44+
Future<String> outputsAppLinkSettings(
4545
String buildVariant, {
4646
required FlutterProject project,
47-
}) async {}
48-
47+
}) async => '/';
4948
}
5049

5150
/// Creates a [FlutterProject] in a directory named [flutter_project]

0 commit comments

Comments
 (0)