You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM跨平台项目切换构建平台时因Gradle实例锁冲突导致构建失败

解决KMM跨平台构建时的Gradle缓存锁冲突问题

我之前维护KMM项目时也踩过一模一样的坑,本质是两个独立的Gradle进程在争抢同一个缓存目录的锁——一边是Android Studio运行的Gradle守护进程,另一边是Xcode构建脚本触发的Gradle进程,两者都要访问~/.gradle/caches下的文件哈希缓存,直接导致了你看到的超时报错。

问题根源

普通的Android或iOS单平台项目不会同时触发两边的Gradle进程,但KMM项目因为依赖共享模块,Xcode构建时会通过embedAndSignAppleFrameworkForXcode任务调用Gradle,这就和Android Studio的Gradle Daemon形成了锁竞争,最终触发超时错误。

实用解决方案

1. 给Xcode的Gradle进程分配独立缓存目录(根治方案)

这是我最推荐的解决办法,让Xcode和Android Studio的Gradle各用各的缓存,彻底避免冲突:

  • 打开Xcode项目,进入Build Phases找到执行Gradle任务的Run Script(一般名为[KOTLIN] Embed Framework)
  • 将原来的命令:
    ./gradlew :shared:embedAndSignAppleFrameworkForXcode
    
    修改为:
    ./gradlew -g ~/.gradle/xcode-kmm-cache :shared:embedAndSignAppleFrameworkForXcode
    
    这里~/.gradle/xcode-kmm-cache是专门给Xcode构建用的缓存目录,你可以自定义路径。之后Xcode构建时会使用独立缓存,再也不会和Android Studio抢锁了。

2. 延长Gradle锁超时时间(临时缓解)

如果不想折腾缓存目录,也可以让Gradle多等一会儿再报错:

  • 在项目根目录的gradle.properties中添加一行:
    org.gradle.caches.lock.timeout=120s
    
    这个设置会让Gradle在获取锁失败时等待120秒再重试,大概率能等到另一个进程释放锁,但高并发构建时仍可能出现冲突。

3. 优化Gradle守护进程配置(辅助优化)

让Gradle守护进程保持更长时间,尽量复用同一个进程,减少冲突概率:

  • 在gradle.properties里添加:
    org.gradle.daemon=true
    org.gradle.daemon.idletimeout=3600s
    
    这个设置会让Android Studio的Gradle守护进程待命1小时,Xcode构建时如果时机合适,会直接复用这个daemon,不用启动新进程,自然就不会有锁冲突了。

补充说明

你提到项目支持embedAndSignAppleFrameworkForXcode任务,这个任务正是Xcode构建KMM共享框架的核心,每次Xcode编译都会触发它调用Gradle——这也是锁冲突的直接触发点,所以上面的方案都是围绕隔离或协调两个Gradle进程的缓存访问来解决问题的。

内容的提问来源于stack exchange,提问作者mrky125

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:13:12