Плагин 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.
ЯДК 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.

Дополнительные сведения об инструменте проверки см. в разделе «Улучшите свой код с помощью проверок» .

Настройки сжатия встроенной библиотеки перенесены в 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 позволяют использовать определяемый пользователем тип устройства, который может быть предоставлен плагином. Этот флаг должен быть включен, если вы хотите использовать плагин Firebase Test Lab.
android.lint.printStackTrace АГП 8.0 false Если этот параметр включен, Android lint печатает трассировку стека в случае сбоя. Этот флаг имеет те же возможности, что и переменная среды LINT_PRINT_STACKTRACE .
android.experimental.testOptions.managedDevices.maxConcurrentDevices АГП 8.0 Никто Указывает максимальное количество одновременных управляемых устройств Gradle (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: Фламинго | 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 не влияет на значение JavaCompile targetCompatibility.
Записи навигации deepLink с доменами с подстановочными знаками не имеют атрибута android:host в объединенном манифесте.
Задача ProcessDebugMainManifest не выполнена, поскольку плагин Android Gradle 8.1
Можем ли мы удалить AnalyticsRecordingTask?
Содержимое файла output-metadata.json несовместимо.
Можем ли мы удалить AnalyticsRecordingTask?
Содержимое файла output-metadata.json несовместимо.
Установка набора инструментов JVM не влияет на значение JavaCompile targetCompatibility.
Записи навигации deepLink с доменами с подстановочными знаками не имеют атрибута android:host в объединенном манифесте.
Задача ProcessDebugMainManifest не выполнена, поскольку плагин Android Gradle 8.1
Android Studio не учитывает переменную среды STUDIO_GRADLE_JDK.
Пользовательские типы источников должны создавать многовариантные наборы источников.
DependencyInfoBuilder требует обновления API + документация
DexingNoClasspathTransform (minSdk >= 24) с целью Java 11 завершается сбоем из-за отсутствия членов гнезда
DslExtension.Builder.extendProjectWith() не работает, как описано в Groovy
Добавьте API VariantSelector.withFlavor, который не использует kotlin.Pair.
АндроидЛинтАнализТаск ( :lintAnalyzeExternalRelease) имеет промах в кэше, поскольку файл proguard.txt изменился.
Объединенный манифест приложения содержит атрибуты extractNativeLibs и useEmbeddedDex из зависимостей.
AGP: предоставить путь к инструменту AIDL и файлу AIDL платформы как общедоступный API.
Просьба: пусть IDE предложит исправление для «PermittedSubclasses требует ASM9».
Ошибка: «Включите KSP и вместо этого используйте процессор KSP для этой зависимости» просто переходит на веб-сайт.
Gradle 8.1 нарушает кэширование конфигурации из-за .gradle/.android/analytics.settings
генерироватьLocaleConfig в 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 не отображает предупреждение при использовании в попытке с ресурсами
Ошибка: ложное срабатывание предупреждения «Поставщик BC устарел и начиная с Android P…»
Ложное срабатывание Lint о запоминании после обновления 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 завершается с ошибкой во время сборки Compose с исключением ArrayIndexOutOfBoundsException
Простой код, связанный с StringBuilder, пропускает хвостовой вызов для добавления в режиме Release или debuggable=false.
Крайний случай в методе VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
Результат оптимизации dex-startup-java.lang.VerifyError: отказ от класса
Сбой с ошибкой проверки на Android 12+

Плагин Android Gradle 8.1.1

Исправленные проблемы
Дексер (D8)
Записи Java 16: равенства (нуль) выдают исключение 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, если удалены нулевые проверки.
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
Не запускайте задачу dexing для классов подпроектов, если они уже обработаны с помощью преобразований артефактов.