Плагин 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] Ошибка проверки класса Hard в Android 11

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

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

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

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

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

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

Начиная с 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 AGP использует библиотеку Zipflinger при создании JAR-файлов для повышения производительности сборки.
android.bundletool.includeRepositoriesInDependencyReport true При включении добавления информации о зависимостях SDK в AAB и 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 создаёт SoftwareComponent только для вариантов, настроенных для публикации с использованием 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 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 нарушает работу Variant API: «Запрос сопоставленного значения 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 должны понимать временные локальные переменные.
Ошибка при замене типа функции на typealias в TestMode.TYPE_ALIAS
Ошибка: когда 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
Файл базовой линии в настоящее время является входом и выходом задач 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 из объекта типа Precise Reference: 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] Ошибка проверки класса Hard в Android 11

Плагин Android Gradle 8.0.2

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