Android Gradle Plugin 3.0.0 (2017 年 10 月)
Android Gradle 插件 3.0.0 包含一系列更改,旨在解决大型项目的性能问题。
例如,在一个具有约 130 个模块和大量外部依赖项(但没有代码或资源)的示例骨架项目中,您可以获得与以下类似的性能提升:
Android 插件版本 + Gradle 版本 | Android 插件 2.2.0 + Gradle 2.14.1 | Android 插件 2.3.0 + Gradle 3.3 | Android 插件 3.0.0 + Gradle 4.1 |
---|---|---|---|
配置(例如运行 ./gradlew --help ) |
约 2 分钟 | 约 9 秒 | 约 2.5 秒 |
1 行 Java 更改(实现更改) | 约 2 分 15 秒 | 约 29 秒 | 约 6.4 秒 |
这些更改中的某些会破坏现有构建。因此,您应在使
用新插件之前考虑迁移项目的精力。
如果您没有体验到上述性能提升,请提交错误,并使用 Gradle Profiler 包含您构建的跟踪记录。
此版本的 Android 插件需要满足以下条件:
最低版本 | 默认版本 | 备注 | |
---|---|---|---|
Gradle | 4.1 | 4.1 | 要了解详情,请参阅更新 Gradle。 |
SDK 构建工具 | 26.0.2 | 26.0.2 | 安装或配置 SDK 构建工具。通过此更新,您无需再为构建工具指定版本,插件默认使用最低所需版本。因此,您现在可以移除 android.buildToolsVersion 属性。 |
3.0.1 (2017 年 11 月)
这是一个次要更新,旨在支持 Android Studio 3.0.1,并包含一般性的 bug 修复和性能改进。
优化
- 通过细粒度的任务图,更好地实现多模块项目的并行处理。
- 更改依赖项时,Gradle 会通过不重新编译无法访问该依赖项 API 的模块来加快构建速度。您应通过使用 Gradle 的新依赖项配置(
implementation
、api
、compileOnly
和runtimeOnly
)来限制哪些依赖项将其 API 泄露给其他模块。 - 由于按类进行 Dex 处理,增量构建速度更快。现在每个类都编译到单独的 DEX 文件中,并且只有修改过的类才会重新进行 Dex 处理。对于将
minSdkVersion
设置为 20 或更低版本并使用旧版多 Dex 的应用,您也应预期构建速度有所提高。 - 通过优化某些任务以使用缓存输出,提高了构建速度。要受益于此优化,您需要首先启用 Gradle 构建缓存。
- 使用 AAPT2 提高了增量资源处理速度,AAPT2 现在默认处于启用状态。如果您在使用 AAPT2 时遇到问题,请报告 bug。您也可以通过在
gradle.properties
文件中设置android.enableAapt2=false
并从命令行运行./gradlew --stop
来重启 Gradle 守护进程以停用 AAPT2。
新功能
- Variant-aware 依赖项管理。在构建模块的某个 Variant 时,插件现在会自动将本地库模块依赖项的 Variant 与您正在构建的模块的 Variant 进行匹配。
- 包含一个新 Feature 模块插件,以支持Android 免安装应用和 Android 免安装应用 SDK(您可以使用SDK 管理器下载)。要了解如何使用新插件创建 Feature 模块,请阅读具有多个 Feature 的免安装应用结构。
- 内置支持使用某些 Java 8 语言特性和 Java 8 库。Jack 现在已弃用且不再需要,您应该先停用 Jack,然后才能使用默认工具链中内置的改进的 Java 8 支持。有关详情,请阅读使用 Java 8 语言特性。
-
增加了对使用 Android Test Orchestrator 运行测试的支持,它允许您在自己的 Instrumentation 调用中运行应用的每个测试。由于每个测试都在自己的 Instrumentation 实例中运行,因此测试之间的共享状态不会在设备的 CPU 或内存上累积。而且,即使一个测试崩溃,它也只会导致自己的 Instrumentation 实例崩溃,因此其他测试仍然可以运行。
- 添加了
testOptions.execution
以确定是否使用设备上的测试编排。如果您想使用 Android Test Orchestrator,需要指定ANDROID_TEST_ORCHESTRATOR
,如下所示。默认情况下,此属性设置为HOST
,这将停用设备上的编排,并且是运行测试的标准方法。
Groovy
android { testOptions { execution 'ANDROID_TEST_ORCHESTRATOR' } }
Kotlin
android { testOptions { execution = "ANDROID_TEST_ORCHESTRATOR" } }
- 添加了
-
新的
androidTestUtil
依赖项配置允许您在运行插桩测试之前安装另一个测试辅助 APK,例如 Android Test OrchestratorGroovy
dependencies { androidTestUtil 'com.android.support.test:orchestrator:1.0.0' ... }
Kotlin
dependencies { androidTestUtil("com.android.support.test:orchestrator:1.0.0") ... }
-
添加了
testOptions.unitTests.includeAndroidResources
以支持需要 Android 资源的单元测试,例如 Roboelectric。当您将此属性设置为true
时,插件会在运行单元测试之前执行资源、素材资源和清单合并。您的测试随后可以检查类路径上的com/android/tools/test_config.properties
以获取以下键值:-
android_merged_assets
:合并后素材资源目录的绝对路径。注意:对于库模块,合并后的素材资源不包含依赖项的素材资源(请参阅问题 #65550419)。
-
android_merged_manifest
:合并后清单文件的绝对路径。 -
android_merged_resources
:合并后资源目录的绝对路径,其中包含来自模块及其所有依赖项的所有资源。 -
android_custom_package
:最终 R 类的软件包名称。如果您动态修改应用 ID,此软件包名称可能与应用清单中的package
属性不匹配。
-
- 支持将字体作为资源(这是 Android 8.0 (API 级别 26) 中引入的新功能)。
- 支持使用 Android Instant Apps SDK 1.1 及更高版本的特定语言 APK。
-
您现在可以更改外部原生构建项目的输出目录,如下所示:
Groovy
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory "./outputs/cmake" } } }
Kotlin
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory = "./outputs/cmake" } } }
- 从 Android Studio 构建原生项目时,您现在可以使用 CMake 3.7 或更高版本。
-
新的
lintChecks
依赖项配置允许您构建一个定义自定义 Lint 规则的 JAR,并将其打包到您的 AAR 和 APK 项目中。您的自定义 Lint 规则必须属于一个单独的项目,该项目输出单个 JAR 并仅包含
compileOnly
依赖项。然后,其他应用和库模块可以使用lintChecks
配置依赖于您的 Lint 项目Groovy
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks project(':lint-checks') }
Kotlin
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks(project(":lint-checks")) }
行为变化
- Android 插件 3.0.0 移除了某些 API,如果您使用它们,您的构建将会中断。例如,您不能再使用 Variants API 访问
outputFile()
对象,也不能使用processManifest.manifestOutputFile()
获取每个 Variant 的清单文件。要了解详情,请阅读API 更改。 - 您无需再为构建工具指定版本(因此,您现在可以移除
android.buildToolsVersion
属性)。默认情况下,插件会自动使用您正在使用的 Android 插件版本所需的最低构建工具版本。 - 您现在在
buildTypes
块中启用/禁用 PNG 压缩,如下所示。PNG 压缩除了调试构建之外的所有构建都默认启用,因为它会增加包含许多 PNG 文件的项目的构建时间。因此,要缩短其他构建类型的构建时间,您应该禁用 PNG 压缩或将您的图像转换为 WebP。Groovy
android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } }
Kotlin
android { buildTypes { release { // Disables PNG crunching for the release build type. isCrunchPngs = false } } }
- Android 插件现在会自动构建您在外部 CMake 项目中配置的可执行目标。
- 您现在必须使用
annotationProcessor
依赖项配置将注解处理器添加到处理器类路径。 - 使用已弃用的
ndkCompile
现在受到更多限制。您应该改为迁移到使用 CMake 或 ndk-build 来编译您希望打包到 APK 中的原生代码。要了解详情,请阅读从 ndkcompile 迁移。