Android Gradle 插件 3.6.0(2020 年 2 月)

此版本的 Android 插件需要满足以下条件

最低版本 默认版本 备注
Gradle 5.6.4 5.6.4 要了解更多信息,请参阅更新 Gradle
SDK Build Tools 28.0.3 28.0.3 安装配置 SDK Build Tools。

3.6.4(2020 年 7 月)

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

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

新功能

此版本的 Android Gradle 插件包含以下新功能。

View Binding

View Binding 在代码中引用视图时提供了编译时安全性。您现在可以用自动生成的绑定类引用替换 findViewById()。要开始使用 View Binding,请在每个模块的 build.gradle 文件中包含以下内容

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

要了解更多信息,请阅读 View Binding 文档

支持 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>项目根目录</var>/build/android-profile 以找到文件。文件的名称为 profile-<var>时间戳</var>.json.gz

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

Native build attribution trace in Chrome

行为变更

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

原生库默认打包为未压缩

构建应用时,插件现在默认将 extractNativeLibs 设置为 "false"。也就是说,您的原生库是页面对齐且未压缩打包的。虽然这会导致上传大小增加,但您的用户将受益于以下几点

  • 更小的应用安装大小,因为平台可以直接从已安装的 APK 访问原生库,而无需创建库的副本。
  • 更小的下载大小,因为当您在 APK 或 Android App Bundle 中包含未压缩的原生库时,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 类对其他项目依赖项的可见性取决于用于将该库作为依赖项包含的配置。例如,如果 Library A 将 Library B 作为“api”依赖项包含,则 Library A 和依赖于 Library A 的其他库可以访问 Library B 的 R 类。但是,如果 Library A 使用 implementation 依赖项配置,则其他库可能无法访问 Library B 的 R 类。要了解更多信息,请阅读有关依赖项配置的内容。

移除默认配置中缺失的资源

对于库模块,如果您包含了一种语言的资源,但该资源未包含在默认资源集中(例如,您在 /values-es/strings.xml 中包含 hello_world 作为字符串资源,但未在 /values/strings.xml 中定义该资源),则 Android Gradle 插件在编译项目时将不再包含该资源。此行为变更应该会减少 Resource Not Found 运行时异常并提高构建速度。

D8 现在遵循注解的 CLASS 保留策略

编译应用时,D8 现在会遵循注解何时应用 CLASS 保留策略,并且这些注解在运行时不再可用。当应用的 target SDK 设置为 API 级别 23 时,也存在此行为;在使用旧版本的 Android Gradle 插件和 D8 编译应用时,API 级别 23 之前允许在运行时访问这些注解。

其他行为变更

  • aaptOptions.noCompress 在所有平台(包括 APK 和 bundles)上不再区分大小写,并遵循使用大写字符的路径。
  • 数据绑定现在默认为增量式。要了解更多信息,请参阅问题 #110061530

  • 所有单元测试,包括 Roboelectric 单元测试,现在都可以完全缓存。要了解更多信息,请参阅问题 #115873047

Bug 修复

此版本的 Android Gradle 插件包含以下 bug 修复

  • 使用数据绑定的库模块现在支持 Robolectric 单元测试。要了解更多信息,请参阅问题 #126775542
  • 现在可以在启用 Gradle 并行执行模式的情况下,在多个模块上运行 connectedAndroidTest 任务。

已知问题

本节介绍 Android Gradle 插件 3.6.0 中的已知问题。

Android Lint 任务性能缓慢

由于其解析基础设施的回归,Android Lint 在某些项目上完成的时间可能会长得多,导致在某些代码构造中推断的 lambda 类型计算速度变慢。

该问题已作为IDEA 中的一个 bug 报告,并将在 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";
                  }
                }