Gradle编译Android单元测试任务:app:compileMainAppDebugUnitTestKotlin卡住
排查与解决方案
- 确认是否触发Kotlin编译器死锁bug
你当前使用的Kotlin 1.3.72版本存在已知的编译期死锁问题,合并分支后如果出现跨类的循环引用、inline函数嵌套调用、reified泛型跨模块调用的代码,很容易触发编译器进入死循环。可通过如下操作验证:
执行任务时添加参数:./gradlew :app:compileMainAppDebugUnitTestKotlin -Dkotlin.compiler.execution.strategy="in-process"
任务卡住后执行jstack <kotlin编译器进程ID>导出线程栈,检查是否存在2个以上编译器线程互相持有锁的情况,如果确认是死锁,可临时将Kotlin版本升级到1.3.x系列最终版本1.3.81即可修复。 - 检查测试依赖冲突
两个分支独立运行正常,合并后可能出现测试依赖版本不匹配的问题,执行以下命令检查测试依赖的版本冲突:./gradlew :app:dependencies --configuration testImplementation
将冲突的测试依赖(如JUnit、MockK、测试版AndroidX库等)强制对齐到同一版本即可。 - 彻底清理编译缓存
先关闭Android Studio,依次删除项目根目录下的.gradle文件夹、项目所有模块的build文件夹、用户根目录下.gradle/caches中对应Gradle 6.5版本的缓存目录,重启后重新执行编译任务,排除缓存损坏导致的卡住问题。 - 禁用增量编译验证
执行任务时添加参数禁用增量编译:./gradlew :app:compileMainAppDebugUnitTestKotlin -Pkotlin.compiler.incremental=false
如果全量编译可以正常完成,可在gradle.properties中添加kotlin.incremental.useClasspathSnapshot=false临时规避类路径快照的bug。
内容的提问来源于stack exchange,提问作者clever_trevor
相关产品推荐
相关产品推荐

