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

Минимальная версия Версия по умолчанию Примечания
Градл 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 и более поздних версий. Вы можете открыть окно Build Analyzer из Android Studio следующим образом:

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

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

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

Обеззараживание библиотеки Java 8 в D8 и R8

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

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

  • Вы хотите запустить 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 выполняет подписывание приложений версии 1.
  • Если v1SigningEnabled явно отключен пользователем, подписывание приложения версии 1 не выполняется.
  • Если пользователь явно не включил подпись v1, ее можно автоматически отключить на основе minSdk и targetSdk .

подпись v2

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

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

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

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

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

Примечание. Чтобы открыть проекты, использующие удаленные плагины, в 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

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

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