Gradle dependencies android support

Gradle

Gradle — система автоматической сборки, построенная на принципах Apache Ant и Apache Maven. В Eclipse использовалась система Ant, но большинство разработчиков даже не замечало её работы. В основном возможности системы использовались в конторах для автоматизации различных задач. В Android Studio такой номер не пройдёт. Gradle сопровождает вас во время разработки постоянно. Поначалу, если вы перешли с Eclipse, Gradle сильно раздражает своими действиями. Но позже вы оцените её удобство и может даже полюбите её.

Gradle не является изобретением для Android Studio, система была разработана раньше и использовалась в приложениях для Java, Scala и других языках.

Система сборки Gradle очень мощная и сложная, чтобы о ней рассказать в двух словах. Есть целые книги о ней. Сами команды в Gradle представляют собой обычный текст с использованием синтаксиса Groove для конфигурации. Но нам не нужно знать всё. Познакомимся поближе с системой и научимся пользоваться ей.

Создайте новый проект или откройте любой существующий проект из Android Studio и посмотрите на структуру проекта.

В последних версиях студии файлы Gradle выделили в отдельную папку Gradle Script. Раскройте её. В основном вас должен интересовать файл build.gradle, который относится к модулю. Рядом с этим файлом в скобках будет написано Module: app. Двойным щелчком откройте его, вы увидите, что файл является текстовым.

Также есть файл build.gradle, который относится к проекту. Но с ним работают реже. Так находятся настройки для репозиториев и самого Gradle.

Вернёмся к файлу модуля, вы увидите много интересной информации. Например, вы там можете увидеть настройки, которые раньше вы могли видеть в манифесте — номера версий, номера SDK и так далее. Забегая вперёд, скажу, что здесь можно добавить всего одну волшебную строчку и нужная библиотека сама скачается из интернета и установится в проекте. Красота!

Однако вернёмся в корневую папку. Кроме файлов build.gradle мы можем заметить файлы gradle.properties, settings.gradle и другие. Трогать их не нужно.

В корневой папке также есть файлы gradlew и gradlew.bat для работы с Gradle Wrapper. В принципе вам не нужно знать о них ничего. Но для параноиков есть информация — если вы часто импортируете проекты из неизвестных источников, то они содержат файл gradle/wrapper/gradle-wrapper.properties. Откройте его текстовым редактором и посмотрите на адрес у distributionUrl. Путь должен вести на официальный сай //services.gradle.org или на внутренний корпоративный сервер. Другие адреса должны вызвать тревогу.

Вы могли заметить, что по сравнению с Eclipse изменилась структура файлов. В папке app находится папка src, а ней папка main, в которых папки java, res и файл манифеста. Новая структура лучше отвечает требованиям Gradle для управления файлами.

Вы, например, можете создавать альтернативные папки с ресурсами и с помощью build.gradle подключить их к проекту.

В этом примере мы указали, что существуют новая папка presentations в папке /src/main/ наряду с существующими папками java и res. Внутри созданной папки есть ещё две папки layout и animations, которые содержат файлы ресурсов.

Только помните, что вам нужно избегать конфликта имён при слиянии всех файлов при сборке.

Значение sourceSets указывает Gradle, какие папки следует использовать. Этим приёмом пользуются продвинутые программисты. Мы пока не будем использовать такую технику.

Другая полезная возможность — создавать разные версии приложений, например, демо-версию и платную версию. Немного об этом рассказано здесь.

Номер версии приложения и требования к версии Android прописаны в секции defaultConfig. Если у вас сохранились старые версии приложений, то в манифесте можете удалить данные записи. По-моему, там даже выводится соответствующая подсказка. Даже если вы эти данные в манифесте не удалите, то значения из gradle.build имеют больший приоритет и перепишут значения в манифесте при не совпадении.

Подключение библиотеки происходит одной строчкой. Например, нужно добавить библиотеку Picasso:

В Android Studio 3.0 используется новая версия Gradle, в которой compile считается устаревшей. Вместо него следует использовать новое слово implementation.

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

