Плагин Android Gradle 3.6.0 (февраль 2020 г.)

Для работы этой версии плагина Android требуются:

Минимальная версия Версия по умолчанию Примечания
Gradle 5.6.4 5.6.4 Подробнее о том, как обновить Gradle…
Инструменты сборки SDK 28.0.3 28.0.3 Установите или настройте инструменты сборки SDK.

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

В этой версии плагина Android Gradle добавлены следующие новые функции.

View Binding

Привязка представлений обеспечивает безопасность во время компиляции при обращении к представлениям в коде. Теперь вы можете заменить findViewById() на автоматически созданную ссылку на класс привязки. Чтобы начать использовать привязку представлений, добавьте в файл build.gradle каждого модуля следующее:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Подробнее о привязке представлений…

Поддержка плагина Maven Publish

Плагин Android Gradle поддерживает плагин Gradle для публикации в Maven, который позволяет публиковать артефакты сборки в репозитории Apache Maven. Плагин Android Gradle создает компонент для каждого артефакта варианта сборки в вашем приложении или модуле библиотеки, который можно использовать для настройки публикации в репозиторий Maven.

Подробнее о том, как использовать плагин Maven Publish…

Новый инструмент упаковки по умолчанию

При создании отладочной версии приложения плагин использует новый инструмент упаковки zipflinger для сборки APK. Этот новый инструмент должен повысить скорость сборки. Если новый инструмент упаковки работает не так, как вы ожидаете, сообщите об ошибке. Чтобы вернуться к старому инструменту упаковки, добавьте в файл gradle.properties следующий код:

        android.useNewApkCreator=false
      

Атрибуция нативных сборок

Теперь вы можете определить, сколько времени требуется Clang, чтобы создать и связать каждый файл C/C++ в вашем проекте. Gradle может создать трассировку Chrome, содержащую временные метки для этих событий компилятора, чтобы вы могли лучше понять, сколько времени требуется для сборки проекта. Чтобы создать файл атрибуции сборки, выполните следующие действия:

  1. Добавьте флаг -Pandroid.enableProfileJson=true при запуске сборки Gradle. Пример:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Откройте браузер Chrome и введите chrome://tracing в строке поиска.

  3. Нажмите кнопку Загрузить и перейдите в папку <var>project-root</var>/build/android-profile , чтобы найти файл. Файл называется profile-<var>timestamp</var>.json.gz.

Данные атрибуции нативной сборки можно найти в верхней части окна просмотра:

Трассировка атрибуции встроенной версии в Chrome

Изменения в поведении

При использовании этой версии плагина могут наблюдаться следующие изменения в работе.

Нативные библиотеки по умолчанию упаковываются без сжатия

При создании приложения плагин теперь по умолчанию устанавливает для параметра extractNativeLibs значение "false". То есть нативные библиотеки выровнены по страницам и упакованы без сжатия. Это увеличивает размер загружаемого файла, но дает пользователям следующие преимущества:

  • Уменьшение размера приложения, поскольку платформа может получить доступ к нативным библиотекам непосредственно из установленного APK-файла, не создавая копию библиотек.
  • Меньший размер скачиваемого файла, поскольку при добавлении в APK-файл или набор Android App Bundle несжатых нативных библиотек сжатие в Google Play обычно выполняется лучше.

Если вы хотите, чтобы плагин Android Gradle упаковывал сжатые нативные библиотеки, добавьте в манифест приложения следующий код:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Примечание. Атрибут манифеста extractNativeLibs заменен на вариант DSL useLegacyPackaging. Подробнее о языке описания спецификаций для упаковки сжатых нативных библиотек…

Версия NDK по умолчанию

Если вы скачали несколько версий NDK, плагин Android Gradle теперь выбирает версию по умолчанию для компиляции файлов исходного кода. Раньше плагин выбирал последнюю скачанную версию NDK. Чтобы переопределить значение по умолчанию, выбранное плагином, используйте свойство android.ndkVersion в файле build.gradle модуля.

Упрощенная генерация класса R

