Хабрахабр

Android Jetpack: превращаем приложения в ракеты

Война… Война никогда не меняется. Так, война за красивый и работающий код идет постоянно. И на каждую сложную задачу рождается свое оружие: кто-то делает его под себя, а кто-то пользуется готовыми инструментами. Разработка под Android не исключение. На нашей конференции AppsConf 2018 мы обсудим, как и чем сейчас интереснее всего пользоваться, где можно споткнуться и что интересного есть в огромном арсенале средств разработки, который Google наконец начал приводить в порядок. Основные темы докладов можно посмотреть на нашем сайте, а пока мы попросили рассказать Google Developer Expert Дениса Неклюдова и Александра Смирнова о новом инструментарии Android Jetpack, который был представлен в мае этого года.

Александр Смирнов, co-founder и CTO в PapaJobs, основатель сообщества Android-разработчиков MOSDROID, ведущий видеоблога «Android в лицах».

Денис Неклюдов, первый GDE в России, работает в Сингапуре в 90seconds.tv, центровой ведущий подкаста AndroidDev, спикер разных конференций и автор нескольких курсов по разработке.

Android Jetpack был представлен в мае этого года на Google I/O.
А чего вы ждали от той конференции? Ожидания оправдались?

Казалось, что развивать платформу с точки зрения бизнеса особо незачем. Александр Смирнов: Я ожидал намного меньше, чем в итоге представили. Я ждал прогресса по Material Design, добавление ML-инструментов для разработчиков, выхода Constraint Layout 2. В mobile-сегменте Google добился уверенной победы в 87 % рынка с позитивными трендами, а последние несколько лет был виден выход ML в качестве их основного направления работы. Но мы увидели огромный шаг в наведении порядка и поддержке разработчиков. 0. Привет, Android X. Неожиданно порадовали новинки в AJP и начало борьбы за улучшенный Support.

Лишь бы ничего не сломали. Денис Неклюдов: Я придерживался главного правила поездок на продуктовые конференции: не ждать анонсов, революционных изменений, подарков — ничего, кроме встречи со старыми приятелями. Но было и много позитивного. Но нет, они представили Android X, миграция на который не самый приятный процесс в больших проектах. Самое ценное в Google I/O — это общение с разработчиками фреймворка и коллегами по цеху.

Какие новинки уже успели применить на практике?

У меня в проекте проверенный набор решений, нет никакого желания спешить и внедрять новые компоненты. Денис Неклюдов: Из AJP опробовали только миграцию на Android X. Ждем, когда сделают доступными обещанные улучшения для тестирования. Просто поддержали Target SDK 28, проверили на недавнем релизе Android Pie и успокоились. Большинство новинок пока не готовы для релизных версий приложений. Jetpack сейчас — это собранные в одном месте различные маленькие библиотеки, которые иногда делают жизнь разработчиков чуть-чуть легче и приятнее.

Люблю схлопывать кучу кода в несколько строк. Александр Смирнов:
Из представленных новинок я попробовал все, но в production мы только обновили приложение на новый Material Design и применили Android KTX, который понравился своей простотой и удобством. Остальное закинули в pipeline и перейдем в этому году.

Но да, некоторые разделы пока что в альфе, поэтому на этапе разработки могут вылезать небольшие проблемы. Jetpack успешно выполнит поставленные задачи, и вам понравится его использовать. Тащить в production инструменты в состоянии альфы я бы не рекомендовал, но с тем же Kotlin меня это не остановило. Это нормально.

Для Android всегда остро стоял вопрос удобной навигации.
С AJP что-нибудь поменяется?

Можно легко запутаться в большой карте экранов. Денис Неклюдов: В Android навигация всегда была мощной и разнообразной: Activity, Fragment, еще нужно DeepLinks обрабатывать и следить за передаваемыми аргументами. Google как раз стараются решить это новым Navigation, который даже встроен в Android Studio со своим реактором иерархии экранов.

Пока в Navigation есть серьезные баги и он не готов к использованию в опубликованных приложениях. Я пользуюсь самодельными решениями, которые соответствуют требованиям и общей архитектуре проекта.

