如何让KMM的linkPodFramework系列Gradle任务并行执行?
KMM构建优化:iOS框架链接任务并行执行
核心问题分析
你遇到的linkPodFrameworkIosArm64、linkPodFrameworkIosX64、linkPodFrameworkIosSimulatorArm64任务串行单核心执行的问题,是因为KMM Cocoapods插件默认给这些任务添加了不必要的顺序依赖,同时LLVM链接器默认未启用多线程。以下是具体解决方法:
1. 让多架构链接任务并行执行
通过Gradle任务配置,移除不同架构链接任务之间的顺序依赖,允许它们并行运行(linkPodFrameworkIosFat必须等三个架构任务完成,无法并行)。
在build.gradle.kts的kotlin代码块外添加:
tasks.withType<org.jetbrains.kotlin.gradle.tasks.AbstractLinkTask>().configureEach { val validLinkTasks = listOf("linkPodFrameworkIosArm64", "linkPodFrameworkIosX64", "linkPodFrameworkIosSimulatorArm64") if (name in validLinkTasks) { // 移除与其他架构链接任务的依赖,仅保留对应架构的编译任务依赖 dependsOn.removeAll { task -> task is org.jetbrains.kotlin.gradle.tasks.AbstractLinkTask && task.name in validLinkTasks && task != this } } }
2. 启用LLVM链接器多线程
让单个链接任务利用多核心执行,大幅缩短单任务耗时。在kotlin块的targets配置中添加:
kotlin { // ... 原有配置 targets.withType<KotlinNativeTarget>().configureEach { binaries.all { // 让LLVM链接器使用全部可用核心,也可以指定具体数量如"-Xlinker -jobs=8" linkerOpts.add("-Xlinker -jobs") } } // ... 原有配置 }
3. 调整Gradle并行参数
在gradle.properties中增加以下配置,提升Gradle并行执行能力:
# 根据CPU核心数设置,M1建议设为8,旧款i7建议设为4-6 org.gradle.workers.max=8 # 允许Gradle在配置阶段并行处理项目 org.gradle.parallel.in-project=true
4. 额外优化建议
- 升级依赖版本:将Kotlin版本升级到1.9.20+,Ktor、Realm等依赖同步升级到对应兼容版本,新版本对KMM构建性能有显著优化。
- 调整JVM内存:将
org.gradle.jvmargs的-Xmx提升到4096M(M1)或3072M(旧款i7),避免内存不足导致的构建卡顿:org.gradle.jvmargs=-Xmx4096M -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options="-Xmx4096M" -XX:+UseParallelGC - 启用Kotlin Native缓存:添加
kotlin.native.cacheKind=both到gradle.properties,缓存Native编译结果。
内容的提问来源于stack exchange,提问作者Vladimír Šimek
相关产品推荐
相关产品推荐

