Плагин Android Gradle 7.1.0 (январь 2022 г.)

Плагин Android Gradle 7.1.0 – это крупный выпуск, в который входит множество новых функций и улучшений.

7.1.3 (апрель 2022 г.)

В этом обновлении исправлены следующие ошибки:

  • Проблемы с дублированием классов, о которых сообщает R8

Полный список исправлений ошибок, включенных в эту версию, можно найти в записи блога о патче 3 для Android Studio Bumblebee.

7.1.2 (февраль 2022 г.)

В этом обновлении исправлены следующие ошибки:

  • Плагин Android Gradle 7.1.0-rc01 не может выполнить преобразование байт-кода ASM во время модульного тестирования
  • Синхронизация Gradle завершается с ошибкой "Не удалось загрузить класс 'com.android.build.api.extension.AndroidComponentsExtension'".
  • Некоторые новые блоки DSL нельзя использовать в Groovy DSL в плагине Android Gradle 7.0.0
  • Новый API публикации AGP 7.1: созданный JAR-файл Javadoc не подписывается
  • ClassesDataSourceCache должен использовать последнюю версию Asm
  • Android Studio BumbleBee не всегда развертывает последние изменения

Полный список исправлений ошибок, включенных в этот выпуск, можно найти в записи блога о втором исправлении для Android Studio Bumblebee.

7.1.1 (февраль 2022 г.)

Это небольшое обновление соответствует выпуску Android Studio Bumblebee Patch 1.

Список исправлений ошибок, включенных в этот выпуск, можно найти в записи блога о первом исправлении для Android Studio Bumblebee.

Совместимость

Минимальная версия Версия по умолчанию Примечания
Gradle 7.2 7.2 Подробнее о том, как обновить Gradle…
Инструменты сборки SDK 30.0.3 30.0.3 Установите или настройте инструменты сборки SDK.
NDK Н/Д 21.4.7075529 Установите или настройте другую версию NDK.
JDK 11 11 Подробнее о том, как задать версию JDK…

Теперь задачу анализа кода можно кешировать

Теперь AndroidLintAnalysisTask совместим с кешем сборки Gradle. Если вы включите кеш сборки, задав org.gradle.caching=true в файле gradle.properties, задача анализа кода будет получать выходные данные из кеша сборки, когда это возможно.

Задача анализа кода с помощью инструмента lint часто является самым узким местом при использовании плагина Android Gradle, поэтому включение кеша сборки во многих случаях позволяет ускорить сборку при запуске lint. Вы должны заметить значительное повышение производительности, например если у вас многомодульный проект и вы очищаете каталог сборки перед запуском lint на сервере CI.

Модули C/C++ теперь могут ссылаться на другие модули C/C++ в том же проекте.

Теперь модуль Gradle для Android с кодом на C/C++ можно настроить так, чтобы он ссылался на файлы заголовков и код библиотеки в другом модуле Gradle. Протокол Prefab используется для передачи заголовков и библиотек между модулями Gradle.

Требования

  • Модуль consuming должен иметь значение CMake, а не ndk-build. Поддержка ndk-build будет добавлена в одном из будущих обновлений NDK. Модуль publishing может быть CMake или ndk-build.

  • Модуль consuming должен включить prefab в файле build.gradle.

android {
  buildFeatures {
    prefab true
  }
}
  • В модуле publishing в файле build.gradle должна быть включена функция prefabPublishing.
android {
  buildFeatures {
    prefabPublishing true
  }
}
  • Модуль consuming должен ссылаться на модуль publishing, для чего нужно добавить строку в файл build.gradle в блоке dependencies. Пример:
dependencies {
  implementation project(':mylibrary')
}
  • Модуль publishing должен предоставлять пакет с помощью раздела 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. Например, и модуль, который использует STL, и модуль, который публикует STL, могут использовать общую версию STL на C++.
   android {
      defaultConfig {
        externalNativeBuild {
          cmake {
            arguments '-DANDROID_STL=c++_shared'
          }
        }
      }
    }

Подробнее о том, как настроить потребителей и производителей AAR-файлов на C/C++ с помощью AGP, рассказывается в статье Зависимости нативных библиотек с 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 была обновлена в плагине Android Gradle 7.1.0-alpha09. Новая реализация поддерживает сжатие приложений с динамическими функциями.

