Плагин Android Gradle 4.1.0 (август 2020 г.)

Совместимость

Минимальная версия Версия по умолчанию Примечания
Gradle 6.5 Н/Д Подробнее об обновлении Gradle…
SDK Build Tools; 29.0.2 29.0.2 Установите или настройте SDK Build Tools.
NDK Н/Д 21.1.6352462 Установите или настройте другую версию NDK.

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

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

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

Поддержка Kotlin Script DSL

Чтобы упростить работу со скриптами сборки Kotlin, DSL и API плагина Android Gradle 4.1 теперь определены в наборе интерфейсов Kotlin отдельно от классов реализации. Вот что это значит:

  • Допустимость значения NULL и изменяемость теперь явно объявляются в типах Kotlin.
  • Документация, созданная на основе этих интерфейсов, опубликована в справочнике по Kotlin API.
  • Поверхность API плагина Android Gradle четко определена, чтобы в будущем расширение сборок Android было менее хрупким.

Важно! Если вы уже используете скрипты сборки KTS или Kotlin в buildSrc, это может привести к нарушению совместимости исходного кода для определенных ошибок, которые в предыдущих выпусках проявлялись как ошибки времени выполнения.

Типы коллекций, предназначенные для изменения в DSL, теперь единообразно определяются как:

val collection: MutableCollectionType

Это означает, что в скриптах Kotlin больше нельзя писать следующее для некоторых коллекций, которые ранее это поддерживали:

collection = collectionTypeOf(...)

Однако изменение коллекции поддерживается единообразно, поэтому collection += … и collection.add(...) теперь должны работать везде.

Если при обновлении проекта, в котором используются API Kotlin и DSL плагина Android Gradle, вы обнаружите проблемы, сообщите об ошибке.

Экспорт зависимостей C/C++ из AAR

В плагине Android Gradle 4.0 добавлена возможность импортировать пакеты Prefab в зависимости AAR. В AGP 4.1 теперь можно экспортировать библиотеки из внешней сборки C/C++ в AAR для проекта библиотеки Android.

Чтобы экспортировать библиотеки C/C++, добавьте в блок android файла build.gradle проекта библиотеки следующий код:

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

В этом примере библиотеки mylibrary и myotherlibrary из внешней сборки C/C++ ndk-build или CMake будут упакованы в AAR, созданный вашей сборкой, и каждая из них экспортирует заголовки из указанного каталога в свои зависимые элементы.

Примечание. Для пользователей плагина Android Gradle версии 4.0 и выше настройки конфигурации для импорта предварительно созданных библиотек C/C++ изменились. Дополнительную информацию вы найдете в примечаниях к выпуску 4.0.

Поддержка метаданных Kotlin в R8

Kotlin использует специальные метаданные в файлах классов Java для идентификации языковых конструкций Kotlin. Теперь R8 поддерживает сохранение и перезапись метаданных Kotlin, чтобы полностью поддерживать сжатие библиотек и приложений Kotlin с помощью kotlin-reflect.

Чтобы сохранить метаданные Kotlin, добавьте следующие правила:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

Это укажет R8, что нужно сохранить метаданные Kotlin для всех классов, которые сохраняются напрямую.

Дополнительную информацию можно найти в статье Shrinking Kotlin libraries and applications using Kotlin reflection with R8 (Уменьшение размера библиотек и приложений Kotlin с помощью рефлексии Kotlin и R8){:.external} на сайте Medium.

Утверждения в отладочных сборках

Когда вы создаете отладочную версию приложения с помощью плагина Android Gradle 4.1.0 или более поздней версии, встроенный компилятор (D8) переписывает код приложения, чтобы включить утверждения во время компиляции. Таким образом, проверки утверждений всегда активны.

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

Удален кеш сборки плагина Android Gradle

Кеш сборки AGP был удален в AGP 4.1. Кеш сборки AGP, который был представлен в AGP 2.3 в качестве дополнения к кешу сборки Gradle, в AGP 4.1 был полностью заменен кешем сборки Gradle. Это изменение не влияет на время сборки.

Задача cleanBuildCache и свойства android.enableBuildCache и android.buildCacheDir больше не поддерживаются и будут удалены в AGP 7.0. Свойство android.enableBuildCache не будет работать, а свойство android.buildCacheDir и задача cleanBuildCache будут функционировать до выхода AGP 7.0, чтобы удалять существующее содержимое кеша сборки AGP.

Размер приложений, в которых используется сокращение кода, значительно уменьшился.

Начиная с этого выпуска поля из классов R больше не сохраняются по умолчанию, что может привести к значительному уменьшению размера APK для приложений, в которых включено сокращение кода. Это не должно привести к изменению поведения, если только вы не обращаетесь к классам R с помощью рефлексии. В этом случае необходимо добавить правила сохранения для этих классов R.

Свойство android.namespacedRClass переименовано в android.nonTransitiveRClass.

Экспериментальный параметр android.namespacedRClass переименован в android.nonTransitiveRClass.

Этот флаг, заданный в файле gradle.properties, включает пространство имен для каждого класса R библиотеки, чтобы он содержал только ресурсы, объявленные в самой библиотеке, и не содержал ресурсы из зависимостей библиотеки. Это позволяет уменьшить размер класса R для этой библиотеки.

Kotlin DSL: coreLibraryDesugaringEnabled переименован

Параметр компиляции Kotlin DSL coreLibraryDesugaringEnabled изменен на isCoreLibraryDesugaringEnabled. Дополнительную информацию об этом флаге можно найти в статье Поддержка десахаризации API Java 8+ (плагин Android Gradle 4.0.0+).

Свойства версий удалены из класса BuildConfig в проектах библиотек

Только для проектов библиотек: свойства BuildConfig.VERSION_NAME и BuildConfig.VERSION_CODE удалены из сгенерированного класса BuildConfig, поскольку эти статические значения не отражали окончательные значения кода и названия версии приложения и поэтому вводили в заблуждение. Кроме того, эти значения были отброшены при объединении манифестов.

В будущей версии плагина Android Gradle свойства versionName и versionCode также будут удалены из DSL для библиотек. Автоматически получить код или название версии приложения из подпроекта библиотеки невозможно.

Для модулей приложений ничего не изменилось. Вы по-прежнему можете присваивать значения versionCode и versionName в DSL. Эти значения будут передаваться в манифест приложения и поля BuildConfig.

Укажите путь к NDK

Вы можете указать путь к локальной установке NDK, используя свойство android.ndkPath в файле build.gradle модуля.


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

Если вы используете это свойство вместе со свойством android.ndkVersion, то путь должен содержать версию NDK, которая соответствует android.ndkVersion.

Изменения в поведении модульного тестирования библиотек

Мы изменили способ компиляции и запуска модульных тестов библиотек. Модульные тесты библиотеки теперь компилируются и выполняются для классов компиляции и среды выполнения самой библиотеки. В результате модульное тестирование использует библиотеку так же, как и внешние подпроекты. Такая конфигурация обычно позволяет повысить качество тестирования.

В некоторых случаях модульные тесты библиотек, использующие привязку данных, могут не находить классы DataBindingComponent или BR. Такие тесты необходимо перенести в инструментальный тест в проекте androidTest, поскольку компиляция и запуск этих классов в модульном тестировании могут привести к неверным результатам.

Поддержка плагина io.fabric Gradle прекращена

Плагин io.fabric Gradle устарел и несовместим с версией 4.1 плагина Android Gradle. Дополнительную информацию об устаревшем Fabric SDK и переходе на Firebase Crashlytics SDK можно найти в статье Переход на Firebase Crashlytics SDK.