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