Эволюция разработки под Android

Отправной точкой истории разработки Android считается начало 2000-х. Энди Рубин, Рич Майнер, Ник Сирс, Крис Уайт основывают Android Inc. Уже в 2005 Google выкупает их. Поначалу первый смартфон на базе Android планировался больше быть похожим на Blackberry.

BlackBerry 8820, BlackBerry Bold 9900 и BlackBerry Classic (источник)

Но в 2007 выходит первый iPhone, который имел сенсорный экран. Конечно, в то время такой экран был в новинку, но людям понравилось, и данная технология обрела популярность. Из-за этого Google сместила акцент на сенсорные экраны. И уже в 2008 Google запустила свою ОС — Android. Первым смартфоном на её базе стал HTC Dream.

Источник

Так началась история самой популярной ОС. Постоянные обновления, отличная поддержка — некоторые причины её массовости. Ещё не стоит забывать, что Android опирается на ядро Linux — систему с открытым исходным кодом. Более того, Android сам является системой с открытым исходным кодом. Вдобавок, возможность реализовывать приложения на Java сделало данную ОС очень популярным среди разработчиков. Но сегодня приоритетным языком программирования для Android-разработки является Kotlin. Это лишь малая часть того, что поменялось с 2008. В данной статье представлена история разработки под Android. Остановлюсь на знаковых технологиях, библиотеках, архитектурах и т.д.

Отправная точка

Как уже было указано выше, поначалу разрабатывали Android-приложения с помощью Java. Google решила использовать этот язык из-за его популярности. Ведь Java имеет огромное сообщество разработчиков и сегодня. Также стоит упомянуть, что Android-приложения можно писать на С++. Но он не стал таким же популярным.

Ещё для создания Android-приложений использовали Android SDK, куда также входит эмулятор для тестирования приложений без физического устройства. А в качестве среды разработки использовался Eclipse с плагином Android Development Tools.

1d62ca87693c84ade5ce9115d338dd86.png

Для вёрстки экрана применяли XML. Очень удачное решение со стороны Google, так как XML используется в передаче данных и потому знаком большинству разработчиков. Всё это выстраивается на основе layout. Layout — способ организации пользовательского интерфейса в приложении. Существуют различные типы layout. В то время стандартным layout в разработке был RelativeLayout или LinearLayout. RelativeLayout позволяет разработчикам определять расположение элементов UI относительно друг друга или относительно родительского контейнера. LinearLayout используется для организации элементов пользовательского интерфейса  в виде линейного списка по горизонтали или вертикали.

Для прокручиваемого списка элементов использовался компонент ListView. Однако сейчас ListView считается устаревшим и его заменил RecyclerView. Но об этом будет рассказано далее. Большой недостаток ListView — проблемы производительности при безграничном списке.

Общепринятой архитектуры в те времена не было. Поэтому каждый сам выбирал, как ему лучше структурировать свой код.

Для выполнения короткой (не более нескольких секунд) трудоёмкой работы в фоновом режиме использовали абстрактный класс AsyncTask, от которого нужно наследоваться. С Android 11 он считается устаревшим. Для выполнения более продолжительной работы была возможность применять различные API пакета java.util.concurrent (Executor, ThreadPoolExecutor, FutureTask). Для сетевого запроса было достаточно и AsyncTask.

И что дальше? А дальше Android Studio

В 2013 году на смену Eclipse с плагином Android Development Tools приходит более удобная среда разработки Android Studio, которая включается в состав Android SDK. Большим плюсом является то, что IDE находится в свободном доступе и поддерживается на Windows, macOS и Linux. Также из интересного — Android Studio основана на IntelliJ IDEA (IDE от JetBrains). А ещё каждая версия Android Studio, начиная с 2020.3.1, посвящена какому-нибудь животному или насекомому. Последняя версия на момент написания статьи посвящена игуане.

d24b343b6e52249a0fb8790f94737da6.png2a17bed4d5f9f665dd7cb52923391178.png

Период MVP (Model-View-Presenter)

И вот сообщество разработчиков решило ввести свою архитектуру — MVP.

Model — это классы для взаимодействия с сервером и базой данных. View — то, что видит пользователь. В Android-разработке View может быть, например, Activity. Ну, а Presenter — это посредник между View и Model.

