Плагин Android Gradle 4.0.0 (апрель 2020 г.)
Для этой версии плагина Android требуется следующее:
Gradle 6.1.1 . Чтобы узнать больше, прочитайте раздел об обновлении Gradle .
Инструменты сборки SDK 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
Окно Build Analyzer помогает вам понять и диагностировать проблемы с процессом сборки, такие как отключенные оптимизации и неправильно настроенные задачи. Эта функция доступна при использовании Android Studio 4.0 и выше с плагином Android Gradle 4.0.0
и выше. Вы можете открыть окно Build Analyzer из Android Studio следующим образом:
- Если вы еще этого не сделали, создайте свое приложение, выбрав «Сборка» > «Создать проект» в строке меню.
- В строке меню выберите Вид > Окна инструментов > Сборка .
- В окне «Сборка» откройте окно «Анализатор сборки» одним из следующих способов:
- После того, как Android Studio завершит сборку вашего проекта, перейдите на вкладку Build Analyzer .
- После того, как Android Studio завершит сборку вашего проекта, щелкните ссылку в правой части окна «Выходные данные сборки» .

Окно Build Analyzer организует возможные проблемы сборки в дереве слева. Вы можете просмотреть и щелкнуть каждую проблему, чтобы изучить ее подробности на панели справа. Когда Android Studio анализирует вашу сборку, она вычисляет набор задач, которые определили продолжительность сборки, и предоставляет визуализацию, чтобы помочь вам понять влияние каждой из этих задач. Вы также можете получить подробную информацию о предупреждениях, развернув узел Warnings .
Чтобы узнать больше, прочтите статью «Определение регрессий скорости сборки» .
Десахаризация библиотеки Java 8 в D8 и R8
Плагин Android Gradle теперь поддерживает использование ряда API языка Java 8 без требования минимального уровня API для вашего приложения.
Благодаря процессу, называемому desugaring , компилятор DEX, D8, в Android Studio 3.0 и выше уже обеспечил существенную поддержку функций языка Java 8 (таких как лямбда-выражения, методы интерфейса по умолчанию, try with ресурсы и многое другое). В Android Studio 4.0 механизм desugaring был расширен, чтобы иметь возможность desugaring API языка Java. Это означает, что теперь вы можете включать стандартные языковые API, которые были доступны только в последних выпусках Android (такие как java.util.streams
), в приложения, поддерживающие старые версии Android.
В этой версии поддерживается следующий набор API:
- Последовательные потоки (
java.util.stream
) - Подмножество
java.time
-
java.util.function
- Последние дополнения к
java.util.{Map,Collection,Comparator}
- Необязательные классы (
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 представляет новый способ управления тем, какие функции сборки вы хотите включить или отключить, например, View Binding и Data Binding. При добавлении новых функций они будут отключены по умолчанию. Затем вы можете использовать блок 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
, которая зависит от базового модуля, как показано на рисунке ниже.

Модуль функций :video
зависит от модуля :camera
, который зависит от базового модуля :app
.
Это означает, что когда ваше приложение запрашивает загрузку функционального модуля, приложение также загружает другие функциональные модули, от которых оно зависит. После создания функциональных модулей для вашего приложения вы можете объявить зависимость feature-on-feature в файле 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, поэтому, если ваша система сборки изменяет эту переменную, обязательно добавляйте ее, а не присваивайте ей.
Каждая зависимость предоставляет пакет config-file {: .external} для вашей сборки CMake, который вы импортируете с помощью команды find_package
{: .external}. Эта команда ищет пакеты config-file, которые соответствуют заданному имени пакета и версии, и предоставляет цели, которые она определяет для использования в вашей сборке. Например, если ваше приложение определяет 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 или app bundle. Для получения дополнительной информации обратитесь к образцу префаба curl {:.external}.
Изменения в поведении
При использовании этой версии плагина вы можете столкнуться со следующими изменениями в поведении.
обновления конфигурации подписи v1/v2
Поведение конфигураций подписи приложений в блоке signingConfig
изменилось на следующее:
v1 подписание
- Если
v1SigningEnabled
явно включен, AGP выполняет подпись приложения v1. - Если
v1SigningEnabled
явно отключен пользователем, подписание приложения v1 не выполняется. - Если пользователь явно не включил подпись v1, ее можно автоматически отключить на основе
minSdk
иtargetSdk
.
v2 подписание
- Если
v2SigningEnabled
явно включен, AGP выполняет подпись приложения v2. - Если
v2SigningEnabled
явно отключен пользователем, подписание приложения v2 не выполняется. - Если пользователь явно не включил подпись v2, ее можно автоматически отключить на основе
targetSdk
.
Эти изменения позволяют AGP оптимизировать сборки, отключая механизм подписи в зависимости от того, включил ли пользователь эти флаги явно. До этого релиза v1Signing
можно было отключить даже при явном включении, что могло сбивать с толку.
плагины Android Gradle для feature
и instantapp
удалены
Плагин Android Gradle 3.6.0 прекратил поддержку плагина Feature ( com.android.feature
) и плагина Instant App ( com.android.instantapp
) в пользу использования плагина Dynamic Feature ( com.android.dynamic-feature
) для создания и упаковки мгновенных приложений с помощью Android App Bundles .
В плагине Android Gradle 4.0.0 и выше эти устаревшие плагины полностью удалены. Поэтому, чтобы использовать последний плагин Android Gradle, вам необходимо перенести ваше мгновенное приложение для поддержки Android 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 Plugin 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
Изменения в плагине Android Gradle 4.0 могут вызвать состояние гонки в Gradle при работе с &endash;&endash;no&endash;daemon
и версиями Gradle 6.3 или ниже, что приводит к зависанию сборок после их завершения.
Эта проблема будет исправлена в Gradle 6.4.