Плагин Android Gradle упрощает путь к классам компиляции, создавая только один класс R для каждого модуля библиотеки в вашем проекте и предоставляя доступ к этим классам R другим зависимостям модуля. Эта оптимизация должна ускорить сборку, но при этом необходимо учитывать следующее:

  • Поскольку компилятор предоставляет доступ к классам R зависимостям вышестоящих модулей, важно, чтобы каждый модуль в вашем проекте использовал уникальное название пакета.
  • Видимость класса R библиотеки для других зависимостей проекта определяется конфигурацией, используемой для включения библиотеки в качестве зависимости. Например, если библиотека А включает библиотеку Б как зависимость типа api, то библиотека А и другие библиотеки, зависящие от библиотеки А, имеют доступ к классу R библиотеки Б. Однако другие библиотеки могут не иметь доступа к классу R библиотеки Б. Если в библиотеке А используется конфигурация зависимости implementation. Подробнее о конфигурациях зависимостей…

Удаление ресурсов, отсутствующих в конфигурации по умолчанию

Если в модуле библиотеки вы добавите ресурс для языка, который не входит в набор ресурсов по умолчанию (например, если вы добавите hello_world в качестве строкового ресурса в /values-es/strings.xml, но не определите этот ресурс в /values/strings.xml), плагин Android Gradle больше не будет включать этот ресурс при компиляции проекта. Это изменение должно привести к уменьшению количества исключений времени выполнения Resource Not Found и повышению скорости сборки.

D8 теперь учитывает правила хранения CLASS для аннотаций

При компиляции приложения D8 теперь учитывает, когда аннотации применяют политику хранения CLASS, и эти аннотации больше не доступны во время выполнения. Такое поведение также наблюдается, когда целевой SDK приложения задан на уровне API 23, который ранее позволял получать доступ к этим аннотациям во время выполнения при компиляции приложения с использованием более старых версий плагина Android Gradle и D8.

Другие изменения в поведении

  • aaptOptions.noCompress больше не учитывает регистр на всех платформах (как для APK, так и для пакетов) и поддерживает пути, в которых используются заглавные буквы.
  • По умолчанию привязка данных выполняется постепенно. Подробнее о проблеме 110061530…

  • Теперь все модульные тесты, в том числе Roboelectric, полностью кэшируются. Подробнее о проблеме 115873047…

Исправлены ошибки.

В этой версии плагина Android Gradle исправлены следующие ошибки:

  • Теперь модульное тестирование Robolectric поддерживается в модулях библиотек, в которых используется привязка данных. Подробнее о проблеме 126775542…
  • Теперь вы можете выполнять задачи connectedAndroidTest в нескольких модулях, когда в Gradle включен режим параллельного выполнения.

Известные проблемы

В этом разделе описаны известные проблемы, которые существуют в плагине Android Gradle 3.6.0.

Медленная работа задачи Android Lint

В некоторых проектах Android Lint может работать дольше из-за регрессии в инфраструктуре синтаксического анализа, в результате чего медленнее вычисляются предполагаемые типы для лямбда-выражений в определенных конструкциях кода.

Проблема является ошибкой в IDEA и будет исправлена в плагине Android Gradle 4.0.

Отсутствует класс манифеста {:#agp-missing-manifest}

Если в манифесте приложения определены специальные разрешения, плагин Android Gradle обычно создает класс Manifest.java, который включает эти разрешения в виде строковых констант. Плагин упаковывает этот класс вместе с приложением, чтобы вы могли легко ссылаться на эти разрешения во время выполнения.

В плагине Android Gradle 3.6.0 не работает создание класса манифеста. Если вы создаете приложение с помощью этой версии плагина и оно ссылается на класс манифеста, может возникнуть исключение ClassNotFoundException. Чтобы устранить эту проблему, выполните одно из следующих действий:

  • Указывайте полные имена собственных разрешений. Пример:"com.example.myapp.permission.DEADLY_ACTIVITY".

  • Определите собственные константы, как показано ниже:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }