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

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

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

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

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

В новых проектах для конфигурации сборки по умолчанию используется Kotlin DSL (build.gradle.kts). Это удобнее, чем Groovy DSL (build.gradle), поскольку в Kotlin DSL есть подсветка синтаксиса, автозаполнение кода и переход к объявлениям. Если вы используете 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):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Яркий

android {
  androidResources {
    generateLocaleConfig true
  }
}

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

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

Подробнее об инструменте lint…

Настройки сжатия общей библиотеки C/C++ перенесены в DSL

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

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

Kotlin

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, например с помощью линтинга. В будущем мы планируем добавить поддержку этого поведения в Variant API.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Если этот параметр включен, управляемые устройства Gradle позволяют использовать пользовательский тип устройства, который может быть предоставлен плагином. Этот флаг необходимо включить, если вы хотите использовать плагин 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. Если значение равно нулю или отрицательное, UTP задаст значение по умолчанию.

Устраненные проблемы

Плагин Android Gradle 8.1.4

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

Плагин 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
Shrinker (R8)
В Kotlin 1.9 лямбда-выражения Kotlin удаляются R8, если удалены проверки на null
R8 завершается с ошибкой "Undefined value encountered during compilation" (Неопределенное значение, обнаруженное во время компиляции) для play-services-measurement-21.3.0-runtime.jar

Плагин Android Gradle 8.1.1

Устраненные проблемы
Dexer (D8)
Java 16 Records: equals(null) throws NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
При использовании библиотеки Apache POI сборка зависает на этапе :minifyReleaseWithR8
Отклонение вызова при включенной оптимизации 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 завершается с ошибкой из-за плейсхолдеров манифеста для вариантов тестирования
Свойство namespace, вероятно, относится к HasAndroidResources
Не удается отключить сообщение "Файлы Gradle изменились после последней синхронизации проекта"
Сообщение "Мы рекомендуем использовать более новую версию плагина Android Gradle", когда более новой версии нет
processDebugUnitTestManifest завершается с ошибкой из-за плейсхолдеров манифеста для вариантов тестирования
Логический флаг, позволяющий отключить проверку SDK для компиляции в CheckAarMetadataTask.
Ошибка сборки относится к уровню API 34, которого не существует
Настройка цепочки инструментов JVM не влияет на значение targetCompatibility для JavaCompile
У записей deepLink для навигации с доменами с подстановочными знаками в объединенном манифесте отсутствует атрибут `android:host`
Задача processDebugMainManifest не выполняется, начиная с версии 8.1 плагина Android Gradle
Можно ли удалить AnalyticsRecordingTask?
Содержимое файла output-metadata.json несовместимо
Можно ли удалить AnalyticsRecordingTask?
Содержимое файла output-metadata.json несовместимо
Настройка цепочки инструментов JVM не влияет на значение targetCompatibility для JavaCompile
У записей deepLink для навигации с доменами с подстановочными знаками в объединенном манифесте отсутствует атрибут `android:host`
Задача processDebugMainManifest не выполняется, начиная с версии 8.1 плагина Android Gradle
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
Функция generateLocaleConfig в AGP 8.1.0 использует недетерминированный порядок, из-за чего сборки не воспроизводятся
Dexer (D8)
Приложение сбоит после недавних обновлений из-за десахаризации основной библиотеки.
agp 8.1.0 regression with API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
Lint проверяет безопасные приведения типов только для непосредственно реализованных интерфейсов, а не для унаследованных.
Lint не проверяет допустимость приведения типов для получателей вызовов
TypedArray#close (API 31) не десахаризован, но AS не показывает предупреждение при использовании в try-with-resources
Ошибка: ложноположительное предупреждение "Поставщик BC устарел и в Android P..."
Ложное срабатывание Lint в отношении функции remember после обновления Kotlin до версии 1.8.0
Ложное предупреждение Lint для проверок SDK_INT, выполненных внутри метода с параметром enum
Проверка TypographyQuotes не работает с экранированными кавычками
Проверка TrustAllX509TrustManager lint неправильно помечает интерфейсы, которые расширяют X509TrustManager
Переформатирование только вставленного кода при замене
Lint: предварительный просмотр намерения вызывает исключение для ReplaceStringQuickFix
Shrinker (R8)
VerifyError: верификатор отклонил класс при использовании R8 с Kotlin 1.8.20
R8 в AGP 8 нарушает работу сервиса Google Fit
Информация об исходном файле с остаточными названиями, которые совпадают с названиями входных данных, представлена некорректно.
R8 не удается выполнить сборку Compose с исключением ArrayIndexOutOfBoundsException
Простой код, связанный с StringBuilder, не содержит хвостового вызова для добавления в режиме release или debuggable=false
Нестандартный случай в методе VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization приводит к ошибке java.lang.VerifyError: Rejecting class
Сбой с ошибкой проверки на устройствах Android 12 и более поздних версий