Android Gradle 插件 7.1.0(2022 年 1 月)

Android Gradle 插件 7.1.0 是一个重要版本,包含各种新功能和改进。

7.1.3(2022 年 4 月)

此小幅更新包含以下 bug 修复

  • R8 报告的重复类问题

要查看此版本包含的完整 bug 修复列表,请参阅 Android Studio Bumblebee Patch 3 博客文章

7.1.2(2022 年 2 月)

此小幅更新包含以下 bug 修复

  • Android Gradle 插件 7.1.0-rc01 在单元测试期间未能执行 ASM 字节码转换
  • Gradle 同步失败并出现“Unable to load class 'com.android.build.api.extension.AndroidComponentsExtension'.”错误。
  • Android Gradle 插件 7.0.0 中的 Groovy DSL 无法使用某些新的 DSL 块
  • AGP 7.1 新的发布 API:创建的 javadoc jar 未签名
  • ClassesDataSourceCache 应使用最新的 Asm 版本
  • Android Studio BumbleBee 并非总是部署最新更改

要查看此版本包含的完整 bug 修复列表,请参阅 Android Studio Bumblebee Patch 2 博客文章

7.1.1(2022 年 2 月)

此小幅更新对应于 Android Studio Bumblebee Patch 1 的发布。

要查看此版本包含的 bug 修复列表,请参阅 Android Studio Bumblebee Patch 1 博客文章

兼容性

最低版本 默认版本 备注
Gradle 7.2 7.2 要了解详情,请参阅更新 Gradle
SDK 构建工具 30.0.3 30.0.3 安装配置 SDK 构建工具。
NDK 不适用 21.4.7075529 安装配置不同版本的 NDK。
JDK 11 11 要了解详情,请参阅设置 JDK 版本

Lint 分析任务现已可缓存

AndroidLintAnalysisTask 现在与Gradle 构建缓存兼容。如果您通过在 gradle.properties 文件中设置 org.gradle.caching=true 来启用构建缓存,lint 分析任务将尽可能从构建缓存获取其输出。

使用 Android Gradle 插件运行 lint 时,lint 分析任务通常是最大的瓶颈,因此在许多情况下,启用构建缓存可以提高运行 lint 时的构建速度。例如,如果您有一个多模块项目并在 CI 服务器上运行 lint 之前清理构建目录,您应该会看到明显的性能提升。

C/C++ 模块现在可以引用同一项目中的其他 C/C++ 模块

现在可以将带有 C/C++ 代码的 Gradle Android 模块设置为引用另一个 Gradle 模块中的头文件和库代码。Prefab 协议用于在 Gradle 模块之间通信头文件和库。

要求

  • “使用”模块必须是 CMake 而不是 ndk-build。对 ndk-build 的支持将需要未来的 NDK 更新。“发布”模块可以是 CMakendk-build

  • “使用”模块必须在 build.gradle 文件中启用 prefab

android {
  buildFeatures {
    prefab true
  }
}
  • “发布”模块必须在 build.gradle 文件中启用 prefabPublishing
android {
  buildFeatures {
    prefabPublishing true
  }
}
  • “使用”模块必须通过在 build.gradle 文件的 dependencies 块中添加一行来引用“发布”模块。例如
dependencies {
  implementation project(':mylibrary')
}
  • “发布”模块必须使用 prefab 部分公开软件包。例如
android {
  prefab {
    mylibrary {
      libraryName "libmylibrary"
      headers "src/main/cpp/include"
    }
  }
}
  • 使用模块的 CMakeLists.txt 文件可以使用 find_package() 来查找生成模块发布的软件包。例如
find_package(mylibrary REQUIRED CONFIG)
target_link_libraries(
  myapplication
  mylibrary::mylibrary)
  • 整个应用必须有一个 STL。因此,例如,使用模块和发布模块都可以使用 C++ 共享 STL。
   android {
      defaultConfig {
        externalNativeBuild {
          cmake {
            arguments '-DANDROID_STL=c++_shared'
          }
        }
      }
    }

要进一步了解如何使用 AGP 配置原生 AAR 使用方和生成方,请参阅使用 AGP 的原生依赖项

settings.gradle 文件中的仓库设置

在 Android Studio Bumblebee 中创建新项目时,顶层 build.gradle 文件包含 plugins 块,后跟用于清理构建目录的代码

plugins {
    id 'com.android.application' version '7.1.0-beta02' apply false
    id 'com.android.library' version '7.1.0-beta02' apply false
    id 'org.jetbrains.kotlin.android' version '1.5.30' apply false
}
task clean(type: Delete) {
  delete rootProject.buildDir
}

之前位于顶层 build.gradle 文件中的仓库设置现在位于 settings.gradle 文件中

pluginManagement {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
  }
}
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    google()
    mavenCentral()
  }
}
rootProject.name = 'GradleManagedDeviceTestingNew'
include ':app'

