Плагин 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 Upgrade Assistant ( Tools > AGP Upgrade Assistant ).

Чтобы использовать несжатые собственные библиотеки, удалите атрибут 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, например, через линтинг. Мы планируем в конечном итоге поддерживать это поведение в API Variant.
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)
Приложение Core Library Desugaring вылетает после недавних обновлений.
Регрессия 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 lint не работает с экранированными кавычками
Проверка lint TrustAllX509TrustManager неправильно помечает интерфейсы, расширяющие X509TrustManager
Переформатирование только вставленного кода замены исправления
Lint: предварительный просмотр намерения вызывает исключение для ReplaceStringQuickFix
Усадочный аппарат (R8)
VerifyError: Верификатор отклонил класс при использовании R8 с Kotlin 1.8.20
R8 на AGP 8 ломает сервис Google Fit
Включение информации об исходном файле с остаточными именами, которые перекрывают входные имена, отображается неправильно.
R8 дает сбой во время сборки Compose с ArrayIndexOutOfBoundsException
Простой код, связанный с StringBuilder, пропускает вызов tail для добавления в режиме выпуска или 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
Не запускайте задачу дексирования для классов подпроектов, если они уже дексированы с помощью преобразований артефактов.