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 的新依赖项配置implementationapicompileOnlyruntimeOnly)来限制哪些依赖项将其 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 Orchestrator

    Groovy

            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 迁移