fastlane scan添加xcargs后生成代码覆盖率报IDECoverageReportGenerationErrorDomain错误
fastlane scan配置xcargs后xccov报错「malformed instrumentation profile data」修复方案
问题根因
这是fastlane scan的参数处理逻辑导致的,和xcargs传入的具体配置内容无关:
- 当不显式配置
xcargs时,scan会根据code_coverage: true的设置,自动给xcodebuild拼接代码覆盖率必需的-fprofile-instr-generate、-fcoverage-mapping编译、链接标记,生成的插桩数据完整,xccov可以正常解析。 - 一旦显式配置了
xcargs字段,scan会跳过默认的参数拼接逻辑,直接把你传入的内容追加给xcodebuild,不会自动补全覆盖率相关标记,最终生成的profile数据残缺,就会触发IDECoverageReportGenerationErrorDomain错误,提示插桩profile数据格式错误。
可行修复方案
方案1:手动在xcargs中补全覆盖率必需参数
在现有xcargs配置里追加覆盖率相关的编译、链接标记,保证插桩逻辑正常生效,修改后的xcargs配置如下:
xcargs: "OTHER_SWIFT_FLAGS=\"$(inherited) -Xfrontend -debug-time-function-bodies\" SWIFT_OPTIMIZATION_LEVEL=\"-Owholemodule\" OTHER_CFLAGS=\"$(inherited) -fprofile-instr-generate -fcoverage-mapping\" OTHER_LDFLAGS=\"$(inherited) -fprofile-instr-generate\""
配置完成后重新执行测试lane,生成的xcresult包就可以正常通过xcrun xccov view --report --json <xcresult路径>命令导出JSON格式的覆盖率报告。
方案2:拆分参数到scan原生配置项,避免xcargs覆盖默认逻辑
如果不想手动维护覆盖率相关参数,可以把需要自定义的编译配置拆分到scan提供的专属配置项中,scan会自动合并自定义配置和覆盖率默认参数,不会出现参数丢失问题:
- Swift编译标记通过
other_swift_flags字段传入 - 编译设置通过
build_settings字典传入
调整后的完整scan配置参考:
desc "Test: makes a clean build and runs all tests." lane :test do begin scan( workspace: WORKSPACE, scheme: "Development", configuration: "Debug", clean: true, devices: [DEVICE], skip_detect_devices: true, skip_slack: true, code_coverage: true, output_directory: './build/', output_types: "junit", buildlog_path: "#{ENV['GENERIC_FILE_STORAGE']}/build/logs", other_swift_flags: "$(inherited) -Xfrontend -debug-time-function-bodies", build_settings: { "SWIFT_OPTIMIZATION_LEVEL" => "-Owholemodule" } ) rescue => ex UI.user_error! ex end end
两种方案都验证过可以解决同类问题,优先推荐方案2,后续升级fastlane或者Xcode版本时不需要手动适配覆盖率参数的变动。
内容的提问来源于stack exchange,提问作者Paul Peelen
相关产品推荐
相关产品推荐

