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,为后续功能开发和维护打下了坚实基础。希望本文的实战总结能帮助到有类似需求的开发者!


相关链接:


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

相关推荐
AI大模型-小华38 分钟前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子3 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅3 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni3 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学5 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端
赵庆明老师5 小时前
Vben精讲:21-详解web-antd:tsconfig.json
前端·json·vim
wc885 小时前
微软EDGE浏览器功能学习
前端·学习·edge
Csvn6 小时前
🎯 原生 `<dialog>` 元素:终于可以扔掉一半的自定义弹窗组件了?
前端
Csvn6 小时前
🎨 CSS @layer:用「层叠优先级」终结样式打架的世纪难题
前端