Плагин Android Gradle 8.1.0 (июль 2023 г.)

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

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

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

Kotlin DSL используется по умолчанию для конфигурации сборки

В новых проектах для настройки сборки по умолчанию используется Kotlin DSL ( build.gradle.kts ). Это обеспечивает более удобный интерфейс редактирования, чем Groovy DSL ( build.gradle ), с подсветкой синтаксиса, автодополнением кода и навигацией по объявлениям. Обратите внимание: если вы используете AGP 8.1 и Kotlin DSL для настройки сборки, для оптимальной работы следует использовать Gradle 8.1. Подробнее см. в руководстве по миграции Kotlin DSL .

Автоматическая поддержка языка для каждого приложения

Начиная с Android Studio Giraffe Canary 7 и AGP 8.1.0-alpha07, вы можете настроить приложение для автоматической поддержки языковых настроек для каждого приложения . На основе ресурсов вашего проекта плагин Android Gradle генерирует файл LocaleConfig и добавляет ссылку на него в финальный файл манифеста, поэтому вам больше не придётся делать это вручную. AGP использует ресурсы в папках res модулей вашего приложения и все зависимости модулей библиотеки для определения локалей, включаемых в файл LocaleConfig .

Обратите внимание, что функция автоматического выбора языка для каждого приложения поддерживает приложения на базе Android 13 (уровень API 33) и выше. Для использования этой функции необходимо установить значение compileSdkVersion не ниже 33. Для настройки языковых настроек для каждого приложения в предыдущих версиях Android по-прежнему необходимо использовать API и встроенные средства выбора языка .

Чтобы включить автоматическую поддержку языка для каждого приложения, укажите языковой стандарт по умолчанию:

  1. В папке res модуля приложения создайте новый файл с именем resources.properties .
  2. В файле resources.properties задайте локаль по умолчанию с помощью метки unqualifiedResLocale . Для формирования имён локалей объедините код языка с необязательными кодами алфавита и региона, разделяя их дефисом:

    • Язык: используйте двух- или трехбуквенный код ISO 639-1 .
    • Скрипт (необязательно): используйте код ISO 15924 .
    • Регион (необязательно): используйте либо двухбуквенный код ISO 3166-1-alpha-2 , либо трехзначный код UN_M.49 .

    Например, если вашей локалью по умолчанию является американский английский:

        unqualifiedResLocale=en-US
        

AGP добавляет эту локаль по умолчанию и любые другие указанные вами локали , используя каталоги values-* в папке res , в автоматически сгенерированный файл LocaleConfig .

Автоматическая поддержка языков для каждого приложения по умолчанию отключена. Чтобы включить эту функцию, используйте параметр generateLocaleConfig в блоке androidResources {} файла build.gradle.kts на уровне модуля (файл build.gradle , если вы используете Groovy):

Котлин

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Круто

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint содержит байт-код, предназначенный для JVM 17

Начиная с AGP 8.1.0-alpha04, Android Lint содержит байт-код, предназначенный для JVM 17. Если вы пишете пользовательские проверки lint, вам необходимо выполнить компиляцию с использованием JDK 17 или выше и указать jvmTarget = '17' в параметрах компилятора Kotlin.

Дополнительную информацию об инструменте lint см. в статье Улучшите свой код с помощью проверок lint .

Настройка сжатия собственной библиотеки перенесена в DSL

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

Чтобы использовать несжатые собственные библиотеки, удалите атрибут android::extractNativeLibs из манифеста и добавьте следующий код в файл build.gradle.kts на уровне модуля (файл build.gradle , если вы используете Groovy):

Котлин

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Круто

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Флаги экспериментальной сборки

Это экспериментальные флаги для настройки вашей сборки, доступные в AGP 8.1.

