В 2015 году мы уже публиковали статью о пяти лучших библиотеках, которые мы использовали в то время. Однако платформа Android значительно выросла с тех пор. Как вы знаете, в такой быстро развивающейся области, как разработка программного обеспечения, всё меняется и развивается с молниеносной скоростью. Именно поэтому мы решили, что пришло время обновить список наиболее эффективных Android-библиотек.
Давайте без долгих предисловий перейдем прямо к нашему списку. Сначала мы рассмотрим одну из самых старых, но, по моему убеждению, и одну из самых эффективных Android-библиотек.
1. Retrofit
Retrofit — это типобезопасный HTTP-клиент, позволяющий представить ваш REST API в виде интерфейса. Вы сможете управлять телами, заголовками, параметрами API-запросов и многим другим с помощью аннотаций, что сделает этот процесс простым и понятным. Retrofit также позволяет выполнять синхронные и асинхронные вызовы API.
interface ApiService {
@GET("movie/{id}")
fun getMovieDetails(@Path("id") id: String) : Call<MovieDetails>
}
Ко всему прочему, Retrofit предоставляет отдельный Rx-модуль. Если вы используете Rx, этот модуль вернёт Observable при обращении к API, что позволит связать его с остальной частью вашего приложения. И это лишь некоторые из множества причин, по которым мы по-прежнему любим и используем Retrofit.
2. Moshi
Moshi — это библиотека для конвертации JSON в Java и Kotlin-объекты. Многие воспринимают Moshi как GSON 3.0. Однако эта библиотека превосходит GSON в нескольких аспектах: она быстрее, она поддерживает Kotlin, она обновляется, генерирует предсказуемые исключения и не использует испорченный адаптер DateTime по умолчанию. Кроме того, используя Moshi, процесс конвертации JSON в Java-объекты (и наоборот) становится максимально простым и понятым.
val moshi = Moshi.Builder().build()
val jsonAdapter = moshi.adapter(Model::class.java)
/* JSON to Model */
val model = jsonAdapter.fromJson(json)
/* Model to JSON */
val json = jsonAdapter.toJson(model)
Мы также любим Moshi за поддержку JSON API. JSON API — это спецификация построения API, и многие API, с которыми мы работаем, написаны с использованием этой спецификации. Moshi JSON API облегчает нашу жизнь, поскольку JSON API ответ преобразуется в значимые Java-объекты. Retrofit ещё поддерживает Moshi, и вместе они просто отлично работают.
3. Chuck
Chuck — это HTTP-инспектор для Android, позволяющий «покопаться» в HTTP-истории вашего приложения на мобильном телефоне. HTTP-лог отображается в виде уведомления, которое можно развернуть, чтобы зайти в Chuck и посмотреть детальную информацию. Использование Chuck невероятно обрадует специалистов QA-отдела, поскольку они смогут увидеть, где находится проблема: на стороне Android или на стороне сервера. Эта библиотека иногда может помочь вам больше, чем logcat. Это связано с тем, что ваша HTTP-история сохранится даже в случае непредвиденного закрытия приложения, в то время как logcat время от времени самоочищается после перезапуска.
4. Glide
Вы скорее всего знаете, что загрузка изображений в Android вызывает большие трудности. Даже изменение размера изображения может обернуться катастрофой с OutOfMemoryException
. Glide — это библиотека загрузки изображений, которая предоставляет качественный API, позволяющий изменять изображение как вам угодно.
GlideApp.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.ic_placeholder)
.into(imageView)
Библиотека позволит вам легко загрузить удалённое изображение в ImageView, определить стабовые изображения, кэшировать и масштабировать изображения и т.д. Просто попробуйте проделать всё это без помощи Glide, и вы сразу поймёте, почему он находится в нашем списке ключевых библиотек. Glide даже поддерживает некоторые распространённые изменения по умолчанию, например, создание изображения круглой формы.
5. ThreeTen
ThreeTen — это библиотека для работы с датой и временем в Android. Это портированная версия JSR-310, который был включен в Java 8 в качестве стандартного пакета java.time.*
. Мы любим эту библиотеку, потому что стандартный Android Calendar API превращает работу в сущий кошмар.
/* Current DateTime */
LocalDateTime.now()
/* String to DateTime */
val localDateTimeString = "2011-12-03T10:15:30"
val localDateTime = LocalDateTime.parse(localDateTimeString)
ThreeTen сильно уступает JodaTime с точки зрения количества методов и бинарного размера. API данной библиотеки также меньше, чем API JodaTime. Если вы уже используете JodaTime, то, вероятно, вам не стоит переходить на ThreeTen. Тем не менее, я настоятельно рекомендую попробовать ThreeTen, если вы только начинаете работать над новым проектом.
6. Timber
Timber — мощная, но простая библиотека логирования, построенная на базе Android-класса Log
. С её помощью вы сможете легко включать и выключать отображение логов. Также библиотека предлагает отличную поддержку логирования форматированных строк и исключений. Благодаря этим преимуществам Timber и входит в наш список ключевых библиотек, которые мы используем практически на всех Android проектах.
/* Log error */
Timber.e("Error happened")
/* Log warning with params */
Timber.w("Your variable value is %s", variable)
/* Log exception */
try {
...
} catch (e: Exception) {
Timber.e(e)
}
7. Room
Room — это официальный ORM для Android, и этот статус оправдывается рядом причин. Эта библиотека отличается удобным API, похожим на Retrofit. Room также в значительной степени опирается на аннотации и стандартный SQL-синтаксис.
@Dao
interface MovieDao {
@Query("SELECT details FROM movies WHERE id = :id")
fun getMovieDetails(id: String): MovieDetails
}
Кроме того, Room по умолчанию включает в себя поддержку Rx и LiveData
, поэтому вы сможете использовать его, как вам захочется. Основное преимущество Room перед различными ORM — простота. Многие ORM имеют гораздо более сложный API, для использования которого вам потребуется тщательно изучить всю документацию. Благодаря стандартному SQL-синтаксису Room предельно доступен для понимания, что позволяет приступить к работе сразу, не тратя много времени на чтение документации.
8. RxJava
RxJava — это Java-реализация ReactiveX API, которая позволяет связывать асинхронные задачи и события в наблюдаемые (англ. observable) последовательности. Пользователи рассчитывают на то, что современные приложения способны отображать данные в режиме реального времени. Другими словами, они хотят, чтобы информация обновлялась автоматически. Именно в этом аспекте вам и пригодится RxJava.
При получении данных в реальном времени становится чрезвычайно сложно объединить несколько запросов API, переключать потоки и обрабатывать ошибки. Именно здесь RxJava отменно проявляет себя, и именно по этой причине мы начали пользоваться этой библиотекой. Я согласен, что RxJava может показаться запутанной и трудной для изучения, но эта библиотека однозначно заслуживает вашего времени. Даже после перехода на Kotlin, мы продолжили использовать RxJava из-за её преимуществ. В сочетании с Kotlin API она становится ещё лучше благодаря дополнительным функциям-расширениям.
Single.zip(
/* Execute first API call and retry twice if it fails */
apiService.getMovieActors(id).retry(2),
/* Execute second API call and retry twice if it fails */
apiService.getMovieDetails(id).retry(2),
/* Receive successful results and merge them into single model */
BiFunction<List<Actor>, MovieDetails, Movie> { actors, details -> Movie(details, actors) }
)
/* Execute API calls on IO thread */
.subscribeOn(Schedulers.io())
/* Receive results on MainThread */
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { /* Handle error */ },
onSuccess = { /* Handle full movie data */ }
)
Попробуйте сделать что-то похожее на приведённый выше фрагмент с помощью простой Java. Ну же.
9. Android KTX
Android KTX — это набор расширений-обёрток для Android API в Kotlin, которые делают его более дружелюбным. Главная цель этой библиотеки — сделать Android API более удобным в использовании. Она содержит множество методов и отличных новых функций Kotlin, таких как именованные параметры, лямбда-функции и параметры по умолчанию.
/* Display View */
view.isVisible = true
/* Apply padding to all sides */
view.setPadding(padding)
/* Update padding on any side */
view.updatePadding(left = newPadding, right = newPadding)
/* Quick Toast */
toast("Display test toast")
/* New way to create bundle */
bundleOf {
"key1" to item1
"key2" to item2
}
/* Better way to use SharedPreferences */
sharedPreferences.edit {
putString("key1", "value1")
putString("key2", "value2")
}
Android KTX отличается наличием множества функций-расширений, и единственный способ узнать о них — погрузиться в код библиотеки, чтобы увидеть, каким образом функции улучшили Android API. Android KTX упрощает способ использования Android API, и по этой причине эта библиотека должна стать основой каждого Android приложения, написанного на Kotlin.
10. Dagger
Наш список 10 лучших библиотек был бы неполным без Dagger. Эта библиотека представляет собой полностью статичный фреймворк внедрения зависимостей во время компиляции. Dagger, так же как и RxJava, действительно сложен для понимания (мне пришлось потратить некоторое время, чтобы понять их пример CoffeeMaker), но определённо заслуживает потраченного времени и усилий.
Внедрение зависимостей (англ. dependency injection) — это способ, позволяющий добавлять небольшие компоненты к другим моделям с минимальными усилиями. Например, если у вас есть модель автомобиля, вы можете добавить к ней шины и с лёгкостью подменить имплементацию шин в будущем — не изменив при этом ни единой строчки кода в моделе автомобиля.
При разработке более сложных приложений вы точно не захотите самостоятельно выполнять задачи по внедрению зависимостей, потому что объём кода быстро увеличивается и становится слишком сложным для поддержки. Dagger избавит вас от этой проблемы, потому что он создает граф внедрения зависимостей во время компиляции посредством обработки аннотаций.
В прошлом году Google добавил отдельный модуль Android Dagger, который позволяет писать меньше шаблонного кода и упрощает внедрение зависимостей.
Заключение
Итак, вот и он: наш список 10 лучших Android-библиотек в 2018 году. Десять отличных библиотек, которые сделают процесс Android-разработки более приятным для каждого, кто решит их использовать. Хотите больше библиотек? Так вышло, что мы в нашей компании разработали несколько собственных Android-библиотек. Можете ознакомиться с ними:
- MjolnirRecyclerView — добавляет в RecyclerView поддержку header, footer, пустых view-компонентов и DiffUtils;
- Goldfinger — упрощает реализацию аутентификации по отпечаткам пальцев;
- DBInspector — просматривает и обеспечивает доступ к базам данных приложения;
- Complexify — простой способ проверить качество пароля пользователя;
- Prince of Versions — обрабатывает обновления приложения внутри приложения.
Автор: Devcolibri