Android Gradle 插件 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 秒
单行 Java 代码更改(实现更改) 约 2 分钟 15 秒 约 29 秒 约 6.4 秒

其中一些更改会破坏现有的构建。因此,您应该在使用新插件之前考虑
迁移项目的难度。

如果您没有体验到上述性能改进,请 提交错误报告 并使用 Gradle Profiler 包含构建跟踪。

此版本的 Android 插件需要以下内容

最低版本 默认版本 说明
Gradle 4.1 4.1 要了解更多信息,请参阅 更新 Gradle
SDK Build Tools 26.0.2 26.0.2 安装配置 SDK Build Tools。通过此更新,您不再需要指定 build tools 的版本 — 插件默认使用最低要求的版本。因此,您现在可以删除 android.buildToolsVersion 属性。

3.0.1(2017 年 11 月)

这是一个次要更新,用于支持 Android Studio 3.0.1,其中包含常规错误修复和性能改进。

优化

  • 通过细粒度的任务图,提高多模块项目的并行性。
  • 在更改依赖项时,Gradle 通过不重新编译不访问该依赖项 API 的模块来执行更快的构建。您应该通过 使用 Gradle 的新依赖项配置 来限制哪些依赖项将其 API 泄漏到其他模块:implementationapicompileOnlyruntimeOnly
  • 由于按类dexing,增量构建速度更快。每个类现在都编译成单独的DEX文件,并且只重新dex修改过的类。对于将minSdkVersion设置为20或更低并使用旧版multi-dex的应用,您也应该预期构建速度会有所提高。
  • 通过优化某些任务以使用缓存的输出,提高了构建速度。要从这种优化中获益,您需要首先启用Gradle构建缓存
  • 使用现在默认启用的AAPT2改进了增量资源处理。如果您在使用AAPT2时遇到问题,请报告错误。您也可以通过在gradle.properties文件中设置android.enableAapt2=false并在命令行中运行./gradlew --stop来禁用AAPT2,从而重新启动Gradle守护进程。

新增功能

  • 区分变体的依赖项管理。在构建模块的特定变体时,插件现在会自动将本地库模块依赖项的变体与您正在构建的模块的变体匹配。
  • 包含一个新的功能模块插件,以支持Android即时应用和Android即时应用SDK(您可以使用SDK管理器下载)。要了解有关使用新插件创建功能模块的更多信息,请阅读具有多个功能的即时应用的结构
  • 内置支持使用某些Java 8语言特性和Java 8库。**Jack现已弃用,不再需要**,您应该首先禁用Jack以使用默认工具链中改进的Java 8支持。更多信息,请阅读使用Java 8语言特性
  • 增加了使用Android测试编排器运行测试的支持,这允许您在Instrumentation的每次调用中运行应用的每个测试。因为每个测试都在其自己的Instrumentation实例中运行,所以测试之间的任何共享状态都不会累积在设备的CPU或内存上。而且,即使一个测试崩溃,它也只会使其自身的Instrumentation实例崩溃,因此您的其他测试仍然可以运行。

    • 添加了testOptions.execution来确定是否使用设备上的测试编排。如果您想使用Android测试编排器,则需要指定ANDROID_TEST_ORCHESTRATOR,如下所示。默认情况下,此属性设置为HOST,这将禁用设备上的编排,并且是运行测试的标准方法。

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • 新的androidTestUtil依赖项配置允许您在运行Instrumentation测试(例如Android测试编排器)之前安装另一个测试辅助APK。

    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即时应用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()获取每个变体的清单文件。要了解更多信息,请阅读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迁移