Плагин 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 требуется следующее:

  • Gradle 4.1 или выше. Чтобы узнать больше, прочитайте раздел об обновлении Gradle .
  • Инструменты сборки 26.0.2 или выше. С этим обновлением вам больше не нужно указывать версию для инструментов сборки — плагин по умолчанию использует минимально необходимую версию. Итак, теперь вы можете удалить свойство 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 : имя пакета окончательного класса 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 . Другие модули приложений и библиотек могут зависеть от вашего проекта 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.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» .