运行clean任务后使用OSS-licenses插件出现java.io.FileNotFoundException报错
根因
该异常由Gradle任务执行顺序不匹配导致:
com.google.android.gms.oss-licenses-plugin依赖generate[Variant]OssLicenses任务生成dependencies.json文件- 执行
clean任务时会清空整个build目录,而项目默认构建流程没有绑定资源合并任务与许可证生成任务的依赖关系,当资源合并任务先于许可证生成任务执行时,就会读取不到目标文件,抛出java.io.FileNotFoundException
可用修复方案
下面按优先级给出可落地的修复方式:
方案1:绑定任务依赖(推荐,全AGP版本兼容)
在你的**应用级模块(通常是app模块)**的build.gradle文件末尾添加以下配置,强制资源合并任务等待许可证生成任务执行完成后再启动:
android.applicationVariants.all { variant -> // 获取对应构建变体的资源合并任务 def mergeResTask = tasks.findByName("merge${variant.name.capitalize()}Resources") // 获取对应构建变体的许可证生成任务 def generateLicenseTask = tasks.named("generate${variant.name.capitalize()}OssLicenses") if (mergeResTask != null && generateLicenseTask != null) { mergeResTask.dependsOn(generateLicenseTask) } }
方案2:预创建目标目录(适合临时快速修复)
如果不想修改构建逻辑,可以在clean任务执行完成后预创建目标目录,避免后续任务读取路径不存在的问题:
tasks.named('clean').configure { doLast { mkdir project.layout.buildDirectory.dir("generated/third_party_licenses").get().asFile } }
方案3:检查版本兼容性
如果上述配置不生效,检查你使用的插件版本是否和当前项目的Android Gradle Plugin(AGP)版本匹配:
- AGP 4.2及以下:使用
0.10.4及更低版本的oss-licenses插件 - AGP 7.0及以上:使用
0.10.5及更高版本的oss-licenses插件
验证步骤
执行一次完整的带clean的构建命令验证修复效果:
- Linux/Mac:
./gradlew clean assembleDebug - Windows:
gradlew.bat clean assembleDebug
如果构建正常完成,且app/build/generated/third_party_licenses/debug/目录下存在dependencies.json文件,说明修复生效。
内容的提问来源于stack exchange,提问作者DoronK
相关产品推荐
相关产品推荐

