Optimize flutter run logic for iOS by "ONLY_ACTIVE_ARCH=YES" if possible (#27817)

This commit is contained in:
KyleWong 2019-02-12 12:24:57 +08:00 committed by GitHub
parent 963d69d8b1
commit 52687c7910
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 2 deletions

View file

@ -243,6 +243,9 @@ class IOSDevice extends Device {
// TODO(chinmaygarde): Use mainPath, route.
printTrace('Building ${package.name} for $id');
final String cpuArchitecture = await iMobileDevice.getInfoForDevice(id, 'CPUArchitecture');
final IOSArch iosArch = getIOSArchForName(cpuArchitecture);
// Step 1: Build the precompiled/DBC application if necessary.
final XcodeBuildResult buildResult = await buildXcodeProject(
app: package,
@ -250,6 +253,7 @@ class IOSDevice extends Device {
targetOverride: mainPath,
buildForDevice: true,
usesTerminalUi: usesTerminalUi,
activeArch: iosArch
);
if (!buildResult.success) {
printError('Could not build the precompiled application for the device.');

View file

@ -134,7 +134,7 @@ class IMobileDevice {
Future<String> getInfoForDevice(String deviceID, String key) async {
try {
final ProcessResult result = await processManager.run(<String>['ideviceinfo', '-u', deviceID, '-k', key, '--simple']);
final ProcessResult result = await processManager.run(<String>['ideviceinfo', '-u', deviceID, '-k', key]);
if (result.exitCode == 255 && result.stdout != null && result.stdout.contains('No device found'))
throw IOSDeviceNotFoundError('ideviceinfo could not find device:\n${result.stdout}');
if (result.exitCode != 0)
@ -294,6 +294,7 @@ Future<XcodeBuildResult> buildXcodeProject({
BuildInfo buildInfo,
String targetOverride,
bool buildForDevice,
IOSArch activeArch,
bool codesign = true,
bool usesTerminalUi = true,
}) async {
@ -435,6 +436,14 @@ Future<XcodeBuildResult> buildXcodeProject({
buildCommands.addAll(<String>['-sdk', 'iphonesimulator', '-arch', 'x86_64']);
}
if (activeArch != null) {
final String activeArchName = getNameForIOSArch(activeArch);
if (activeArchName != null) {
buildCommands.add('ONLY_ACTIVE_ARCH=YES');
buildCommands.add('ARCHS=$activeArchName');
}
}
if (!codesign) {
buildCommands.addAll(
<String>[

View file

@ -130,7 +130,7 @@ void main() {
});
testUsingContext('getInfoForDevice throws IOSDeviceNotFoundError when ideviceinfo returns specific error code and message', () async {
when(mockProcessManager.run(<String>['ideviceinfo', '-u', 'foo', '-k', 'bar', '--simple']))
when(mockProcessManager.run(<String>['ideviceinfo', '-u', 'foo', '-k', 'bar']))
.thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(1, 255, 'No device found with udid foo, is it plugged in?', '')));
expect(() async => await iMobileDevice.getInfoForDevice('foo', 'bar'), throwsA(isInstanceOf<IOSDeviceNotFoundError>()));
}, overrides: <Type, Generator>{