Android Gradle 插件 3.6.0(2020 年 2 月)
此版本的 Android 插件需要以下内容
最低版本 | 默认版本 | 说明 | |
---|---|---|---|
Gradle | 5.6.4 | 5.6.4 | 要了解更多信息,请参阅 更新 Gradle。 |
SDK 构建工具 | 28.0.3 | 28.0.3 | 安装 或 配置 SDK 构建工具。 |
新功能
此版本的 Android Gradle 插件包含以下新功能。
视图绑定
在代码中引用视图时,视图绑定提供编译时安全性。您现在可以使用自动生成的绑定类引用替换 findViewById()
。要开始使用视图绑定,请在每个模块的 build.gradle
文件中包含以下内容
android { viewBinding.enabled = true }
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 构建时添加标志
-Pandroid.enableProfileJson=true
。例如gradlew assembleDebug -Pandroid.enableProfileJson=true
-
打开 Chrome 浏览器,并在搜索栏中键入
chrome://tracing
。 -
单击加载按钮,然后导航到
<var>project-root</var>/build/android-profile
以查找文件。该文件名为profile-<var>timestamp</var>.json.gz
。
您可以在查看器顶部附近看到原生构建属性数据
行为变化
使用此版本的插件时,您可能会遇到以下行为变化。
默认情况下,原生库以未压缩的方式打包
在构建应用时,插件现在默认将extractNativeLibs
设置为"false"
。也就是说,您的原生库是页面对齐的,并且以未压缩的方式打包。虽然这会导致上传文件大小增加,但您的用户将受益于以下方面:
- 更小的应用安装大小,因为平台可以直接从已安装的 APK 访问原生库,而无需创建库的副本。
- 更小的下载大小,因为当您在 APK 或 Android 应用包中包含未压缩的原生库时,Play 商店压缩通常会更好。
如果您希望 Android Gradle 插件改为打包压缩的原生库,请在应用的清单文件中包含以下内容:
<application
android:extractNativeLibs="true"
... >
</application>
注意:extractNativeLibs
清单属性已被useLegacyPackaging
DSL 选项取代。有关更多信息,请参阅发行说明 使用 DSL 打包压缩的原生库。
默认 NDK 版本
如果您下载了多个版本的 NDK,Android Gradle 插件现在会选择一个默认版本用于编译您的源代码文件。以前,插件会选择下载的最新版本的 NDK。使用模块的 build.gradle
文件中的 android.ndkVersion
属性来覆盖插件选择的默认值。
简化的 R 类生成
Android Gradle 插件通过为项目中的每个库模块仅生成一个 R 类并与其他模块依赖项共享这些 R 类来简化编译类路径。此优化应该会加快构建速度,但您需要牢记以下几点:
- 由于编译器与上游模块依赖项共享 R 类,因此项目中的每个模块都必须使用唯一的包名。
- 库的 R 类对其他项目依赖项的可见性由用于将库包含为依赖项的配置确定。例如,如果库 A 将库 B 包含为“api”依赖项,则库 A 和依赖于库 A 的其他库可以访问库 B 的 R 类。但是,其他库可能无法访问库 B 的 R 类。如果库 A 使用
implementation
依赖项配置。要了解更多信息,请阅读有关 依赖项配置 的内容。
删除默认配置中缺少的资源
对于库模块,如果您包含了未包含在默认资源集中的一种语言的资源(例如,如果您在 /values-es/strings.xml
中将 hello_world
包含为字符串资源,但未在 /values/strings.xml
中定义该资源),则 Android Gradle 插件在编译项目时不再包含该资源。此行为更改应该会导致更少的 Resource Not Found
运行时异常并提高构建速度。
D8 现在尊重注释的 CLASS 保留策略
在编译应用时,D8 现在会尊重注释何时应用 CLASS 保留策略,并且这些注释在运行时不再可用。当将应用的目标 SDK 设置为 API 级别 23 时,此行为也存在,以前在使用旧版本的 Android Gradle 插件和 D8 编译应用时,允许在运行时访问这些注释。
其他行为更改
-
aaptOptions.noCompress
在所有平台上(对于 APK 和捆绑包)都不再区分大小写,并且尊重使用大写字符的路径。 -
数据绑定现在默认情况下是增量的。要了解更多信息,请参阅 问题 #110061530。
-
所有单元测试,包括 Roboelectric 单元测试,现在都完全可缓存。要了解更多信息,请参阅 问题 #115873047。
错误修复
此版本的 Android Gradle 插件包含以下错误修复:
- 现在,使用数据绑定的库模块支持 Roboelectric 单元测试。要了解更多信息,请参阅 问题 #126775542。
- 现在,您可以在启用 Gradle 的 并行执行模式 的情况下,跨多个模块运行
connectedAndroidTest
任务。
已知问题
本节描述了 Android Gradle 插件 3.6.0 中存在的已知问题。
Android Lint 任务性能缓慢
由于其解析基础结构中的回归,Android Lint 在某些项目上可能需要更长时间才能完成,导致在某些代码结构中推断的 lambda 类型计算速度变慢。
此问题已报告为 IDEA 中的一个错误,将在 Android Gradle 插件 4.0 中修复。
缺少清单类 {:#agp-missing-manifest}
如果您的应用在其清单中定义了自定义权限,则 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"; } }