Плагин Android Gradle 7.0.0 (июль 2021 г.)
Плагин Android Gradle 7.0.0 — это крупный релиз, включающий множество новых функций и улучшений.
7.0.1 (август 2021 г.)
Это небольшое обновление включает в себя исправления различных ошибок. Список наиболее заметных исправлений ошибок можно найти в соответствующей публикации в блоге Release Updates .
Совместимость
Минимальная версия | Версия по умолчанию | Примечания | |
---|---|---|---|
Грейдл | 7.0.2 | 7.0.2 | Более подробную информацию см. в разделе Обновление Gradle . |
Инструменты сборки SDK | 30.0.2 | 30.0.2 | Установите или настройте инструменты сборки SDK. |
НДК | Н/Д | 21.4.7075529 | Установите или настройте другую версию NDK. |
JDK | 11 | 11 | Более подробную информацию см. в разделе Установка версии JDK . |
Для запуска AGP 7.0 требуется JDK 11
При использовании плагина Android Gradle 7.0 для сборки приложения теперь требуется JDK 11 для запуска Gradle. Android Studio Arctic Fox включает JDK 11 и настраивает Gradle на его использование по умолчанию. Это означает, что большинству пользователей Android Studio не нужно вносить какие-либо изменения в конфигурацию своих проектов.
Если вам нужно вручную установить версию JDK, используемую AGP внутри Android Studio, вам нужно использовать JDK 11 или выше.
При использовании AGP независимо от Android Studio обновите версию JDK, установив переменную среды JAVA_HOME или параметр командной строки -Dorg.gradle.java.home
в каталоге установки JDK 11.
Обратите внимание, что SDK Manager и AVD Manager в устаревшем пакете SDK Tools не работают с JDK 11. Чтобы продолжить использовать SDK Manager и AVD Manager с AGP 7.0 и выше, вам необходимо перейти на новые версии инструментов в текущем пакете Android SDK Command-Line Tools .
Стабильный вариант API
Новый API Variant теперь стабилен. См. новые интерфейсы в пакете com.android.build.api.variant и примеры в проекте gradle-recipes на GitHub. В рамках нового API Variant мы предоставили доступ к ряду промежуточных файлов, называемых артефактами, через интерфейс Artifacts . Эти артефакты, как и объединённый манифест, можно безопасно получить и настроить с помощью сторонних плагинов и кода.
Мы продолжим расширять API Variant, добавляя новые функции и увеличивая количество промежуточных артефактов, доступных для настройки.
Изменения поведения Lint
В этом разделе описываются многочисленные изменения поведения Lint в плагине Android Gradle 7.0.0.
Улучшенный анализ зависимостей библиотек
Выполнение lint с checkDependencies = true
теперь выполняется быстрее, чем раньше. Для проектов Android, состоящих из приложения с зависимостями от библиотек, рекомендуется установить checkDependencies
в true
, как показано ниже, и запускать lint через ./gradlew :app:lint
. Это позволит параллельно проанализировать все модули зависимостей и создать единый отчёт, включающий проблемы в приложении и всех его зависимостях.
Круто
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Котлин
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
Задачи линтинга теперь могут быть АКТУАЛЬНЫМИ
Если исходные коды и ресурсы модуля не изменились, задачу анализа lint для этого модуля не нужно запускать повторно. В этом случае выполнение задачи отображается в результатах Gradle как «UP-TO-DATE». Благодаря этому изменению при запуске lint для модуля приложения с checkDependencies = true
анализ потребуется выполнять только для изменившихся модулей. В результате Lint может работать ещё быстрее.
Задачу отчёта Lint также не нужно запускать, если её входные данные не изменились. Связанная с этим известная проблема заключается в том, что текстовый вывод Lint не выводится на стандартный вывод, когда задача Lint находится в состоянии UP-TO-DATE ( проблема № 191897708 ).
Выполнение lint для модулей с динамическими функциями
AGP больше не поддерживает запуск lint из модулей динамических функций. Запуск lint из соответствующего модуля приложения запустит lint для его модулей динамических функций и включит все проблемы в отчёт lint приложения. Связанная с этим известная проблема заключается в том, что при запуске lint с checkDependencies = true
из модуля приложения зависимости библиотеки динамических функций не проверяются, если только они не являются зависимостями приложения ( проблема № 191977888 ).
Выполнение lint только для варианта по умолчанию
Выполнение ./gradlew :app:lint
теперь запускает lint только для варианта по умолчанию. В предыдущих версиях AGP lint запускался для всех вариантов.
Отсутствуют предупреждения о классах в усадочном модуле R8
R8 более точно и последовательно обрабатывает отсутствующие классы и опцию -dontwarn
. Поэтому вам следует начать с анализа предупреждений об отсутствующих классах, выдаваемых R8.
Когда R8 обнаруживает ссылку на класс, не определённую в вашем приложении или одной из его зависимостей, он выдаёт предупреждение, которое отображается в результатах сборки. Например:
R8: Missing class: java.lang.instrument.ClassFileTransformer
Это предупреждение означает, что определение класса java.lang.instrument.ClassFileTransformer
не удалось найти при анализе кода вашего приложения. Хотя обычно это означает наличие ошибки, возможно, вы захотите проигнорировать это предупреждение. Есть две распространённые причины игнорировать это предупреждение:
Библиотеки, ориентированные на JVM, и отсутствующий класс относятся к типу библиотеки JVM (как в примере выше).
Одна из ваших зависимостей использует API только во время компиляции.
Вы можете игнорировать предупреждение об отсутствии класса, добавив правило -dontwarn
в файл proguard-rules.pro
. Например:
-dontwarn java.lang.instrument.ClassFileTransformer
Для удобства AGP создаст файл, содержащий все потенциально отсутствующие правила, и запишет их в файл по следующему пути: app/build/outputs/mapping/release/missing_rules.txt
. Добавьте правила в файл proguard-rules.pro
, чтобы игнорировать предупреждения.
В AGP 7.0 сообщения об отсутствующих классах будут отображаться как предупреждения, и вы можете преобразовать их в ошибки, установив android.r8.failOnMissingClasses = true
в gradle.properties
. В AGP 8.0 эти предупреждения станут ошибками, которые приведут к сбою сборки. Можно сохранить поведение AGP 7.0, добавив опцию -ignorewarnings
в файл proguard-rules.pro
, но это не рекомендуется.
Кэш сборки плагина Android Gradle удален
Кэш сборки AGP был удалён в AGP 4.1. Ранее представленный в AGP 2.3 в качестве дополнения к кэшу сборки Gradle, кэш сборки AGP был полностью заменён кэшем сборки Gradle в AGP 4.1. Это изменение не влияет на время сборки.
В AGP 7.0 свойство android.enableBuildCache
, свойство android.buildCacheDir
и задача cleanBuildCache
были удалены.
Используйте исходный код Java 11 в своем проекте
Теперь вы можете компилировать исходный код Java 11 в проекте своего приложения, что позволяет использовать новые возможности языка, такие как методы закрытого интерфейса, оператор «ромб» для анонимных классов и синтаксис локальной переменной для параметров лямбда.
Чтобы включить эту функцию, задайте compileOptions
нужную версию Java и задайте compileSdkVersion
значение 30 или выше:
// build.gradle
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "11"
}
}
// build.gradle.kts
android {
compileSdkVersion(30)
compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
kotlinOptions {
jvmTarget = "11"
}
}
Удалены конфигурации зависимостей
В AGP 7.0 были удалены следующие конфигурации (или области зависимостей):
-
compile
В зависимости от варианта использования это заменялось наapi
илиimplementation
.
Также применимо к вариантам *Compile , например:debugCompile
. -
provided
Это было заменено наcompileOnly
.
Также применимо к вариантам *Provided , например:releaseProvided
. -
apk
Это было заменено наruntimeOnly
. -
publish
Это было заменено наruntimeOnly
.
В большинстве случаев AGP Upgrade Assistant автоматически перенесет ваш проект на новые конфигурации.
Изменение пути к классам при компиляции с плагином Android Gradle
Если вы компилируете с помощью плагина Android Gradle, ваш путь к классам компиляции может измениться. Поскольку AGP теперь использует внутренние конфигурации api/implementation
, некоторые артефакты могут быть удалены из пути к классам компиляции. Если вы используете зависимость AGP во время компиляции, обязательно добавьте её как явную зависимость.
Добавление собственных библиотек в папку ресурсов Java не поддерживается.
Раньше можно было добавить нативную библиотеку в папку ресурсов Java и зарегистрировать её с помощью android.sourceSets.main.resources.srcDirs
, чтобы нативная библиотека была извлечена и добавлена в финальный APK-файл. Начиная с AGP 7.0, эта функция не поддерживается, и нативные библиотеки в папке ресурсов Java игнорируются. Вместо этого используйте метод DSL, предназначенный для нативных библиотек, android.sourceSets.main.jniLibs.srcDirs
. Подробнее см. в разделе «Как настроить исходные наборы» .
Известные проблемы
В этом разделе описываются известные проблемы, существующие в плагине Android Gradle 7.0.0.
Несовместимость с плагином Kotlin Multiplatform версии 1.4.x
Плагин Android Gradle 7.0.0 совместим с плагином Kotlin Multiplatform версии 1.5.0 и выше. Проекты, использующие поддержку Kotlin Multiplatform, должны обновиться до Kotlin 1.5.0, чтобы использовать плагин Android Gradle 7.0.0. В качестве временного решения можно понизить версию плагина Android Gradle до 4.2.x, хотя это не рекомендуется.
Более подробную информацию см. в KT-43944 .
Отсутствует вывод lint
При обновлении задачи lint текстовый вывод lint не выводится в stdout ( проблема № 191897708 ). Подробнее см. в разделе «Изменения поведения lint» . Эта проблема будет исправлена в плагине Android Gradle 7.1.
Не все зависимости библиотеки динамических функций проверяются линтом
При запуске lint с checkDependencies = true
из модуля приложения зависимости динамических библиотек не проверяются, если только они не являются зависимостями приложения ( проблема № 191977888 ). В качестве обходного решения можно запустить задачу lint для этих библиотек. Подробнее см. в разделе Изменения поведения lint .