В крупных приложениях навигация может стать сложной настолько, что запомнить все варианты переходов нереально. Александр Смирнов: В Jetpack Google сделали серьезный шаг вперед: появился Navigation, который изменит архитектуру приложений в лучшую сторону. Было несколько альтернатив, которые пытались это решить: Cicerone, Flow, Conductor. А их еще нужно запрограммировать и протестировать. Ни один из них не является таким функциональным.

Реализована удобная обработка DeepLinks с поддержкой воспроизведения всего дерева переходов. В первую очередь стоит отметить Navigation Editor: с ним удобно строить и графическую диаграмму переходов, и приятно управлять ею с помощью мыши. Первые мы можем создавать сами через удобное DSL и вызывать как PendingIntent через определенное действие. Navigation Component делит работу с DeepLinks на два кейса: Explicit и Implicit. Они по-разному создаются и вызываются, но идентично обрабатываются c помощью графа навигации и полной поддержки построения стека для открытия необходимого раздела. Второе — это привычные нам DeepLinks, например, из браузера. Обрабатывать DeepLinks никогда не было так просто.

Как она меняет работу с RecyclerView? В AJP была добавлена Paging Library.

В Paging Library Google представил свое решение данной проблемы. Денис Неклюдов: У RecyclerView всегда был недостаток: нужно потратить много времени на решение, которое осуществит постраничную загрузку в обе стороны, да еще и с возможностью перескакивать на разные участки этого бесконечного списка.

Все мы для ускорения отображения больших наборов данных разбиваем их на страницы и работаем с ними. Александр Смирнов: Библиотека повторяет рутинную операция большинства Android-разработчиков — работу со списками. Дополнительно компонент умеет работать над загрузкой данных из нескольких источников и миксовать их. С помощью Paging Library подобная работа становится простой, так как мы получаем реализацию из коробки. Кроме того, добавлена kill-feature работа со снапшотами или нестабильными данными — компонент может сам понимать, что было изменено и какие элементы нужно закинуть в центр списка, а какие — в начало. Также мы получаем интересную идею с Placeholders, когда в момент дозагрузки данных можно показать красивые заглушки вместо вечных спиннеров.

Собственно, с помощью PagedList можно работать с данным порциями, загружать из нескольких источников. По сути, этот компонент был создан для работы в связке с RecyclerView, но Paging Library состоит из двух основных частей: PagedList и PagedListAdapter.

Как он меняет работу с фоновыми задачами? Одной из новинок стал Workmanager.

Можно передавать данные в исполняемую задачу и получать из нее результат. Александр Смирнов: Он помогает планомерно уйти от всемогущих сервисов к удобному API в Jetpack: позволяет добавлять необходимость выполнения условий окружения для запуска задачи, задавать порядок выполнения задач и цепочек. У него три огромных преимущества: не нужен Google Play на устройстве, можно запускать задачи только при соблюдении определенных условий, можно создавать цепочки задач.

После появления WorkManager необходимость в них отпадает. Ни один из прошлых аналогов не был самодостаточен, поэтому существовала такая библиотека, как Android-Job от Evernote, которая использовала все аналоги сразу.

С тем, что отложенную задачу просто так в Service выполнить не удастся, разработчики столкнулись с выходом Android Marshmallow и приходом Doze Mode. Денис Неклюдов: У Google получилась такая большая обертка над всеми существующими решениями для работы с фоновыми задачами. И с каждой версией таких ограничений все больше и больше. Теперь приложение не может делать все, что ему вздумается. Для этого была создана обертка в виде GCM network manager и переписана еще раз в виде Firebase Job Dispatcher. Еще с Lollipop нам доступен JobScheduler, который запускает фоновые задачи при определенных условиях и с согласия системы, но у него есть баги на ранних версиях и неясно, как с ним работать в версиях Android, где его нет. Но и они оказались неидеальны — так на свет появилась их современная замена WorkManager, который берет на себя задачу выполнения фоновых задач на любой версии Android без багов.

Что в ней интересного? В AJP была добавлена новая возможность — Slices.

Они позволяют пользователю чаще видеть ваше приложение и быстрее пользоваться необходимой его частью: перейти сразу в нужный раздел, переключить необходимую фичу. Александр Смирнов: В первую очередь Slices стоит показать вашему продакту и маркетологу. Также Slices позволяют участвовать вашему приложению среди поисковой выдачи в Google Search, а также в дальнейшем смогут встраиваться в Google Assistant.

