Skip to content

Commit a102051

Browse files
authored
Support iOS arm64 simulator (#85059)
1 parent 00c73d0 commit a102051

File tree

9 files changed

+44
-27
lines changed

9 files changed

+44
-27
lines changed

dev/devicelab/bin/tasks/build_ios_framework_module_test.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
147147
outputPath,
148148
'Debug',
149149
'App.xcframework',
150-
'ios-x86_64-simulator',
150+
'ios-arm64_x86_64-simulator',
151151
'App.framework',
152152
'flutter_assets',
153153
'vm_snapshot_data',
@@ -210,7 +210,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
210210
outputPath,
211211
mode,
212212
'App.xcframework',
213-
'ios-x86_64-simulator',
213+
'ios-arm64_x86_64-simulator',
214214
'App.framework',
215215
'App',
216216
));
@@ -312,7 +312,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
312312
outputPath,
313313
mode,
314314
'device_info.xcframework',
315-
'ios-x86_64-simulator',
315+
'ios-arm64_x86_64-simulator',
316316
'device_info.framework',
317317
'device_info',
318318
);
@@ -321,7 +321,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
321321
outputPath,
322322
mode,
323323
'device_info.xcframework',
324-
'ios-x86_64-simulator',
324+
'ios-arm64_x86_64-simulator',
325325
'device_info.framework',
326326
'Headers',
327327
'DeviceInfoPlugin.h',
@@ -368,7 +368,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
368368
outputPath,
369369
mode,
370370
'FlutterPluginRegistrant.xcframework',
371-
'ios-x86_64-simulator',
371+
'ios-arm64_x86_64-simulator',
372372
'FlutterPluginRegistrant.framework',
373373
'Headers',
374374
'GeneratedPluginRegistrant.h',

dev/integration_tests/ios_host_app/Host.xcodeproj/project.pbxproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,6 @@
447447
DEBUG_INFORMATION_FORMAT = dwarf;
448448
ENABLE_STRICT_OBJC_MSGSEND = YES;
449449
ENABLE_TESTABILITY = YES;
450-
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
451450
GCC_C_LANGUAGE_STANDARD = gnu11;
452451
GCC_DYNAMIC_NO_PIC = NO;
453452
GCC_NO_COMMON_BLOCKS = YES;

