Android Gradle 插件 7.0.0(2021 年 7 月)
Android Gradle 插件 7.0.0 是一个主要版本,包含各种新的 功能和改进。
7.0.1(2021 年 8 月)
本次要更新包含多项 bug 修复。要查看重要问题修复列表,请阅读 <ph type="x-smartling-placeholder"></ph> 版本更新博客。
兼容性
最低版本 | 默认版本 | |
---|---|---|
Gradle | 7.0.2 | 7.0.2 |
SDK Build Tools | 30.0.2 | 30.0.2 |
NDK | 不适用 | 21.4.7075529 |
JDK | 11 | 11 |
需要 JDK 11 才能运行 AGP 7.0
使用 Android Gradle 插件 7.0 构建应用时,JDK 11 现在是 来运行 Gradle。Android Studio Arctic Fox 捆绑了 JDK 11 和 将 Gradle 配置为默认使用它,这意味着大多数 Android Studio 用户无需对其项目进行任何配置更改。
如果您需要手动设置 JDK 版本时,您需要使用 JDK 11 或更高版本。
使用独立于 Android Studio 的 AGP 时,请通过以下命令升级 JDK 版本
设置 JAVA_HOME 环境变量
或 -Dorg.gradle.java.home
命令行选项
复制到您的 JDK 11 安装目录。
请注意,已弃用的 SDK 工具软件包中的 SDK 管理器和 AVD 管理器 不适用于 JDK 11。如需继续使用 SDK 管理器和 AVD 管理器,请执行以下操作: 需要使用 AGP 7.0 及更高版本,您需要将这些工具 当前 Android SDK 命令行工具 软件包。
Variant API 已稳定
新的 Variant API 现已稳定。要了解新界面 com.android.build.api.variant 软件包和 gradle-recipes GitHub 项目。作为新版 Variant API),我们还提供了许多中间文件,称为 通过 制品 界面。这些工件(例如合并后的清单)可以安全地获取 以及使用第三方插件和代码进行自定义
我们将继续通过增加新功能来扩展 Variant API 并增加我们提供给 自定义。
lint 的行为变更
本部分介绍了 Android Gradle 中的多项 lint 行为变更 插件 7.0.0。
针对库依赖项提高了 lint 性能
现在,使用 checkDependencies = true
运行 lint 的速度更快
对于包含库应用的 Android 项目
依赖项,建议将 checkDependencies
设置为
true
(如下所示),通过以下命令运行 lint:
./gradlew :app:lint
,用于分析所有依赖项
并生成一份报告,其中包含
应用及其所有依赖项
Groovy
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
lint 任务现在可以显示为“UP-TO-DATE”
如果模块的源代码和资源未更改,lint 分析
模块无需再次运行。出现这种情况时,
该任务的执行状态会显示为“UP-TO-DATE”(在 Gradle 中)
输出。进行此更改后,在设置了 checkDependencies = true
的应用模块上运行 lint 时,只有已更改的模块才会
需要运行分析。因此,lint 的运行速度更快。
如果 lint 报告任务的输入尚未运行,也不需要运行 已更改。一个相关的已知问题是未 lint 任务的状态为“UP-TO-DATE”时输出到 stdout 的文本输出 (问题 191897708)。
在动态功能模块上运行 lint
AGP 不再支持从动态功能模块运行 lint。
从相应的应用模块运行 lint 将会运行 lint,
其动态功能模块,并在应用的 lint 中包含所有问题
报告。一个相关的已知问题是运行 lint 时
使用应用模块中的 checkDependencies = true
,
系统不会检查动态功能库依赖项,除非它们同时也是应用
依赖项(问题
#191977888)。
仅对默认变体运行 lint
运行 ./gradlew :app:lint
现在只会针对
默认变体。在以前的 AGP 版本中,它会对所有
变体。
R8 缩减器中的“缺少类”警告
R8,更精确地
始终如一地处理缺失的类和 -dontwarn
选项。
因此,您应开始评估发出的“缺少类”警告
。
当 R8 遇到未在应用中定义的类引用时,或 其依赖项之一时,它会发出一条警告,该警告会显示在您的 build 中 输出。例如:
R8: Missing class: java.lang.instrument.ClassFileTransformer
此警告意味着,类定义
找不到 java.lang.instrument.ClassFileTransformer
在分析应用代码时遵循的原则虽然这通常意味着出现错误,
您可以忽略此警告。两个常见原因
忽略该警告:
-
针对 JVM 和缺少的类以 JVM 为目标平台的库属于 JVM 库类型(如上例所示)。
-
您的其中一个依赖项使用了仅限编译时使用的 API。
您可以通过添加 -dontwarn
来忽略“缺少类”警告
规则添加到 proguard-rules.pro
文件中。例如:
-dontwarn java.lang.instrument.ClassFileTransformer
为方便起见,AGP 将生成一个文件,其中包含所有可能
缺少规则,将其写入文件路径,如下所示:
app/build/outputs/mapping/release/missing_rules.txt
。将
proguard-rules.pro
文件中的规则来忽略警告。
在 AGP 7.0 中,“缺少类”消息将显示为警告,并且您可以
将它们变成错误
android.r8.failOnMissingClasses = true
英寸
gradle.properties
。在 AGP 8.0 中,这些警告将变为
会破坏您构建的错误可以通过以下方式使 AGP 7.0 行为
将-ignorewarnings
选项添加到您的
proguard-rules.pro
文件,但不建议这样做。
移除了 Android Gradle 插件构建缓存
AGP 构建缓存已在 AGP 4.1 中移除。之前在 AGP 中引入 2.3 以补充 Gradle 构建缓存,已取代 AGP 构建缓存 在 AGP 4.1 中完全由 Gradle 构建缓存完成。此次变更不会影响 构建时间。
在 AGP 7.0 中,android.enableBuildCache
属性
android.buildCacheDir
属性,而
已移除“cleanBuildCache
”任务。
在项目中使用 Java 11 源代码
现在,您可以在应用的项目中编译最高 Java 11 源代码, 您可以使用更新的语言功能,例如私有接口方法、菱形 运算符,用于 lambda 参数的局部变量语法。
如需启用此功能,请将 compileOptions
设置为所需的
Java 版本),并将 compileSdkVersion
设置为 30 或更高版本:
// build.gradle
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "11"
}
}
// build.gradle.kts
android {
compileSdkVersion(30)
compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
kotlinOptions {
jvmTarget = "11"
}
}
移除了依赖项配置
在 AGP 7.0 中,已配置以下配置(或依赖项范围) 已移除:
-
compile
此配置已被api
替换,具体取决于用例 或implementation
。
也适用于 *Compile 变体,例如debugCompile
。 -
provided
该配置已被compileOnly
替换。
也适用于 *Provided 变体,例如:releaseProvided
。 -
apk
该配置已被runtimeOnly
替换。 -
publish
该配置已被runtimeOnly
替换。
在大多数情况下,AGP 升级助理会自动将您的项目迁移到新的 配置。
针对 Android 进行编译时的类路径更改 Gradle 插件
如果您是针对 Android Gradle 插件进行编译,您的编译
类路径可能会更改。由于 AGP 现在使用 api/implementation
配置,某些工件可能会从您的编译库中移除
类路径。如果您在编译时依赖于 AGP 依赖项,请务必
请将其作为显式依赖项添加。
在 Java 资源中添加原生库 文件夹不受支持
以前,您可以在 Java 资源文件夹中添加原生库,然后
使用 android.sourceSets.main.resources.srcDirs
注册文件夹,以便提取原生库并将其添加到最终
APK。从 AGP 7.0 开始,此功能不受支持,
Java 资源文件夹会被忽略。而应使用适用于
原生库 android.sourceSets.main.jniLibs.srcDirs
。对于
请参阅
如何配置
源代码集。
已知问题
本部分介绍了 Android Gradle 插件中存在的已知问题 7.0.0。
与 1.4.x Kotlin 多平台插件不兼容
Android Gradle 插件 7.0.0 兼容 Kotlin Multiplatform 插件 1.5.0 及更高版本。使用 Kotlin 的项目 多平台支持需要更新到 Kotlin 1.5.0 才能使用 Android Gradle 插件 7.0.0.为了解决此问题,您可以将 Android Gradle 插件降级 升级到 4.2.x,但我们不建议这样做。
如需了解详情,请参阅 KT-43944。
缺少 lint 输出
执行 lint 任务时没有输出到 stdout 的 lint 文本输出 最新 (问题 191897708)。 如需了解更多背景信息,请参阅 lint 的行为变更。此问题 将在 Android Gradle 插件 7.1 中修复。
系统不会对所有动态功能库依赖项进行 lint 检查
使用 checkDependencies = true
从
应用模块,除非
它们也是应用依赖项
(问题 191977888)。
解决方法之一是,您可以在这些库上运行 lint 任务。如需了解更多背景信息,
请参阅 lint 的行为变更。