Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可独立于 Android Studio 运行并单独更新。
本页将介绍如何让 Gradle 工具保持最新状态,以及最近的更新都包含哪些内容。
如需详细了解如何使用 Gradle 配置 Android build,请参阅以下页面:
要详细了解 Gradle 构建系统,请参阅 Gradle 用户指南。
更新 Android Gradle 插件
在更新 Android Studio 时,您可能会收到将 Android Gradle 插件自动更新为最新可用版本的提示。您可以选择接受该更新,也可以根据项目的构建要求手动指定版本。
您可以在 Android Studio 的 File > Project Structure > Project 菜单中指定插件版本,也可以在顶级 build.gradle
文件中进行指定。该插件版本适用于在相应 Android Studio 项目中构建的所有模块。以下示例从 build.gradle
文件中将插件的版本设置为 3.6.0:
buildscript {
repositories {
// Gradle 4.1 and higher include support for Google's Maven repo using
// the google() method. And you need to include this repo to download
// Android Gradle plugin 3.0.0 or higher.
google()
...
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0'
}
}
注意:请勿在版本号中采用动态依赖项(例如 'com.android.tools.build:gradle:2.+'
),否则可能会导致意外的版本更新和难以解析的版本差异。
如果指定的插件版本尚未下载,则 Gradle 会在您下次构建项目时进行下载;或者,您也可以在 Android Studio 菜单栏中依次点击 Tools > Android > Sync Project with Gradle Files 进行下载。
更新 Gradle
在更新 Android Studio 时,您可能会收到一并将 Gradle 更新为最新可用版本的提示。您可以选择接受该更新,也可以根据项目的构建要求手动指定版本。
下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本。要获得最佳性能,您应该使用 Gradle 和插件这两者的最新版本。
插件版本 | 所需的 Gradle 版本 |
---|---|
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.5.0 | 2.2.1 - 2.13 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1+ |
2.3.0+ | 3.3+ |
3.0.0+ | 4.1+ |
3.1.0+ | 4.4+ |
3.2.0 - 3.2.1 | 4.6+ |
3.3.0 - 3.3.3 | 4.10.1+ |
3.4.0 - 3.4.3 | 5.1.1+ |
3.5.0 - 3.5.4 | 5.4.1+ |
3.6.0 - 3.6.4 | 5.6.4+ |
4.0.0+ | 6.1.1+ |
4.1.0+ | 6.5+ |
您可以在 Android Studio 的 File > Project Structure > Project 菜单中指定 Gradle 版本,也可以通过在 gradle/wrapper/gradle-wrapper.properties
文件中修改 Gradle 分发引用来指定。以下示例在 gradle-wrapper.properties
文件中将 Gradle 的版本设置为 5.4.1。
...
distributionUrl = https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
...
3.6.0(2020 年 2 月)
此版本的 Android 插件需要使用以下工具:
- Gradle 5.6.4. 如需了解详情,请阅读有关更新 Gradle 的部分。
- SDK Build Tools 28.0.3 或更高版本。
新功能
此版本的 Android Gradle 插件包含以下新功能。
视图绑定
在代码中引用视图时,视图绑定可确保编译时安全性。您现在可以将 findViewById()
替换为自动生成的绑定类引用。如需开始使用视图绑定,请在每个模块的 build.gradle
文件中添加以下代码:
android {
viewBinding.enabled = true
}
如需了解详情,请阅读视图绑定文档。
支持 Maven Publish 插件
Android Gradle 插件支持 Maven Publish Gradle 插件,可让您将构建工件发布到 Apache Maven 代码库。Android Gradle 插件会为应用或库模块中的每个构建变体工件创建一个组件,您可以使用它来自定义要发布到 Maven 代码库的发布内容。
如需了解详情,请转到介绍如何使用 Maven Publish 插件的页面。
新的默认打包工具
在构建应用的调试版本时,该插件会使用一个新的打包工具 zipflinger 来构建 APK。这一新工具应该能够提高构建速度。如果新的打包工具无法正常运行,请报告错误。您可以通过在 gradle.properties
文件中添加以下代码来恢复使用旧的打包工具:
android.useNewApkCreator=false
原生构建属性
您现在可以确定 Clang 构建和链接项目中的每个 C/C++ 文件所需的时间。Gradle 可以生成包含这些编译器事件时间戳的 Chrome 跟踪记录,以便您更好地了解构建项目所需的时间。如需生成此构建属性文件,请执行以下操作:
- 在运行 Gradle build 时添加标记
-Pandroid.enableProfileJson=true
。例如:
gradlew assembleDebug -Pandroid.enableProfileJson=true
- 打开 Chrome 浏览器,然后在搜索栏中输入
chrome://tracing
。 - 点击 Load 按钮并导航到 project-root
/build/android-profile
以查找文件。该文件的名称为profile-
timestamp.json.gz
。
您可以在查看器顶部附近查看原生构建属性数据:
行为变更
使用此版本的插件时,您可能会遇到以下行为方面的变更。
默认情况下,原生库以未压缩的形式打包
在构建应用时,插件现在默认会将 extractNativeLibs
设置为 "false"
。也就是说,您的原生库将保持页面对齐状态并以未压缩的形式打包。虽然这样会增加上传大小,但您的用户会从以下优势中受益:
- 减小应用安装大小,因为平台可以直接从已安装的 APK 访问原生库,而无需创建库的副本。
- 减小下载文件大小,因为在 APK 或 Android App Bundle 中添加未压缩的原生库通常可提高 Play 商店的压缩率。
如果您希望 Android Gradle 插件改为打包压缩后的原生库,请在应用的清单中添加以下代码:
<application
android:extractNativeLibs="true"
... >
</application>
默认 NDK 版本
现在,如果您下载了多个版本的 NDK,Android Gradle 插件会选择一个默认版本来编译源代码文件。以前,该插件选择的是最新下载的 NDK 版本。使用模块的 build.gradle
文件中的 android.ndkVersion
属性可替换插件选择的默认版本。
简化了 R 类的生成过程
Android Gradle 插件通过仅为项目中的每个库模块生成一个 R 类并与其他模块依赖项共享这些 R 类,简化了编译类路径。这项优化应该会加快构建速度,但您需要注意以下事项:
- 由于编译器与上游模块依赖项共享 R 类,因此项目中的每个模块都必须使用独一无二的软件包名称。
- 库的 R 类对其他项目依赖项的可见性取决于用于将库添加为依赖项的配置。例如,如果库 A 将库 B 添加为“api”依赖项,则库 A 和其他依赖于库 A 的库都可以访问库 B 的 R 类。不过,如果库 A 使用
implementation
依赖项配置,则其他库可能无权访问库 B 的 R 类。如需了解详情,请参阅依赖项配置。
移除默认配置中缺少的资源
对于库模块,如果您添加了未包含在默认资源集内的语言资源(例如,将 hello_world
作为字符串资源添加到 /values-es/strings.xml
中,但未在 /values/strings.xml
中定义该资源),Android Gradle 插件在编译项目时将不会再添加该资源。这种行为变更应该会减少 Resource Not Found
运行时异常,并提高构建速度。
D8 现在遵循注释的类保留政策
现在,在编译应用时,D8 会遵循注释应用的类保留政策,并且这些注释在运行时不再可用。将应用的目标 SDK 设置为 API 级别 23 时,也存在此行为;此前,在使用旧版本的 Android Gradle 插件和 D8 编译应用时,会允许在运行时访问这些注释。
其他行为变更
aaptOptions.noCompress
在所有平台(针对 APK 和软件包)上都不再区分大小写,并且遵循使用大写字符的路径。- 现在,数据绑定默认为增量式。如需了解详情,请参阅问题 #110061530。
- 现在,包括 Roboelectric 单元测试在内的所有单元测试都可以完全缓存。如需了解详情,请参阅问题 #115873047。
问题修复
此版本的 Android Gradle 插件包含以下问题修复:
- 现在,使用数据绑定的库模块支持 Robolectric 单元测试。如需了解详情,请参阅问题 #126775542。
- 现在,您可在启用 Gradle 的并行执行模式的情况下跨多个模块运行
connectedAndroidTest
任务。
已知问题
本部分介绍 Android Gradle 插件 3.6.0 中存在的已知问题。
Android Lint 任务的执行速度过慢
Android Lint 由于解析基础架构性能降低,导致在某些代码构造中对 lambda 的推断类型的计算速度变慢,因此可能需要更长时间才能完成某些项目。
此问题会报告为 IDEA 错误,并将在 Android Gradle 插件 4.0 中修复。
缺少清单类
如果您的应用在其清单中定义自定义权限,Android Gradle 插件通常会生成 Manifest.java
类,用于以字符串常量的形式添加您的自定义权限。该插件会将此类与您的应用打包在一起,以便于您在运行时更轻松地引用这些权限。
在 Android Gradle 插件 3.6.0 中无法生成清单类。如果您使用此版本的插件构建应用,并且该应用引用了清单类,您可能会看到 ClassNotFoundException
异常。如需解决此问题,请执行以下某项操作:
- 通过完全限定名称引用自定义权限。例如:
"com.example.myapp.permission.DEADLY_ACTIVITY"
。 - 定义您自己的常量,如下所示:
public final class CustomPermissions {
public static final class permission {
public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
}
3.5.0(2019 年 8 月)
Android Gradle 插件 3.5.0 和 Android Studio 3.5 是一个重大版本,同时也是 Project Marble 计划的成果,该计划主要围绕 Android 开发者工具的三大核心领域进行改进,分别是系统运行状况、功能完善和错误修复。值得注意的是,本次更新的重中之重是提高项目的构建速度。
要详细了解这些更新以及其他 Project Marble 更新,请参阅 Android 开发者博文或以下几个部分的内容。
此版本的 Android 插件需要使用以下工具:
- Gradle 5.4.1。如需了解详情,请阅读有关更新 Gradle 的部分。
- SDK Build Tools 28.0.3 或更高版本。
3.5.3(2019 年 12 月)
本次要更新对 Android Studio 3.5.3 构成补充,修复了各种错误并做出了多项性能改进。
3.5.2</