flutter 1.17升级

升级

最近官方发布了flutter 稳定版本1.17.0 ,记录下升级1.17 ios上碰到的的问题

App产物

在 1.12.13 的时候,为了支持模拟器运行,会进行 debug 产物 跟 release 产物的merge (lipo create …)
debug 产物 x86 、release 产物 arm64 arm7

升级到1.17.0 之后 ,merge报错

IMAGE

lipo 查看下

IMAGE

发现针对模拟器的debug产物 含有arm64

Debug Flutter tool源码, build 里面进行了两次createStubAppFramework(iphone && simulator)
然后做了merge,实际上environment参数里面 iosArchs只有 arch x86,所以问题出在这里

DebugUniveralFramework

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@override
Future<void> build(Environment environment) async {
// Generate a trivial App.framework.
final Set<DarwinArch> iosArchs = environment.defines[kIosArchs]
?.split(' ')
?.map(getIOSArchForName)
?.toSet()
?? <DarwinArch>{DarwinArch.arm64};
final File iphoneFile = environment.buildDir.childFile('iphone_framework');
final File simulatorFile = environment.buildDir.childFile('simulator_framework');
final File lipoOutputFile = environment.buildDir.childFile('App');
final RunResult iphoneResult = await createStubAppFramework(
iphoneFile,
SdkType.iPhone,
// Only include 32bit if it is contained in the active architectures.
include32Bit: iosArchs.contains(DarwinArch.armv7)
);
final RunResult simulatorResult = await createStubAppFramework(
simulatorFile,
SdkType.iPhoneSimulator,
);
if (iphoneResult.exitCode != 0 || simulatorResult.exitCode != 0) {
throw Exception('Failed to create App.framework.');
}
final List<String> lipoCommand = <String>[
'xcrun',
'lipo',
'-create',
iphoneFile.path,
simulatorFile.path,
'-output',
lipoOutputFile.path
];
final RunResult lipoResult = await processUtils.run(
lipoCommand,
);

if (lipoResult.exitCode != 0) {
throw Exception('Failed to create App.framework.');
}
}

解决办法 可以通过archs 判断下具体执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@override
Future<void> build(Environment environment) async {
// Generate a trivial App.framework.
final Set<DarwinArch> iosArchs = environment.defines[kIosArchs]
?.split(' ')
?.map(getIOSArchForName)
?.toSet()
?? <DarwinArch>{DarwinArch.arm64};
final File iphoneFile = environment.buildDir.childFile('iphone_framework');
final File simulatorFile = environment.buildDir.childFile('simulator_framework');
final File lipoOutputFile = environment.buildDir.childFile('App');

RunResult iphoneResult;

if(iosArchs.contains(DarwinArch.arm64) || iosArchs.contains(DarwinArch.armv7)) {
iphoneResult = await createStubAppFramework(
iphoneFile,
SdkType.iPhone,
// Only include 32bit if it is contained in the active architectures.
include32Bit: iosArchs.contains(DarwinArch.armv7)
);
if (iphoneResult.exitCode != 0) {
throw Exception('(iphoneResult)Failed to create App.framework.');
}
}

RunResult simulatorResult;

if(iosArchs.contains(DarwinArch.x86_64)) {
simulatorResult = await createStubAppFramework(
simulatorFile,
SdkType.iPhoneSimulator,
);
if (simulatorResult.exitCode != 0) {
throw Exception('(simulatorResult)Failed to create App.framework.');
}
}

if(simulatorResult == null) {
iphoneFile.copySync(lipoOutputFile.path);
return;
}

if(iphoneResult == null) {
simulatorFile.copySync(lipoOutputFile.path);
return;
}

final List<String> lipoCommand = <String>[
'xcrun',
'lipo',
'-create',
iphoneFile.path,
simulatorFile.path,
'-output',
lipoOutputFile.path
];
final RunResult lipoResult = await processUtils.run(
lipoCommand,
);

if (lipoResult.exitCode != 0) {
throw Exception('Failed to create App.framework.');
}
}

突然想到 既然1.17 对debug 产物做了arm64的支持,那我们收集产物是不是可以不用自己做merge,发现是不可以的
因为除了App.framework,还有plugin native代码生成的pod静态库 libxxx.a。
静态库 是哪里生成的呢?

这里 build_ios.dart -> buildXcodeProject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...

final List<String> buildCommands = <String>[
'/usr/bin/env',
'xcrun',
'xcodebuild',
'-configuration', configuration,
];

...

if (buildForDevice) {
buildCommands.addAll(<String>['-sdk', 'iphoneos']);
} else {
buildCommands.addAll(<String>['-sdk', 'iphonesimulator', '-arch', 'x86_64']);
}

...

这里只针对x86做了xcode build,所以还是要自己merge的…