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

Android Studio 3.2.0-alpha11自定义插件配置阶段fileTree.getFiles()构建失败

解决Android Gradle插件3.2.0-alpha11下自定义插件遍历FileTree失败的问题

嘿,这个问题我熟!你升级到Android Studio 3.2 Canary 11(对应AGP 3.2.0-alpha11)后遇到的构建报错,本质是新版本的Android Gradle插件对构建阶段的文件访问权限做了更严格的限制——之前2.3.3版本没这么多约束,所以你的插件能正常跑,但现在不行了。

问题根源

Android Gradle插件从3.0版本开始就逐步强化了configuration(配置)阶段和execution(执行)阶段的隔离。在configuration阶段,Gradle只是在确定任务依赖、加载配置,这时候项目的文件结构甚至可能还没完全准备好,直接调用fileTree.getFiles()去遍历文件,就会触发EvalIssueException这类阶段违规的错误。

具体解决方案

1. 把文件遍历逻辑移到execution阶段

这是最直接的修复方式,把原本在configuration阶段执行的文件操作,放到自定义任务的doFirst或doLast闭包里——这两个闭包都是在execution阶段才会执行的。

举个代码对比的例子:

// ❌ 错误写法:在configuration阶段直接访问文件
project.configurations.all { config ->
    def fileTree = project.fileTree(dir: 'src/main/assets')
    fileTree.files.each { file ->
        // 你的文件处理逻辑
    }
}

// ✅ 正确写法:移到execution阶段执行
task processAssetsFiles {
    doLast {
        def fileTree = project.fileTree(dir: 'src/main/assets')
        fileTree.files.each { file ->
            // 你的文件处理逻辑
        }
    }
}

2. 用Gradle的懒加载API延迟文件解析

如果你的逻辑必须在configuration阶段做一些准备,但又不能直接访问文件,可以用Gradle的Provider API来实现懒加载,延迟文件的解析直到execution阶段:

// 用Provider包装FileTree,延迟解析
def fileTreeProvider = project.provider {
    project.fileTree(dir: 'src/main/assets')
}

// 在任务执行阶段才获取实际的文件
task processAssetsFiles {
    doLast {
        fileTreeProvider.get().files.each { file ->
            // 你的文件处理逻辑
        }
    }
}

3. 适配AGP的阶段隔离规则

尽量遵循AGP的最佳实践:

  • 避免在configuration阶段做任何IO操作(包括文件遍历、读取)
  • 如果需要引用其他任务的输出文件,改用task.outputs.files这类懒加载的集合,而不是直接访问文件系统

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:22:59