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
相关产品推荐
相关产品推荐

