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


相关链接:


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

相关推荐
lichenyang45322 分钟前
从 Demo 到本地 HAR 包:把 HarmonyOS JSBridge 运行时做成可复用库
前端
不简说30 分钟前
拖拽DIY表格插件来了!sv-print 七月更新:这次真的能自己拼表格了
前端·javascript·前端框架
ssshooter1 小时前
小程序分包页面报 "has not been registered yet" 的隐蔽根因:一个动态 import 拖垮整个分包
前端·javascript·微信小程序
鹏多多1 小时前
Web浏览器后台离线通知方案实现以及兼容指南
前端·javascript·vue.js
yangmu32031 小时前
Vue3 响应式系统深度解析:从 Proxy 到依赖追踪
前端·javascript·vue.js
还有多久拿退休金1 小时前
AI 写了代码,谁替你"试毒"?
前端·架构·ai编程
大E帝国子民11 小时前
OpenCloudOS Server 9 安装 Nginx 完整指南
前端·网络·nginx
少年白马醉春风丶1 小时前
【AI Agent面试题】Agent 的自主性分级,怎么理解?
前端
yingyima2 小时前
Docker Compose 紧急救援:凌晨3点服务器报警的解决方案
前端
石小石Orz2 小时前
星云SDK + 油猴:给LLM塑造肉身,陪伴你在每个网页
前端·人工智能