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

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

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

Минимальная версия Версия по умолчанию Примечания
Градл 8.0 8.0 Более подробную информацию см. в разделе Обновление Gradle .
Инструменты сборки SDK 30.0.3 30.0.3 Установите или настройте инструменты сборки SDK.
НДК Н/Д 25.1.8937393 Установите или настройте другую версию NDK.
JDK 17 17 Более подробную информацию см. в разделе «Настройка версии JDK» .

Выпуски патчей

Ниже приведен список выпущенных исправлений для Android Gradle Plugin 8.0.

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

Список ошибок, исправленных в AGP 8.0.2, см. в разделе «Закрытые проблемы Android Studio 2022.2.1» .

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

Это небольшое обновление включает в себя следующие исправления ошибок:

Исправлены проблемы
Ошибка: «В таблице нет VersionRequirement с указанным идентификатором» после обновления AGP 7.2.2 -> 7.4.0
R8 NullPointerException в markTypeAsLive AGP 7.4.1
[R8 4.0.53] Ошибка проверки жесткого класса на Android 11

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

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

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

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

Более подробную информацию см. в выпуске № 191813691, комментарий № 19 .

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

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

Флаг Новое значение по умолчанию Предыдущее значение по умолчанию Примечания
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. Для получения более подробной информации см. Missing class warnings in R8 shrinker .
android.testConfig.useRelativePath true Когда включена поддержка использования ресурсов, активов и манифестов Android в модульных тестах, AGP 8.0 генерирует файл test_config.properties , содержащий только относительные пути. Это гарантирует, что модульные тесты Android всегда могут использовать кэш сборки Gradle.
android.useNewJarCreator true AGP использует библиотеку Zipflinger при создании JAR-файлов для повышения производительности сборки.
android.bundletool.includeRepositoriesInDependencyReport true При включении добавления информации о зависимости SDK в AAB и APK, AGP 8.0 также добавляет список репозиториев проекта к этой информации. Чтобы узнать больше, см. Информация о зависимости для Play Console .
android.enableArtProfiles true Базовые профили теперь всегда генерируются. Подробности см. в разделе Базовые профили .
android.enableNewResourceShrinker true Используйте новую реализацию resource shinker по умолчанию. Новый resource shrinker включает поддержку динамических функций.
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 не поддерживается

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

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

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

