Плагин 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 Build Tools. С этим обновлением вам больше не нужно указывать версию для инструментов сборки — плагин по умолчанию использует минимально необходимую версию. Поэтому теперь вы можете удалить свойство 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
из командной строки.
Новые возможности
- Управление зависимостями с учетом вариантов . При сборке определенного варианта модуля плагин теперь автоматически сопоставляет варианты зависимостей модуля локальной библиотеки с вариантом собираемого вами модуля.
- Включает новый плагин Feature module для поддержки Android Instant Apps и Android Instant Apps SDK (который можно загрузить с помощью SDK manager ). Чтобы узнать больше о создании Feature modules с новым плагином, прочитайте Structure of an instant app with multiple features .
- Встроенная поддержка использования определенных языковых функций Java 8 и библиотек Java 8. Jack теперь устарел и больше не требуется , и вам следует сначала отключить Jack, чтобы использовать улучшенную поддержку Java 8, встроенную в цепочку инструментов по умолчанию. Для получения дополнительной информации прочтите раздел Использование языковых функций Java 8 .
Добавлена поддержка запуска тестов с помощью Android Test Orchestrator , что позволяет вам запускать каждый из тестов вашего приложения в его собственном вызове Instrumentation. Поскольку каждый тест выполняется в своем собственном экземпляре Instrumentation, любое общее состояние между тестами не накапливается в процессоре или памяти вашего устройства. И даже если один тест дает сбой, он останавливает только свой собственный экземпляр 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
в classpath на наличие следующих ключей:android_merged_assets
: абсолютный путь к каталогу объединенных активов.Примечание: для библиотечных модулей объединенные активы не содержат активы зависимостей (см. проблему № 65550419 ).
android_merged_manifest
: абсолютный путь к объединенному файлу манифеста.android_merged_resources
: абсолютный путь к каталогу объединенных ресурсов, который содержит все ресурсы из модуля и все его зависимости.android_custom_package
: имя пакета конечного класса R. Если вы динамически изменяете идентификатор приложения, это имя пакета может не совпадать с атрибутом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-файл, определяющий пользовательские правила lint, и упаковывать его в ваши проекты AAR и APK.Ваши пользовательские правила lint должны принадлежать отдельному проекту, который выводит один 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, и ваша сборка сломается, если вы их используете. Например, вы больше не можете использовать API Variants для доступа к объектам
outputFile()
или использоватьprocessManifest.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. Чтобы узнать больше, прочитайте Migrate from ndkcompile .