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 秒
1 行 Java 更改(实现更改) 大约 2 分 15 秒 大约 29 秒 大约 6.4 秒

其中某些更改会让现有 build 出现异常。因此,您应该考虑
在使用新插件之前迁移您的项目。

如果您没有体验到上述性能提升,请提交 bug 并使用 Gradle 性能分析器添加 build 的轨迹。

此版本的 Android 插件需要使用以下工具:

  • Gradle 4.1 或更高版本。如需了解详情,请参阅有关更新 Gradle 的部分。
  • Build Tools 26.0.2 或更高版本。经过此次更新,您无需再指定 Build Tools 的版本。默认情况下,该插件会使用所需的最低版本。因此,您现在可以移除 android.buildToolsVersion 属性了。

3.0.1(2017 年 11 月)

此次要更新对 Android Studio 3.0.1 构成补充,修复了各种 bug 并进行了多项性能改进。

优化

  • 通过精细控制的任务图提升了多模块项目的并行性。
  • 更改依赖项时,Gradle 不会重新编译无法访问该依赖项 API 的模块,从而提高构建速度。 您应使用 Gradle 的新依赖项配置implementationapicompileOnlyruntimeOnly)限制将其 API 泄露给其他模块的依赖项。
  • 借助每个类的 dex 处理,可加快增量构建速度。每个类现在都会编译成单独的 DEX 文件,并且只会对修改过的类重新进行 dex 处理。对于将 minSdkVersion 设置为 20(或更低数值)并使用旧版 MultiDex 的应用,构建速度应该也会得到改善。
  • 通过优化某些任务来使用缓存的输出,从而加快构建速度。如需利用此项优化,您需要先启用 Gradle 构建缓存
  • 使用 AAPT2(现已默认处于启用状态)改进了增量资源处理。如果您在使用 AAPT2 时遇到问题,请报告 bug。您也可以停用 AAPT2,方法是在 gradle.properties 文件中设置 android.enableAapt2=false,然后通过在命令行中运行 ./gradlew --stop 来重启 Gradle 守护程序。

新功能

  • 变体感知依赖项管理。现在,在构建某个模块的特定变体时,插件会自动将本地库模块依赖项的变体与您正在构建的模块变体进行匹配。
  • 加入了新的功能模块插件,以支持 Android 免安装应用和 Android 免安装应用 SDK(您可以使用 SDK 管理器下载)。如需详细了解如何使用新插件创建功能模块,请参阅包含多个功能的免安装应用的结构
  • 对使用某些 Java 8 语言功能和 Java 8 库提供内置支持。Jack 现已废弃且无需再使用,您应先停用 Jack,才能使用内置到默认工具链中并得到改进的 Java 8 支持。有关详情,请参阅使用 Java 8 语言功能一文。
  • 添加了对使用 Android Test Orchestrator 运行测试的支持,可让您在它自己的插桩调用中运行每一项应用测试。因为每个测试都是在自己的插桩实例中运行,所以测试之间的任何共享状态都不会在设备的 CPU 或内存上累积。而且,即使有一个测试崩溃,也只会移除它自己的插桩实例,因此其他测试仍会正常运行。

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

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • 新的 androidTestUtil 依赖项配置允许您在运行插桩测试(例如 Android Test Orchestrator)之前安装其他测试辅助程序 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。如果您使用这些 API,您的 build 将会出现异常。例如,您无法再使用 Variants API 访问 outputFile() 对象,也无法使用 processManifest.manifestOutputFile() 获取各个变体的清单文件。如需了解详情,请参阅 API 变更部分。
  • 您无需再指定 Build Tools 的版本(因此,您现在可以移除 android.buildToolsVersion 属性了)。默认情况下,插件会针对所用 Android 插件的版本自动使用所需的最低版 Build Tools。
  • 现在,您可以在 buildTypes 代码块中启用/停用 PNG 处理(如下所示)。默认情况下,会为所有 build 启用 PNG 处理;但调试 build 除外,因为它会增加包含许多 PNG 文件的项目的构建时间。因此,为了缩短其他 build 类型的构建时间,您应该停用 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 迁移