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

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

Минимальная версия Версия по умолчанию Примечания
Градл 6.5 Н/Д Более подробную информацию см. в разделе Обновление Gradle .
Инструменты сборки SDK 29.0.2 29.0.2 Установите или настройте инструменты сборки SDK.
НДК Н/Д 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 buildscript, DSL и API плагина Android Gradle 4.1 теперь определены в наборе интерфейсов Kotlin отдельно от их классов реализации. Это означает, что:

  • Теперь для типов Kotlin явно объявлены допустимость значений NULL и изменчивость.
  • Документация, созданная на основе этих интерфейсов, опубликована в Справочнике API Kotlin .
  • Поверхность 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 теперь можно экспортировать библиотеки из внешней нативной сборки в AAR для проекта библиотеки Android.

Чтобы экспортировать собственные библиотеки, добавьте следующее в блок 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 из вашей внешней собственной сборки ndk-build или CMake будут упакованы в AAR-файл, созданный вашей сборкой, и каждая из них экспортирует заголовки из указанного каталога в свои зависимые файлы.

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

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

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

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

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

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

Для получения дополнительной информации см. статью Сжатие библиотек и приложений Kotlin с помощью отражения Kotlin с помощью R8 {:.external} на Medium.

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

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

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

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

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

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

Плагин Gradle io.fabric устарел

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