dev/integration_tests/ios_host_app_swift/Host.xcodeproj/project.pbxproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,6 @@
390390
buildSettings = {
391391
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
392392
CODE_SIGN_STYLE = Automatic;
393-
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
394393
INFOPLIST_FILE = Host/Info.plist;
395394
LD_RUNPATH_SEARCH_PATHS = (
396395
"$(inherited)",

packages/flutter_tools/bin/podhelper.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def flutter_additional_ios_build_settings(target)
5555
# Profile can't be derived from the CocoaPods build configuration. Use release framework (for linking only).
5656
configuration_engine_dir = build_configuration.type == :debug ? debug_framework_dir : release_framework_dir
5757
Dir.new(configuration_engine_dir).each_child do |xcframework_file|
58-
if xcframework_file.end_with?("-simulator") # ios-x86_64-simulator
58+
if xcframework_file.end_with?("-simulator") # ios-arm64_x86_64-simulator
5959
build_configuration.build_settings['FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]'] = "\"#{configuration_engine_dir}/#{xcframework_file}\" $(inherited)"
6060
elsif xcframework_file.start_with?("ios-") # ios-armv7_arm64
6161
build_configuration.build_settings['FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]'] = "\"#{configuration_engine_dir}/#{xcframework_file}\" $(inherited)"
@@ -72,8 +72,9 @@ def flutter_additional_ios_build_settings(target)
7272
# If the pod only supports a higher version, do not delete to correctly produce an error.
7373
build_configuration.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' if inherit_deployment_target
7474

75-
# Apple Silicon ARM simulators not yet supported.
76-
build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386'
75+
# Override legacy Xcode 11 style VALID_ARCHS[sdk=iphonesimulator*]=x86_64 and prefer Xcode 12 EXCLUDED_ARCHS.
76+
build_configuration.build_settings['VALID_ARCHS[sdk=iphonesimulator*]'] = '$(ARCHS_STANDARD)'
77+
build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'i386'
7778
end
7879
end
7980

packages/flutter_tools/lib/src/artifacts.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -672,9 +672,8 @@ String _getIosEngineArtifactPath(String engineDirectory,
672672
if (!platformDirectory.basename.startsWith('ios-')) {
673673
continue;
674674
}
675-
// ios-x86_64-simulator, ios-armv7_arm64 (Xcode 11), or ios-arm64_armv7 (Xcode 12).
676-
final bool simulatorDirectory =
677-
platformDirectory.basename.endsWith('-simulator');
675+
// ios-x86_64-simulator, ios-arm64_x86_64-simulator, ios-armv7_arm64 (Xcode 11), or ios-arm64_armv7 (Xcode 12).
676+
final bool simulatorDirectory = platformDirectory.basename.endsWith('-simulator');
678677
if ((environmentType == EnvironmentType.simulator && simulatorDirectory) ||
679678
(environmentType == EnvironmentType.physical && !simulatorDirectory)) {
680679
flutterFrameworkSource = platformDirectory;

packages/flutter_tools/lib/src/build_info.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,8 +547,8 @@ List<DarwinArch> defaultIOSArchsForEnvironment(
547547
EnvironmentType environmentType) {
548548
if (environmentType == EnvironmentType.simulator) {
549549
return <DarwinArch>[
550-
// Apple Silicon ARM simulators not yet supported.
551550
DarwinArch.x86_64,
551+
DarwinArch.arm64,
552552
];
553553
}
554554
return <DarwinArch>[
@@ -876,7 +876,7 @@ const String kIosArchs = 'IosArchs';
876876
/// The define to control what macOS architectures are built for.
877877
///
878878
/// This is expected to be a space-delimited list of architectures. If not
879-
/// provided, defautls to x86_64.
879+
/// provided, defaults to x86_64.
880880
///
881881
/// Supported values are x86_64 and arm64.
882882
const String kDarwinArchs = 'DarwinArchs';

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,6 @@ end
454454
simulatorConfiguration,
455455
'SYMROOT=${simulatorBuildOutput.path}',
456456
'ENABLE_BITCODE=YES', // Support host apps with bitcode enabled.
457-
'ARCHS=x86_64',
458457
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
459458
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
460459
];

packages/flutter_tools/lib/src/ios/xcode_build_settings.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,9 @@ List<String> _xcodeBuildSettingsLines({
190190
String arch;
191191
if (localEngineName.endsWith('_arm')) {
192192
arch = 'armv7';
193+
} else if (localEngineName.contains('_arm64')) {
194+
arch = 'arm64';
193195
} else if (localEngineName.contains('_sim')) {
194-
// Apple Silicon ARM simulators not yet supported.
195196
arch = 'x86_64';
196197
} else {
197198
arch = 'arm64';
@@ -203,8 +204,7 @@ List<String> _xcodeBuildSettingsLines({
203204
// ARM not yet supported https://github.com/flutter/flutter/issues/69221
204205
xcodeBuildSettings.add('EXCLUDED_ARCHS=arm64');
205206
} else {
206-
// Apple Silicon ARM simulators not yet supported.
207-
xcodeBuildSettings.add('EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64 i386');
207+
xcodeBuildSettings.add('EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386');
208208
}
209209

210210
for (final MapEntry<String, String> config in buildInfo.toEnvironmentConfig().entries) {

packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ Information about project "Runner":
698698

699699
final String contents = config.readAsStringSync();
700700
expect(contents.contains('ARCHS=armv7'), isTrue);
701-
expect(contents.contains('EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64 i386'), isTrue);
701+
expect(contents.contains('EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386'), isTrue);
702702

703703
final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
704704
expect(buildPhaseScript.existsSync(), isTrue);
@@ -751,13 +751,33 @@ Information about project "Runner":
751751
});
752752

753753
group('sim local engine', () {
754-
Artifacts localArtifacts;
754+
testUsingContext('sets ARCHS=x86_64 when x86 sim local engine is set', () async {
755+
const BuildInfo buildInfo = BuildInfo.debug;
756+
final FlutterProject project = FlutterProject.fromDirectoryTest(fs.directory('path/to/project'));
757+
await updateGeneratedXcodeProperties(
758+
project: project,
759+
buildInfo: buildInfo,
760+
);
755761

756-
setUp(() {
757-
localArtifacts = Artifacts.test(localEngine: 'out/ios_debug_sim_unopt');
762+
final File config = fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
763+
expect(config.existsSync(), isTrue);
764+
765+
final String contents = config.readAsStringSync();
766+
expect(contents.contains('ARCHS=x86_64'), isTrue);
767+
768+
final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
769+
expect(buildPhaseScript.existsSync(), isTrue);
770+
771+
final String buildPhaseScriptContents = buildPhaseScript.readAsStringSync();
772+
expect(buildPhaseScriptContents.contains('ARCHS=x86_64'), isTrue);
773+
}, overrides: <Type, Generator>{
774+
Artifacts: () => Artifacts.test(localEngine: 'out/ios_debug_sim_unopt'),
775+
Platform: () => macOS,
776+
FileSystem: () => fs,
777+
ProcessManager: () => FakeProcessManager.any(),
758778
});
759779

760-
testUsingContext('sets ARCHS=x86_64 when sim local engine is set', () async {
780+
testUsingContext('sets ARCHS=arm64 when arm64 sim local engine is set', () async {
761781
const BuildInfo buildInfo = BuildInfo.debug;
762782
final FlutterProject project = FlutterProject.fromDirectoryTest(fs.directory('path/to/project'));
763783
await updateGeneratedXcodeProperties(
@@ -769,15 +789,15 @@ Information about project "Runner":
769789
expect(config.existsSync(), isTrue);
770790

771791
final String contents = config.readAsStringSync();
772-
expect(contents.contains('ARCHS=x86_64'), isTrue);
792+
expect(contents.contains('ARCHS=arm64'), isTrue);
773793

774794
final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
775795
expect(buildPhaseScript.existsSync(), isTrue);
776796

777797
final String buildPhaseScriptContents = buildPhaseScript.readAsStringSync();
778-
expect(buildPhaseScriptContents.contains('ARCHS=x86_64'), isTrue);
798+
expect(buildPhaseScriptContents.contains('ARCHS=arm64'), isTrue);
779799
}, overrides: <Type, Generator>{
780-
Artifacts: () => localArtifacts,
800+
Artifacts: () => Artifacts.test(localEngine: 'out/ios_debug_sim_arm64'),
781801
Platform: () => macOS,
782802
FileSystem: () => fs,
783803
ProcessManager: () => FakeProcessManager.any(),

0 commit comments

Comments
 (0)