diff --git a/dev/devicelab/bin/tasks/ios_content_validation_test.dart b/dev/devicelab/bin/tasks/ios_content_validation_test.dart index e84b346ec0..753958095a 100644 --- a/dev/devicelab/bin/tasks/ios_content_validation_test.dart +++ b/dev/devicelab/bin/tasks/ios_content_validation_test.dart @@ -182,6 +182,43 @@ Future main() async { await flutter('clean'); }); + section('Build app for simulator with all available architectures'); + + // Apple Silicon ARM simulators not yet supported. + // Prove (on Xcode 12) Flutter knows to exclude this architecture. + await inDirectory(flutterProject.rootPath, () async { + await flutter('build', options: [ + 'ios', + '--simulator', + '--no-codesign', + '--verbose', + ], environment: { + 'FLUTTER_XCODE_ONLY_ACTIVE_ARCH': 'NO' + }); + }); + + final String simulatorAppFrameworkBinary = path.join( + flutterProject.rootPath, + 'build', + 'ios', + 'iphonesimulator', + 'Runner.app', + 'Frameworks', + 'App.framework', + 'App', + ); + + final String archs = await fileType(simulatorAppFrameworkBinary); + if (!archs.contains('Mach-O 64-bit dynamically linked shared library x86_64')) { + throw TaskResult.failure('Unexpected architecture'); + } + + section('Clean build'); + + await inDirectory(flutterProject.rootPath, () async { + await flutter('clean'); + }); + section('Archive'); await inDirectory(flutterProject.rootPath, () async { diff --git a/packages/flutter_tools/bin/podhelper.rb b/packages/flutter_tools/bin/podhelper.rb index a5d720b31c..ae81f7cdab 100644 --- a/packages/flutter_tools/bin/podhelper.rb +++ b/packages/flutter_tools/bin/podhelper.rb @@ -68,6 +68,9 @@ def flutter_additional_ios_build_settings(target) # When deleted, the deployment version will inherit from the higher version derived from the 'Runner' target. # If the pod only supports a higher version, do not delete to correctly produce an error. build_configuration.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' if inherit_deployment_target + + # Apple Silicon ARM simulators not yet supported. + build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386' end end diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 5ce33fb1d3..65c356429e 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -250,7 +250,7 @@ Future buildXcodeProject({ if (buildForDevice) { buildCommands.addAll(['-sdk', 'iphoneos']); } else { - buildCommands.addAll(['-sdk', 'iphonesimulator', '-arch', 'x86_64']); + buildCommands.addAll(['-sdk', 'iphonesimulator']); } } diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart index 7cf04c1ba9..5f7c99220f 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart @@ -209,6 +209,9 @@ List _xcodeBuildSettingsLines({ if (useMacOSConfig) { // ARM not yet supported https://github.com/flutter/flutter/issues/69221 xcodeBuildSettings.add('EXCLUDED_ARCHS=arm64'); + } else { + // Apple Silicon ARM simulators not yet supported. + xcodeBuildSettings.add('EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64 i386'); } for (final MapEntry config in buildInfo.toEnvironmentConfig().entries) { diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart index 30b3b686f6..4052a0c62c 100644 --- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart @@ -683,12 +683,14 @@ Information about project "Runner": final String contents = config.readAsStringSync(); expect(contents.contains('ARCHS=armv7'), isTrue); + expect(contents.contains('EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64 i386'), isTrue); final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh'); expect(buildPhaseScript.existsSync(), isTrue); final String buildPhaseScriptContents = buildPhaseScript.readAsStringSync(); expect(buildPhaseScriptContents.contains('ARCHS=armv7'), isTrue); + expect(buildPhaseScriptContents.contains('"EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64 i386"'), isTrue); }); testUsingOsxContext('sets TRACK_WIDGET_CREATION=true when trackWidgetCreation is true', () async { diff --git a/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart b/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart index a2b86f5690..7382a46ced 100644 --- a/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart +++ b/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart @@ -41,10 +41,7 @@ void main() { // Config is updated if command succeeded. expect(generatedConfig, exists); - expect(generatedConfig.readAsStringSync(), allOf( - contains('DART_OBFUSCATION=true'), - isNot(contains('EXCLUDED_ARCHS')), - )); + expect(generatedConfig.readAsStringSync(), contains('DART_OBFUSCATION=true')); // file that only exists if app was fully built. final File frameworkPlist = fileSystem.file(