Плагин Android Gradle 8.0.0 (апрель 2023 г.)

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

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

Минимальная версия Версия по умолчанию Примечания
Gradle 8.0 8.0 Подробнее об обновлении Gradle…
SDK Build Tools; 30.0.3 30.0.3 Установите или настройте SDK Build Tools.
NDK Н/Д 25.1.8937393 Установите или настройте другую версию NDK.
JDK 17 17 Подробнее о том, как задать версию JDK…

Исправления

Ниже приведен список исправлений для плагина Android Gradle версии 8.0.

Плагин Android Gradle 8.0.2 (май 2023 г.)

Список исправлений ошибок в AGP 8.0.2 можно найти в закрытых проблемах Android Studio 2022.2.1.

Плагин Android Gradle 8.0.1 (май 2023 г.)

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

Устраненные проблемы
Ошибка "No VersionRequirement with the given id in the table" (В таблице нет VersionRequirement с указанным идентификатором) после обновления AGP с версии 7.2.2 до 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Ошибка проверки класса в Android 11

Критическое изменение: в скрипте сборки на уровне модуля требуется пространство имен

Пространство имен нужно задать в файле build.gradle.kts на уровне модуля, а не в файле манифеста. Вы можете начать использовать свойство DSL namespace, начиная с AGP 7.3. Подробнее о том, как задать пространство имен…

При переходе на DSL пространства имен учитывайте следующие проблемы:

  • В предыдущих версиях AGP тестовое пространство имен в некоторых случаях неправильно выводилось из основного пространства имен или идентификатора приложения. Помощник по обновлению AGP блокирует обновление, если обнаруживает, что основное пространство имен вашего проекта и тестовое пространство имен совпадают. Если обновление заблокировано, вам нужно вручную изменить testNamespace и соответствующим образом изменить исходный код.
  • После изменения пространства имен для тестов код может компилироваться, но инструментальные тесты могут завершаться сбоем во время выполнения. Это может произойти, если исходный код инструментального теста ссылается на ресурс, определенный как в androidTest, так и в источниках приложения.

Подробная информация доступна в комментарии 19 к проблеме 191813691.

Критические изменения: значения по умолчанию для параметров сборки

Начиная с AGP 8.0, значения по умолчанию для этих флагов были изменены, чтобы повысить производительность сборки. Чтобы адаптировать код к этим изменениям, используйте помощник по обновлению AGP (Инструменты > Помощник по обновлению AGP). Помощник по обновлению поможет вам изменить код в соответствии с новыми правилами или установить флаги, чтобы сохранить прежние правила.

Флаг Новое значение по умолчанию Предыдущее значение по умолчанию Примечания
android.defaults.buildfeatures.buildconfig false true AGP 8.0 не генерирует BuildConfig по умолчанию. Вам нужно указать этот параметр с помощью DSL в проектах, где он необходим.
android.defaults.buildfeatures.aidl false true В AGP 8.0 поддержка AIDL по умолчанию отключена. Вам нужно указать этот параметр с помощью DSL в проектах, где он необходим. Этот флаг планируется удалить в AGP 9.0.
android.defaults.buildfeatures.renderscript false true В AGP 8.0 поддержка RenderScript по умолчанию отключена. Вам нужно указать этот параметр с помощью DSL в проектах, где он необходим. Этот флаг планируется удалить в AGP 9.0.
android.nonFinalResIds true false По умолчанию AGP 8.0 генерирует классы R с нефинальными полями.
android.nonTransitiveRClass true false AGP 8.0 генерирует классы R только для ресурсов, определенных в текущем модуле.
android.enableR8.fullMode true false В AGP 8.0 полный режим R8 включен по умолчанию. Подробнее о полном режиме R8…

Критические изменения: принудительные значения параметров сборки

Начиная с AGP 8.0, вы больше не можете изменять значения этих флагов. Если вы укажете их в файле gradle.properties, значение будет проигнорировано и AGP выведет предупреждения.

