升级至buildTools 27.0.3后Gradle构建失败并抛出空指针异常
我之前在升级buildToolsVersion到27.0.3时也碰到过一模一样的问题,核心原因是旧版插件/自定义脚本调用了已废弃的registerResGeneratingTask方法,而新版本的Android Gradle Plugin(AGP)对这个方法的内部实现做了变更,直接调用就会触发空指针异常(NullPointerException)。下面是具体的排查和解决步骤:
步骤1:定位问题来源
你输出里反复出现的警告registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)已经给出了线索——肯定有代码还在调用这个废弃方法。大概率是项目里的第三方插件(比如旧版ButterKnife、自定义资源生成插件),或者你自己写的Gradle脚本在使用它。
步骤2:升级第三方插件
先把项目中所有第三方插件升级到适配buildToolsVersion 27.0.3的最新版本:
- 比如用了ButterKnife的话,直接升级到10.0.0及以上版本,这个版本已经替换了废弃的API;
- 其他插件可以去官方仓库查版本说明,确认是否修复了AGP兼容性问题。
步骤3:手动替换废弃方法(针对自定义脚本)
如果是你自己写的Gradle脚本在调用registerResGeneratingTask,直接替换成官方推荐的registerGeneratedResFolders方法:
原来的废弃代码:
android.applicationVariants.all { variant -> registerResGeneratingTask(yourResourceGenTask, yourResourceGenTask.outputDir) }
替换后的代码:
android.applicationVariants.all { variant -> // 注册生成的资源文件夹 variant.registerGeneratedResFolders(files(yourResourceGenTask.outputDir)) // 如果是Library模块,把applicationVariants换成libraryVariants }
注意要确保yourResourceGenTask已经正确配置,输出目录是有效的文件路径。
步骤4:清理缓存重新构建
替换完成后,先清理Gradle缓存避免旧文件干扰:
./gradlew clean
然后再执行构建命令:
./gradlew main:build
一般来说,做完这几步就能解决空指针异常的问题了。如果还是不行,可以加上--stacktrace参数执行构建,查看详细报错日志定位具体哪一行代码触发了NPE。
内容的提问来源于stack exchange,提问作者Diego Plentz

