Android Gradle Plugin 3.6.0 (февраль 2020 г.)

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

Минимальная версия Версия по умолчанию Примечания
Грэдл 5.6.4 5.6.4 Для получения более подробной информации см. раздел «Обновление Gradle» .
Инструменты сборки SDK 28.0.3 28.0.3 Установите или настройте инструменты сборки SDK.

3.6.4 (июль 2020 г.)

Это небольшое обновление обеспечивает совместимость с новыми настройками по умолчанию и функциями отображения пакетов в Android 11 .

Подробности см. в примечаниях к выпуску 4.0.1 .

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

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

Привязка представления

Привязка представлений обеспечивает безопасность на этапе компиляции при обращении к представлениям в вашем коде. Теперь вы можете заменить 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. Нажмите кнопку «Загрузить» и перейдите в папку <var>project-root</var>/build/android-profile чтобы найти файл. Файл называется profile-<var>timestamp</var>.json.gz .

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

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

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

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

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

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

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

Если вы хотите, чтобы плагин 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 и другие библиотеки, зависящие от библиотеки 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 .

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

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

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

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

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

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

Низкая производительность задачи Android Lint

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

В IDEA эта проблема зарегистрирована как ошибка и будет исправлена ​​в Android Gradle Plugin 4.0.

Отсутствует класс Manifest {:#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";
                  }
                }