Далее включаете синхронизацию и через несколько секунд в папке появляется нужная библиотека, готовая к использованию. Сама библиотека скачивается с специального хранилища-репозитория JCenter. Данный репозиторий используется по умолчанию и прописан в buil.gradle проекта.

Можно указать другой репозиторий, например, Maven Central.

Для поиска через Maven-репозиторий используйте The Central Repository Search Engine.

Библиотеку можно подключать и старым способом, используя jar-файл, но такой способ уходит в прошлое.

Сам файл нужно скопировать в папку /libs.

При любом изменении файла недостаточно его сохранить. Нужно также произвести синхронизацию. Наверху обычно появляется жёлтая полоска с ссылкой Sync Now.

Задаём имя APK при компиляции

Можно задать собственное имя при компиляции проекта. Например, так.

Получим имя MyName-1.0.12-release.apk

Оптимизатор кода R8

Оптимизатор кода R8 имеет следующие возможности: урезание байт-кода, сжатие, обфускация, оптимизация, удаление «синтаксического сахара», преобразование в DEX. Оптимизатор может производить все операции за один шаг, что даёт сильное улучшение производительности. R8 был введён в Android Gradle plugin 3.3.0. Вам нужно только включить его.

Читайте также:  Настройка bluetooth джойстика android

R8 разработан для работы с существующими ProGuard-правилами, хотя возможны ситуации, когда нужно переработать правила.

Сжимаем итоговый APK

В Gradle 1.4 появилась возможность сжать итоговый файл, убрав неиспользуемые ресурсы, в том числе из библиотек, например, Google Play Services.

Во время сборки приложения вы можете увидеть строку:

Другой способ убрать неиспользуемые ресурсы конфигурации. Например, вам не нужные локализованные ресурсы для всех языков, которые входят в библиотеку Google Play Services или Android Support Library и др. Оставим только нужные языки. Возможно, вы также не хотите поддерживать mdpi или tvdpi-разрешения в своём приложении. Мы можем установить языки и разрешения, которые используются в приложении, остальные будут исключены, что позволит уменьшить вес приложения.

Можно перенести ключи из манифеста.

Чтобы их не светить, например, если выкладывать код на Гитхабе, то сделаем так.

И в манифесте переделаем код.

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

В манифесте пишем.

Класс BuildConfig

В статье LogCat упоминался способ быстрого отключения журналирования.

Суть в следующем. Когда вы создаёте новые переменные в блоках defaultConfig или buildTypes (ветки debug и release), то Gradle создаёт специальный класс BuildConfig, и вы можете получить доступ к этим переменным.

Например, добавим переменную в defaultConfig

На языке Java это равносильно String YOUR_TOKEN = «ABRAKADABRA»;

Теперь мы можем обратиться к созданной строке.

С секцией buildType ситуация интереснее. У секции есть два блока debug и release. Можно создать переменные с разными значениями, которые будут использоваться в зависимости от ситуации. Например, у вас есть собственное API для сервера. Для тестирования вы используете один адрес, а для финальной версии — другой адрес. Тогда вы просто указываете разные адреса в разных ветках. Переменные могут быть не только строковыми.

Создаём код для перехода на веб-страницу.

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

Разделяем отладочную и финальную версию

По такому же принципу можно организовать запуск новой версии программы, не затрагивая программу, которую вы установили с Google Play. Допустим вы на своём телефоне установили своё собственное приложение через Google Play. Теперь вам нужно написать новую версию и проверить на своём телефоне. Из-за конфликта имён новое тестируемое приложение перепишет финальную версию или вообще не установится. Поможет следующий трюк.

В специальных переменных applicationIdSuffix и versionNameSuffix мы задаём суффиксы, чтобы избежать конфликта. А в переменной resValue указываем название программы для отладочной и финальных версий, чтобы на устройстве можно было их найти. Не забудьте при этом удалить строковый ресурс app_name в res/values/strings.xml, иначе получите ошибку при компиляции. Теперь можете спокойно запускать приложение с новым кодом, не боясь повредить своё любимое приложение.

Прячем секретную информацию

