Плагин 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 или ниже и используется устаревшая мультидексировка .
  • Ускорение сборки за счёт оптимизации некоторых задач для использования кэшированных выходных данных. Чтобы воспользоваться этой оптимизацией, необходимо сначала включить кэширование сборки Gradle .
  • Улучшена инкрементальная обработка ресурсов с помощью AAPT2, которая теперь включена по умолчанию. Если у вас возникли проблемы при использовании AAPT2, сообщите об ошибке . Вы также можете отключить AAPT2, установив android.enableAapt2=false в файле gradle.properties и перезапустив демон Gradle, выполнив команду ./gradlew --stop из командной строки.

Новые функции

  • Управление зависимостями с учётом вариантов . При сборке определённого варианта модуля плагин теперь автоматически сопоставляет варианты зависимостей модуля локальной библиотеки с вариантом собираемого модуля.
  • Включает новый плагин Feature Module для поддержки Android Instant Apps и Android Instant Apps SDK (который можно загрузить с помощью менеджера SDK ). Чтобы узнать больше о создании Feature Module с помощью нового плагина, ознакомьтесь со статьей «Структура мгновенного приложения с несколькими функциями» .
  • Встроенная поддержка использования некоторых языковых функций Java 8 и библиотек Java 8. Jack устарел и больше не требуется . Чтобы использовать улучшенную поддержку Java 8, встроенную в стандартный набор инструментов, сначала отключите Jack. Подробнее см. в статье «Использование языковых функций 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.

    Ваши пользовательские правила линтинга должны принадлежать отдельному проекту, создающему один JAR-файл и включающему только зависимости compileOnly . Другие модули приложений и библиотек могут затем зависеть от вашего проекта линтинга с помощью конфигурации 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. Подробнее см. в статье «Миграция с ndkcompile» .