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不兼容,编译报错:
kotlinCannot 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.application
和com.android.library
插件版本升级到8.1.0。- Kotlin插件升级到1.90.20与Compose10.5.4推荐组合)。
问题:
-
低版本Compose Compiler与新Kotlin不兼容,报错:
vbnetThis 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
中添加:groovycomposeOptions { kotlinCompilerExtensionVersion '1.5 }
3. Manifest package属性问题
问题 :
AGP 8要求所有模块的AndroidManifest.xml
不能再使用package=..."
属性,必须在build.gradle
的android
块中用namespace
声明包名。
解决:
- 删除所有
AndroidManifest.xml
中的package
属性。 - 在每个模块的
build.gradle
的android
块中添加正确的namespace
。
###4. BuildConfig和R类引用问题
问题:
- 使用了
buildConfigField
但未开启buildFeatures.buildConfig
。 - 升级namespace后,代码中R类的包名与实际生成不一致,导致
Unresolved reference: R
。
解决:
-
在
build.gradle
的android
块中添加:groovybuildFeatures { 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别名功能,如:
kotlinimport com.a.gbox.plane.R as PlaneR import com.a.gbox.bird.R as BirdR
并将代码中相关资源引用改为
PlaneR.drawable.xxx
、BirdR.drawable.xxx
。
7其他常见问题
- Kotlin/Compose版本兼容 :务必查阅Compose官方兼容表。
- Gradle警告:AGP 80.1.0官方支持到compileSdk33,使用34有警告但不影响编译。
- API变更 :如
consumeAllChanges()
已废弃,需用consume()
替换。
三、升级建议与总结1升级顺序:先升级Gradle Wrapper,再升级AGP和Kotlin,最后处理Compose和各模块兼容性。
- 全局搜索替换 :升级namespace和R类后,务必全局替换import和资源引用。3 多模块同步 :所有用到Compose的模块都要同步升级
composeOptions
。 - 查阅官方文档 :遇到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,为后续功能开发和维护打下了坚实基础。希望本文的实战总结能帮助到有类似需求的开发者!
相关链接:
- Android Gradle Plugin 官方文档 -Jetpack Compose 版本兼容表](developer.android.com/jetpack/and...)
- Gradle 官方升级指南
如需详细升级脚本、批量替换命令或遇到特殊问题,欢迎留言交流!