Следующий совет больше подходит для компаний. Когда подписывается приложение, то нужно указывать пароль, хранилище и т.д. Чтобы их не светить в студии, можно прописать их в переменных и поместить в секцию signingConfigs. Сервер сам найдёт нужные ключи и воспользуется ими в своих сценариях.

Автогенерация версии кода

Нашёл совет, сам не применял. Не обязательно вручную менять версию приложения в атрибутах versionCode и versionName, можно сделать через переменные, а они сами подставятся в нужное место. На любителя.

settings.gradle

Файл settings.gradle обычно состоит из одной строчки.

Это означает, что у вас используется один проект для работы. Если вы будете подключать другие проекты, то здесь появятся новые строки.

gradle.properties (Project Properties)

Несколько советов по настройке файла gradle.properties.

Режим параллельного выполнения

В этом файле можно найти закомментированную строку # org.gradle.parallel=true. Если модули вашего проекта не используют друг друга как зависимости, создавая перекрёстные ссылки, можно включать режим параллельного выполнения, что ускорит скорость сборки до

Gradle-демон

Включение на компьютере демона Gradle даст значительный прирост в скорости сборки.

Режим конфигурации при необходимости

Если в проекте используется много модулей, то можно включить режим конфигурации при необходимости. Ускорение будет заметно при большом количестве используемых модулей:

Меняем номер версии библиотек в одном месте

Очень часто в проекте используются взаимосвязанные библиотеки с одинаковыми номерами.

Можно быстро поменять у всех номера через переменную. Для этого используется секция ext, в которой указывается переменная и номер версии. Затем в секции dependencies номер версии заменяется на имя переменной

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

Расширенная версия с разными переменными в другом виде.

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

Настройки в Android Studio

Рассмотрим настройки, доступные в Android Studio. Закройте текущий проект, чтобы увидеть стартовое окно студии. В правой части нажмите на пункт Configure. В следующем окне выберите пункт Settings, чтобы оказаться в окне настроек студии. В левой части найдите пункт Build, Execution, Deployment, затем подпункт Build Tools, далее подпункт Gradle. По умолчанию, там всё чисто, только указан путь у Service directory path. Это были общие настройки.

Теперь рассмотрим настройки, относящиеся к проекту. Запустите любой проект в Android Studio. Выберите меню File | Settings. . Снова пройдитесь по пунктам Build, Execution, Deployment | Build Tools | Gradle. Вы увидите практически такое же окно с небольшими изменениями. Теперь поле Linked Gradle Projects не будет пустым, а также появятся дополнительные настройки. По умолчанию рекомендуют использовать Use default gradle wrapper.

Gradle Task

На правой стороне Android Studio имеется вертикальная вкладка Gradle, которую можно развернуть. Она содержит список задач (task), которая выполняет Gradle при работе с текущим проектом. Вы можете выделить любую из этих задач и запустить её двойным щелчком. Можно выделить несколько задач.

Читайте также:  Как взломать киви с андроид

Узнать debug.keystore: MD5 и SHA1

Иногда требуется узнать значения debug.keystore: MD5 и SHA1. Обычно их получают через командную строку. Но это долго и неудобно, так как нужно помнить все аргументы. Есть способ проще. Открываем вкладку Gradle, нажимаем на кнопку со стрелками Refresh all Gradle Projects. Затем последовательно открываем элементы Tasks | android и запускаем команду signingReport. В нижнем окне Run увидите нужную информацию.

Gradle Console

Когда выполняется какая-то задача Gradle, то ход её выполнения можно увидеть в окне Gradle Console. Открыть её можно через вкладку Gradle Console в нижней правой части студии.

Terminal

Запускать задачи Gradle можно и в окне Terminal.

На панели инструментов имеется значок Sync Project with Gradle Files, которую следует использовать при редактировании файлов Gradle. Как правило, студия также выводит предупреждающее сообщение с ссылкой при изменении файла, которая делает ту же работу.

Добавление зависимостей через интерфейс студии

