Skip to content

Commit 6017be5

Browse files
jmagmanexaby73
authored andcommitted
Remove Finder extended attributes in build target before code signing iOS frameworks (flutter#123896)
Remove Finder extended attributes in build target before code signing iOS frameworks
1 parent ec47c9d commit 6017be5

File tree

3 files changed

+81
-18
lines changed

3 files changed

+81
-18
lines changed

packages/flutter_tools/lib/src/build_system/targets/ios.dart

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import '../../base/build.dart';
99
import '../../base/common.dart';
1010
import '../../base/file_system.dart';
1111
import '../../base/io.dart';
12+
import '../../base/process.dart';
1213
import '../../build_info.dart';
1314
import '../../globals.dart' as globals;
15+
import '../../ios/mac.dart';
1416
import '../../macos/xcode.dart';
1517
import '../../project.dart';
1618
import '../../reporting/reporting.dart';
@@ -296,7 +298,7 @@ abstract class UnpackIOS extends Target {
296298
if (buildMode == BuildMode.release) {
297299
_bitcodeStripFramework(environment, frameworkBinaryPath);
298300
}
299-
_signFramework(environment, frameworkBinaryPath, buildMode);
301+
await _signFramework(environment, frameworkBinary, buildMode);
300302
}
301303

302304
void _copyFramework(Environment environment, String sdkRoot) {
@@ -463,7 +465,7 @@ abstract class IosAssetBundle extends Target {
463465
}
464466
final BuildMode buildMode = BuildMode.fromCliName(environmentBuildMode);
465467
final Directory frameworkDirectory = environment.outputDir.childDirectory('App.framework');
466-
final String frameworkBinaryPath = frameworkDirectory.childFile('App').path;
468+
final File frameworkBinary = frameworkDirectory.childFile('App');
467469
final Directory assetDirectory = frameworkDirectory.childDirectory('flutter_assets');
468470
frameworkDirectory.createSync(recursive: true);
469471
assetDirectory.createSync();
@@ -474,7 +476,7 @@ abstract class IosAssetBundle extends Target {
474476
environment.buildDir
475477
.childDirectory('App.framework')
476478
.childFile('App')
477-
.copySync(frameworkBinaryPath);
479+
.copySync(frameworkBinary.path);
478480

479481
final String vmSnapshotData = environment.artifacts.getArtifactPath(Artifact.vmSnapshotData, mode: BuildMode.debug);
480482
final String isolateSnapshotData = environment.artifacts.getArtifactPath(Artifact.isolateSnapshotData, mode: BuildMode.debug);
@@ -486,7 +488,7 @@ abstract class IosAssetBundle extends Target {
486488
.copySync(assetDirectory.childFile('isolate_snapshot_data').path);
487489
} else {
488490
environment.buildDir.childDirectory('App.framework').childFile('App')
489-
.copySync(frameworkBinaryPath);
491+
.copySync(frameworkBinary.path);
490492
}
491493

492494
// Copy the dSYM
@@ -539,7 +541,7 @@ abstract class IosAssetBundle extends Target {
539541
.childDirectory('App.framework')
540542
.childFile('Info.plist').path);
541543

542-
_signFramework(environment, frameworkBinaryPath, buildMode);
544+
await _signFramework(environment, frameworkBinary, buildMode);
543545
}
544546
}
545547

@@ -692,10 +694,16 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
692694
}
693695
}
694696

695-
_signFramework(environment, outputFile.path, BuildMode.debug);
697+
await _signFramework(environment, outputFile, BuildMode.debug);
696698
}
697699

