Плагин 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 включает в себя следующие новые функции.

Просмотр привязки

Привязка View обеспечивает безопасность времени компиляции при ссылке на представления в вашем коде. Теперь вы можете заменить findViewById() на автоматически сгенерированную ссылку на класс привязки. Чтобы начать использовать привязку View, включите следующее в файл 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. Нажмите кнопку Load и перейдите в <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 упрощает компиляцию classpath, генерируя только один класс R для каждого модуля библиотеки в вашем проекте и разделяя эти классы R с другими зависимостями модуля. Эта оптимизация должна привести к более быстрой сборке, но она требует, чтобы вы имели в виду следующее:

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

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

Для модулей Library, если вы включаете ресурс для языка, который вы не включаете в набор ресурсов по умолчанию, например, если вы включаете 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, так и для пакетов) и учитывает пути, в которых используются заглавные символы.
  • Связывание данных теперь по умолчанию инкрементальное. Чтобы узнать больше, см. issue #110061530 .

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

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

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

  • Тесты Robolectric unit теперь поддерживаются в библиотечных модулях, использующих привязку данных. Чтобы узнать больше, см. issue #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 , который включает ваши пользовательские разрешения в виде строковых констант. Плагин упаковывает этот класс с вашим приложением, поэтому вам будет проще ссылаться на эти разрешения во время выполнения.

Генерация класса манифеста сломана в плагине 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";
                  }
                }