Android Gradle Plugin 4.0.0 (апрель 2020 г.)
Для работы этой версии плагина для Android требуются следующие компоненты:
Gradle 6.1.1 . Чтобы узнать больше, прочтите раздел об обновлении Gradle .
SDK Build Tools 29.0.2 или выше.
4.0.1 (июль 2020 г.)
Это небольшое обновление обеспечивает совместимость с новыми настройками по умолчанию и функциями отображения пакетов в Android 11 .
В предыдущих версиях Android можно было просмотреть список всех приложений, установленных на устройстве. Начиная с Android 11 (уровень API 30), по умолчанию приложения имеют доступ только к отфильтрованному списку установленных пакетов. Чтобы увидеть более полный список приложений в системе, теперь необходимо добавить элемент <queries> в манифест Android вашего приложения или библиотеки.
Плагин Android Gradle версии 4.1 и выше уже совместим с новым объявлением <queries> ; однако более старые версии несовместимы. Если вы добавите элемент <queries> или начнете использовать библиотеку или SDK, поддерживающие Android 11, вы можете столкнуться с ошибками слияния манифестов при сборке вашего приложения.
Для решения этой проблемы мы выпускаем набор исправлений для AGP 3.3 и выше. Если вы используете более старую версию AGP, обновитесь до одной из следующих версий:
| Минимальная версия | Версия по умолчанию | Примечания | |
|---|---|---|---|
| Грэдл | 6.1.1 | 6.1.1 | Для получения более подробной информации см. раздел «Обновление Gradle» . |
| Инструменты сборки SDK | 29.0.2 | 29.0.2 | Установите или настройте инструменты сборки SDK. |
Для получения более подробной информации об этой новой функции см. раздел «Видимость пакетов в Android 11» .
Новые функции
В этой версии плагина Android Gradle добавлены следующие новые функции.
Поддержка анализатора сборки Android Studio
Окно «Анализ сборки» помогает понять и диагностировать проблемы в процессе сборки, такие как отключенные оптимизации и неправильно настроенные задачи. Эта функция доступна при использовании Android Studio 4.0 и выше с плагином Android Gradle 4.0.0 и выше. Открыть окно «Анализ сборки» из Android Studio можно следующим образом:
- Если вы еще этого не сделали, соберите свое приложение, выбрав в строке меню пункт «Сборка» > «Создать проект» .
- В строке меню выберите «Вид» > «Окна инструментов» > «Сборка» .
- В окне «Сборка» откройте окно « Анализатор сборки» одним из следующих способов:
- После завершения сборки проекта в Android Studio перейдите на вкладку «Анализ сборки» .
- После завершения сборки проекта в Android Studio нажмите на ссылку в правой части окна «Результаты сборки» .

