Плагин Android Gradle 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
      }
      

Более подробную информацию можно найти в документации View Binding .

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

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

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

Генерация класса manifest не работает в плагине Android Gradle 3.6.0. Если вы собираете приложение с помощью этой версии плагина, и оно ссылается на класс manifest, может возникнуть исключение 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";
                  }
                }