В статье описывался способ включения библиотеки в проект через редактирование файла build.gradle. Существует альтернативный вариант через настройки студии. Щёлкните правой кнопкой мыши на имени модуля (app) и выберите пункт Open Module Settings (быстрая клавиша F4). В правой части окна находятся вкладки, которые оказывают влияние на файл build.gradle. Например, вкладка Dependencies содержит подключаемые библиотеки.

Чтобы добавить новую зависимость, нажмите на значок с плюсом и выберите нужный вариант, например, Library dependency. Откроется список доступных библиотек из репозитория Maven.

Дополнительное чтение

В примере работы с PDF-файлами в папке assets использована операция запрета на сжатие файлов, которое происходит по умолчанию.

Задачи Gradle — теория для общего развития.

Источник

How to manage Gradle dependencies in an Android project properly.

Introduction

If you’re reading this article, you probably did at least one android project. It means you’re familiar with the Gradle build system, and pain that comes up with management Groovy files. What if I say that you can minimize this pain a lot? Moreover, you can do this with Kotlin ❤️.
Gradle dependency management can be done in at least three various ways. Let’s review each of them in detail.

Summary

  • Plain dependency management;
  • Dependency management via ext;
  • The right way;
  • Managing repos;
  • Keeping dependencies up to date;
  • A few words about Kotlin DSL.

Why should I even care?

As soon as your project will grow, the count of its dependencies rise, and build.gradle files will become such a mess and error-prone. As soon as you will modularize your project, you will get many build.gradle files with the same content and will have to manage each file manually.

1) Plain dependency management ❌

The worst approach you can manage your Gradle dependencies is to perform no special workaround and use plain strings alike:

Everybody managed dependencies this way at least once, but it requires a lot of manual changes whenever you upgrade your libraries. Keep in mind that many dependencies are come from one group and have the same version. Moreover, the project may include more than one module, and you’ll have to update dependencies in other modules too (look at the samples below).

As you can see, it has a lot of boilerplate code which can be reduced. It would be great to put these dependencies and their versions in variables and all of them in one place. Let’s see what we can do.

  • None… Except for the case, when you’re making a very simple project — you’ll save a little time.
  • Your build.gradle files become messy when the project grows;
  • In multi-module projects, you have to update the dependencies manually for each module;
  • Strings are “dangerous” and error-prone.

2) Dependency management using ExtraPropertiesExtension (ext) 🆗

Another very popular method is to keep your dependencies in ext. This method is OK. Furthermore, it’s recommended by Google. Despite this, I wouldn’t recommend using this method and let’s see why.

The core of this method is to keep all of the dependencies and their versions in one place — ext object by key/value pairs.

What is ext?

From Gradle docs: Extra properties extensions allow new properties to be added to existing domain objects. They act like maps, allowing the storage of arbitrary key/value pairs. All ExtensionAware Gradle domain objects intrinsically have an extension named “ext” of this type.

For example, you can create ‘ deps.gradle’ (or any other name by your choice) file in the project’s root folder. And its content will look something like that:

As you can see, dependencies and their versions are stored in a Groovy map by key/value pairs. Versions are taken out, cause different dependencies from one package/group have the same version number. And we all like to reuse the code, don’t we? 😎

Then you can apply these dependencies whenever you need by specifying “ apply from: ‘[name].gradle’” in necessary buildscript (top-level in our case):

And using these dependencies in action looks like this:

You are supposed to notice a lack of autocomplete, navigation and highlight. It becomes a game-changer for me, so I decided to dig deeper and discovered the third method — buildSrc.

  • All of your dependencies are stored in one place;
  • Build.gradle files look neat.
  • Lack of the highlight, autocomplete or navigation;
  • IDE will not show you a warning if dependency is out of date;
  • You’re still using error-prone strings, as you get the dependency by string key from ext, and you never know you’re using the right key till building the project, because of lack of the IDE highlight.
Читайте также:  Клеш рояль для андроида

3) Dependency management using buildSrc ✅

As Madis Pink wittily noticed in ZeroTurnaround RebelLabs blog about what buildSrc is: If somebody asked about the Gradle feature that everybody should know about, I would probably point them towards buildSrc. It is a magic Gradle Java/Groovy project inside your repository, available as a library to all of your build.gradlefiles.