Экспериментальные способы уменьшения размера приложения

Новая реализация уменьшения размера ресурсов позволяет ещё больше сократить размер приложения, изменяя таблицу ресурсов, чтобы удалить неиспользуемые ресурсы значений и ссылки на неиспользуемые ресурсы файлов. Новый инструмент для удаления неиспользуемых ресурсов позволяет уменьшить размер приложения. По умолчанию эта функция пока не включена, но вы можете попробовать ее, добавив экспериментальную настройку android.experimental.enableNewResourceShrinker.preciseShrinking=true в файл gradle.properties проекта.

Сообщайте о любых проблемах, которые вы обнаружите при использовании нового сокращения ресурсов или экспериментального флага. Чтобы помочь в диагностике проблем или в качестве временного решения, вы можете вернуться к предыдущей реализации, добавив android.enableNewResourceShrinker=false в gradle.properties проекта. Новый инструмент для удаления неиспользуемых ресурсов заменяет неиспользуемые ресурсы на основе файлов минимальными файлами, которые немного отличаются от тех, что использовались в предыдущей версии инструмента. Ожидается, что это не повлияет на работу приложения.

Старая реализация будет удалена в плагине Android Gradle 8.0.0.

Публикация вариантов сборки

Плагин Android Gradle версии 7.1.0 и более поздних позволяет настроить, какие варианты сборки будут опубликованы в репозитории Apache Maven. AGP создает компонент с одним или несколькими вариантами сборки на основе нового языка описания публикации, который можно использовать для настройки публикации в репозитории Maven. По сравнению с предыдущими версиями это также позволяет избежать ненужной работы, поскольку по умолчанию никакие компоненты не создаются. Подробнее см. в примере кода для публикации.

Как опубликовать JAR-файл Javadoc

В AGP 7.1.0 и более поздних версий можно создавать Javadoc из источников Java и Kotlin и публиковать JAR-файлы Javadoc в дополнение к AAR для проектов библиотек. Javadoc добавляется в POM и файлы метаданных модуля Gradle{:.external}. Чтобы включить эту функцию, добавьте withJavadocJar() в блок публикации singleVariant или multipleVariants. Подробнее о примере кода вариантов публикации…

Публикация JAR-файлов с исходным кодом

AGP 7.1.0 и более поздних версий позволяет публиковать исходные JAR-файлы Java и Kotlin в дополнение к AAR-файлам для проектов библиотек. Источники добавляются в файлы POM и Gradle Module Metadata{:.external}. Чтобы включить эту функцию, добавьте withSourcesJar() в блок публикации singleVariant или multipleVariants. Подробнее о примере кода вариантов публикации…

Семантические изменения в блоке Lint

Все методы проверки, которые переопределяют заданный уровень серьезности проблемы (enable, disable/ignore, informational, warning, error, fatal), теперь учитывают порядок конфигурации. Например, если в finalizeDsl() указать, что проблема является критической, это переопределит ее отключение в основном DSL. Подробнее о блоке lint{} и точках расширения для сборки Android можно узнать из справочной документации.

Удалены API AGP, от которых зависит плагин Gradle Safe Args для Navigation. 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. Чтобы использовать сборку Snapshot, следуйте инструкциям с идентификатором сборки 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 несовместим с плагином Gradle для мониторинга производительности Firebase версии 1.4.0 и ниже. Помощник по обновлению AGP не будет автоматически обновлять плагин до версии 1.4.1, поэтому, если вы используете firebase-perf и хотите обновить AGP до версии 7.1, вам нужно сделать это вручную.

Известные проблемы

В этом разделе описаны известные проблемы, которые существуют в плагине Android Gradle 7.1.0.

Проблемы с модульным тестированием проекта приложения, в котором используется плагин Hilt

Путь к классам для модульного тестирования содержит неинструментированные классы приложения, а это значит, что Hilt не инструментирует классы приложения для обработки внедрения зависимостей при выполнении модульного тестирования.

Эта проблема будет устранена в версии 7.1.1 (см. issue #213534628).