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

Android Gradle plugin 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 метки ResLocale. Для формирования названий локалей объедините код языка с необязательными кодами скрипта и региона, разделяя их дефисом:

    • Язык: Используйте двух- или трехбуквенный код 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. Если вы пишете собственные проверки линтера, вам необходимо компилировать с 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 AGP 8.0 false Включение этой опции без указания параметров подписи приводит к тому, что AGP использует конфигурацию подписи отладки по умолчанию при выполнении сборки с возможностью профилирования или отладки. Этот флаг отключен по умолчанию, чтобы побудить авторов сборок указывать конкретные параметры подписи для профилирования.
android.experimental.library.desugarAndroidTest AGP 8.0 false Этот флаг позволяет разработчикам библиотек включать оптимизацию содержимого основной библиотеки для тестовых APK-файлов без влияния на создаваемый AAR-файл, например, при проверке синтаксиса. В будущем мы планируем добавить поддержку этого поведения в API вариантов.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Если эта опция включена, функция Gradle Managed Devices позволяет пользователю определять собственный тип устройства, который может быть предоставлен плагином. Этот флаг необходимо включить, если вы хотите использовать плагин Firebase Test Lab.
android.lint.printStackTrace AGP 8.0 false Если эта опция включена, Android Lint выводит трассировку стека в случае сбоя. Этот флаг обладает теми же возможностями, что и переменная среды LINT_PRINT_STACKTRACE .
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 Никто Указывает максимальное количество одновременно активных управляемых устройств Gradle (AVD). Если значение равно 0 или отрицательное, максимальное количество устройств отсутствует.
android.experimental.testOptions.installApkTimeout AGP 8.0 Никто Время ожидания в секундах для установки APK-файла. Если значение равно 0 или отрицательное, оно будет установлено на значение по умолчанию протоколом UTP.

Исправлены ошибки

Плагин Android Gradle 8.1.4

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

Плагин Android Gradle 8.1.3

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

Плагин Android Gradle 8.1.2

Исправлены ошибки
Плагин Android Gradle
Класс androidResources недоступен в модуле библиотеки Android.
[AGP 8.1.0] Команда ./gradlew test завершается с ошибкой "Не удалось найти выходные данные манифеста", если параметры 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.1

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

Плагин 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 не влияет на значение targetCompile.
В объединенном манифесте отсутствуют атрибуты `android:host` для записей навигационных глубоких ссылок с подстановочными знаками.
Задача processDebugMainManifest завершается с ошибкой начиная с версии Android Gradle Plugin 8.1.
Можно ли удалить AnalyticsRecordingTask?
Содержимое файла output-metadata.json не согласуется.
Можно ли удалить AnalyticsRecordingTask?
Содержимое файла output-metadata.json не согласуется.
Настройка цепочки инструментов JVM не влияет на значение targetCompile.
В объединенном манифесте отсутствуют атрибуты `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 requires ASM9"
Ошибка: сообщение «Включите KSP и используйте процессор KSP для этой зависимости» просто перенаправляет на веб-сайт.
В Gradle 8.1 нарушено кэширование конфигураций из-за файла .gradle/.android/analytics.settings.
В agp 8.1.0 функция generateLocaleConfig использует недетерминированный порядок выполнения, что нарушает воспроизводимость сборок.
Дексер (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 выдает ложное срабатывание по поводу функции remember после обновления Kotlin до версии 1.8.0.
Ложное срабатывание предупреждения Lint для проверок SDK_INT, выполняемых внутри метода с параметром перечисления.
Проверка синтаксиса TypographyQuotes не работает с экранированными кавычками.
Проверка синтаксиса TrustAllX509TrustManager некорректно помечает интерфейсы, расширяющие X509TrustManager.
Изменение формата только вставленного кода при замене.
Lint: предварительный просмотр намерений вызывает исключение для ReplaceStringQuickFix
Уменьшитель (R8)
VerifyError: Верификатор отклонил класс при использовании R8 с Kotlin 1.8.20
R8 на AGP 8 ломает сервис Google Fit.
Информация об исходном файле, включающая остаточные имена, которые перекрываются с входными именами, отображается некорректно.
Сборка R8 завершается ошибкой ArrayIndexOutOfBoundsException во время выполнения команды Compose.
В простом коде, связанном с StringBuilder, отсутствует вызов функции добавления хвостовой части в режиме выпуска или при значении debuggable=false.
Особый случай в методе VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization приводит к ошибке java.lang.VerifyError: Rejecting class
Сбой с ошибкой проверки на Android 12+