Android Gradle Plugin 7x 升级到 8.1 实战问题总结

Android Play官网需要target升级到35,然后升级时,7.x不能用了.需要升级到8.1,不过遇到了挺多的改动,记录下来方便其他人也可以用


一、升级背景与目标

  • 目标:将项目的Gradle和AGP升级到官方推荐的最新兼容版本(Gradle 810 + AGP 8.1.0,以便支持更高的compileSdk、Kotlin和Jetpack Compose等新特性。
  • 项目结构:多模块(含bird、plane、tetris、tank等游戏模块),大量使用Jetpack Compose、Kotlin、Navigation等现代技术栈。

二、升级步骤与遇到的主要问题

1 Gradle Wrapper 升级

操作

gradle/wrapper/gradle-wrapper.properties中的distributionUrl改为80.10。

问题

  • 升级后,AGP 7x与Gradle 8.x不兼容,编译报错:

    kotlin 复制代码
    Cannot use @TaskAction annotation on method IncrementalTask.taskAction$gradle_core() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method.

解决

必须同步升级AGP到8.1.0及以上。


###2. 升级AGP和Kotlin版本

操作

  • build.gradle中将com.android.applicationcom.android.library插件版本升级到8.1.0。
  • Kotlin插件升级到1.90.20与Compose10.5.4推荐组合)。

问题

  • 低版本Compose Compiler与新Kotlin不兼容,报错:

    vbnet 复制代码
    This version (1.30.2f the Compose Compiler requires Kotlin version 1.70.2 but you appear to be using Kotlin version 10.9which is not known to be compatible.

解决

  • compose_version升级到1.54,并在所有用到Compose的模块build.gradle中添加:

    groovy 复制代码
    composeOptions {
        kotlinCompilerExtensionVersion '1.5 }

3. Manifest package属性问题

问题

AGP 8要求所有模块的AndroidManifest.xml不能再使用package=..."属性,必须在build.gradleandroid块中用namespace声明包名。

解决

  • 删除所有AndroidManifest.xml中的package属性。
  • 在每个模块的build.gradleandroid块中添加正确的namespace

###4. BuildConfig和R类引用问题

问题

  • 使用了buildConfigField但未开启buildFeatures.buildConfig
  • 升级namespace后,代码中R类的包名与实际生成不一致,导致Unresolved reference: R

解决

  • build.gradleandroid块中添加:

    groovy 复制代码
    buildFeatures {
        buildConfig true
    }
  • 全局搜索并替换所有R类的import为新namespace,如import com.a.find.bird.R改为import com.a.gbox.bird.R


5etpack Compose API变更

问题

  • Compose 1.2,LazyVerticalGrid等API迁移到foundation.lazy.grid包,参数由cells改为columns

解决

  • 替换import为import androidx.compose.foundation.lazy.grid.*,并将cells = GridCells.Fixed(3)改为columns = GridCells.Fixed(3

###6. 资源跨模块访问与R类别名

问题

  • 主模块Demo代码中直接引用了其他模块(如plane、bird)的R类资源,升级namespace后找不到。

解决

  • 用Kotlin的import别名功能,如:

    kotlin 复制代码
    import com.a.gbox.plane.R as PlaneR
    import com.a.gbox.bird.R as BirdR

    并将代码中相关资源引用改为PlaneR.drawable.xxxBirdR.drawable.xxx


7其他常见问题

  • Kotlin/Compose版本兼容 :务必查阅Compose官方兼容表
  • Gradle警告:AGP 80.1.0官方支持到compileSdk33,使用34有警告但不影响编译。
  • API变更 :如consumeAllChanges()已废弃,需用consume()替换。

三、升级建议与总结1升级顺序:先升级Gradle Wrapper,再升级AGP和Kotlin,最后处理Compose和各模块兼容性。

  1. 全局搜索替换 :升级namespace和R类后,务必全局替换import和资源引用。3 多模块同步 :所有用到Compose的模块都要同步升级composeOptions
  2. 查阅官方文档 :遇到API变更、兼容性问题,第一时间查阅官方升级指南。 5 分步编译调试:每次修正一类问题后及时编译,逐步定位和解决新报错。

四、版本兼容性参考

Gradle + AGP + Kotlin + Compose 推荐组合

Gradle AGP Kotlin Compose Compiler 状态
80.10 8.1.0 10.90.2 1.54 ✅ 推荐
85 8.1.0 10.90.2 1.54 ✅ 兼容
80 8.0.2 1.80.201.4.7 ⚠️ 旧版本

常见错误与解决方案速查

错误信息 原因 解决方案
Cannot use @TaskAction annotation AGP版本过低 升级AGP到8.10
Namespace not specified 缺少namespace声明 在build.gradle中添加namespace
Unresolved reference: R R类包名错误 更新import语句
GridCells not found Compose API变更 使用foundation.lazy.grid包
Compose Compiler version incompatible 版本不匹配 升级Compose Compiler版本

通过本次升级,项目成功适配了最新的Gradle和AGP,支持了更高版本的Kotlin和Jetpack Compose,为后续功能开发和维护打下了坚实基础。希望本文的实战总结能帮助到有类似需求的开发者!


相关链接:


如需详细升级脚本、批量替换命令或遇到特殊问题,欢迎留言交流!

相关推荐
LotteChar4 分钟前
WebStorm vs VSCode:前端圈的「豆腐脑甜咸之争」
前端·vscode·webstorm
90后的晨仔6 分钟前
零基础快速搭建 Vue 3 开发环境(附官方推荐方法)
前端·vue.js
洛_尘18 分钟前
Java EE进阶2:前端 HTML+CSS+JavaScript
java·前端·java-ee
孤独的根号_21 分钟前
Vite背后的技术原理🚀:为什么选择Vite作为你的前端构建工具💥
前端·vue.js·vite
吹牛不交税1 小时前
Axure RP Extension for Chrome插件安装使用
前端·chrome·axure
薛定谔的算法1 小时前
# 前端路由进化史:从白屏到丝滑体验的技术突围
前端·react.js·前端框架
拾光拾趣录2 小时前
Element Plus表格表头动态刷新难题:零闪动更新方案
前端·vue.js·element
Adolf_19933 小时前
React 中 props 的最常用用法精选+useContext
前端·javascript·react.js
前端小趴菜053 小时前
react - 根据路由生成菜单
前端·javascript·react.js
喝拿铁写前端3 小时前
`reduce` 究竟要不要用?到底什么时候才“值得”用?
前端·javascript·面试