Флаг Принудительно применяемое значение Примечания
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0 выдает предупреждение, если обнаруживает разрешение конфигурации на этапе настройки, поскольку это отрицательно влияет на время настройки Gradle.
android.r8.failOnMissingClasses true AGP 8.0 не выполняет сборки, в которых используется R8, если отсутствуют классы, необходимые для оптимизации DEX. Чтобы устранить эту проблему, добавьте недостающие библиотеки или правила -dontwarn keep. Подробнее о предупреждениях об отсутствующих классах в R8 shrinker…
android.testConfig.useRelativePath true Если включена поддержка использования ресурсов, объектов и манифестов Android в модульном тестировании, AGP 8.0 генерирует файл test_config.properties, который содержит только относительные пути. Это гарантирует, что модульные тесты Android всегда могут использовать кеш сборки Gradle.
android.useNewJarCreator true При создании JAR-файлов AGP использует библиотеку Zipflinger, чтобы повысить производительность сборки.
android.bundletool.includeRepositoriesInDependencyReport true Если включено добавление информации о зависимостях SDK в наборы Android App Bundle и APK-файлы, AGP 8.0 также добавляет в эту информацию список хранилищ проекта. Подробнее об информации о зависимостях для Play Console…
android.enableArtProfiles true Теперь базовые профили создаются всегда. Подробнее о базовых профилях…
android.enableNewResourceShrinker true Использовать новую реализацию сжатия ресурсов по умолчанию. Новый инструмент сжатия ресурсов поддерживает динамические функции.
android.enableSourceSetPathsMap true Используется для вычисления относительных сопоставлений путей к ресурсам, чтобы сборки Gradle чаще обновлялись.
android.cacheCompileLibResources true Скомпилированные ресурсы библиотеки теперь можно кешировать по умолчанию, поскольку Gradle отслеживает файлы ресурсов относительно местоположения проекта. Требуется включить android.enableSourceSetPathsMap.
android.disableAutomaticComponentCreation true AGP 8.0 по умолчанию не создает SoftwareComponent. Вместо этого AGP создает SoftwareComponents только для вариантов, настроенных для публикации с помощью DSL.

Новый стабильный параметр для профиля выполнения

В AGP добавлен новый флаг android.settings.executionProfile. Используйте этот флаг, чтобы переопределить профиль выполнения по умолчанию из SettingsExtension. Подробную информацию вы найдете в документации по плагину настроек.

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

Ленивое присваивание свойств Kotlin не поддерживается.

Если вы используете Kotlin DSL для Gradle в скриптах сборки, обратите внимание, что Android Studio и AGP 8.0 не поддерживают экспериментальное назначение свойств с помощью оператора =. Дополнительную информацию об этой функции можно найти в примечаниях к выпуску и документации.

Категории задач Build Analyzer

Начиная с версии Android Studio Flamingo, в Build Analyzer по умолчанию используется новый режим просмотра задач, влияющих на продолжительность сборки. Если в проекте используется AGP 8.0 или более поздней версии, Build Analyzer группирует задачи по категориям, а не показывает их по отдельности. Например, задачи, связанные с ресурсами Android, Kotlin или Dexing, группируются, а затем сортируются по продолжительности сборки. Это поможет вам определить, какая категория больше всего влияет на время сборки. Развернув каждую категорию, вы увидите список соответствующих задач. Чтобы показывать задачи по отдельности, без группировки, используйте раскрывающийся список Группировать по.

Категории задач Build Analyzer.

Новый плагин настроек

В AGP 8.0.0-alpha09 появился новый плагин настроек. Плагин настроек позволяет централизовать глобальные конфигурации (конфигурации, которые применяются ко всем модулям) в одном месте, поэтому вам не нужно копировать и вставлять конфигурации в несколько модулей. Кроме того, с помощью плагина настроек можно создавать профили выполнения инструментов, то есть разные инструкции по их запуску, и переключаться между ними.

Чтобы использовать плагин настроек, примените его в файле settings.gradle:

apply plugin 'com.android.settings'

Централизованные глобальные конфигурации

Чтобы задать глобальные настройки, используйте новый блок android в файле settings.gradle. Рассмотрим пример.

android {
  compileSdk 31
  minSdk 28
  ...
}

Профили выполнения инструментов

Плагин настроек также позволяет создавать профили выполнения для некоторых инструментов. Профиль выполнения определяет, как запускается инструмент. Вы можете выбрать разные профили выполнения в зависимости от среды. В профиле выполнения можно задать аргументы JVM для инструмента и настроить его запуск в отдельном процессе. Поддерживается только инструмент R8.

Создайте профили выполнения и задайте профиль по умолчанию в файле settings.gradle, как показано в примере ниже.

