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 外部原生构建的 mylibrary
和 myotherlibrary
库将打包到你的构建生成的 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.enableBuildCache
和 android.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_NAME
和 BuildConfig.VERSION_CODE
属性,因为这些静态值未反映应用的最终版本代码和名称值,因此具有误导性。此外,这些值在清单合并期间被丢弃。
在未来版本的 Android Gradle 插件中,versionName
和 versionCode
属性也将从库的 DSL 中移除。目前,无法从库子项目自动访问应用版本代码/名称。
对于应用模块,没有更改,你仍然可以在 DSL 中为 versionCode
和 versionName
分配值;这些值将传播到应用的清单和 BuildConfig
字段。
设置 NDK 路径
你可以使用模块的 build.gradle
文件中的 android.ndkPath
属性设置本地 NDK 安装路径。
android {
ndkPath "your-custom-ndk-path"
}
android {
ndkPath = "your-custom-ndk-path"
}
如果你将此属性与android.ndkVersion
属性一起使用,则此路径必须包含与 android.ndkVersion
匹配的 NDK 版本。
库单元测试行为变更
我们更改了库单元测试的编译和运行方式。库的单元测试现在针对库自身的编译/运行时类进行编译和运行,从而使单元测试以与外部子项目相同的方式使用库。此配置通常会产生更好的测试效果。
在某些情况下,使用数据绑定的库单元测试可能会遇到缺失的 DataBindingComponent
或 BR
类。这些测试需要移植到 androidTest
项目中的插桩测试,因为在单元测试中针对这些类进行编译和运行可能会产生不正确的输出。
io.fabric Gradle 插件已弃用
io.fabric Gradle 插件已弃用,并且与 Android Gradle 插件 4.1 版本不兼容。有关已弃用的 Fabric SDK 以及迁移到 Firebase Crashlytics SDK 的更多信息,请参阅升级到 Firebase Crashlytics SDK。