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

Android Gradle plugin 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 Plugin 8.0.2 (май 2023 г.)

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

Android Gradle Plugin 8.0.1 (май 2023 г.)

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

Исправлены ошибки
Ошибка: "В таблице отсутствует требование к версии с указанным идентификатором" после обновления 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. Для получения дополнительной информации см. раздел «Задача пространства имен» .

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

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

Для получения дополнительной информации см. комментарий № 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 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 по умолчанию не создаются компоненты программного обеспечения. Вместо этого AGP создает компоненты программного обеспечения только для вариантов, которые настроены на публикацию с использованием 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, группируются вместе, а затем сортируются по времени сборки. Это позволяет легко определить, какая категория оказывает наибольшее влияние на время сборки. При разворачивании каждой категории отображается список соответствующих задач. Чтобы отобразить задачи по отдельности без группировки, используйте раскрывающийся список «Группировать по».

Создайте категории задач анализатора.

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

В 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.2

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

Плагин Android Gradle 8.0.1

Исправлены ошибки
Уменьшитель (R8)
Ошибка: "В таблице отсутствует требование к версии с указанным идентификатором" после обновления AGP с версии 7.2.2 до 7.4.0
R8 NullPointerException в 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).
В AGP 7.4.0-alpha09 появилась новая "неизвестная константа перечисления" из javac.
Настройка MergeGeneratedProguardFilesCreationAction выполняется медленно, даже при включенном кэшировании конфигурации.
[AGP] Добавить сгенерированный каталог исходного кода в модель IDE (вариант 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
Устаревшие готовые артефакты упаковываются в AAR
Перейдите от свойства destination к свойству 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 в основном поставщике исходного кода модели линтинга.
Gradle 8.0-milestone-2 вызывает исключение в AGP
Оптимизация слияния манифестов для приложений и библиотек.
Добавить gradle-settings-api в генерацию javadoc
В AGP 7.4.0-alpha09 появилась новая "неизвестная константа перечисления" из javac.
AGP 7.4.0-alpha09 генерирует сборки, которые не загружаются в Firebase App Distribution.
Файл lint.xml в модулях не учитывается при проверке актуальности задач линтинга.
Проблема с плагином Android Gradle 7.0+ и тестами Android: Не удается найти ресурс: id
configureCMakeDebug нестабильно завершается с ошибкой нулевого указателя.
IllegalAccessError при обновлении проекта до AS2022.2.1.5, FireBasePerfPlugin
Синхронизация завершается с непонятной ошибкой: «Коллекция не содержит элемента, соответствующего предикату».
API инструментирования не преобразует локальные файловые зависимости.
Ошибка `AnnotationProcessorOptions.arguments are queried` при обновлении до версии 7.4 Beta 1.
Переместите общедоступные плагины Gradle в папку gradle-api и удалите BasePlugin.getExtension.
r8.jvmArgs не используются
Минимальная требуемая версия для AGP — JDK17.
AGP 8.0.0 A8 выходит за рамки базовых профилей.
В сообщении CheckAarMetadataTask в AGP 8.0 измените значение 'compileSdkVersion' на 'compileSdk'.
В 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.
Ворс
Проверка синтаксиса ResourceType не работает для исходных файлов Kotlin.
VersionChecks не обрабатывает проверки диапазонов значений в Kotlin.
Ложное срабатывание для InlinedApi при использовании обертки
Ложное срабатывание Lint Recycle для openInputStream
[BuildTool/Lint] Проверяет свойство конструктора ChecksSdkIntAtLeast
Lint: Слияние PartialResults работает некорректно.
Android Studio некорректно помечает указанную версию как устаревшую.
EP AndroidDeprecationInspection.DeprecationFilter никогда не регистрируется в файле android-plugin.xml.
Объяснение функции проверки кода AccessibilityDetector устарело.
Проверки Lint SDK_INT должны понимать временные локальные переменные.
Ошибка возникает при замене типа функции на typealias в TestMode.TYPE_ALIAS.
Ошибка: при создании ObjectAnimator вне текущего блока кода возникают ложные предупреждения о том, что он не был запущен #38
Lint: Ошибка NullPointerException из-за запроса к экземпляру приложения в режиме mergeOnly.
Правило проверки кода NonConstantResourceId не может обнаружить присвоение постоянных значений идентификатору ресурса.
Ошибка не отображается для идентификатора представления.
Невыполнение десериализации кэша ресурсов линтера приводит к ошибке линтера (но должно отображаться как предупреждение).
AGP Flamingo Alpha 8 Lint NewApi Desugar Регрессия
Метод TypedArray#close (API 31) не десахаризован, но AS не отображает предупреждение при использовании в конструкции try-with-resources.
Lint не проверяет корректность приведения типов для получателей вызовов.
Lint проверяет корректность приведения типов только для непосредственно реализованных интерфейсов, а не для унаследованных.
Интеграция Lint
В настоящее время базовый файл является одновременно входным и выходным файлом для задач проверки кода (Lint).
Уменьшитель (R8)
NPE / ошибка утверждения в верификаторе CF-фрейма
Снижение производительности после удаления кэша поиска полей.
В AGP 7.4.0-beta02 вызов `:app:minifyVariantWithR8` приводит к ошибке NullPointerException.
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] Невозможно получить доступ к полю экземпляра 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.