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中添加一行:
这个设置会让Gradle在获取锁失败时等待120秒再重试,大概率能等到另一个进程释放锁,但高并发构建时仍可能出现冲突。org.gradle.caches.lock.timeout=120s
3. 优化Gradle守护进程配置(辅助优化)
让Gradle守护进程保持更长时间,尽量复用同一个进程,减少冲突概率:
- 在
gradle.properties里添加:
这个设置会让Android Studio的Gradle守护进程待命1小时,Xcode构建时如果时机合适,会直接复用这个daemon,不用启动新进程,自然就不会有锁冲突了。org.gradle.daemon=true org.gradle.daemon.idletimeout=3600s
补充说明
你提到项目支持embedAndSignAppleFrameworkForXcode任务,这个任务正是Xcode构建KMM共享框架的核心,每次Xcode编译都会触发它调用Gradle——这也是锁冲突的直接触发点,所以上面的方案都是围绕隔离或协调两个Gradle进程的缓存访问来解决问题的。
内容的提问来源于stack exchange,提问作者mrky125
相关产品推荐
相关产品推荐

