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

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

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

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

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

View Binding

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

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

Подробную информацию вы найдете в документации по привязке представлений.

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

Плагин Android Gradle поддерживает плагин Maven Publish Gradle, который позволяет публиковать артефакты сборки в репозитории 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. Нажмите кнопку Load (Загрузить) и найдите файл в папке <var>project-root</var>/build/android-profile. Название файла – profile-<var>timestamp</var>.json.gz.

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

Отслеживание атрибуции нативной сборки в Chrome

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

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

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

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

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

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

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

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

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

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

Упрощенное создание класса R

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

  • Поскольку компилятор использует классы R совместно с зависимостями вышестоящих модулей, важно, чтобы каждый модуль в проекте имел уникальное название пакета.
  • Видимость класса R библиотеки для других зависимостей проекта определяется конфигурацией, используемой для включения библиотеки в качестве зависимости. Например, если библиотека A включает библиотеку B как зависимость api, то библиотека A и другие библиотеки, зависящие от нее, имеют доступ к классу R библиотеки B. Однако у других библиотек может не быть доступа к классу R библиотеки B. Если библиотека A использует конфигурацию зависимостей 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.

  • Все модульные тесты, включая тесты Robolectric, теперь полностью кешируются. Подробная информация доступна в описании проблемы 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";
                  }
                }