[CP-beta]Prevent `flutter build ios-framework --xcframework` from copying `Flutter.xcframework.dSYM` into the `App.framework` folder. (#158131)
This pull request is created by [automatic cherry pick workflow](https://github.com/flutter/flutter/blob/main/docs/releases/Flutter-Cherrypick-Process.md#automatically-creates-a-cherry-pick-request)
Please fill in the form below, and a flutter domain expert will evaluate this cherry pick request.
### Issue Link:
What is the link to the issue this cherry-pick is addressing?
https://github.com/flutter/flutter/issues/157359
### Changelog Description:
Explain this cherry pick in one line that is accessible to most Flutter developers. See [best practices](https://github.com/flutter/flutter/blob/main/docs/releases/Hotfix-Documentation-Best-Practices.md) for examples
Prevents `flutter build ios-framework --xcframework` from copying an extraneous Flutter.xcframework.dSYM into the App.framework folder
### Impact Description:
What is the impact (ex. visual jank on Samsung phones, app crash, cannot ship an iOS app)? Does it impact development (ex. flutter doctor crashes when Android Studio is installed), or the shipping production app (the app crashes on launch)
Previously, `flutter build ios-framework --xcframework` would fail with
`error: Multiple commands produce '......./BuildProductsPath/Release-iphoneos/Flutter.framework.dSYM/Contents'`.
Is there a workaround for this issue?
The workaround is to delete `App.xcframework/ios-arm64/dSYMs/Flutter.framework.dSYM`.
### Risk:
What is the risk level of this cherry-pick?
### Test Coverage:
Are you confident that your fix is well-tested by automated tests?
### Validation Steps:
What are the steps to validate that this fix works?
Try to build any example app with `flutter build ios-framework --xcframework`, then inspect the App.framework folder. It should only include `App.framework.dSYM`, and not `Flutter.xcframework.dSYM `
diff --git a/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart b/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart
index fc9c07f..af6c85e 100644
--- a/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart
+++ b/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart
@@ -188,15 +188,25 @@
'vm_snapshot_data',
));
+ final String dsymPath = path.join(
+ outputPath,
+ mode,
+ 'App.xcframework',
+ 'ios-arm64',
+ 'dSYMs'
+ );
+ checkDirectoryExists(dsymPath);
+
final String appFrameworkDsymPath = path.join(
- outputPath,
- mode,
- 'App.xcframework',
- 'ios-arm64',
- 'dSYMs',
- 'App.framework.dSYM'
+ dsymPath,
+ 'App.framework.dSYM'
);
checkDirectoryExists(appFrameworkDsymPath);
+
+ if (Directory(dsymPath).listSync().whereType<Directory>().length != 1) {
+ throw TaskResult.failure('App.framework/dSYMs should ONLY contain App.xcframework.dSYM');
+ }
+
await _checkDsym(path.join(
appFrameworkDsymPath,
'Contents',
diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
index fd65893..27fe92c 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
@@ -150,7 +150,7 @@
...framework.parent
.listSync()
.where((FileSystemEntity entity) =>
- entity.basename.endsWith('dSYM'))
+ entity.basename.endsWith('dSYM') && !entity.basename.startsWith('Flutter'))
.map((FileSystemEntity entity) => <String>['-debug-symbols', entity.path])
.expand<String>((List<String> parameter) => parameter),
],
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart
index 605e1df..1ee8e0a 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart
@@ -558,6 +558,8 @@
final Directory parentA = fileSystem.directory('FrameworkA')..createSync();
final File dSYMA = parentA.childFile('FrameworkA.framework.dSYM')..createSync();
final Directory frameworkA = parentA.childDirectory('FrameworkA.framework')..createSync();
+ // Flutter.framework.dSYM should be correctly filtered out.
+ parentA.childFile('Flutter.framework.dSYM').createSync();
final Directory parentB = fileSystem.directory('FrameworkB')..createSync();
final File dSYMB = parentB.childFile('FrameworkB.framework.dSYM')..createSync();