Плагин 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, 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 Library.

Чтобы экспортировать собственные библиотеки, добавьте следующее в блок 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 . Подробнее об этом флаге см. в статье Java 8+ API desugaring support (Android Gradle Plugin 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 устарел

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