Плагин 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()
автоматически созданной ссылкой на класс привязки. Чтобы начать использовать привязку 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, содержащую временные метки для этих событий компилятора, чтобы вы могли лучше понять, сколько времени требуется для сборки вашего проекта. Чтобы вывести этот файл атрибуции сборки, выполните следующие действия:
Добавьте флаг
-Pandroid.enableProfileJson=true
при запуске сборки Gradle. Например:gradlew assembleDebug -Pandroid.enableProfileJson=true
Откройте браузер Chrome и введите
chrome://tracing
в строке поиска.Нажмите кнопку «Загрузить» и перейдите в
<var>project-root</var>/build/android-profile
чтобы найти файл. Файл называетсяprofile-<var>timestamp</var>.json.gz
.
Вы можете увидеть собственные данные атрибуции сборки в верхней части средства просмотра:
Изменения в поведении
При использовании этой версии плагина вы можете столкнуться со следующими изменениями в поведении.
Нативные библиотеки по умолчанию упакованы в несжатом виде.
Когда вы создаете свое приложение, плагин теперь устанавливает для 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"; } }