698-
void _signFramework(Environment environment, String binaryPath, BuildMode buildMode) {
700+
Future<void> _signFramework(Environment environment, File binary, BuildMode buildMode) async {
701+
await removeFinderExtendedAttributes(
702+
binary,
703+
ProcessUtils(processManager: environment.processManager, logger: environment.logger),
704+
environment.logger,
705+
);
706+
699707
String? codesignIdentity = environment.defines[kCodesignIdentity];
700708
if (codesignIdentity == null || codesignIdentity.isEmpty) {
701709
codesignIdentity = '-';
@@ -709,13 +717,13 @@ void _signFramework(Environment environment, String binaryPath, BuildMode buildM
709717
// Mimic Xcode's timestamp codesigning behavior on non-release binaries.
710718
'--timestamp=none',
711719
],
712-
binaryPath,
720+
binary.path,
713721
]);
714722
if (result.exitCode != 0) {
715723
final String stdout = (result.stdout as String).trim();
716724
final String stderr = (result.stderr as String).trim();
717725
final StringBuffer output = StringBuffer();
718-
output.writeln('Failed to codesign $binaryPath with identity $codesignIdentity.');
726+
output.writeln('Failed to codesign ${binary.path} with identity $codesignIdentity.');
719727
if (stdout.isNotEmpty) {
720728
output.writeln(stdout);
721729
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'dart:async';
66

7-
import 'package:meta/meta.dart';
87
import 'package:process/process.dart';
98

109
import '../artifacts.dart';
@@ -493,8 +492,7 @@ Future<XcodeBuildResult> buildXcodeProject({
493492

494493
/// Extended attributes applied by Finder can cause code signing errors. Remove them.
495494
/// https://developer.apple.com/library/archive/qa/qa1940/_index.html
496-
@visibleForTesting
497-
Future<void> removeFinderExtendedAttributes(Directory projectDirectory, ProcessUtils processUtils, Logger logger) async {
495+
Future<void> removeFinderExtendedAttributes(FileSystemEntity projectDirectory, ProcessUtils processUtils, Logger logger) async {
498496
final bool success = await processUtils.exitsHappy(
499497
<String>[
500498
'xattr',

packages/flutter_tools/test/general.shard/build_system/targets/ios_test.dart

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ void main() {
104104
'-o',
105105
appFrameworkPath,
106106
]),
107+
FakeCommand(command: <String>[
108+
'xattr',
109+
'-r',
110+
'-d',
111+
'com.apple.FinderInfo',
112+
appFrameworkPath,
113+
]),
107114
FakeCommand(command: <String>[
108115
'codesign',
109116
'--force',
@@ -141,6 +148,13 @@ void main() {
141148
'-o',
142149
appFrameworkPath,
143150
]),
151+
FakeCommand(command: <String>[
152+
'xattr',
153+
'-r',
154+
'-d',
155+
'com.apple.FinderInfo',
156+
appFrameworkPath,
157+
]),
144158
FakeCommand(command: <String>[
145159
'codesign',
146160
'--force',
@@ -195,7 +209,14 @@ void main() {
195209

196210
final Directory frameworkDirectory = environment.outputDir.childDirectory('App.framework');
197211
final File frameworkDirectoryBinary = frameworkDirectory.childFile('App');
198-
processManager.addCommand(
212+
processManager.addCommands(<FakeCommand>[
213+
FakeCommand(command: <String>[
214+
'xattr',
215+
'-r',
216+
'-d',
217+
'com.apple.FinderInfo',
218+
frameworkDirectoryBinary.path,
219+
]),
199220
FakeCommand(command: <String>[
200221
'codesign',
201222
'--force',
@@ -204,7 +225,7 @@ void main() {
204225
'--timestamp=none',
205226
frameworkDirectoryBinary.path,
206227
]),
207-
);
228+
]);
208229

209230
await const DebugIosApplicationBundle().build(environment);
210231
expect(processManager, hasNoRemainingExpectations);
@@ -267,6 +288,13 @@ void main() {
267288
'--include=/',
268289
'--include=/./shader_lib',
269290
]),
291+
FakeCommand(command: <String>[
292+
'xattr',
293+
'-r',
294+
'-d',
295+
'com.apple.FinderInfo',
296+
frameworkDirectoryBinary.path,
297+
]),
270298
FakeCommand(command: <String>[
271299
'codesign',
272300
'--force',
@@ -323,15 +351,22 @@ void main() {
323351

324352
final Directory frameworkDirectory = environment.outputDir.childDirectory('App.framework');
325353
final File frameworkDirectoryBinary = frameworkDirectory.childFile('App');
326-
processManager.addCommand(
354+
processManager.addCommands(<FakeCommand>[
355+
FakeCommand(command: <String>[
356+
'xattr',
357+
'-r',
358+
'-d',
359+
'com.apple.FinderInfo',
360+
frameworkDirectoryBinary.path,
361+
]),
327362
FakeCommand(command: <String>[
328363
'codesign',
329364
'--force',
330365
'--sign',
331366
'ABC123',
332367
frameworkDirectoryBinary.path,
333368
]),
334-
);
369+
]);
335370

336371
await const ReleaseIosApplicationBundle().build(environment);
337372
expect(processManager, hasNoRemainingExpectations);
@@ -371,15 +406,22 @@ void main() {
371406

372407
final Directory frameworkDirectory = environment.outputDir.childDirectory('App.framework');
373408
final File frameworkDirectoryBinary = frameworkDirectory.childFile('App');
374-
processManager.addCommand(
409+
processManager.addCommands(<FakeCommand>[
410+
FakeCommand(command: <String>[
411+
'xattr',
412+
'-r',
413+
'-d',
414+
'com.apple.FinderInfo',
415+
frameworkDirectoryBinary.path,
416+
]),
375417
FakeCommand(command: <String>[
376418
'codesign',
377419
'--force',
378420
'--sign',
379421
'-',
380422
frameworkDirectoryBinary.path,
381423
]),
382-
);
424+
]);
383425

384426
await const ReleaseIosApplicationBundle().build(environment);
385427
expect(usage.events, contains(const TestUsageEvent('assemble', 'ios-archive', label: 'success')));
@@ -466,6 +508,7 @@ void main() {
466508
late FakeCommand copyPhysicalFrameworkCommand;
467509
late FakeCommand lipoCommandNonFatResult;
468510
late FakeCommand lipoVerifyArm64Command;
511+
late FakeCommand xattrCommand;
469512
late FakeCommand adHocCodesignCommand;
470513

471514
setUp(() {
@@ -495,6 +538,14 @@ void main() {
495538
'arm64',
496539
]);
497540

541+
xattrCommand = FakeCommand(command: <String>[
542+
'xattr',
543+
'-r',
544+
'-d',
545+
'com.apple.FinderInfo',
546+
binary.path,
547+
]);
548+
498549
adHocCodesignCommand = FakeCommand(command: <String>[
499550
'codesign',
500551
'--force',
@@ -538,6 +589,7 @@ void main() {
538589
'-verify_arch',
539590
'x86_64',
540591
]),
592+
xattrCommand,
541593
adHocCodesignCommand,
542594
]);
543595
await const DebugUnpackIOS().build(environment);
@@ -684,6 +736,7 @@ void main() {
684736
copyPhysicalFrameworkCommand,
685737
lipoCommandNonFatResult,
686738
lipoVerifyArm64Command,
739+
xattrCommand,
687740
adHocCodesignCommand,
688741
]);
689742
await const DebugUnpackIOS().build(environment);
@@ -733,6 +786,7 @@ void main() {
733786
'armv7',
734787
binary.path,
735788
]),
789+
xattrCommand,
736790
adHocCodesignCommand,
737791
]);
738792

@@ -810,6 +864,7 @@ void main() {
810864
copyPhysicalFrameworkCommand,
811865
lipoCommandNonFatResult,
812866
lipoVerifyArm64Command,
867+
xattrCommand,
813868
adHocCodesignCommand,
814869
]);
815870
await const DebugUnpackIOS().build(environment);
@@ -838,6 +893,7 @@ void main() {
838893
copyPhysicalFrameworkCommand,
839894
lipoCommandNonFatResult,
840895
lipoVerifyArm64Command,
896+
xattrCommand,
841897
FakeCommand(command: <String>[
842898
'codesign',
843899
'--force',
@@ -885,6 +941,7 @@ void main() {
885941
copyPhysicalFrameworkCommand,
886942
lipoCommandNonFatResult,
887943
lipoVerifyArm64Command,
944+
xattrCommand,
888945
FakeCommand(command: <String>[
889946
'codesign',
890947
'--force',

0 commit comments

Comments
 (0)