Плагин 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…