android {
  execution {
    profiles {
      high {
        r8 {
          jvmOptions += ["-Xms2048m", "-Xmx8192m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      low {
        r8 {
          jvmOptions += ["-Xms256m", "-Xmx2048m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      ci {
        r8.runInSeparateProcess false
      }
    }
    defaultProfile "low"
  }
}

Чтобы переопределить профиль по умолчанию, выберите другой профиль с помощью свойства android.experimental.settings.executionProfile в файле gradle.properties:

android.experimental.settings.executionProfile=high

Это свойство также можно задать с помощью командной строки, что позволяет настраивать различные рабочие процессы. Например, если у вас есть рабочий процесс непрерывной интеграции, вы можете использовать командную строку, чтобы изменить профиль выполнения, не меняя файл settings.gradle:

./gradlew assembleRelease \
-Pandroid.experimental.settings.executionProfile=ci

Для запуска AGP 8.0 требуется JDK 17

Если вы используете плагин Android Gradle 8.0 для сборки приложения, то для запуска Gradle потребуется JDK 17. Android Studio Flamingo поставляется с JDK 17 и настраивает Gradle на его использование по умолчанию. Это означает, что большинству пользователей Android Studio не нужно вносить никаких изменений в конфигурацию своих проектов.

Если вам нужно вручную задать версию JDK, используемую AGP в Android Studio, выберите JDK 17 или более позднюю версию.

Если вы используете AGP независимо от Android Studio, обновите версию JDK, указав в JAVA_HOME переменной среды или -Dorg.gradle.java.home параметре командной строки каталог установки JDK 17.

Устраненные проблемы

Плагин Android Gradle 8.0.2

Устраненные проблемы
Shrinker (R8)
При сборке Compose в R8 возникает ошибка ArrayIndexOutOfBoundsException
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
R8 в AGP 8 нарушает работу сервиса Google Fit
Информация об исходном файле с остаточными названиями, которые перекрывают названия входных файлов, представлена неправильно.

Плагин Android Gradle 8.0.1

Устраненные проблемы
Shrinker (R8)
Ошибка "No VersionRequirement with the given id in the table" (В таблице нет VersionRequirement с указанным идентификатором) после обновления AGP с версии 7.2.2 до 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Ошибка проверки класса в Android 11

Плагин Android Gradle 8.0.0

Устраненные проблемы
Плагин Android Gradle
Нестабильный сбой сборки в задаче MergeResources
JavaPluginConvention и HasConvention больше не поддерживаются.
Неправильное и несогласованное расположение файла для нового API преобразования
Плагин Android Gradle не должен использовать устаревшую функцию GUtil.toWords(string)
Плагин Android Gradle не должен использовать устаревшую функцию ConfigureUtil.configure(closure, target)
Обновите тесты AGP, чтобы использовать KGP 1.7.20-Beta
Сбой Gradle 7.4 (не удалось создать экземпляр AnalyticsService)
Новая ошибка "unknown enum constant" (неизвестная константа перечисления) из javac в AGP 7.4.0-alpha09
Конфигурация MergeGeneratedProguardFilesCreationAction выполняется медленно, даже если включено кеширование конфигурации.
[AGP] Добавление сгенерированного каталога с исходными файлами в модель IDE (Variant API)
JavaPluginConvention и HasConvention больше не поддерживаются.
Не добавлять ignorewarnings в R8 по умолчанию
Предупреждать, если файлы proguard отсутствуют
AGP 7.3.0 нарушает синхронизацию Gradle для проектов платформы Gradle
Библиотека apksig: метод ApkVerifier$Result.getV4SchemeSigners() помечен как закрытый.
Прекращение создания конфигурации androidJacocoAnt, если покрытие не включено.
При использовании @IntDef в компоненте библиотеки не генерируется файл annotations.zip в aar.
Не удалось найти общий супертип для и .
Добавьте свойство gradle LINT_PRINT_STACKTRACE=true.
Устаревшие артефакты prefab упаковываются в AAR
Перейдите со свойства destination на свойство outputLocation, чтобы устранить предупреждение об устаревании и подготовиться к Gradle 9.0.
Учитывайте флаг `--release` при настройке задачи JavaCompile.
[AGP-7.3.0-beta03] ShrinkResourcesNewShrinkerTask завершается ошибкой, если после объявления XML есть пустая строка
Цель lintVital по умолчанию запускается в варианте отладки
Предупреждать, если файлы proguard отсутствуют
AGP пытается добавить kotlinOptions.freeCompilerArgs на этапе выполнения задачи
Ошибка синхронизации Gradle: причина неизвестна
DependencyReportTask несовместим с кешем конфигурации
Переопределение ресурсов с помощью resValue в build.gradle приводит к ошибке "Повторяющиеся ресурсы"
Тип сборки debug имеет ключ подписи по умолчанию, а другие – нет.
Использование динамических функций и удаление неиспользуемых ресурсов приводит к сбою во время выполнения
Тип сборки debug имеет ключ подписи по умолчанию, а другие – нет.
сгенерированный каталог с исходными файлами, указанный как каталог Java в основном поставщике исходных файлов модели lint;
Gradle 8.0-milestone-2 вызывает исключение в AGP
Оптимизация объединения манифестов для приложений и библиотек
Добавьте gradle-settings-api в генерацию javadoc.
Новая ошибка "unknown enum constant" (неизвестная константа перечисления) из javac в AGP 7.4.0-alpha09
AGP 7.4.0-alpha09 генерирует сборки, которые не загружаются в Firebase App Distribution
Файл lint.xml в модулях не учитывается при проверке актуальности задач lint.
Проблема с плагином Android Gradle 7.0+ и тестами Android: не удается найти ресурс: id
configureCMakeDebug периодически аварийно завершает работу с исключением нулевого указателя
Ошибка IllegalAccessError при обновлении проекта до AS2022.2.1.5, FireBasePerfPlugin
Синхронизация завершается сбоем и появляется непонятная ошибка "Коллекция не содержит элементов, соответствующих предикату"
Instrumentation API не преобразует зависимости локальных файлов
Ошибка AnnotationProcessorOptions.arguments are queried при обновлении до версии 7.4 Beta 1
Перенос общедоступных плагинов Gradle в gradle-api и удаление BasePlugin.getExtension
r8.jvmArgs не используются
JDK 17 – минимальная версия, необходимая для AGP
AGP 8.0.0 A8 нарушает работу базовых профилей
В AGP 8.0 в сообщении CheckAarMetadataTask параметр compileSdkVersion заменен на compileSdk.
В AGP 7.4.0-rc01 не работает Variant API. Появляется сообщение об ошибке "Querying the mapped value of map(provider(java.util.Set)) before task '...' has completed is not supported".
Проблемы с кешем конфигурации в `com.android.build.gradle.tasks.ShaderCompile`
Добавление ресурсов Java с помощью API AGP нарушает работу кеша конфигурации
Плагин Lint не входит в gradle-api
DexingFileDependenciesTask.outputKeepRules является каталогом, но помечен как OutputFile
При обновлении до AGP 7.4 возникает ошибка StackOverflowError
Ошибка processDebugUnitTestManifest с плейсхолдерами манифеста для тестовых вариантов
Lint получает доступ к информации о наборах исходных файлов без зависимостей
Ошибка сборки относится к уровню API 34, которого не существует
Рекомендация использовать более новую версию плагина Android Gradle, когда такой версии нет
android.injected.testOnly=false не работает
Dexer (D8)
Ошибка объединения dex, связанная с глобальной синтетикой, после обновления AS Canary 6 до 7
Обновите библиотеку метаданных Kotlin до версии 0.6.0.
Для уровней API 28–30 требуется обходное решение для JDK-8272564.
Lint
Проверка ResourceType lint не работает для источников kotlin
VersionChecks не обрабатывает проверки диапазонов Kotlin
Ложноположительный результат для InlinedApi при упаковке
Ложноположительный результат Lint Recycle в отношении openInputStream
[BuildTool/Lint] Свойство конструктора ChecksSdkIntAtLeast
Lint: PartialResults merging works incorrectly
Android Studio неправильно помечает указанную версию как устаревшую.
AndroidDeprecationInspection.DeprecationFilter EP не зарегистрирован в файле android-plugin.xml
Объяснение проверки lint AccessibilityDetector устарело
Проверки Lint SDK_INT должны понимать временные локальные переменные
Ошибка при замене типа Function на typealias в TestMode.TYPE_ALIAS
Ошибка: если ObjectAnimator создается за пределами текущего блока кода, появляются ложные предупреждения о том, что он не запущен (#38).
Lint: NPE из-за запроса экземпляра приложения в режиме mergeOnly
Правило NonConstantResourceId не может определить, что идентификатору ресурса присваиваются постоянные значения.
not showing error on view id
Сбой десериализации кеша ресурсов lint приводит к ошибке lint (но должно быть предупреждение)
Регрессия NewApi Desugar в AGP Flamingo Alpha 8 Lint
TypedArray#close (API 31) не десахаризируется, но AS не показывает предупреждение при использовании в try-with-resources
Lint не проверяет допустимые приведения типов для получателей вызовов.
Lint проверяет только безопасные приведения типов для непосредственно реализованных интерфейсов, а не унаследованных.
Интеграция с Lint
Базовый файл в настоящее время является входным и выходным для задач Lint.
Shrinker (R8)
Ошибка NPE / утверждения в верификаторе фреймов CF
Регрессия после удаления кеша поиска полей
`:app:minifyVariantWithR8` выдает NullPointerException в AGP 7.4.0-beta02
R8: ClassNotFoundException при -allowaccessmodification
Добавлена поддержка получателей контекста в метаданных.
java.lang.VerifyError: Verifier rejected class androidx.compose.ui.graphics.colorspace.o: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object) failed to verify: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object): [0x0] cannot access instance field java.lang.Object androidx.compose.ui.graphics.colorspace.n.a from object of type Precise Reference: androidx.compose.ui.graphics.colorspace.o
AGP 7.4.0/7.3.1 – попытка поставить действие в очередь в списке задач, в который нельзя добавлять элементы
Минификация кода Renderscript: значительное снижение производительности при обновлении AGP с версии 7.3.1 до 7.4.0