Флаг Добавлено в Значение по умолчанию Примечания
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes АГП 8.0 false Включение этого параметра без указания конфигураций подписи приводит к тому, что AGP использует конфигурацию подписи отладки по умолчанию при запуске профилируемой или отлаживаемой сборки. Этот флаг по умолчанию отключен, чтобы побудить авторов сборок указывать конкретные конфигурации подписи профилирования.
android.experimental.library.desugarAndroidTest АГП 8.0 false Этот флаг позволяет сборщикам библиотек включать десахаризацию основной библиотеки для тестовых APK-файлов, не влияя на создаваемый AAR-файл, например, посредством линтинга. Мы планируем в конечном итоге реализовать поддержку этого поведения в Variant API.
android.experimental.testOptions.managedDevices.customDevice АГП 8.0 false Если этот параметр включен, Gradle Managed Devices позволяет пользователю определить тип устройства, предоставляемый плагином. Этот флаг необходимо включить, если вы хотите использовать плагин Firebase Test Lab.
android.lint.printStackTrace АГП 8.0 false Если флаг включён, Android lint выводит трассировку стека в случае сбоя. Этот флаг имеет те же возможности, что и переменная окружения LINT_PRINT_STACKTRACE .
android.experimental.testOptions.managedDevices.maxConcurrentDevices АГП 8.0 Никто Задаёт максимальное количество одновременно активных устройств Gradle Managed Devices (AVD) в любой момент времени. Если значение равно 0 или отрицательно, максимальное количество устройств не ограничено.
android.experimental.testOptions.installApkTimeout АГП 8.0 Никто Длительность тайм-аута в секундах для установки APK. Если значение равно 0 или отрицательно, UTP установит его на значение по умолчанию.

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

Плагин Android Gradle 8.1.0

Исправленные проблемы
Плагин Android Gradle
Проблемы `com.android.build.gradle.tasks.ShaderCompile` с кэшем конфигурации
Добавление ресурсов Java с использованием API AGP нарушает кэш конфигурации
[Android Studio: Flamingo | 2022.2.1 Canary 8] liblog.so упакован внутри APK
KGP считывает манифест во время настройки, делая кэш конфигурации недействительным при изменении манифеста.
Предупреждающее сообщение о сборке неясно, если проблема в объединенном манифесте
Обновление до AGP 7.4 приводит к ошибке StackOverflowError
ClassNotFoundException в динамической функции, которая напрямую зависит от подпроекта библиотеки Kotlin
processDebugUnitTestManifest не работает с заполнителями манифеста для тестовых вариантов
processDebugUnitTestManifest не работает с заполнителями манифеста для тестовых вариантов
Свойство пространства имен, вероятно, принадлежит HasAndroidResources
Невозможно отключить сообщение «Файлы Gradle были изменены с момента последней синхронизации проекта».
«Мы рекомендуем использовать более новый плагин Android Gradle», хотя более новой версии нет.
processDebugUnitTestManifest не работает с заполнителями манифеста для тестовых вариантов
Булевский флаг для отключения проверки компиляции SDK в CheckAarMetadataTask
Ошибка сборки относится к API уровня 34, которого не существует.
Настройка JVM toolchain не влияет на значение JavaCompile targetCompatibility
Записи deepLink навигации с подстановочными доменами не имеют атрибута `android:host` в объединенном манифесте.
Задача processDebugMainManifest не выполняется с версии Android Gradle Plugin 8.1
Можно ли удалить AnalyticsRecordingTask?
Содержимое output-metadata.json не согласовано
Можно ли удалить AnalyticsRecordingTask?
Содержимое output-metadata.json не согласовано
Настройка JVM toolchain не влияет на значение JavaCompile targetCompatibility
Записи deepLink навигации с подстановочными доменами не имеют атрибута `android:host` в объединенном манифесте.
Задача processDebugMainManifest не выполняется с версии Android Gradle Plugin 8.1
Android Studio не учитывает переменную среды STUDIO_GRADLE_JDK
Пользовательские типы источников должны создавать многовариантные наборы источников.
DependenciesInfoBuilder требует обновления API + документация
DexingNoClasspathTransform (minSdk >= 24) с целевой версией Java 11 завершается ошибкой из-за отсутствия вложенных элементов
DslExtension.Builder.extendProjectWith() не работает так, как описано в Groovy
Добавьте API VariantSelector.withFlavor, который не использует kotlin.Pair
AndroidLintAnalysisTask ( :lintAnalyzeExternalRelease) имеет пропуск кэша, поскольку `proguard.txt` был изменен
Объединенный манифест приложения содержит атрибуты extractNativeLibs и useEmbeddedDex из зависимостей.
AGP: предоставить путь к инструменту AIDL и файлу AIDL фреймворка как общедоступному API
Запрос: пусть IDE предложит исправление для «PermittedSubclasses требует ASM9»
Ошибка: «Включить KSP и использовать процессор KSP для этой зависимости» просто перенаправляет на веб-сайт
Gradle 8.1 нарушает кэширование конфигурации из-за .gradle/.android/analytics.settings
generateLocaleConfig в agp 8.1.0 использует недетерминированный порядок, что нарушает воспроизводимые сборки.
Дексер (D8)
Приложение для десахаризации основной библиотеки вылетает после недавних обновлений.
Регрессия agp 8.1.0 с API 21 - F/dex2oat (4176): art/compiler/driver/compiler_driver.cc:1181] Проверка не удалась: !method->IsAbstract()
Линт
Lint проверяет только безопасные приведения для напрямую реализованных интерфейсов, а не для унаследованных.
Lint не проверяет допустимые приведения типов для приемников вызовов.
TypedArray#close (API 31) не очищен от сахара, но AS не выводит предупреждение при использовании в try-with-resources
Ошибка: ложное срабатывание предупреждения «Поставщик 'BC' устарел и, начиная с Android P...»
Ложное срабатывание Lint при запоминании после обновления Kotlin до версии 1.8.0
Ложное срабатывание предупреждения Lint для проверок SDK_INT, выполняемых внутри метода с параметром enum.
Проверка TypographyQuotes не работает с экранированными кавычками
Проверка TrustAllX509TrustManager lint неправильно помечает интерфейсы, расширяющие X509TrustManager.
Переформатирование только вставленного кода исправления замены
Lint: предварительный просмотр намерения вызывает исключение для ReplaceStringQuickFix
Усадочный аппарат (R8)
VerifyError: Верификатор отклонил класс при использовании R8 с Kotlin 1.8.20
R8 на AGP 8 ломает сервис Google Fit
Включение информации об исходном файле с остаточными именами, которые перекрывают входные имена, отображается неправильно.
R8 дает сбой во время сборки Compose с исключением ArrayIndexOutOfBoundsException
Простой код, связанный с StringBuilder, пропускает хвостовой вызов для добавления в режиме выпуска или debuggable=false
Крайний случай в методе VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization приводит к ошибке java.lang.VerifyError: Отклонение класса
Сбой с ошибкой проверки на Android 12+

