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

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

3.6.4 (июль 2020 г.)

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

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

Новые возможности

Эта версия плагина Android Gradle включает следующие новые функции.

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

Привязка представления обеспечивает безопасность во время компиляции при обращении к представлениям в коде. Теперь вы можете заменить 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. Нажмите кнопку «Загрузить» и перейдите в <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 был заменен параметром useLegacyPackaging DSL. Дополнительные сведения см. в примечаниях к выпуску. Используйте 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 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";
                  }
                }