View обращается к Presenter, если на экране пользователь что-то сделал. Presenter обрабатывает эти действия, вызывает соответствующие методы Model для получения данных и обновляет View.

Разработчики решили стандартизировать архитектуру Android-приложений, что, безусловно, стало большим шагом вперёд.

b91d5dd888c0f783e1b874b31c07e566.png

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

Также стоит упомянуть XML-макеты. Google начал рекомендовать ConstraintLayout. На таком макете у каждого элемента есть ограничения (constraints), которые позволяют его гибко настраивать относительно других элементов. Например, layout_constraintLeft_toLeftOf, layout_constraintBaseline_toBaselineOf. Также, в отличие от RelativeLayout и LinearLayout, в ConstraintLayout во многих случаях не нужно вкладывать несколько макетов, что ускоряет производительность рендеринга.

Также на замену ListView пришёл RecyclerView, который более эффективен и имеет больше возможностей для кастомизации списка и прокрутки. Также исчезла проблема, связанная с бесконечным списком, так как RecyclerView повторно использует ранее созданные контейнеры (в одном контейнере хранится один элемент списка). Но RecyclerView более сложный в использовании, чем ListView.

Dagger 2

В 2015 году разработчики из Google представили Dagger 2. Если существует Dagger 2, то должен быть и Dagger 1, верно? Верно. Dagger 1 был представлен в 2012 г. компанией Square (они же, кстати, выпустили такие библиотеки, как Retrofit и Picasso. Ну и множество других прекрасных библиотек). В чём же суть Dagger 2? Это фреймворк для внедрения зависимостей, который генерирует код, тем самым облегчая жизнь разработчикам. Основное отличие Dagger 1 от Dagger 2 заключается в механизме работы. Dagger 2 использует генерацию на этапе компиляции, а Dagger 1 основана на рефлексии. Такое нововведение улучшает эффективность. А ещё ошибки, связанные с Dagger 2, будут выявлены на этапе компиляции.

Flutter

7a9e9fe19df07a913e910ad41260ff11.png

В 2015 г. выходит первая версия Flutter от Google. Это новый фреймворк, с помощью которого можно реализовывать приложения как для iOS, так и для Android. Но вначале была поддержка только Android, а возможность реализации для мобильной ОС Apple появилась позже. Также позже можно будет делать веб-приложения, настольные приложения под Windows, macOS и Linux. Вместо Kotlin используется язык Dart, который не сильно отличается от Kotlin и Java. На сегодняшний день Flutter сосуществует с нативной разработкой под Android и имеет более высокий порог вхождения.

Instant Apps

В 2016 году были анонсированы Instant Apps, а первые приложения появились уже в 2017. Благодаря этой технологии пользователь может нажать на специальную ссылку или кнопку, что позволяет открыть определенный раздел приложения, не загружая и не устанавливая приложение полностью. Instant Apps также позволяют пользователям попробовать приложение перед его установкой в Google Play.

8921d55d5493b0f234bf34adb58ccab2.jpg

Всё это достигается благодаря модульному подходу при разработке приложений и Deep Link«ам.

Появление Kotlin

7a9bb343d9d44ec5643043ae64024b5c.png

Вообще Kotlin появился раньше, но именно в 2017 году Google объявляет Kotlin основным языком программирования для Android-разработки. Модный, стильный, молодёжный. И что немаловажно — более безопасный (привет, NullPointerException). К тому же синтаксис похож на Java. А ещё Kotlin работает поверх JVM. А это значит, что Kotlin совместим с Java. Следовательно, миграция с Java на Kotlin будет происходить легче. Ещё одним преимуществом является поддержка функционального программирования.

Конечно, с развитием технологий появились варианты использовать другие языки программирования. Например, C#, Python. И каждый язык даёт свои уникальные возможности для разработки под Android. Но в этой статье я пропущу такие технологии, как, например, React Native, Xamarin.

Период MVVM (Model-View-ViewModel)

И тут Google начинает пропагандировать архитектуру MVVM. Вместо Presenter«a теперь ViewModel. ViewModel предоставляет данные для View и обрабатывает действия пользователя. И что немаловажно, хранит состояние при изменении конфигурации интерфейса (например, когда поворачивается экран). А ещё класс ViewModel является компонентом Jetpack (о котором будет сказано далее), поэтому разработчикам не нужно создавать самим класс ViewModel.

