Плагин Android Gradle 4.0.0 (апрель 2020 г.)

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

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, обновите ее до одной из следующих версий:

Минимальная версия Версия по умолчанию Примечания
Gradle 6.1.1 6.1.1 Подробнее о том, как обновить Gradle…
Инструменты сборки SDK 29.0.2 29.0.2 Установите или настройте инструменты сборки SDK.

Подробнее о видимости пакетов в Android 11…

Новые функции

В этой версии плагина Android Gradle добавлены следующие новые функции:

Поддержка Android Studio Build Analyzer

Окно Build Analyzer помогает понять и диагностировать проблемы с процессом сборки, например отключенные оптимизации и неправильно настроенные задачи. Эта функция доступна в Android Studio 4.0 и более поздних версий с плагином Android Gradle 4.0.0 и более поздних версий. Чтобы открыть окно Анализатор сборки в Android Studio, выполните следующие действия:

  1. Если вы ещё не создали приложение, выберите Build > Make Project (Сборка > Создать проект) в строке меню.
  2. В строке меню выберите View > Tool Windows > Build (Вид > Окна инструментов > Сборка).
  3. В окне Сборка откройте окно Анализатор сборки одним из следующих способов:
    • Когда Android Studio завершит сборку проекта, нажмите на вкладку Анализатор сборки.
    • Когда Android Studio завершит сборку проекта, нажмите на ссылку в правой части окна Build Output (Выходные данные сборки).

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

Подробнее о том, как выявлять регрессии скорости сборки…

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

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

Компилятор DEX D8 в Android Studio 3.0 и более поздних версий уже обеспечивал значительную поддержку функций языка Java 8 (таких как лямбда-выражения, методы интерфейса по умолчанию, оператор try с ресурсами и т. д.) с помощью процесса десахаризации. В Android Studio 4.0 механизм десахаризации был расширен, чтобы он мог десахаризировать API языка Java. Это означает, что теперь вы можете добавлять в приложения, поддерживающие более ранние версии Android, стандартные языковые API, которые были доступны только в последних версиях Android (например, java.util.streams).

В этом выпуске поддерживаются следующие 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 распознавать допустимое использование 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 необходимо включить функцию зависимости функций (чтобы поддерживать функцию при редактировании конфигурации запуска, например). Для этого нажмите Help > Edit Custom VM Options (Справка > Изменить специальные параметры виртуальной машины) в строке меню и добавьте следующее:

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

Каждая зависимость предоставляет пакет 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)

Теперь в app.cpp можно указать #include "curl/curl.h". Когда вы создаете проект, внешняя система сборки автоматически связывает libapp.so с libcurl.so и упаковывает libcurl.so в APK или набор App Bundle. Дополнительную информацию можно найти в образце curl prefab{:.external}.

Изменения в поведении

При использовании этой версии плагина могут наблюдаться следующие изменения в поведении:

Изменения конфигурации подписи v1/v2

Поведение конфигураций подписи приложений в блоке signingConfig изменилось следующим образом:

Подпись версии 1

  • Если v1SigningEnabled включен, AGP выполняет подписание приложений версии 1.
  • Если пользователь явно отключил v1SigningEnabled, подпись приложения версии 1 не выполняется.
  • Если пользователь не включил подпись версии 1, она может быть автоматически отключена на основе minSdk и targetSdk.

Подпись версии 2

  • Если v2SigningEnabled включен явным образом, AGP выполняет подписание приложений версии 2.
  • Если пользователь явно отключил параметр v2SigningEnabled, подпись приложения версии 2 не выполняется.
  • Если пользователь не включил подпись версии 2, она может быть автоматически отключена на основе targetSdk.

Эти изменения позволяют AGP оптимизировать сборки, отключая механизм подписи в зависимости от того, включил ли пользователь эти флаги. До этого выпуска v1Signing можно было отключить, даже если он был явно включен, что могло вызывать путаницу.

Удалены плагины Android Gradle feature и instantapp

В версии 3.6.0 плагина Android Gradle плагины Feature (com.android.feature) и Instant App (com.android.instantapp) были объявлены устаревшими. Вместо них для сборки и упаковки приложений с мгновенным запуском с помощью наборов Android App Bundle рекомендуется использовать плагин Dynamic Feature (com.android.dynamic-feature).

В плагине Android Gradle версии 4.0.0 и более поздних эти устаревшие плагины полностью удалены. Чтобы использовать последнюю версию плагина Android Gradle, вам нужно перенести приложение с мгновенным запуском на наборы Android App Bundle. Перенос приложений с мгновенным запуском позволит вам воспользоваться преимуществами наборов App Bundle и упростить модульную структуру приложения.

Примечание. Чтобы открыть в Android Studio 4.0 и более поздних версий проекты, в которых используются удаленные плагины, в проекте должен быть плагин Android Gradle версии 3.6.0 или более ранней.

Удалена функция отдельной обработки аннотаций

Возможность разделять обработку аннотаций на отдельные задачи удалена. Этот параметр использовался для поддержки инкрементной компиляции Java, когда в проектах, написанных только на Java, применялись неинкрементные процессоры аннотаций. Он включался путем установки значения true для параметра android.enableSeparateAnnotationProcessing в файле gradle.properties, но теперь это не работает.

Вместо этого перейдите на использование процессоров добавочных аннотаций, чтобы повысить эффективность сборки.

includeCompileClasspath больше не поддерживается

Плагин Android Gradle больше не проверяет и не включает процессоры аннотаций, которые вы объявляете в пути компиляции, а свойство annotationProcessorOptions.includeCompileClasspath DSL больше не имеет никакого эффекта. Если вы добавите процессоры аннотаций в путь к классам компиляции, может появиться следующая ошибка:

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

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

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