模块级 build.gradle 文件没有改变。因此,使用顶层 build.gradle 文件和 settings.gradle 文件定义应用于项目所有模块的构建配置,或应用于 Gradle 本身的仓库和依赖项;使用模块级 build.gradle 文件定义特定于项目内给定模块的构建配置。

改进的资源压缩器

Android Studio Bumblebee 包含改进的资源压缩器,有助于减小您的应用大小。

支持包含动态特性的应用

Android Gradle 插件 7.1.0-alpha09 中更新了 Android 资源压缩器的默认实现。新实现支持压缩包含动态特性的应用。

实验性地进一步减小应用大小

新的资源压缩器实现可以通过修改资源表以移除未使用的值资源和对未使用文件资源的引用,进一步减小压缩应用的体积。新的资源压缩器可以完全删除未使用的文件资源,进一步减小应用大小。此行为目前未默认启用,但您可以通过将实验性选项 android.experimental.enableNewResourceShrinker.preciseShrinking=true 添加到项目的 gradle.properties 文件中来选择试用。

如果您发现新资源压缩器或实验标志的任何问题,请向我们报告。为了帮助诊断问题,或者作为临时解决方法,您可以通过向项目的 gradle.properties 添加 android.enableNewResourceShrinker=false 来切换回先前的实现。新的压缩器将基于文件的未使用资源替换为与先前资源压缩器略有不同的最小文件,但这预计不会对运行时产生任何影响。

旧实现计划在 Android Gradle 插件 8.0.0 中移除。

构建变体发布

Android Gradle 插件 7.1.0 及更高版本允许您配置要发布到 Apache Maven 仓库的构建变体。AGP 根据新的发布 DSL 创建一个包含单个或多个构建变体的组件,您可以使用该组件自定义到 Maven 仓库的发布。与先前版本相比,这还避免了不必要的工作,因为默认情况下不会创建组件。要了解详情,请参阅发布代码示例

发布 Javadoc JAR

AGP 7.1.0 及更高版本允许您从 Java 和 Kotlin 源生成 Javadoc,并为库项目发布 Javadoc JAR 文件以及 AAR。Javadoc 会添加到 POM 和Gradle Module Metadata{:.external} 文件中。通过在 singleVariantmultipleVariants 发布块中添加 withJavadocJar() 来启用此功能。要了解详情,请参阅发布选项代码示例

发布 sources JAR

AGP 7.1.0 及更高版本允许您为库项目发布 Java 和 Kotlin 源 JAR 文件以及 AAR。源会添加到 POM 和Gradle Module Metadata{:.external} 文件中。您可以通过在 singleVariantmultipleVariants 发布块中添加 withSourcesJar() 来启用此功能。要了解详情,请参阅发布选项代码示例

Lint 块语义更改

所有覆盖给定问题的严重级别(enabledisable/ignoreinformationalwarningerrorfatal)的 lint 方法现在都遵循配置顺序。例如,在 finalizeDsl() 中将问题设置为致命级别现在会覆盖在主 DSL 中将其禁用。有关更多信息,请参阅 lint{} 块参考文档和Android 构建流程和扩展点

Navigation Safe Args Gradle 插件所依赖的 AGP API 已被移除。AGP 7.1 不支持 Navigation Safe Args 2.4.0-rc1 或 2.4.0 版本,但支持 2.5.0-alpha01 和 2.4.1 版本。同时,作为解决方法,您可以将 AGP 7.1 与 Navigation Safe Args 的快照版本 Navigation 2.5.0-SNAPSHOT 一起使用。要使用快照版本,请按照快照说明,构建 ID 为 #8054565。

此外,Navigation Safe Args 2.4.1 和 2.5.0 版本将不再与 AGP 4.2 兼容;要使用这些版本的 Safe Args,您必须使用 AGP 7.0 及更高版本。

禁用自动组件创建

从 AGP 8.0 开始,自动组件创建将默认禁用。目前,AGP 7.1 会为每个构建变体自动创建一个组件,其名称与构建变体相同,并创建一个包含所有构建变体的 all 组件。这种自动组件创建将被禁用。要切换到新的行为,您应该通过将 android.disableAutomaticComponentCreation 设置为 true 来手动禁用自动组件创建。有关更多信息,请参阅使用 Maven Publish 插件

Firebase Performance Monitoring 兼容性

AGP 7.1 与 Firebase Performance Monitoring Gradle 插件 1.4.0 及更低版本不兼容。AGP 升级助手不会自动将插件更新到 1.4.1 版本,因此如果您正在使用 firebase-perf 并希望将 AGP 升级到 7.1,则需要手动完成此特定升级。

已知问题

本部分介绍了 Android Gradle 插件 7.1.0 中存在的已知问题。

使用 Hilt 插件的应用项目的单元测试问题

单元测试类路径包含未插桩的应用类,这意味着 Hilt 在运行单元测试时不会插桩应用类来处理依赖注入。

此问题将在 7.1.1 版本中修复,请参阅问题 #213534628