[Reland] Skip injecting Bonjour settings when port publication is disabled (#136751)
Reland of https://github.com/flutter/flutter/pull/136562 with fixes.
This commit is contained in:
parent
697242c9f1
commit
1599cbebc3
@ -886,6 +886,7 @@ class StartupTest {
|
||||
'-v',
|
||||
'--profile',
|
||||
'--target=$target',
|
||||
if (deviceOperatingSystem == DeviceOperatingSystem.ios) '--no-publish-port',
|
||||
]);
|
||||
final String buildRoot = path.join(testDirectory, 'build');
|
||||
applicationBinaryPath = _findDarwinAppInBuildDirectory(buildRoot);
|
||||
|
@ -256,6 +256,12 @@ class Context {
|
||||
|
||||
// Add the vmService publisher Bonjour service to the produced app bundle Info.plist.
|
||||
void addVmServiceBonjourService() {
|
||||
// Skip adding Bonjour service settings when DISABLE_PORT_PUBLICATION is YES.
|
||||
// These settings are not needed if port publication is disabled.
|
||||
if (environment['DISABLE_PORT_PUBLICATION'] == 'YES') {
|
||||
return;
|
||||
}
|
||||
|
||||
final String buildMode = parseFlutterBuildMode();
|
||||
|
||||
// Debug and profile only.
|
||||
|
@ -27,7 +27,11 @@ import 'build.dart';
|
||||
/// Builds an .app for an iOS app to be used for local testing on an iOS device
|
||||
/// or simulator. Can only be run on a macOS host.
|
||||
class BuildIOSCommand extends _BuildIOSSubCommand {
|
||||
BuildIOSCommand({ required super.logger, required super.verboseHelp }) {
|
||||
BuildIOSCommand({
|
||||
required super.logger,
|
||||
required bool verboseHelp,
|
||||
}) : super(verboseHelp: verboseHelp) {
|
||||
addPublishPort(verboseHelp: verboseHelp);
|
||||
argParser
|
||||
..addFlag('config-only',
|
||||
help: 'Update the project configuration without performing a build. '
|
||||
@ -658,6 +662,9 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand {
|
||||
configOnly: configOnly,
|
||||
buildAction: xcodeBuildAction,
|
||||
deviceID: globals.deviceManager?.specifiedDeviceId,
|
||||
disablePortPublication: usingCISystem &&
|
||||
xcodeBuildAction == XcodeBuildAction.build &&
|
||||
await disablePortPublication,
|
||||
);
|
||||
xcodeBuildResult = result;
|
||||
|
||||
|
@ -501,6 +501,7 @@ class IOSDevice extends Device {
|
||||
targetOverride: mainPath,
|
||||
activeArch: cpuArchitecture,
|
||||
deviceID: id,
|
||||
disablePortPublication: debuggingOptions.usingCISystem && debuggingOptions.disablePortPublication,
|
||||
);
|
||||
if (!buildResult.success) {
|
||||
_logger.printError('Could not build the precompiled application for the device.');
|
||||
|
@ -135,6 +135,7 @@ Future<XcodeBuildResult> buildXcodeProject({
|
||||
String? deviceID,
|
||||
bool configOnly = false,
|
||||
XcodeBuildAction buildAction = XcodeBuildAction.build,
|
||||
bool disablePortPublication = false,
|
||||
}) async {
|
||||
if (!upgradePbxProjWithFlutterAssets(app.project, globals.logger)) {
|
||||
return XcodeBuildResult(success: false);
|
||||
@ -382,6 +383,12 @@ Future<XcodeBuildResult> buildXcodeProject({
|
||||
_kResultBundleVersion,
|
||||
]);
|
||||
|
||||
// Adds a setting which xcode_backend.dart will use to skip adding Bonjour
|
||||
// service settings to the Info.plist.
|
||||
if (disablePortPublication) {
|
||||
buildCommands.add('DISABLE_PORT_PUBLICATION=YES');
|
||||
}
|
||||
|
||||
// Don't log analytics for downstream Flutter commands.
|
||||
// e.g. `flutter build bundle`.
|
||||
buildCommands.add('FLUTTER_SUPPRESS_ANALYTICS=true');
|
||||
|
@ -146,6 +146,7 @@ void main() {
|
||||
bool verbose = false,
|
||||
bool simulator = false,
|
||||
bool customNaming = false,
|
||||
bool disablePortPublication = false,
|
||||
String? deviceId,
|
||||
int exitCode = 0,
|
||||
String? stdout,
|
||||
@ -189,6 +190,8 @@ void main() {
|
||||
],
|
||||
'-resultBundlePath', _xcBundleDirectoryPath,
|
||||
'-resultBundleVersion', '3',
|
||||
if (disablePortPublication)
|
||||
'DISABLE_PORT_PUBLICATION=YES',
|
||||
'FLUTTER_SUPPRESS_ANALYTICS=true',
|
||||
'COMPILER_INDEX_STORE_ENABLE=NO',
|
||||
],
|
||||
@ -303,6 +306,65 @@ void main() {
|
||||
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
|
||||
});
|
||||
|
||||
testUsingContext('ios build invokes xcode build with disable port publication setting', () async {
|
||||
final BuildCommand command = BuildCommand(
|
||||
androidSdk: FakeAndroidSdk(),
|
||||
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
|
||||
fileSystem: MemoryFileSystem.test(),
|
||||
logger: BufferLogger.test(),
|
||||
osUtils: FakeOperatingSystemUtils(),
|
||||
);
|
||||
createMinimalMockProjectFiles();
|
||||
|
||||
await createTestCommandRunner(command).run(
|
||||
const <String>['build', 'ios', '--no-pub', '--no-publish-port', '--ci']
|
||||
);
|
||||
expect(testLogger.statusText, contains('build/ios/iphoneos/Runner.app'));
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
|
||||
xattrCommand,
|
||||
setUpFakeXcodeBuildHandler(
|
||||
disablePortPublication: true,
|
||||
onRun: () {
|
||||
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
|
||||
},
|
||||
),
|
||||
setUpRsyncCommand(),
|
||||
]),
|
||||
Platform: () => macosPlatform,
|
||||
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
|
||||
});
|
||||
|
||||
testUsingContext('ios build invokes xcode build without disable port publication setting when not in CI', () async {
|
||||
final BuildCommand command = BuildCommand(
|
||||
androidSdk: FakeAndroidSdk(),
|
||||
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
|
||||
fileSystem: MemoryFileSystem.test(),
|
||||
logger: BufferLogger.test(),
|
||||
osUtils: FakeOperatingSystemUtils(),
|
||||
);
|
||||
createMinimalMockProjectFiles();
|
||||
|
||||
await createTestCommandRunner(command).run(
|
||||
const <String>['build', 'ios', '--no-pub', '--no-publish-port']
|
||||
);
|
||||
expect(testLogger.statusText, contains('build/ios/iphoneos/Runner.app'));
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
|
||||
xattrCommand,
|
||||
setUpFakeXcodeBuildHandler(
|
||||
onRun: () {
|
||||
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
|
||||
},
|
||||
),
|
||||
setUpRsyncCommand(),
|
||||
]),
|
||||
Platform: () => macosPlatform,
|
||||
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
|
||||
});
|
||||
|
||||
testUsingContext('ios build invokes xcode build with renamed xcodeproj and xcworkspace', () async {
|
||||
final BuildCommand command = BuildCommand(
|
||||
artifacts: artifacts,
|
||||
|
@ -604,6 +604,32 @@ void main() {
|
||||
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
|
||||
});
|
||||
|
||||
testUsingContext('ipa build invokes xcode build without disablePortPublication', () async {
|
||||
final BuildCommand command = BuildCommand(
|
||||
androidSdk: FakeAndroidSdk(),
|
||||
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
|
||||
fileSystem: MemoryFileSystem.test(),
|
||||
logger: BufferLogger.test(),
|
||||
osUtils: FakeOperatingSystemUtils(),
|
||||
);
|
||||
fakeProcessManager.addCommands(<FakeCommand>[
|
||||
xattrCommand,
|
||||
setUpFakeXcodeBuildHandler(),
|
||||
exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist),
|
||||
]);
|
||||
createMinimalMockProjectFiles();
|
||||
|
||||
await createTestCommandRunner(command).run(
|
||||
const <String>['build', 'ipa', '--no-pub', '--ci']
|
||||
);
|
||||
expect(fakeProcessManager, hasNoRemainingExpectations);
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => fakeProcessManager,
|
||||
Platform: () => macosPlatform,
|
||||
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
|
||||
});
|
||||
|
||||
testUsingContext('ipa build --no-codesign skips codesigning and IPA creation', () async {
|
||||
final BuildCommand command = BuildCommand(
|
||||
artifacts: artifacts,
|
||||
|
@ -183,5 +183,30 @@ void main() {
|
||||
''');
|
||||
expect(result, const ProcessResultMatcher());
|
||||
});
|
||||
|
||||
test('does not add bonjour settings when port publication is disabled', () async {
|
||||
infoPlist.writeAsStringSync('''
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
</dict>
|
||||
</plist>''');
|
||||
|
||||
final ProcessResult result = await Process.run(
|
||||
xcodeBackendPath,
|
||||
<String>['test_vm_service_bonjour_service'],
|
||||
environment: <String, String>{
|
||||
'CONFIGURATION': 'Debug',
|
||||
'BUILT_PRODUCTS_DIR': buildDirectory.path,
|
||||
'INFOPLIST_PATH': 'Info.plist',
|
||||
'DISABLE_PORT_PUBLICATION': 'YES',
|
||||
},
|
||||
);
|
||||
|
||||
expect(infoPlist.readAsStringSync().contains('NSBonjourServices'), isFalse);
|
||||
expect(infoPlist.readAsStringSync().contains('NSLocalNetworkUsageDescription'), isFalse);
|
||||
expect(result, const ProcessResultMatcher());
|
||||
});
|
||||
}, skip: !io.Platform.isMacOS); // [intended] requires macos toolchain.
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user