Плагин Android Gradle 8.1.1

Исправленные проблемы
Дексер (D8)
Записи Java 16: equals(null) выдает исключение NullPointerException
Усадочный аппарат (R8)
java.lang.VerifyError: Верификатор отклонил класс
Сборка зависает на :minifyReleaseWithR8 при использовании библиотеки Apache POI
Отклонение вызова при включении оптимизации r8
NoClassDefFoundError для java.lang.reflect.Executable

Плагин Android Gradle 8.1.2

Исправленные проблемы
Плагин Android Gradle
androidResources недоступен в модуле библиотеки Android
[AGP 8.1.0] Тест ./gradlew завершается ошибкой «Не удалось найти выходные данные манифеста», если значения splits.abi.isEnable и testOptions.unitTests.isIncludeAndroidResources равны true.
Усадочный аппарат (R8)
Kotlin 1.9 приводит к тому, что лямбда-выражения Kotlin уничтожаются R8, если удаляются проверки на null.
R8 завершается ошибкой «Во время компиляции обнаружено неопределённое значение» для play-services-measurement-21.3.0-runtime.jar

Плагин Android Gradle 8.1.3

Исправленные проблемы
Плагин Android Gradle
[AGP 8.1.0] Тест ./gradlew завершается ошибкой «Не удалось найти выходные данные манифеста», если значения splits.abi.isEnable и testOptions.unitTests.isIncludeAndroidResources равны true.
Ошибка сборки после обновления до AGP 8.1

Плагин Android Gradle 8.1.4

Исправленные проблемы
Плагин Android Gradle
Не запускайте задачу дексирования для классов подпроектов, если они уже дексированы с помощью преобразований артефактов.