Плагин 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 для зависимостей библиотек
Запуск lint с checkDependencies = true
теперь выполняется быстрее, чем раньше. Для проектов Android, состоящих из приложения с зависимостями библиотек, рекомендуется установить checkDependencies
в true
, как показано ниже, и запустить lint через ./gradlew :app:lint
, который будет параллельно анализировать все модули зависимостей и создавать единый отчет, включающий проблемы из приложения и всех его зависимостей.
Круто
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Котлин
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
Задачи lint теперь могут быть АКТУАЛЬНЫМИ
Если источники и ресурсы модуля не изменились, задачу анализа lint для модуля не нужно запускать снова. Когда это происходит, выполнение задачи отображается как "UP-TO-DATE" в выходных данных Gradle. С этим изменением при запуске lint для модуля приложения с checkDependencies = true
только измененные модули должны будут запустить свой анализ. В результате Lint может работать еще быстрее.
Задачу отчета Lint также не нужно запускать, если ее входные данные не изменились. Связанная известная проблема заключается в том, что текстовый вывод lint не печатается на stdout, когда задача lint UP-TO-DATE ( проблема № 191897708 ).
Запуск lint на модулях с динамическими функциями
AGP больше не поддерживает запуск lint из динамических модулей функций. Запуск lint из соответствующего модуля приложения запустит lint для его динамических модулей функций и включит все проблемы в отчет lint приложения. Связанная известная проблема заключается в том, что при запуске lint с checkDependencies = true
из модуля приложения зависимости библиотеки динамических функций не проверяются, если они также не являются зависимостями приложения ( проблема № 191977888 ).
Запуск lint только для варианта по умолчанию
Запуск ./gradlew :app:lint
теперь запускает lint только для варианта по умолчанию. В предыдущих версиях AGP он запускал lint для всех вариантов.
Отсутствуют предупреждения о классах в R8 shrinker
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
. Для получения дополнительной информации см. how to configure source sets .
Известные проблемы
В этом разделе описываются известные проблемы, существующие в плагине Android Gradle 7.0.0.
Несовместимость с плагином Kotlin Multiplatform 1.4.x
Android Gradle Plugin 7.0.0 совместим с Kotlin Multiplatform plugin 1.5.0 и выше. Проекты, использующие поддержку Kotlin Multiplatform, должны обновиться до Kotlin 1.5.0, чтобы использовать Android Gradle Plugin 7.0.0. В качестве обходного пути вы можете понизить версию Android Gradle plugin до 4.2.x, хотя это не рекомендуется.
Более подробную информацию см. в KT-43944 .
Отсутствует вывод lint
Текстовый вывод lint не выводится на stdout, когда задача lint актуальна ( проблема № 191897708 ). Для получения более подробной информации см. Изменения поведения для lint . Эта проблема будет исправлена в плагине Android Gradle 7.1.
Не все зависимости библиотеки динамических функций проверяются линтом
При запуске lint с checkDependencies = true
из модуля приложения зависимости библиотеки динамических функций не проверяются, если они также не являются зависимостями приложения ( проблема № 191977888 ). В качестве обходного пути можно запустить задачу lint для этих библиотек. Для получения более подробной информации см. Изменения поведения для lint .