Android Gradle 插件 3.6.0(2020 年 2 月)

此版本的 Android 插件需要以下内容

最低版本 默认版本 说明
Gradle 5.6.4 5.6.4 要了解更多信息,请参阅 更新 Gradle
SDK 构建工具 28.0.3 28.0.3 安装配置 SDK 构建工具。

3.6.4(2020 年 7 月)

此次小更新支持与 Android 11 中 包可见性 的新默认设置和功能的兼容性。

有关详细信息,请参阅 4.0.1 版本说明

新功能

此版本的 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 跟踪,以便您可以更好地了解构建项目所需的时间。要输出此构建属性文件,请执行以下操作

  1. 运行 Gradle 构建时添加标志 -Pandroid.enableProfileJson=true。例如

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. 打开 Chrome 浏览器,并在搜索栏中键入 chrome://tracing

  3. 单击加载按钮,然后导航到 <var>project-root</var>/build/android-profile 以查找文件。该文件名为 profile-<var>timestamp</var>.json.gz

您可以在查看器顶部附近看到原生构建属性数据

Native build attribution trace in Chrome

行为变化

使用此版本的插件时,您可能会遇到以下行为变化。

默认情况下,原生库以未压缩的方式打包

在构建应用时,插件现在默认将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";
                  }
                }