Android Gradle 插件 4.1.0(2020 年 8 月)

兼容性

最低版本 默认版本 说明
Gradle 6.5 N/A 要了解更多信息,请参阅 更新 Gradle
SDK 构建工具 29.0.2 29.0.2 安装配置 SDK 构建工具。
NDK N/A 21.1.6352462 安装配置 不同版本的 NDK。

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org.cn/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

新功能

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

Kotlin 脚本 DSL 支持

为了帮助改善 Kotlin 构建脚本用户的编辑体验,Android Gradle 插件 4.1 的 DSL 和 API 现在在与其实现类分开的 Kotlin 接口集中定义。这意味着

  • 现在在 Kotlin 类型上明确声明了可空性和可变性。
  • 从这些接口生成的文档发布在 Kotlin API 参考 中。
  • Android Gradle 插件的 API 表面已明确定义,以便将来能够更轻松地扩展 Android 构建。

重要:如果您已采用 KTS 构建脚本或在 buildSrc 中使用 Kotlin,这可能会导致某些错误的源代码兼容性中断,这些错误在以前的版本中将表现为运行时错误。

设计为在 DSL 中进行修改的集合类型现在统一定义为

val collection: MutableCollectionType

这意味着在某些以前支持它的集合的 Kotlin 脚本中,不再能够编写以下内容

collection = collectionTypeOf(...)

但是,修改集合得到统一支持,因此 collection += …collection.add(...) 现在应该在任何地方都能使用。

如果您在升级使用 Android Gradle 插件 Kotlin API 和 DSL 的项目时发现任何问题,请 报告错误

从 AAR 导出 C/C++ 依赖项

Android Gradle 插件 4.0 添加了 在 AAR 依赖项中导入预制包 的功能。在 AGP 4.1 中,现在可以从 Android 库项目的 AAR 中导出外部原生构建中的库。

要导出您的原生库,请将以下内容添加到库项目的 build.gradle 文件的 android 块中

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

在此示例中,来自 ndk-build 或 CMake 外部原生构建的 mylibrarymyotherlibrary 库将打包在构建生成的 AAR 中,并且每个库都将从指定的目录将其标头导出到其依赖项。

注意:对于 Android Gradle 插件 4.0 及更高版本的使用者,导入预构建原生库的配置设置已更改。有关更多信息,请参阅 4.0 版本说明

R8 对 Kotlin 元数据的支持

Kotlin 在 Java 类文件中使用自定义元数据来识别 Kotlin 语言结构。R8 现在支持维护和重写 Kotlin 元数据,以完全支持使用 kotlin-reflect 缩减 Kotlin 库和应用。

要保留 Kotlin 元数据,请添加以下保留规则

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

这将指示 R8 保留所有直接保留的类的 Kotlin 元数据。

有关更多信息,请参阅 Medium 上的 使用 Kotlin 反射和 R8 缩减 Kotlin 库和应用{:.external}。

调试版本中的断言

使用 Android Gradle 插件 4.1.0 及更高版本构建应用的调试版本时,内置编译器 (D8) 将重写应用的代码以在编译时启用断言,因此断言检查始终处于活动状态。

行为更改

Android Gradle 插件构建缓存已移除

AGP 4.1 中移除了 AGP 构建缓存。AGP 构建缓存最初在 AGP 2.3 中引入,用于补充 Gradle 构建缓存,但在 AGP 4.1 中完全被 Gradle 构建缓存取代。此更改不会影响构建时间。

cleanBuildCache 任务以及 android.enableBuildCacheandroid.buildCacheDir 属性已弃用,并将在 AGP 7.0 中移除。目前 android.enableBuildCache 属性无效,而 android.buildCacheDir 属性和 cleanBuildCache 任务将在 AGP 7.0 之前保持功能,用于删除任何现有的 AGP 构建缓存内容。

使用代码缩减的应用的应用大小显著减小

从本版本开始,R 类中的字段默认不再保留,这可能会导致启用代码缩减的应用的 APK 大小显著减少。除非您正在通过反射访问 R 类,否则这不会导致行为更改,在这种情况下,需要添加保留规则来保留这些 R 类。

android.namespacedRClass 属性重命名为 android.nonTransitiveRClass

实验性标志 android.namespacedRClass 已重命名为 android.nonTransitiveRClass

此标志设置在 gradle.properties 文件中,它启用每个库的 R 类的命名空间,以便其 R 类仅包含库本身中声明的资源,而不包含来自库依赖项的任何资源,从而减小该库的 R 类的大小。

Kotlin DSL:coreLibraryDesugaringEnabled 重命名

Kotlin DSL 编译选项 coreLibraryDesugaringEnabled 已更改为 isCoreLibraryDesugaringEnabled。有关此标志的更多信息,请参阅 Java 8+ API 反糖支持 (Android Gradle 插件 4.0.0+)

从库项目中的 BuildConfig 类中删除版本属性

仅对于库项目,BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE 属性已从生成的 BuildConfig 类中删除,因为这些静态值不反映应用程序版本代码和名称的最终值,因此具有误导性。此外,这些值在清单合并期间会被丢弃。

在 Android Gradle 插件的未来版本中,versionNameversionCode 属性也将从库的 DSL 中删除。目前,无法从库子项目自动访问应用版本代码/名称。

对于应用程序模块,没有任何更改,您仍然可以在 DSL 中为 versionCodeversionName 分配值;这些值将传播到应用程序的清单和 BuildConfig 字段。

设置 NDK 路径

您可以使用模块的 build.gradle 文件中的 android.ndkPath 属性设置本地 NDK 安装的路径。


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

如果您将此属性与 android.ndkVersion 属性一起使用,则此路径必须包含与 android.ndkVersion 匹配的 NDK 版本。

库单元测试行为更改

我们更改了编译和运行库单元测试的方式。库的单元测试现在针对库本身的编译/运行时类进行编译和运行,导致单元测试以与外部子项目相同的方式使用库。此配置通常会导致更好的测试结果。

在某些情况下,使用数据绑定的库单元测试可能会遇到缺少 DataBindingComponentBR 类的情况。这些测试需要移植到 androidTest 项目中的 Instrumentation 测试中,因为在单元测试中针对这些类进行编译和运行可能会产生不正确的输出。

io.fabric Gradle 插件已弃用

io.fabric Gradle 插件已弃用,与 Android Gradle 插件 4.1 版本不兼容。有关已弃用的 Fabric SDK 和迁移到 Firebase Crashlytics SDK 的更多信息,请参阅 升级到 Firebase Crashlytics SDK