Можно выделить три группы: навигация, выполнение задачи, возвращение к данным. В Slices можно вывести функции, которые связаны с типом вашего приложения и его возможностями. В целом от Slices пользователи получают более простое и быстрое взаимодействие, разработчики — больше трафика и возможностей вернуть пользователя в приложение.

Slices решают именно такую задачу, позволяя приложению декларировать UI и действия с ним, который будет встроен в сторонние приложения, в том числе и в поиск. Денис Неклюдов: Признайтесь, вам давно не хватало возможности получать в приложениях информацию с интерактивными элементами из приложений прямо из поиска. д. Я очень жду, когда в интерфейсе Google Assistant на смартфоне новости будут встроены из Feedly, фотки прошлого из Timehop, мои полеты из App in the Air, маршрут до работы «Я.Навигатор» и т.

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

А какие есть ограничения?

За универсальность всегда нужно платить. Александр Смирнов: Slices пока сильно урезан шаблонами: куча приложений встраивается в другие и пользователю нужно понимать, что механизм взаимодействия будет другой. Расширение функционала, конечно же, будет, но не думаю, что от этого стоит ждать чего-то большого. Если вы вспомните Widgets, они также были сильно ограничены.

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

Каковы ваши впечатления от нее? Google добавил в AJP библиотеку для работы с KTX.

KTX — это набор extensions для более приятного использования Android API в повседневных задачах. Александр Смирнов: Отличный инструмент, это как раз то, чего очень долго не хватало.

Он дает удобство, скорость и хорошее настроение при разработке. Очень рекомендую перейти на него всем Android-разработчикам, чтобы повысить продуктивность. С помощью KTX можно еще больше схлопывать boilerplate и получать аккуратный, хорошо читаемый код.

А так никаких подводных камней больше нет, смело можно брать в бой. Но нужно хорошенько изучить extensions, которые KTX предоставляет, и просмотреть исходный код этих расширений, чтобы понимать, что там происходит «под капотом».

Так родился проект с набором статических функций, расширяющий синтаксис фреймворка. Денис Неклюдов: Разработчики AJP пришли к правильному решению: фреймворк должен быть более дружелюбным к Kotlin. К примеру, view.isVisible идет как короткая альтернатива для view.getVisibility()==View. В Kotlin много удобных возможностей языка, и как раз extension-функции позволяют обращаться к классам фреймворка в удобной манере. Visible.

Конечно, можно жить и без них, как, собственно, и без Kotlin. Там очень много различных функций, лучше посмотрите сами. Но так приятнее.

Как вы к этому относитесь?
Какие у него перспективы?
Google всё активнее продвигает Kotlin.

За это время участвовал в миграции трех компаний с Java на Kotlin. Александр Смирнов: К Kotlin я отношусь очень позитивно и с января 2016 использую как основной язык разработки на Android. Java, к сожалению, развивается достаточно медленно, и Kotlin для мобильной разработки — глоток свежего воздуха.

Уже появляются Android-разработчики, у которых Kotlin является первым языком разработки, а Java — что-то малознакомое. Момент, когда Kotlin станет основным языком разработки под Android, — вопрос времени. Но это вопрос отдаленного будущего, которое не факт что наступит. Нас ждет приятное будущее с Kotlin, во всяком случае пока Google не решит построить новую ОС, так сказать, улучшенный Android.

Это вовсе не означает, что в 2018-м разработчик на Java под Android — какой-то отщепенец или представитель меньшинства. Денис Неклюдов: Не могу сказать, что Google активно продвигает Kotlin, скорее некоторые проекты, связанные с самим фреймворком, становятся дружелюбными к Kotlin. Но факт, что Kotlin все увереннее и быстрее становится языком по умолчанию для разработчиков, и это не может не радовать.

Многие ждут, когда он станет языком для всего: Android, iOS, Web, Embeded… Планы у JetBrains наполеоновские. Когда слышишь о Flutter — кросс-платформенном фреймворке для мобильных приложений от Google, сразу эхом доносится Kotlin Native, который компилируется как под Android, так и под iOS. Мы же наблюдаем, репортим баги, бетатестим и получаем удовольствие от приятного языка, на который с минимальной болью нам удалось мигрировать свои проекты.

