Android Gradle Plugin 4.0.0 (апрель 2020 г.)

Для этой версии плагина для Android требуется следующее:

4.0.1 (июль 2020 г.)

Это небольшое обновление поддерживает совместимость с новыми настройками по умолчанию и функциями видимости пакетов в Android 11 .

В предыдущих версиях Android можно было просматривать список всех приложений, установленных на устройстве. Начиная с Android 11 (API уровня 30), приложения по умолчанию имеют доступ только к отфильтрованному списку установленных пакетов. Чтобы увидеть более широкий список приложений в системе, теперь необходимо добавить элемент <queries> в манифест Android вашего приложения или библиотеки.

Плагин Gradle для Android версии 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 следующим образом:

  1. Если вы еще этого не сделали, создайте свое приложение, выбрав в меню «Сборка » > «Создать проект» .
  2. В строке меню выберите Вид > Окна инструментов > Сборка .
  3. В окне «Сборка» откройте окно «Анализатор сборки» одним из следующих способов:
    • После того как Android Studio завершит сборку вашего проекта, перейдите на вкладку Build Analyzer .
    • После того как Android Studio завершит сборку вашего проекта, щелкните ссылку в правой части окна «Выходные данные сборки» .

В окне Build Analyzer возможные проблемы сборки представлены в виде дерева слева. Вы можете просмотреть каждую проблему и нажать на неё, чтобы изучить её подробности на панели справа. Когда Android Studio анализирует вашу сборку, она вычисляет набор задач, определивших продолжительность сборки, и предоставляет визуализацию, помогающую оценить влияние каждой из этих задач. Вы также можете получить подробную информацию о предупреждениях, развернув узел «Предупреждения» .

Чтобы узнать больше, прочтите статью Определение регрессий скорости сборки .

Десахаризация библиотеки Java 8 в D8 и R8

Плагин Android Gradle теперь поддерживает использование ряда API языка Java 8 без требования минимального уровня API для вашего приложения.

Благодаря процессу, называемому «дешугаринг» , компилятор DEX D8 в Android Studio 3.0 и более поздних версиях уже обеспечивал существенную поддержку функций языка Java 8 (таких как лямбда-выражения, методы интерфейса по умолчанию, try with ресурсы и многое другое). В 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}
  • Необязательные классы ( 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 , которая, в свою очередь, зависит от базового модуля, как показано на рисунке ниже.

Зависимости функций от функций

Модуль функций :video зависит от модуля :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 следующее:

  1. Для CMake:

    add_library(app SHARED app.cpp)

    # Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

  2. Для 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, поэтому, если ваша система сборки изменяет эту переменную, обязательно добавляйте её, а не присваивайте.

Каждая зависимость предоставляет пакет конфигурационных файлов {: .external} для вашей сборки CMake, который вы импортируете с помощью команды 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 выполняет подписывание приложения 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 . Миграция приложений с мгновенным запуском позволит вам воспользоваться преимуществами пакетов приложений 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 Worker

Изменения в плагине Android Gradle 4.0 могут вызвать состояние гонки в Gradle при работе с &endash;&endash;no&endash;daemon и версиями Gradle 6.3 или ниже, что приводит к зависанию сборок после их завершения.

Эта проблема будет исправлена в Gradle 6.4.