5bbab3fc1515301391892ab139d65e96.png

Для хранения данных Google представила LiveData, который реализует принцип паттерна Observer. Таким образом, из View идёт подписка к LiveData. Когда ViewModel получает данные из Model, эти значения отображаются на экране.

На смену RxJava пришли корутины (Coroutines). Они представляют собой вычисления, работающие в контексте реальных потоков, но при этом данные вычисления выполняются асинхронно и являются более легковесными по сравнению с обычными потоками. Всё работает примерно таким образом: корутина может быть приостановлена и возобновлена в любой момент выполнения. Когда она приостанавливается, выполнение передается обратно в вызывающий код, который затем через какое-то время продолжит её работу. В случае возобновления корутины выполнение начинается с того места, где она была приостановлено. И благодаря тому, что корутины позволяют писать последовательный код, в отличие от RxJava, код стало легче читать. Это всё дало корутинам популярность в Android-разработке. Например, чтобы указать, что функция будет выполняться асинхронно, достаточно добавить модификатор «suspend» этой функции.

Иcточник

Не APK, а AAB

В 2018 Google представляет миру AAB. Это новый стандартный формат публикаций приложений, хотя APK никуда не делся. Если коротко, то AAB позволяет собирать приложения, которые поддерживают различные устройства и языки, без необходимости создавать отдельные APK файлы для каждой конфигурации. Да, из-за многообразия девайсов на Android, нет какого-то универсального APK, который подходит любым устройствам. AAB же призван исправить это, так как по сути новый формат является архивом со всеми нужными файлами.

Android Jetpack

e7319f4e51d4d243361b76ee3aae7b00.png

Ещё стоит упомянуть Android Jetpack — набор компонентов и инструментов для разработки Android приложений, представленный Google в том же 2018 году. Android Jetpack включает библиотеки, предлагающие готовые решения для задач, с которыми обычно сталкиваются Android-разработчики, такие как работа с жизненным циклом приложения, обработка данных, навигация и т.д.

На самом деле, это ещё и переломный момент в отношении стандарта создания приложений. Многие сторонние библиотеки стали менее популярными, потому что разработчик теперь может сделать то же самое с помощью Android Jetpack.

Рукоять кинжала

В июне 2020 выходит альфа-версия Dagger Hilt. Это новая библиотека для внедрения зависимостей. Отличается от Dagger 2 тем, что позволяет использовать возможности Dagger 2 упрощённым способом, так как Dagger Hilt автоматически генерирует код для DI, что упрощает процесс настройки и уменьшает объем написания необходимого кода.

Наши дни

От XML к Compose

6d37f5efc14ce0b43ef9717bf24e5155.png

В 2019 году компания Google анонсирует Jetpack Compose. А в 2021 сначала выпускает бета-версию, а затем и версию 1.0. Это ещё один большой шаг к изменению созданию приложений под Android. Теперь вместо XML-макетов разработчик может использовать библиотеку Compose и создавать UI с помощью декларативного подхода на языке Kotlin.

Что интересно, также существует Compose Multiplatform. Благодаря этой технологии создавать UI на Compose можно также для iOS, macOS, Windows, Linux и веба.

Flow

Ещё одним изменением нынешнего этапа можно считать замену LiveData на Flow, представленный в библиотеке Kotlin Coroutines. Flow является потоком значений, работающим асинхронно на основе корутин.

AI и ML

С развитием искусственного интеллекта и машинного обучения Android приложения также стали предоставлять функции, связанные с ИИ и машинным обучением. TensorFlow и другие ML-фреймворки имеют поддержку Android, что позволяет разработчикам добавлять такие функции, как распознавание голоса, систему рекомендаций и т.п.

Заключение

Конечно, не всё в этой статье рассказано. Можно было бы написать про базы данных, отличия Android API, разработку для Android TV и Wear OS и многое другое. Не уверен, что получится всё перечислить. Я только хотел провести ретроспективу, показать как изменилась Android-разработка за эти неполные 16 лет. Ведь изменилось многое. И мне кажется, что как Android, так и вся мобильная разработка будут продолжать динамично меняться и развиваться.

© Habrahabr.ru