It allows you to write custom build logic (declare dependencies, writing tasks, and plugins, etc) using your lovely Kotlin🤘, so stop wasting time and let’s go!

First, you need to create a folder named ‘buildSrc’ in the root folder of your project:

Then, to be able to write Java/Kotlin code you have to create a default for java projects src/main/java structure inside just created folder:

Last preparation step: create build.gradle.kts file to enable kotlin support in Gradle.

Now you just need to create a kotlin file inside a newly created folder and move all of your dependencies and versions inside. This way you’ll get full code completion, highlight and navigation support right in the IDE! Here’s a very simple example:

And now we can reference these in our build.gradle files:

At first glance it may feel wrong to put build configuration inside the buildSrc module, though the benefits are still worth it.

  • All of your dependencies are stored in one place;
  • Build.gradle files look neat;
  • You get full of the IDE highlight, autocompletion, and navigation.
  • IDE will not show you a warning if dependency is out of date;

4) Keep your dependencies up to date

As you can see, the big downside of both ext and buildSrc methods is IDE will not show you a warning if dependency is out of date, so let’s turn it into a significant advantage.

Default newer version check

By default, IDE checks for the newer version by the ‘Newer Library Version Available’ lint inspection:

It isn’t compatible with both ext and buildSrc methods but nothing to worry about as it’s far from ideal. Sometimes it works a bit incorrect and doesn’t warn some outdated dependencies:

After a very short research, I decided to use the Gradle Versions Plugin developed by Ben Manes.

Gradle Versions Plugin

It’s more stable than Lint inspection and can be configured to match all of your needs. I will not focus on how to add this plugin to the project, its GitHub page has an exhaustive instruction.

To make the magic happen you need to run dependencyUpdates task by prompting this command in terminal:

And task’s default output looks like this:

As you see, it suggests updating the dependencies to beta, alpha, and RC versions. To make it focus on release versions only — some task configuration is needed.

Just add this function to your ‘Dependencies.kt’ file:

And place this code to the bottom of the top-level build.gradle file:

That’s it! It suggests release versions only now:

If you want some fine-tuning, check the GitHub page. You can even configure the task to save its report in the file and use this file with Danger in your CI/CD pipelines to warn you about newer versions automatically.

5) (Bonus) Managing the repositories alongside dependencies

If you read up to this point, I’d like to share with you one of the ways to manage your repositories alongside dependencies. It could be done by gradle interface — RepositoryHandler.

From Gradle docs: A RepositoryHandler manages a set of repositories, allowing repositories to be defined and queried.

Doesn’t matter what method you use, whether ext or buildSrc, you can do that trick with both. All you need is to create a method that receives RepositoryHandler as a parameter like this:

Then just call it inside the build.gradle file and pass the ‘repositories’ handler inside:

Now you can keep all of your build configurations in the same place, which made its management as simple as never before. And how do you manage the repos? Write in the comments below.

6) Kotlin DSL

You may notice, Kotlin DSL used in the buildSrc module. It’s needed to support Kotlin code inside. It’s natural to use it in some modules but not to use it in the entire project. If you’re a Kotlin fan like me, I have to suggest that you at least try Kotlin as the main Gradle language.

From Gradle Kotlin DSL samples at GitHub: The Gradle Kotlin DSL provides support for writing Gradle build scripts using JetBrains’ Kotlin language. It aims to provide Gradle users with a rich, flexible and statically-typed approach to developing build logic in conjunction with the best IDE and tooling experience possible.

So, Kotlin DSL gives you an ability to write your Gradle files, tasks, and so on in Kotlin. It makes Gradle files much more readable and simple. But it isn’t fully supported yet and has a build speed issue at first build with cold Gradle daemon. But Kotlin DSL has official support by the Gradle team, and they teamwise with the JetBrains do their best to make it better.

Conclusion

I’ve described all the methods I know, please, tell me how you’re managing dependencies in your project. Also, I would appreciate, if you let me know how you’d like the story, it’s my first attempt at writing. Feel free to use comments below or ping me on social media. Thank you for your attention.

Источник

Оцените статью