Плагин Android Gradle 3.0.0 (октябрь 2017 г.)
Плагин Android Gradle 3.0.0 включает в себя множество изменений, направленных на решение проблем с производительностью крупных проектов.
Например, в примере скелетного проекта с примерно 130 модулями и большим количеством внешних зависимостей (но без кода и ресурсов) вы можете получить повышение производительности, подобное следующему:
Версия плагина Android + версия Gradle | Плагин Android 2.2.0 + Gradle 2.14.1 | Плагин Android 2.3.0 + Gradle 3.3 | Плагин Android 3.0.0 + Gradle 4.1 |
---|---|---|---|
Конфигурация (например, запуск ./gradlew --help ) | ~2 минуты | ~9 с | ~2,5 с |
Изменение Java в 1 строку (изменение реализации) | ~2 минуты 15 с | ~29 с | ~6,4 с |
Некоторые из этих изменений нарушают существующие сборки. Итак, вам следует рассмотреть
усилия по переносу вашего проекта перед использованием нового плагина.
Если вы не заметили описанного выше улучшения производительности, сообщите об ошибке и включите трассировку своей сборки с помощью Gradle Profiler .
Для этой версии плагина Android требуется следующее:
Минимальная версия | Версия по умолчанию | Примечания | |
---|---|---|---|
Градл | 4.1 | 4.1 | Чтобы узнать больше, см. обновление Gradle . |
Инструменты сборки SDK | 26.0.2 | 26.0.2 | Установите или настройте инструменты сборки SDK. С этим обновлением вам больше не нужно указывать версию для инструментов сборки — плагин по умолчанию использует минимально необходимую версию. Итак, теперь вы можете удалить свойство android.buildToolsVersion. |
3.0.1 (ноябрь 2017 г.)
Это небольшое обновление для поддержки Android Studio 3.0.1, включающее общие исправления ошибок и улучшения производительности.
Оптимизации
- Улучшенный параллелизм для многомодульных проектов за счет детального графа задач.
- Внося изменения в зависимость, Gradle выполняет более быстрые сборки, не переполняя модули, которые не имеют доступа к API этой зависимости. Вам следует ограничить, какие зависимости передают свои API другим модулям, используя новые конфигурации зависимостей Gradle :
implementation
,api
,compileOnly
иruntimeOnly
. - Более быстрая дополнительная скорость сборки благодаря индексированию каждого класса. Каждый класс теперь компилируется в отдельные файлы DEX, и повторно индексируются только измененные классы. Также следует ожидать повышения скорости сборки для приложений, для которых
minSdkVersion
установлено значение 20 или ниже и которые используют устаревший multi-dex . - Повышена скорость сборки за счет оптимизации некоторых задач для использования кэшированных выходных данных. Чтобы извлечь выгоду из этой оптимизации, вам нужно сначала включить кеш сборки Gradle .
- Улучшенная инкрементная обработка ресурсов с использованием AAPT2, которая теперь включена по умолчанию. Если у вас возникают проблемы при использовании AAPT2, сообщите об ошибке . Вы также можете отключить AAPT2, установив
android.enableAapt2=false
в файлеgradle.properties
и перезапустив демон Gradle, запустив./gradlew --stop
из командной строки.
Новые возможности
- Управление зависимостями с учетом вариантов . При сборке определенного варианта модуля плагин теперь автоматически сопоставляет варианты зависимостей модуля локальной библиотеки с вариантом создаваемого вами модуля.
- Включает новый плагин функционального модуля для поддержки Android Instant Apps и Android Instant Apps SDK (который можно загрузить с помощью менеджера SDK ). Чтобы узнать больше о создании функциональных модулей с помощью нового плагина, прочтите «Структура мгновенного приложения с несколькими функциями» .
- Встроенная поддержка использования определенных функций языка Java 8 и библиотек Java 8. Jack теперь устарел и больше не требуется , и вам следует сначала отключить Jack, чтобы использовать улучшенную поддержку Java 8, встроенную в набор инструментов по умолчанию. Дополнительные сведения см. в статье Использование функций языка Java 8 .
Добавлена поддержка запуска тестов с помощью Android Test Orchestrator , который позволяет запускать каждый тест вашего приложения в рамках отдельного вызова Instrumentation. Поскольку каждый тест выполняется в своем собственном экземпляре инструментария, любое общее состояние между тестами не накапливается в процессоре или памяти вашего устройства. И даже если один тест выйдет из строя, он уничтожит только свой собственный экземпляр инструментария, поэтому остальные тесты продолжат работать.
- Добавлен
testOptions.execution
, чтобы определить, следует ли использовать оркестрацию тестов на устройстве. Если вы хотите использовать Android Test Orchestrator , вам необходимо указатьANDROID_TEST_ORCHESTRATOR
, как показано ниже. По умолчанию это свойство установлено наHOST
, который отключает оркестровку на грани и является стандартным методом выполнения тестов.
классный
android { testOptions { execution 'ANDROID_TEST_ORCHESTRATOR' } }
Котлин
android { testOptions { execution = "ANDROID_TEST_ORCHESTRATOR" } }
- Добавлен
Новая конфигурация зависимостей
androidTestUtil
позволяет вам установить еще один вспомогательный APK-файл для тестирования перед запуском инструментальных тестов, например Android Test Orchestrator:классный
dependencies { androidTestUtil 'com.android.support.test:orchestrator:1.0.0' ... }
Котлин
dependencies { androidTestUtil("com.android.support.test:orchestrator:1.0.0") ... }
Добавлен
testOptions.unitTests.includeAndroidResources
для поддержки модульных тестов, требующих ресурсов Android, таких как Roboelectric . Когда вы устанавливаете это свойство вtrue
, плагин выполняет ресурс, активы и манифест слияния перед проходом ваших модульных тестов. Затем ваши тесты смогут проверятьcom/android/tools/test_config.properties
в пути к классам на наличие следующих ключей:android_merged_assets
: абсолютный путь к каталогу объединенных ресурсов.Примечание. Для модулей библиотеки объединенные ресурсы не содержат ресурсы зависимостей (см. проблему №65550419 ).
android_merged_manifest
: абсолютный путь к объединенному файлу манифеста.android_merged_resources
: абсолютный путь к каталогу объединенных ресурсов, который содержит все ресурсы модуля и все его зависимости.android_custom_package
: the package name of the final R class. Если вы динамически изменяете идентификатор приложения, это имя пакета может не совпадать с атрибутомpackage
в манифесте приложения.
- Поддержка шрифтов в качестве ресурсов (это новая функция, представленная в Android 8.0 (уровень API 26) ).
- Поддержка языковых APK-файлов с помощью Android Instant Apps SDK 1.1 и более поздних версий.
Теперь вы можете изменить выходной каталог для вашего внешнего собственного проекта сборки, как показано ниже:
классный
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory "./outputs/cmake" } } }
Котлин
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory = "./outputs/cmake" } } }
- Теперь вы можете использовать CMake 3.7 или более поздней версии при создании собственных проектов из Android Studio.
Новая конфигурация зависимостей
lintChecks
позволяет создавать JAR-файлы, определяющие собственные правила проверки, и упаковывать их в проекты AAR и APK.Ваши пользовательские правила проверки должны принадлежать отдельному проекту, который выводит один JAR-файл и включает только зависимости
compileOnly
. Другие модули приложений и библиотек могут зависеть от вашего проекта lint, используя конфигурациюlintChecks
:классный
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks project(':lint-checks') }
Котлин
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks(project(":lint-checks")) }
Изменения в поведении
- Плагин Android 3.0.0 удаляет некоторые API, и ваша сборка сломается, если вы их используете. Например, вы больше не можете использовать Variants API для доступа к объектам
outputFile()
или использоватьprocessManifest.manifestOutputFileprocessManifest.manifestOutputFile()
для получения файла манифеста для каждого варианта. Чтобы узнать больше, прочтите изменения API . - Вам больше не нужно указывать версию для инструментов сборки (поэтому теперь вы можете удалить свойство
android.buildToolsVersion
). По умолчанию плагин автоматически использует минимально необходимую версию инструментов сборки для используемой вами версии плагина Android. - Теперь вы включаете/отключаете сжатие PNG в блоке
buildTypes
, как показано ниже. Обработка PNG включена по умолчанию для всех сборок, кроме отладочных, поскольку она увеличивает время сборки для проектов, включающих много файлов PNG. Таким образом, чтобы сократить время сборки для других типов сборки, вам следует либо отключить сжатие PNG, либо преобразовать изображения в WebP .классный
android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } }
Котлин
android { buildTypes { release { // Disables PNG crunching for the release build type. isCrunchPngs = false } } }
- Плагин Android теперь автоматически создает исполняемые объекты, которые вы настраиваете во внешних проектах CMake.
- Теперь вам необходимо добавить процессоры аннотаций в путь к классам процессоров, используя конфигурацию зависимостей
annotationProcessor
. - Использование устаревшего
ndkCompile
теперь более ограничено. Вместо этого вам следует перейти на использование CMake или ndk-build для компиляции собственного кода, который вы хотите упаковать в свой APK. Чтобы узнать больше, прочтите «Миграция с ndkcompile» .