Как он себя показал? Прошло уже более трех месяцев с выхода Android AJP.

А в качестве бонуса еще сильнее упростили вход новичкам в Android-разработку. Александр Смирнов: C помощью AJP Google планировал помочь Android-разработчикам создавать высококачественные приложения еще быстрее и без зоопарка дополнительных решений. Думаю, с поставленной задачей Jetpack справился.

Но точно сказать мы сможем примерно через 6–12 месяцев, когда придем к релизу большинства нововведений. Получился классный набор, решающий задачи большинства разработчиков. Пока это останавливает многих на пути к началу использования AJP в production.

Это хорошая идея — объединить их все под одним модным, ярким именем. Денис Неклюдов: Google не делал AJP с нуля, а соединил много полезных наработок, которые не входят в сам фреймворк и доупаковываются в приложения их разработчиками. Как минимум это удобно. Разработчикам хорошо, что теперь есть единый ресурс, где можно найти официальное решение множества проблем.

От самого фреймворка стойкое ощущение бета-версии, я уж не буду давить на больное и обсуждать IDE. Конечно, не все, что входит в этот набор, уже готово для использования в серьезных приложениях, что-то до сих пор на стадиях активной разработки и отладки. Но мы в Android привыкшие.

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

Что может появиться нового в следующем году? Какие перспективы развития AJP?

Затем я бы ожидал планомерного развития каждого из компонентов и инструментария, возможно незначительное добавление чего-то нового. Александр Смирнов: Сейчас мы имеем много новых разработок, поэтому в первую очередь их необходимо финализировать и стабилизировать. Чего точно стоит ждать в следующем году, так это более плотной и удобной интеграции с Android Studio. Jetpack был шагом вперед, поэтому от следующего года я ожидаю планомерных улучшений, а вот еще через год может быть и очень интересно.

С каждой версией Android будет развиваться и основа Jetpack в виде AppCompat и Material Components. Денис Неклюдов: AJP будет расширяться с каждой новой решенной задачей, которую вынесли в открытый доступ. Что появится в ближайшее время — сложно сказать, я жду, когда добавят Nitrogen — пакет утилит для тестирования приложений в большом масштабе.

Глобально Google постоянно расширяет возможности браузера, к чему это может привести в перспективе?

Если у команды Chrome достаточно ресурсов на развитие AMP, PWA, а теперь еще и WebAssembly, это не означает, что есть заговор взять и перевести всех на веб к 202… году. Денис Неклюдов: Я постоянно повторяю, что не надо воспринимать некоторые шаги Google как что-то глобальное и централизованное. Этим летом Jake Wharton выступил на Droidcon Berlin с докладом о том, как размывается линия между вебом и нативными приложениями. Как и разработка Flutter не означает, что все мы станем использовать этот фреймворк, а потом Android и вовсе будет обречен умереть, ведь сначала ChromeOS, а потом и Fuchsia захватят все устройства пользователей. Однако если вы верите, что интернет может во всем мире быть очень высокоскоростным, стабильным и дешевым, то тогда, может, и есть у веб-приложений шанс доминировать. Из доклада можно вывести, что в современной ситуации нужно как следует поддерживать все платформы отдельно и стараться переиспользовать код между ними. Но пока в это слабо верится.

Выбирая PWA-приложение вместо мобайла, компания упрощает разработку, использование, обновление и привлечения пользователей. Александр Смирнов: Переход с нативных приложений на Progressive Web Apps — мечта миллионов веб-разработчиков, менеджеров продуктов и огромного количества других людей. PWA — хорошее решение для большого сегмента простых мобильных приложений, а полностью отказаться от нативной разработки мы сможем очень нескоро.

Ну а кому интересно послушать новости из мира Android разработки в живую, узнать ещё много интересного про последние коварные планы Анклава Google, пообщаться с экспертами напрямую, ждём на нашей конференции AppsConf 2018.

Для тех, кто предпочитает изучать всё дома, у нас есть YouTube-канал, где будут выложены видеозаписи AppsConf (через несколько месяцев после конференции).

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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть