Отправной точкой истории разработки Android считается начало 2000-х. Энди Рубин, Рич Майнер, Ник Сирс, Крис Уайт основывают Android Inc. Уже в 2005 Google выкупает их. Поначалу первый смартфон на базе Android планировался больше быть похожим на Blackberry.
![BlackBerry 8820, BlackBerry Bold 9900 и BlackBerry Classic (источник) BlackBerry 8820, BlackBerry Bold 9900 и BlackBerry Classic (источник)](https://habrastorage.org/getpro/habr/upload_files/62e/1e0/069/62e1e0069a6aeced1d14b525e1c1f436.jpg)
Но в 2007 выходит первый iPhone, который имел сенсорный экран. Конечно, в то время такой экран был в новинку, но людям понравилось, и данная технология обрела популярность. Из-за этого Google сместила акцент на сенсорные экраны. И уже в 2008 Google запустила свою ОС — Android. Первым смартфоном на её базе стал HTC Dream.
![Источник Источник](https://habrastorage.org/getpro/habr/upload_files/453/e58/99b/453e5899b3ca5aac7f66f1b9a384f6dc.png)
Так началась история самой популярной ОС. Постоянные обновления, отличная поддержка — некоторые причины её массовости. Ещё не стоит забывать, что Android опирается на ядро Linux — систему с открытым исходным кодом. Более того, Android сам является системой с открытым исходным кодом. Вдобавок, возможность реализовывать приложения на Java сделало данную ОС очень популярным среди разработчиков. Но сегодня приоритетным языком программирования для Android-разработки является Kotlin. Это лишь малая часть того, что поменялось с 2008. В данной статье представлена история разработки под Android. Остановлюсь на знаковых технологиях, библиотеках, архитектурах и т.д.
Отправная точка
Как уже было указано выше, поначалу разрабатывали Android-приложения с помощью Java. Google решила использовать этот язык из-за его популярности. Ведь Java имеет огромное сообщество разработчиков и сегодня. Также стоит упомянуть, что Android-приложения можно писать на С++. Но он не стал таким же популярным.
Ещё для создания Android-приложений использовали Android SDK, куда также входит эмулятор для тестирования приложений без физического устройства. А в качестве среды разработки использовался Eclipse с плагином Android Development Tools.
![](https://habrastorage.org/getpro/habr/upload_files/1d6/2ca/876/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, посвящена какому-нибудь животному или насекомому. Последняя версия на момент написания статьи посвящена игуане.
![](https://habrastorage.org/getpro/habr/upload_files/d24/b34/3b6/d24b343b6e52249a0fb8790f94737da6.png)
![](https://habrastorage.org/getpro/habr/upload_files/2a1/7be/d4d/2a17bed4d5f9f665dd7cb52923391178.png)
Период MVP (Model-View-Presenter)
И вот сообщество разработчиков решило ввести свою архитектуру — MVP.
Model — это классы для взаимодействия с сервером и базой данных. View — то, что видит пользователь. В Android-разработке View может быть, например, Activity. Ну а Presenter — это посредник между View и Model.
View обращается к Presenter, если на экране пользователь что-то сделал. Presenter обрабатывает эти действия, вызывает соответствующие методы Model для получения данных и обновляет View.
Разработчики решили стандартизировать архитектуру Android-приложений, что, безусловно, стало большим шагом вперёд.
![](https://habrastorage.org/getpro/habr/upload_files/b91/d5d/d88/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
![](https://habrastorage.org/getpro/habr/upload_files/7a9/e9f/e19/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.
![](https://habrastorage.org/getpro/habr/upload_files/892/1d5/5d5/8921d55d5493b0f234bf34adb58ccab2.jpg)
Всё это достигается благодаря модульному подходу при разработке приложений и Deep Link’ам.
Появление Kotlin
![](https://habrastorage.org/getpro/habr/upload_files/7a9/bb3/43d/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.
![](https://habrastorage.org/getpro/habr/upload_files/5bb/ab3/fc1/5bbab3fc1515301391892ab139d65e96.png)
Для хранения данных Google представила LiveData, который реализует принцип паттерна Observer. Таким образом, из View идёт подписка к LiveData. Когда ViewModel получает данные из Model, эти значения отображаются на экране.
На смену RxJava пришли корутины (Coroutines). Они представляют собой вычисления, работающие в контексте реальных потоков, но при этом данные вычисления выполняются асинхронно и являются более легковесными по сравнению с обычными потоками . Всё работает примерно таким образом: корутина может быть приостановлена и возобновлена в любой момент выполнения. Когда она приостанавливается, выполнение передается обратно в вызывающий код, который затем через какое-то время продолжит её работу. В случае возобновления корутины выполнение начинается с того места, где она была приостановлено. И благодаря тому, что корутины позволяют писать последовательный код, в отличие от RxJava, код стало легче читать. Это всё дало корутинам популярность в Android-разработке. Например, чтобы указать, что функция будет выполняться асинхронно, достаточно добавить модификатор ‘suspend’ этой функции.
![Иcточник Иcточник](https://habrastorage.org/getpro/habr/upload_files/a23/c8e/9fd/a23c8e9fd9afa81f7154f6b7fd2580eb.png)
Не APK, а AAB
В 2018 Google представляет миру AAB. Это новый стандартный формат публикаций приложений, хотя APK никуда не делся. Если коротко, то AAB позволяет собирать приложения, которые поддерживают различные устройства и языки, без необходимости создавать отдельные APK файлы для каждой конфигурации. Да, из-за многообразия девайсов на Android, нет какого-то универсального APK, который подходит любым устройствам. AAB же призван исправить это, так как по сути новый формат является архивом со всеми нужными файлами.
Android Jetpack
![](https://habrastorage.org/getpro/habr/upload_files/e73/19f/4e5/e7319f4e51d4d243361b76ee3aae7b00.png)
Ещё стоит упомянуть Android Jetpack — набор компонентов и инструментов для разработки Android приложений, представленный Google в том же 2018 году. Android Jetpack включает библиотеки, предлагающие готовые решения для задач, с которыми обычно сталкиваются Android-разработчики, такие как работа с жизненным циклом приложения, обработка данных, навигация и т.д.
На самом деле, это ещё и переломный момент в отношении стандарта создания приложений. Многие сторонние библиотеки стали менее популярными, потому что разработчик теперь может сделать то же самое с помощью Android Jetpack.
Рукоять кинжала
В июне 2020 выходит альфа-версия Dagger Hilt. Это новая библиотека для внедрения зависимостей. Отличается от Dagger 2 тем, что позволяет использовать возможности Dagger 2 упрощённым способом, так как Dagger Hilt автоматически генерирует код для DI, что упрощает процесс настройки и уменьшает объем написания необходимого кода.
Наши дни
От XML к Compose
![](https://habrastorage.org/getpro/habr/upload_files/6d3/7f5/efc/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, так и вся мобильная разработка будут продолжать динамично меняться и развиваться.
Комментарии (3)
PavPavel
27.04.2024 06:44Спасибо за статью! Познавательно для тех, кто не в теме разработки под Android. А как дела обстоят сейчас (последние 4 года)? Какие решения позволяют одинаково разрабатывать для Android и iOS (конечно, можно погуглить, но интересно услышать мнение)? И какой порог вхождения?
Ga_Rif Автор
27.04.2024 06:44Спасибо за комментарий!
Помимо упомянутого Flutter, есть React Native, Xamarin. Для работы с этими фреймворками надо знать JS и C# соответственно. Также не упомянул в статье Kotlin Multiplatform, тоже сейчас используется для кроссплатформенной разработки. Не могу сказать про порог вхождения, так как ни разу не работал с ним.
yusufv
Мне кажется, эволюция разработки под Android привела к значительному улучшению инструментов и ресурсов для разработчиков. Платформа постоянно развивается, предлагая новые API, инструменты и библиотеки. Более того, Google активно инвестирует в развитие Android Studio и других средств разработки, предоставляя разработчикам мощные инструменты для создания качественных приложений. В целом, я вижу это как положительную тенденцию, которая способствует развитию мобильной экосистемы и повышению качества приложений для пользователей Android.