我正在尝试重建我的 Android Studio Gradle 项目(主要包含 Kotlin 代码),但它UnableToDeleteFileException在清理/重建过程中开始抛出:
UnableToDeleteFileException
Execution failed for task ':app:clean'. > Unable to delete file: C:\Users\User\KotlinGameEngine\app\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.0.1\jars\classes.jar
这在我尝试更改项目的包结构后开始发生。不幸的是,我通过重命名和移动源文件夹而不是通过 Android Studio 重构来做到这一点,这是一个坏主意。
我整天都在寻找解决这个问题的方法,这些都是我试图无济于事的事情:
gradle
.gradle
gradlew clean
我尝试过的事情取得了一点成功,但只让我在错误再次发生之前再执行一次清理和重建:
java.exe
因此,似乎编译 Java 过程可能会出于某种原因对构建文件进行锁定,但也可能与 Kotlin 有关。我有一个(更成熟的)Java Android 项目,我正在处理它,但在清理它时我无法重现此错误。它似乎只发生在我的 Kotlin 项目中。
我发现问题是由 Kotlin Android 插件引起的。apply plugin: 'kotlin- android'当我从模块的文件中删除时问题消失了build.gradle,当我重新插入它时又回来了。随时提供对此的任何见解。
apply plugin: 'kotlin- android'
build.gradle
上次更新不是原因。我发现如果一个项目包含一个 Kotlin 文件,那么重建和清理就会失败。即使删除了所有 Kotlin 文件,它也会继续失败,直到后台 Java 进程被杀死,这意味着它对构建文件有某种锁定。我在这里提交了一个错误,其中包含更多详细信息和重现错误的步骤:KT-9440
在我向 Kotlin 错误跟踪器发布错误报告后,我在 AOSP 跟踪器上收到了问题 61300的通知。这似乎是原因。由于目前我无能为力,因此我将此问题标记为已回答,如果错误已修复,我将更新答案。
同时,如果您运行的是 Windows,我相信我已经找到了解决方法。您需要下载LockHunter(当然风险自负),然后将以下内容添加到模块gradle.build文件中,将lockhunter变量替换为 LockHunter.exe 的路径:
gradle.build
lockhunter
task clean(type: Exec) { ext.lockhunter = '\"C:\\LockHunter.exe\"' def buildDir = file(new File("build")) commandLine 'cmd', "$lockhunter", '/delete', '/silent', buildDir }
这会导致 LockHunter 在 app:clean 任务运行时强制且静默地解锁和删除构建文件。