В окне «Анализ сборки» возможные проблемы сборки отображаются в виде дерева слева. Вы можете просмотреть каждую проблему и щелкнуть по ней, чтобы узнать подробности на панели справа. Когда Android Studio анализирует вашу сборку, она вычисляет набор задач, которые определили продолжительность сборки, и предоставляет визуализацию, которая поможет вам понять влияние каждой из этих задач. Вы также можете получить подробную информацию о предупреждениях, развернув узел «Предупреждения» .
Чтобы узнать больше, прочтите статью «Выявление регрессий скорости сборки» .
Десахаризация библиотек Java 8 в D8 и R8
Теперь плагин Android Gradle поддерживает использование ряда API языка Java 8 без необходимости указывать минимальный уровень API для вашего приложения.
Благодаря процессу, называемому десахаризацией , компилятор DEX, D8, в Android Studio 3.0 и выше уже обеспечивал существенную поддержку языковых возможностей Java 8 (таких как лямбда-выражения, методы интерфейса по умолчанию, try with resources и многое другое). В Android Studio 4.0 механизм десахаризации был расширен, чтобы иметь возможность десахарить API языка Java. Это означает, что теперь вы можете включать стандартные языковые API, которые были доступны только в последних версиях Android (например, java.util.streams ), в приложения, поддерживающие более старые версии Android.
В этом выпуске поддерживается следующий набор API:
- Последовательные потоки (
java.util.stream) - Подмножество
java.time -
java.util.function - Недавние дополнения к
java.util.{Map,Collection,Comparator} - Классы Optional (
java.util.Optional,java.util.OptionalIntиjava.util.OptionalDouble) и некоторые другие новые классы, полезные для работы с указанными выше API. - Внесены некоторые дополнения в
java.util.concurrent.atomic(новые методы дляAtomicInteger,AtomicLongиAtomicReference). -
ConcurrentHashMap(с исправлениями ошибок для Android 5.0)
Для поддержки этих языковых API D8 компилирует отдельный DEX-файл библиотеки, содержащий реализацию недостающих API, и включает его в ваше приложение. В процессе десахаризации код вашего приложения переписывается таким образом, чтобы во время выполнения использовалась именно эта библиотека.
Чтобы включить поддержку этих языковых API, добавьте следующее в файл build.gradle вашего модуля приложения :
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled = true
}
compileOptions {
// Flag to enable support for the new language APIs
isCoreLibraryDesugaringEnabled = true
// Sets Java compatibility to Java 8
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4")
}
Обратите внимание, что вам также может потребоваться включить приведенный выше фрагмент кода в файл build.gradle модуля библиотеки , если...
Инструментированные тесты модуля библиотеки используют эти языковые API (либо напрямую, либо через модуль библиотеки или его зависимости). Это необходимо для того, чтобы недостающие API были предоставлены для вашего APK-файла инструментированных тестов.
Вам нужно запустить проверку синтаксиса (lint) для модуля библиотеки в отрыве от остального кода. Это поможет lint распознавать допустимые варианты использования языковых API и избегать ложных предупреждений.
Новые параметры для включения или отключения функций сборки.
В плагине Android Gradle 4.0.0 представлен новый способ управления включением и отключением функций сборки, таких как привязка представления и привязка данных. При добавлении новых функций они по умолчанию отключаются. Затем вы можете использовать блок buildFeatures , чтобы включить только нужные вам функции, что поможет оптимизировать производительность сборки вашего проекта. Вы можете задать параметры для каждого модуля в файле build.gradle на уровне модуля следующим образом:
android {
// The default value for each feature is shown below. You can change the value to
// override the default behavior.
buildFeatures {
// Determines whether to generate a BuildConfig class.
buildConfig = true
// Determines whether to support View Binding.
// Note that the viewBinding.enabled property is now deprecated.
viewBinding = false
// Determines whether to support Data Binding.
// Note that the dataBinding.enabled property is now deprecated.
dataBinding = false
// Determines whether to generate binder classes for your AIDL files.
aidl = true
// Determines whether to support RenderScript.
renderScript = true
// Determines whether to support injecting custom variables into the module’s R class.
resValues = true
// Determines whether to support shader AOT compilation.
shaders = true
}
}android {
// The default value for each feature is shown below. You can change the value to
// override the default behavior.
buildFeatures {
// Determines whether to generate a BuildConfig class.
buildConfig = true
// Determines whether to support View Binding.
// Note that the viewBinding.enabled property is now deprecated.
viewBinding = false
// Determines whether to support Data Binding.
// Note that the dataBinding.enabled property is now deprecated.
dataBinding = false
// Determines whether to generate binder classes for your AIDL files.
aidl = true
// Determines whether to support RenderScript.
renderScript = true
// Determines whether to support injecting custom variables into the module’s R class.
resValues = true
// Determines whether to support shader AOT compilation.
shaders = true
}
}Вы также можете задать настройки по умолчанию для этих функций для всех модулей в проекте, добавив один или несколько из следующих параметров в файл gradle.properties вашего проекта, как показано ниже. Имейте в виду, что вы по-прежнему можете использовать блок buildFeatures в файле build.gradle на уровне модуля, чтобы переопределить эти настройки по умолчанию для всего проекта.
android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=trueЗависимости между функциями
В предыдущих версиях плагина Android Gradle все функциональные модули могли зависеть только от базового модуля приложения. При использовании плагина Android Gradle 4.0.0 теперь можно включать функциональный модуль, который зависит от другого функционального модуля. То есть, функция ` :video может зависеть от функции :camera , которая, в свою очередь, зависит от базового модуля, как показано на рисунке ниже.

Модуль Feature :video зависит от модуля Feature :camera , который, в свою очередь, зависит от базового модуля :app .
Это означает, что когда ваше приложение запрашивает загрузку модуля функций, оно также загружает другие модули функций, от которых зависит. После создания модулей функций для вашего приложения вы можете объявить зависимость «функция от функции» в файле build.gradle модуля. Например, модуль :video объявляет зависимость от :camera следующим образом:
// In the build.gradle file of the ':video' module.
dependencies {
// All feature modules must declare a dependency
// on the base module.
implementation project(':app')
// Declares that this module also depends on the 'camera'
// feature module.
implementation project(':camera')
...
}// In the build.gradle file of the ':video' module.
dependencies {
// All feature modules must declare a dependency
// on the base module.
implementation(project(":app"))
// Declares that this module also depends on the 'camera'
// feature module.
implementation(project(":camera"))
...
}Кроме того, в Android Studio следует включить функцию зависимости функций от функций (например, для поддержки этой функции при редактировании конфигурации запуска), для этого выберите в строке меню «Справка» > «Редактировать параметры пользовательской виртуальной машины» и добавьте следующие параметры:
-Drundebug.feature.on.feature=trueМетаданные зависимостей
При сборке приложения с использованием плагина Android Gradle версии 4.0.0 и выше, плагин включает метаданные, описывающие зависимости, которые компилируются в ваше приложение. При загрузке приложения Play Console анализирует эти метаданные, предоставляя вам следующие преимущества:
- Получайте уведомления об известных проблемах с SDK и зависимостями, используемыми вашим приложением.
- Получите полезную обратную связь для решения этих проблем.
Данные сжимаются, шифруются ключом подписи Google Play и хранятся в блоке подписи вашего релизного приложения. Однако вы можете самостоятельно просмотреть метаданные в локальных промежуточных файлах сборки в следующем каталоге: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt .
Если вы не хотите делиться этой информацией, вы можете отказаться, добавив следующее в файл build.gradle вашего модуля:
android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}Импортируйте собственные библиотеки из зависимостей AAR.
Теперь вы можете импортировать библиотеки C/C++ из зависимостей AAR вашего приложения. Выполнив описанные ниже шаги по настройке, Gradle автоматически сделает эти нативные библиотеки доступными для использования с вашей внешней системой сборки нативных приложений, например, CMake. Обратите внимание, что Gradle делает эти библиотеки доступными только для вашей сборки; вам все равно необходимо настроить ваши скрипты сборки для их использования.
Библиотеки экспортируются с использованием формата пакетов Prefab .
Каждая зависимость может предоставлять не более одного пакета Prefab, который включает в себя один или несколько модулей. Модуль Prefab представляет собой отдельную библиотеку, которая может быть как разделяемой, так и статической, или состоять только из заголовочных файлов.
Как правило, имя пакета совпадает с именем артефакта Maven, а имя модуля — с именем библиотеки, но это не всегда так. Поскольку вам необходимо знать имена пакета и модуля библиотек, вам может потребоваться обратиться к документации зависимости, чтобы определить их названия.
Настройте внешнюю систему сборки нативных приложений.
Чтобы узнать, какие шаги необходимо выполнить, следуйте инструкциям ниже для внешней системы сборки, которую вы планируете использовать.
Каждая из зависимостей AAR вашего приложения, включающая нативный код, предоставляет файл Android.mk , который необходимо импортировать в ваш проект ndk-build. Импорт этого файла осуществляется с помощью команды import&endash;module , которая выполняет поиск по указанным вами путям с помощью свойства import&endash;add&endash;path в вашем проекте ndk-build. Например, если ваше приложение определяет libapp.so и использует curl, вам следует включить следующее в файл Android.mk:
Для CMake:
add_library(app SHARED app.cpp)# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)
Для
ndk-build:include $(CLEAR_VARS) LOCAL_MODULE := libapp LOCAL_SRC_FILES := app.cpp # Link libcurl from the curl AAR. LOCAL_SHARED_LIBRARIES := curl include $(BUILD_SHARED_LIBRARY)# If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif
# Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)
Встроенные зависимости, включенные в AAR-файл, доступны вашему проекту CMake через переменную CMAKE_FIND_ROOT_PATH {: .external}. Это значение будет автоматически установлено Gradle при вызове CMake, поэтому, если ваша система сборки изменяет эту переменную, обязательно добавляйте к ней значение, а не присваивайте его.
Каждая зависимость предоставляет вашему CMake-сборщику пакет конфигурационных файлов {: .external}, который вы импортируете с помощью команды find_package {: .external}. Эта команда ищет пакеты конфигурационных файлов, соответствующие заданному имени и версии пакета, и предоставляет цели, которые она определяет для использования в вашей сборке. Например, если ваше приложение использует libapp.so и curl, вам следует добавить следующее в файл CMakeLists.txt :
add_library(app SHARED app.cpp)
# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)
Теперь вы можете указать #include "curl/curl.h" в app.cpp . При сборке проекта ваша внешняя система сборки автоматически связывает libapp.so с libcurl.so и включает libcurl.so в APK-файл или пакет приложения. Для получения дополнительной информации обратитесь к примеру префаба `curl` {:.external}.
Изменения в поведении
При использовании этой версии плагина вы можете столкнуться со следующими изменениями в его работе.
Обновления конфигурации подписи v1/v2
Поведение параметров подписи приложений в блоке signingConfig изменилось следующим образом:
подпись v1
- Если
v1SigningEnabledявно включен, AGP выполняет подпись приложения версии 1. - Если
v1SigningEnabledявно отключен пользователем, подписание приложения версии v1 не выполняется. - Если пользователь явно не включил подписание версии 1, оно может быть автоматически отключено на основе
minSdkиtargetSdk.
Подписание v2
- Если
v2SigningEnabledявно включен, AGP выполняет подпись приложений версии v2. - Если пользователь явно отключит
v2SigningEnabled, подписание приложения v2 не будет выполнено. - Если пользователь явно не включил подписание версии 2, оно может быть автоматически отключено в зависимости от
targetSdk.
Эти изменения позволяют AGP оптимизировать сборки, отключая механизм подписи в зависимости от того, включил ли пользователь явно эти флаги. До этого релиза можно было отключить v1Signing , даже если он был явно включен, что могло вызывать путаницу.
Удалены плагины Android Gradle feature и instantapp .
В версии 3.6.0 плагин Android Gradle устарел, вместо него стали использоваться плагины Feature ( com.android.feature ) и Instant App ( com.android.instantapp ), а для сборки и упаковки мгновенных приложений с помощью Android App Bundles используется плагин Dynamic Feature ( com.android.dynamic-feature ).
В плагине Android Gradle версии 4.0.0 и выше эти устаревшие плагины полностью удалены. Поэтому, чтобы использовать последнюю версию плагина Android Gradle, вам необходимо перевести ваше мгновенное приложение на поддержку Android App Bundles . Переведя ваши мгновенные приложения на эту платформу, вы сможете воспользоваться преимуществами App Bundles и упростить модульную структуру вашего приложения .
Примечание: Для открытия проектов, использующих удаленные плагины, в Android Studio 4.0 и выше, проект должен использовать плагин Android Gradle версии 3.6.0 или ниже.
Функция отдельной обработки аннотаций удалена.
Возможность выделения обработки аннотаций в отдельную задачу была удалена. Эта опция использовалась для поддержания инкрементальной компиляции Java при использовании неинкрементальных обработчиков аннотаций в проектах, написанных только на Java; она включалась путем установки параметра android.enableSeparateAnnotationProcessing в true в файле gradle.properties , что больше не работает.
Вместо этого следует перейти к использованию инкрементальных обработчиков аннотаций для повышения производительности сборки.
includeCompileClasspath устарела.
Плагин Android Gradle больше не проверяет и не включает обработчики аннотаций, объявленные вами в пути компиляции, и свойство DSL annotationProcessorOptions.includeCompileClasspath больше не имеет никакого эффекта. Если вы включите обработчики аннотаций в путь компиляции, вы можете получить следующую ошибку:
Error: Annotation processors must be explicitly declared now.Для решения этой проблемы необходимо добавить обработчики аннотаций в файлы build.gradle , используя конфигурацию зависимости annotationProcessor . Подробнее см. в разделе «Добавление обработчиков аннотаций» .
Автоматическая упаковка предварительно собранных зависимостей, используемых CMake.
В более ранних версиях плагина Android Gradle требовалось явно упаковывать все предварительно собранные библиотеки, используемые вашей внешней нативной сборкой CMake, с помощью jniLibs . Библиотеки могут находиться в каталоге src/main/jniLibs вашего модуля или, возможно, в другом каталоге, указанном в файле build.gradle :
sourceSets {
main {
// The libs directory contains prebuilt libraries that are used by the
// app's library defined in CMakeLists.txt via an IMPORTED target.
jniLibs.srcDirs = ['libs']
}
}sourceSets {
main {
// The libs directory contains prebuilt libraries that are used by the
// app's library defined in CMakeLists.txt via an IMPORTED target.
jniLibs.setSrcDirs(listOf("libs"))
}
}С плагином Android Gradle 4.0 указанная выше конфигурация больше не требуется и приведет к ошибке сборки:
* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> More than one file was found with OS independent path 'lib/x86/libprebuilt.so'Теперь внешняя нативная сборка автоматически упаковывает эти библиотеки, поэтому явная упаковка библиотеки с помощью jniLibs приводит к дублированию. Чтобы избежать ошибки сборки, переместите предварительно собранную библиотеку в место вне jniLibs или удалите конфигурацию jniLibs из файла build.gradle .
Известные проблемы
В этом разделе описаны известные проблемы, существующие в плагине Android Gradle версии 4.0.0.
Состояние гонки в механизме Gradle worker
Изменения в плагине Android Gradle 4.0 могут вызвать состояние гонки в Gradle при запуске с &endash;&endash;no&endash;daemon и версиями Gradle 6.3 или ниже, что приводит к зависанию сборки после её завершения.
Эта проблема будет исправлена в Gradle 6.4.