Плагин 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 (изменение реализации) | ~2 мин. 15 с | ~29 с | ~6,4 с |
Некоторые из этих изменений нарушают существующие сборки. Поэтому перед использованием нового плагина следует оценить
трудоемкость переноса проекта.
Если вы не заметили описанных выше улучшений производительности, сообщите об ошибке и приложите трассировку сборки с помощью профилировщика Gradle.
Для работы этой версии плагина Android требуются:
| Минимальная версия | Версия по умолчанию | Примечания | |
|---|---|---|---|
| Gradle | 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 или меньше и используется старая версия MultiDex, выполняется быстрее. - Увеличена скорость сборки за счет оптимизации некоторых задач для использования кешированных выходных данных. Чтобы воспользоваться этой оптимизацией, сначала включите кеш сборки Gradle.
- Улучшена обработка дополнительных ресурсов с помощью AAPT2, который теперь включен по умолчанию. Если у вас возникли проблемы при использовании AAPT2, сообщите об ошибке. Вы также можете отключить AAPT2, задав значение
android.enableAapt2=falseв файлеgradle.propertiesи перезапустив демон Gradle с помощью команды./gradlew --stopв командной строке.
Новые функции
- Управление зависимостями с учетом вариантов. При сборке определенного варианта модуля плагин теперь автоматически сопоставляет варианты зависимостей локального модуля библиотеки с вариантом собираемого модуля.
- Включает новый плагин модуля функций для поддержки Приложений для Android с мгновенным запуском и Android Instant Apps SDK (его можно скачать с помощью SDK Manager). Чтобы узнать больше о создании модулей функций с помощью нового плагина, прочитайте статью Структура мгновенного приложения с несколькими функциями.
- Встроенная поддержка некоторых языковых функций Java 8 и библиотек Java 8. Jack устарел и больше не требуется. Чтобы использовать улучшенную поддержку Java 8, встроенную в цепочку инструментов по умолчанию, сначала отключите Jack. Подробнее о том, как использовать функции языка Java 8…
-
Добавлена поддержка тестирования с помощью Android Test Orchestrator, который позволяет запускать каждый тест приложения в отдельном вызове Instrumentation. Поскольку каждый тест выполняется в собственном экземпляре Instrumentation, общее состояние между тестами не накапливается в ЦП или памяти устройства. Даже если один тест завершится с ошибкой, это повлияет только на его экземпляр Instrumentation, поэтому остальные тесты будут выполняться.
- Добавлен параметр
testOptions.execution, определяющий, следует ли использовать оркестрацию тестирования на устройстве. Если вы хотите использовать Инструмент оркестрации тестов Android, вам нужно указатьANDROID_TEST_ORCHESTRATOR, как показано ниже. По умолчанию для этого свойства задано значениеHOST, которое отключает оркестрацию на устройстве и является стандартным методом запуска тестов.
Яркий
android { testOptions { execution 'ANDROID_TEST_ORCHESTRATOR' } }
Kotlin
android { testOptions { execution = "ANDROID_TEST_ORCHESTRATOR" } }
- Добавлен параметр
-
Новая конфигурация зависимостей
androidTestUtilпозволяет установить APK-файл вспомогательного приложения перед запуском инструментальных тестов, например Инструмент оркестрации тестов Android:Яркий
dependencies { androidTestUtil 'com.android.support.test:orchestrator:1.0.0' ... }
Kotlin
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– название пакета конечного класса 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 C/C++ // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory "./outputs/cmake" } } }
Kotlin
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external C/C++ // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory = "./outputs/cmake" } } }
- Теперь при создании нативных проектов в Android Studio можно использовать CMake 3.7 или более поздней версии.
-
Новая конфигурация зависимостей
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') }
Kotlin
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.manifestOutputFile(), чтобы получить файл манифеста для каждого варианта. Подробнее об изменениях в API… - Вам больше не нужно указывать версию для инструментов сборки (поэтому вы можете удалить свойство
android.buildToolsVersion). По умолчанию плагин автоматически использует минимальную требуемую версию инструментов сборки для версии плагина Android, которую вы используете. - Теперь вы можете включить или отключить сжатие PNG в блоке
buildTypes, как показано ниже. Сжатие PNG-файлов по умолчанию включено для всех сборок, кроме отладочных, поскольку оно увеличивает время сборки проектов, содержащих много PNG-файлов. Чтобы ускорить сборку других типов, отключите сжатие PNG или конвертируйте изображения в формат WebP.Яркий
android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } }
Kotlin
android { buildTypes { release { // Disables PNG crunching for the release build type. isCrunchPngs = false } } }
- Теперь плагин Android автоматически создает исполняемые цели, которые вы настраиваете во внешних проектах CMake.
- Теперь вам нужно добавить процессоры аннотаций в classpath процессора, используя конфигурацию зависимости
annotationProcessor. - Использование устаревшего атрибута "
ndkCompile" теперь более ограничено. Вместо этого используйте CMake или ndk-build для компиляции нативного кода, который вы хотите добавить в APK. Подробнее о том, как перейти с ndkcompile…