Android Gradle 插件 4.1.0(2020 年 8 月)

兼容性

最低版本 默认版本 注释
Gradle 6.5 不适用 如需了解详情,请参阅更新 Gradle
SDK 构建工具 29.0.2 29.0.2 安装配置 SDK 构建工具。
NDK 不适用 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 接口集中定义,与其实现类分开。这意味着

  • nullability 和 mutability 现在在 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 依赖项中导入 Prefab 软件包的功能。在 AGP 4.1 中,现在可以从外部原生构建中将库导出到 Android Library 项目的 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 上的使用 R8 缩减使用 Kotlin 反射的 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 类中移除 BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE 属性,因为这些静态值未反映应用的最终版本代码和名称值,因此具有误导性。此外,这些值在清单合并期间被丢弃。

在未来版本的 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 项目中的插桩测试,因为在单元测试中针对这些类进行编译和运行可能会产生不正确的输出。

io.fabric Gradle 插件已弃用

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