Разработчики про использование Gradle в Android

Ivan Andreyshev
7 min readDec 22, 2018

--

Вы читаете перевод статьи “a Developer’s insight(s) about Android + Gradle

Разработчики боятся gradle, потому что им приходится тратить много драгоценного времени на исправление его ошибок при сборке проекта. Большинство проблем связаны с конфигурацией версий, что является следствием отсутствия надлежащего знания gradle. Посмотрим, как разработчик пытается решить ошибки сборки…

Разработчик 1: Привет, я не могу собрать мой Android проект, gradle выдает ошибку.

Разработчик 2: Ты пытался искать решение в Google?

Разработчик 1: Да, я попробовал все, что возможно. Копировал все решения из Google, но проблема так и не решилась.

Разработчик 2: Хорошо, попробуй Clean build, Rebuild, Invalidate Cache/Restart, Remove your project from the recent project. Выполни эти действия по отдельности или все вместе и твоя проблема возможно решится.

Так мы пытаемся решить ошибки gradle. Даже я один из таких разработчиков. Так происходит из-за следующих причин:

  1. Мы не понимаем, как Android Studio использует gradle для сборки приложения.
  2. Не существует адекватного сайта или документации, которые научили бы разработчика правильно настраивать версии в gradle, чтобы избежать ошибок сборки.

Gradle может быть весьма полезным для Android разработчика, поэтому стоит потратить время на его изучение. Прежде всего, каждый должен знать основные компоненты при использовании gradle.

  1. SDK Versions
  2. Android Support Library
  3. Android Gradle Plugin
  4. Android Build Tool
  5. Gradle

Их знание позволит вам лучше понимать gradle.

SDK Versions

Выпустив новую версию операционной системы, Android выпускает и свой новый пакет SDK (Software Development Kit). Это позволяет разработчикам создавать приложения с самым свежим функционалом. Давайте посмотрим на три версии SDK, которые указываются в скриптах gradle и которые играют ключевую роль во время сборки приложения.

  1. minSdkVersion: это наименьшая версия SDK, поддерживаемая вашим приложением.
  • Приложение не установится на устройство с меньшим уровнем API, чем minSdkVersion. Пример: представим, что в приложении minSdkVersion 26 — Android Oreo. Если я попробую установить его на устройство с предыдущей версией (API 25 — Android Nougat), у меня это не получится.
  • Опираясь на minSdkVersion, Google Play Store определяет, каким пользователям показывать ваше приложение. Приложение никогда не будет показано в результатах поиска в Google Play Store, если устройство пользователя имеет версию ОС меньше minSdkVersion.

2. compileSdkVersion: это версия Android SDK, которая используется при компиляции вашего кода. Если вы выберете версию 28, вы сможете писать код со всеми функциями доступными в API 28 — Pie. Имейте в виду, что изменение compileSdkVersion не меняет поведение приложения. После добавления compileSdkVersion можно заметить следующее:

  • Вы начнете получать предупреждения об устаревших методах. Они сообщают, что в новых версиях API эти методы устарели.
  • Во время написания кода вы можете узнавать, что появилось новое, а что устарело.
  • Вы получите максимальную пользу от новых проверок компилятора на существующем коде и будете готовы к использованию новых API.

3. targetSdkVersion: это сообщение для операционной системы, на которой запущено приложение, о том, для какой версии API оно было разработано. Это как сертификат или подпись, которую вы предоставляете операционной системе, сообщая, что приложение было протестировано на этой версии.

Примечание: minSdkVersion <= targetSdkVersion <= compileSdkVersion

Android Support Library

Android Support Library — это набор библиотек, которые обеспечивают расширенную обратную совместимость Android Framework. Библиотека поддержки начинала с обеспечения обратной совместимости, но позже она стала предоставлять и дополнительную функциональность, например RecyclerView, CardView, Annotations и т.д. Эти элементы имеют реализации платформенных классов. Вы можете использовать Android Support Library в следующих целях:

  1. Обеспечение обратной совместимости новых возможностей Android API. Например, представим что в Android API 27 появилась новая функциональность, тогда соответствующая библиотека поддержки (с версией 27.x.x) позволит использовать эту функциональность на устройствах с API < 27.
  2. Использование дополнительных элементов UI.
  3. Использование не встроенных в Android Framework функций.

Android Gradle Plugin

Android Gradle Plugin — это набор задач gradle, которые предназначены для сборки Android приложений. После добавления строки apply plugin: ‘com.android.application’ в build.gradle приложения и синхронизации, вы можете увидеть список разных задач во вкладке Gradle. По умолчанию вкладка находится справа от кода проекта.

Список задач Android Gradle Plugin

Чтобы получить список задач с их описанием, используйте в терминале Android Studio одну из команд:

  • Windows user: gradlew tasks
  • Mac user: ./gradlew tasks

Почему Gradle нуждается в Android gradle plugin?

Так как Gradle не зависит от платформы, на которой используется, он не имеет отношения ни к одной из них, в частности к Android. Gradle полностью написан на groovy, поэтому Android gradle plugin — это посредник, организующий связь между Android и Gradle. Скрипты Android gradle plugin написаны таким образом, что могут взаимодействовать с инструментами Android для выполнения своей задачи.

