Android Gradle 升级 7.1.0 的一些注意事项与备忘

Android Gradle Plugin(后简称为AGP),在 7.0 版本之后与 Gradle 版本版本号保持同步(大喜,不需要再去查 gradle 与 AGP 的版本号对应了)。

本文记录了在AS升级到 Android Studio Bumblebee | 2021.1.1 版本后,项目默认创建使用 AGP 7.1.0 的一些注意事项。

先看一个在 Gradle 6.7.1+AGP 4.2 时代(后简称为AGP 6.0)最常见的项目配置:

AGP 6.0

settings.gradle

1
2
3
//包含了我们项目所有用到的模块
include ':app'
include ':utils'

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//项目中使用的插件所在的仓库与插件库依赖
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.1"
//kotlin插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

//项目工程使用到的第三方库所在的仓库
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" }
// Warning: this repository is going to shut down soon
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

app/build.gradle

1
2
3
4
5
6
7
8
9
10
11
//使用到的gradle插件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-parcelize'

android {
}

//依赖的第三方库
dependencies {
}

在 7.0 之后个人感觉使用了更多的 Gradle 的 DSL,变化如下:

APG 7.0

首先是 settings.gradle 的变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
//添加阿里云镜像仓库
maven {url 'https://maven.aliyun.com/repository/public/'}
maven {url "https://maven.aliyun.com/repository/google"}
google()
mavenCentral()
}
}
rootProject.name = "My Application"
include ':app'

现在setttings中承担了原先项目build.gradle做的一些工作:项目插件管理项目依赖仓库管理,比如原本我们使用阿里镜像仓库都是写在项目build.gradle中的,现在需要写在 settings.gradle 的 dependencyResolutionManagement 填写。

build.gradle

1
2
3
4
5
6
7
8
9
10
//项目中使用到的插件与版本
plugins {
id 'com.android.application' version '7.1.0' apply false
id 'com.android.library' version '7.1.0' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}

task clean(type: Delete) {
delete rootProject.buildDir
}

这里的 id 'org.jetbrains.kotlin.android' version '1.6.10' apply false 大至等同于 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31" 所代表的含义,及项目中使用的 gradle 插件与版本。

app/build.gradle

1
2
3
4
5
6
7
8
9
10
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}

android {
}

dependencies {
}

模块中使用插件的语句发生了变化,由原来的 apply plugin: 'com.android.application',变成了 dsl 语句的模式,kotlin插件也从 apply plugin: 'kotlin-android' 变成了 id 'org.jetbrains.kotlin.android'。例如在kotlin中非常好用的 @Parcelize 注解,现在需要在 plugins{} 中添加 id 'kotlin-parcelize' 然后在相应类中使用注解。
例如:

1
2
3
4
5
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class TestData(var name:String): Parcelable

补充

新版的AS Bumblebee + AGP7.0 在使用gradle assemble打包指令时,最终的产物目录变成了:app\build\intermediates\apk\release\,而非原先的 `app\build\outputs\apk\release\