Android Studio是目前Android开发最常用的集成开发环境(IDE),它使用Gradle进行项目构建,并且可以集成专门针对Android应用构建的Android Gradle Plugin(AGP)。另外如果项目中需要使用Kotlin,还可以集成Kotlin Gradle Plugin(KGP)。在开发过程中,如果AGP、KGP、Gradle不兼容,可能会导致编译失败,下面简单介绍一下AGP、KGP与Gradle的兼容性。
AGP与Gradle的兼容性
AGP是专门为Android应用开发设计的,而Gradle的应用则更广泛一些,AGP的不同版本需要特定版本的Gradle才能正常运行。二者的更新频率不一定总是同步的,因此需要特别注意。
下表列举个人在实际开发中用到的最新版本到最低版本的AGP及其对应的最低Gradle版本,更多新旧版本可以到官网查看。
AGP版本 | 最低Gradle版本 |
---|---|
8.7.0、8.7.1、8.7.2、8.7.3 | 8.9 |
8.5.0、8.5.1、8.5.2、8.6.0、8.6.1 | 8.7 |
8.4.0、8.4.1、8.4.2 | 8.6 |
8.3.0、8.3.1、8.3.2 | 8.4 |
8.2.0、8.2.1、8.2.2 | 8.2 |
8.1.0、8.1.1、8.1.2、8.1.3、8.1.4 | 8.0 |
8.0.0、8.0.1、8.0.2 | 8.0 |
7.4.0、7.4.1、7.4.2 | 7.5 |
7.3.0、7.3.1 | 7.4 |
7.2.0、7.2.1、7.2.2 | 7.3.3 |
7.1.0、7.1.1、7.1.2、7.1.3 | 7.2 |
7.0.0、7.0.1、7.0.2、7.0.3、7.0.4 | 7.0 |
4.2.0、4.2.1、4.2.2 | 6.7.1 |
4.1.0、4.1.1、4.1.2、4.1.3 | 6.5 |
另外顺便附上Gradle对应的最低JDK版本:
Gradle版本 | 最低JDK版本 |
---|---|
8.0+ | 17 |
7.0+ | 11 |
7.0以下 | 8 |
单项目兼容性
Gradle的版本通常是向下兼容的,那么高版本Gradle应该也可以使用低版本AGP。在单个项目中使用高版本Gradle(8.0以上)和低版本AGP(8.0.0以下)进行了一次简单的测试,结果为Gradle 8.0-8.11.1最低兼容至AGP 7.3.0,如果使用更低版本的AGP,编译时则会报错,如下图:
Gradle 8.0 + AGP7.3.0 | Gradle 8.0 + AGP 7.2.2 |
---|---|
跨项目兼容性
如果SDK项目和集成SDK的App项目使用不同的编译环境会发生什么呢?我也做了个简单的测试。
- SDK项目编译环境为Gradle 8.7、AGP 8.3.2。
- 集成SDK的App项目编译环境为Gradle6.5、AGP 4.1.3,App项目依赖SDK项目,使用Gradle的assembleDebug指令编译项目。
编译顺利完成,根据测试结果来看SDK项目和集成SDK的App项目使用不同版本的AGP、Gradle时不会有兼容性问题。
KGP与Gradle之间的兼容性
与AGP类似,KGP的不同版本也需要特定版本的Gradle才能正常运行。另外KGP需要定期更新来支持Kotlin最新的语言特性。二者的更新频率也不一定总是同步的。
下表列举个人在实际开发中用到的最新版本到最低版本的KGP及其对应的最低Gradle版本和AGP版本,更多新旧版本可以到官网查看。
KGP版本 | 最低Gradle版本 | 最低AGP版本 |
---|---|---|
2.0.10、2.0.20、2.0.21 | 7.3.3 | 7.2.0 |
2.0.0 | 7.2 | 7.1.3 |
1.9.0、1.9.10、1.9.20、1.9.21、1.9.22、1.9.23、1.9.24 | 6.8.3 | 4.2.2 |
1.8.0、1.8.10、1.8.20、1.8.21、1.8.22 | 6.8.3 | 4.1.3 |
1.7.0、1.7.10、1.7.20、1.7.21、1.7.22 | 6.7.1 | 4.1.3 |
1.6.0、1.6.10、1.6.20、1.6.21 | 6.1.1 | 4.1.3 |
PS: 上述表格中的最低兼容版本与官方文档中的略有不同。例如官网中KGP 2.0.0最低兼容Gradle版本为6.8.3,但是在Android项目中基本都会同时使用AGP,KGP 2.0.0最低兼容APG版本为7.1.3,而APG 7.1.3最低兼容Gradle版本为7.2,因此在上表中,KGP 2.0.0最低兼容的版本与官方文档不同。
单项目兼容性
与AGP类似,简单测试一下单项目中使用高版本Gradle(8.7)和低版本KGP(16.0、1.5.32)会发生什么,结果为Gradle 8.7(当前最新的release版)最低可以兼容至KGP 1.6.0,如果使用更低版本的KGP,编译时则会报错,如下图:
Gradle 8.7 + KGP1.6.0 | Gradle 8.7 + KGP 1.5.32 |
---|---|
跨项目兼容性
与AGP类似,测试一下SDK项目和集成SDK的App项目使用不同的编译环境会发生什么。
- SDK项目编译环境为Gradle 8.7、AGP 8.3.2、KGP 1.9.23。
- 集成SDK的App项目编译环境为Gradle 6.5、AGP 4.1.3、KGP 1.5.32,App项目依赖SDK项目,使用Gradle的assembleDebug指令编译项目。
编译顺利完成,根据测试结果来看SDK项目和集成SDK的App项目使用不同版本的KGP、AGP、Gradle时不会有兼容性问题。
小结
写这篇文章的起因其实是开发完的SDK项目在实际使用过程中遇到了在不同编译环境下出现了打包时有的环境编译成功了,有的环境编译失败了的现象。最初我认为应该是SDK项目和集成SDK的App项目使用的KGP、AGP、和Gradle之间存在兼容性问题。但是根据这次实际测试结果来看,不添加任何依赖包的情况下SDK项目和集成SDK的App项目即使使用了不同版本的KGP、AGP、Gradle也不会出现兼容性问题。
虽然不知道为何三方依赖包会产生兼容性问题(测试用的SDK一样也是SDK啊!),但是根据目前测试的结果来看,编译失败暂时确定是由三方依赖包引起的。