Android Build Tools

Эти инструменты необходимы для сборки Android приложения.

  • AAPT2 (Android Asset Packaging Tool) — инструмент, который используется в Android Studio и Android gradle plugin для компиляции и упаковки ресурсов приложения, например файлы графики или XML файлы.
  • dx — компилятор Java класс-файлов в .dex (Dalvik Executable) файлы.
  • apksigner — позволяет подписать созданный APK файл.
  • Zipalign — инструмент для выравнивания APK архива. Преимущество выравненных этим инструментом файлов в уменьшении времени запуска и более эффективном использовании RAM.

Gradle

Является ли gradle системой сборки? Если так, то почему инструменты для сборки Android отделены? У меня, как у Android-разработчика, появились сомнения и я стал анализировать gradle чуточку глубже и понимать разницу между системой сборки и инструментом сборки. Для простоты понимания, я разделил определения gradle на части.

Определение 1: Gradle — это система автоматизации сборки.

Все понимают значение слов “сборка” и “автоматизация”. Давайте посмотрим что значит “система”. Система — набор процедур и подпрограмм созданных для осуществления определенной деятельности. Отсюда выведем следующее определение.

Определение 2: Gradle — это набор процедур и подпрограмм, созданных для осуществления определенной деятельности.

Теперь вспомним про build.gradle файлы и выведем из описанных выше третье и последнее определение.

Процедурами и подпрограммами является:

  • Объявление плагинов и зависимостей.
  • Добавление источников зависимостей для скачивания.
  • Определение версий Android SDK, которые будет поддерживать приложение.
  • Определение версий инструментов, которые будут собирать приложение.

Под определенной деятельностью понимается сборка приложения.

Отсюда последнее определение

Определение 3: Gradle — это набор процедур и подпрограмм, которые автоматически скачивают плагины и зависимости, необходимые для сборки приложения с использованием инструментов сборки Android.

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

Надеюсь, все понимают пять важных компонентов при использовании Gradle в Android разработке. Будучи разработчиками мы должны знать, как настроить эти компоненты, чтобы избежать ошибок с их версиями. Определить, какие версии использовать, оказывается не просто. Так как компоненты связаны друг с другом, если версия одного из них будет определена не правильно, то может возникнуть конфликт. Я поделюсь с вами планом, в котором показывается, как правильно определить их версии.

Порядок определения версий

Диаграмма наглядно показывает, в каком порядке должны определяться версии. Рассмотрим процесс в деталях.

1. Как только вы решили изменить compileSdkVersion, вам нужно помнить, что версия Android Support Library и Build Tool тоже нуждаются в обновлении, и они обе должны стать больше или равны compileSdkVersion.

Support Library Version & Build Tool Version >= compileSdkVersion

Дело в том, что изменив compileSdkVersion, вы собираетесь написать код с функциями, доступными для этой версии SDK. Разумеется, для обеспечения их обратной совместимости нужно обновить Android Support Library. Точно таким же образом, для сборки кода с функционалом из нового SDK, нужно обновить версию Android Build Tools.

2. Если вы обновили версию Build Tools, значит вам нужно обновить версию соответствующего ему Android Gradle Plugin. Посмотрите Android Gradle Plugin release notes, чтобы знать, какая версия плагина поддерживает ваши инструменты сборки.

3. Следующей будет версия Gradle. Посмотрите таблицу Android Gradle Plugin release notes, чтобы узнать, для какой версии Android Gradle Plugin какая версия Gradle необходима.

4. Android Studio автоматически попросит вас обновить Gradle и Android Gradle Plugin, когда вы обновляете IDE или импортируете в нее новый проект. Я рекомендую вручную обновлять версии в соответствии с вашим проектом.

И, наконец, хочу поделиться своим пониманием удаленных зависимостей (remote dependencies). Являясь разработчиками, вы должны быть очень осторожны при удалении / обновлении зависимостей. Я видел много разработчиков, которые используют сторонние библиотеки без надлежащей проверки. Это может вызвать не только поломку функциональности, но и серьезные последствия в плане безопасности. При добавлении или обновлении сторонней зависимости, помните следующее:

  1. Проведите надлежащую проверку перед использованием сторонней библиотеки.
  2. Некоторые библиотеки могут иметь собственное значение minSdkVersion, в таком случае ваше приложение должно иметь как минимум такое же.
  3. Многие из них могут содержать транзитивные зависимости. Это зависимости, от которых зависит подключаемая библиотека и от которых начнет зависеть ваш проект тоже, что приводит к дереву зависимостей. Чтобы было понятнее, я показал это на картинке:
Транзитивная зависимость

Когда gradle находит одинаковую зависимость, но с разными версиями, он должен совершить выбор. Подключение разных версий одной библиотеки не имеет смысла. В таком случае gradle выберет последнюю версию (27.0.2) библиотеки. Это может стать причиной падения приложения во время выполнения, если какая-нибудь функциональность была убрана в новой версии, а библиотека использует старую. Чтобы избежать такого поведения, всегда используйте одну версию в разных проектах и их зависимостях.

Если перевод или оригинальная статья вам были полезны, тогда нажимайте👏 . Спасибо всем, кто помог с переводом.

--

--