Категории задач 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 Plugin 8.0 для сборки приложения теперь требуется JDK 17 для запуска Gradle. 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.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)
Новая «неизвестная константа перечисления» из javac на AGP 7.4.0-alpha09
Конфигурация MergeGeneratedProguardFilesCreationAction работает медленно даже при включенном кэшировании конфигурации
[AGP] Добавить сгенерированный исходный каталог в модель IDE (Variant API)
JavaPluginConvention и HasConvention устарели
Не добавлять игнорирование предупреждений в R8 по умолчанию
Предупреждать, если файлы Proguard отсутствуют
AGP 7.3.0 нарушает синхронизацию Gradle для проектов платформы Gradle
Библиотека apksig: ApkVerifier$Result.getV4SchemeSigners() помечена как частная
Прекратите создавать конфигурацию androidJacocoAnt, если покрытие не включено
Использование @IntDef в компоненте библиотеки не приводит к созданию annotations.zip в aar
Не удалось найти общий супертип для и
Добавьте версию свойства gradle LINT_PRINT_STACKTRACE=true
Устаревшие готовые артефакты упаковываются в AAR
Перейдите от свойства назначения к свойству outputLocation, чтобы устранить предупреждение об устаревании и подготовиться к Gradle 9.0
При настройке задачи JavaCompile следует учитывать флаг `--release`
[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
Новая «неизвестная константа перечисления» из javac на AGP 7.4.0-alpha09
AGP 7.4.0-alpha09 создает сборки, которые не загружаются в Firebase App Distribution
lint.xml в модулях не учитывается для АКТУАЛЬНОЙ проверки задач lint
Проблема с плагином Android Gradle 7.0+ и Android Tests: Невозможно найти ресурс: id
configureCMakeDebug нестабильно завершается сбоем из-за исключения нулевого указателя
IllegalAccessError обновление проекта до AS2022.2.1.5, FireBasePerfPlugin
Синхронизация завершается ошибкой «Коллекция не содержит элементов, соответствующих предикату».
API инструментария не преобразует локальные файловые зависимости
Ошибка `AnnotationProcessorOptions.arguments are query` при обновлении до 7.4 Beta 1
Переместить публичные плагины Gradle в gradle-api и удалить BasePlugin.getExtension
r8.jvmArgs не используются
JDK17 как минимальная версия, необходимая для AGP
AGP 8.0.0 A8 нарушает базовые профили
Измените «compileSdkVersion» на «compileSdk» в сообщении CheckAarMetadataTask в AGP 8.0.
AGP 7.4.0-rc01 нарушает работу API Variant: «Запрос сопоставленного значения map(provider(java.util.Set)) до завершения задачи '...' не поддерживается»
Проблемы `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 не работает
Дексер (D8)
Ошибка слияния Dex, связанная с глобальными синтетиками после обновления AS Canary 6 до 7
Обновление библиотеки метаданных Kotlin до версии 0.6.0
Обходной путь для JDK-8272564, по-видимому, требуется на уровне API 28-30
Ворс
Проверка lint ResourceType не работает для исходников Kotlin
VersionChecks не обрабатывает проверки диапазона Kotlin
Ложное срабатывание для InlinedApi при обертывании
Lint ложноположительный Recycle относительно openInputStream
[BuildTool/Lint] Свойство конструктора ChecksSdkIntAtLeast
Lint: слияние PartialResults работает некорректно
Android Studio ошибочно помечает указанную версию как устаревшую.
AndroidDeprecationInspection.DeprecationFilter EP никогда не регистрируется в файле android-plugin.xml
Объяснение проверки линта AccessibilityDetector устарело
Проверки Lint SDK_INT должны понимать временные локальные переменные
Ошибка при замене типа функции TestMode.TYPE_ALIAS на typealias
Ошибка: когда ObjectAnimator создается вне текущего блока кода, возникают ложноположительные предупреждения о том, что он не запущен #38
Lint: NPE из-за запроса экземпляра приложения в режиме mergeOnly
Правило lint NonConstantResourceId не может определить, следует ли назначать постоянные значения из идентификатора ресурса
не отображается ошибка при просмотре идентификатора
Невозможность десериализации кэша ресурсов lint приводит к ошибке lint (но должно быть предупреждение)
AGP Flamingo Alpha 8 Lint NewApi Desugar Регрессия
TypedArray#close (API 31) не очищен от сахара, но AS не выводит предупреждение при использовании в try-with-resources
Lint не проверяет допустимые приведения для приемников вызовов
Lint проверяет только безопасные приведения для напрямую реализованных интерфейсов, а не для унаследованных.
Интеграция Линта
Базовый файл в настоящее время является входом и выходом задач Lint.
Усадочный аппарат (R8)
NPE / ошибка утверждения в верификаторе кадра CF
Регрессия после удаления кэша поиска полей
`:app:minifyVariantWithR8` выдает исключение NullPointerException в AGP 7.4.0-beta02
R8: ClassNotFoundException при -allowaccessmodification
Добавить поддержку приемников контекста в метаданных
java.lang.VerifyError: Верификатор отклонил класс androidx.compose.ui.graphics.colorspace.o: void androidx.compose.ui.graphics.colorspace.o. (java.lang.Object) не удалось проверить: void androidx.compose.ui.graphics.colorspace.o. (java.lang.Object): [0x0] не может получить доступ к полю экземпляра java.lang.Object androidx.compose.ui.graphics.colorspace.na из объекта типа Точная ссылка: androidx.compose.ui.graphics.colorspace.o
AGP 7.4.0/7.3.1 — попытка поставить действие в очередь в непересылаемом списке задач очереди
Минификация кода Renderscript: огромное падение производительности при обновлении AGP с 7.3.1 до 7.4.0

Плагин Android Gradle 8.0.1

Исправленные проблемы
Усадочный аппарат (R8)
Ошибка: «В таблице нет VersionRequirement с указанным идентификатором» после обновления AGP 7.2.2 -> 7.4.0
R8 NullPointerException в markTypeAsLive AGP 7.4.1
[R8 4.0.53] Ошибка проверки жесткого класса на Android 11

Плагин Android Gradle 8.0.2

Исправленные проблемы
Усадочный аппарат (R8)
R8 дает сбой во время сборки Compose с ArrayIndexOutOfBoundsException
VerifyError: Верификатор отклонил класс при использовании R8 с Kotlin 1.8.20
R8 на AGP 8 ломает сервис Google Fit
Включение информации об исходном файле с остаточными именами, которые перекрывают входные имена, отображается неправильно.