Перейти к основному содержимому

Мобильные приложения на Kotlin

Разработчику Архитектору

Мобильные приложения на Kotlin

Kotlin с 2019 года — язык, который Google рекомендует для новых Android-проектов. Это не отдельная платформа: приложение всё равно работает на Android Runtime (ART), использует Activity, жизненный цикл экрана и магазин Google Play — но исходный код пишется лаконичнее и безопаснее, чем на Java.

В разделе Kotlin этой энциклопедии собран языковой маршрут — Compose, ViewModel, корутины, DataStore. Общая дисциплина "мобильная разработка" (ограничения батареи, сенсор, подпись APK, сравнение Flutter и React Native) живёт в разделе "Мобильные приложения".

Развёрнутый обзор Kotlin именно на Android — Kotlin в мобильных приложениях: Activity, Jetpack, MVVM, nullable-типы и первый проект в Android Studio.


Словарь терминов

ТерминПростыми словами
Activity"Окно" приложения на Android; точка входа экрана, управляет жизненным циклом.
Jetpack ComposeUI на Kotlin-функциях @Composable вместо XML-макетов.
ViewModelОбъект, переживающий поворот экрана; хранит данные и логику экрана.
StateFlowПоток "последнее значение состояния" для подписки из UI.
КорутинаЛегковесная асинхронная задача; таймер игры или запись на диск не блокируют UI.
DataStoreСовременная замена SharedPreferences для ключ–значение на диске.
RoomЛокальная SQL-база с ORM поверх SQLite.
Gradle (KTS)Система сборки; версии SDK и библиотек задаются в build.gradle.kts.
APK / AABФайл установки; AAB — формат для загрузки в Google Play.

Подробнее про Activity и Compose — 229.md. Про процессы и потоки — асинхронность, про корутины — 222.md.


Стек учебного Android-приложения

Современный "минимальный продуктовый" стек Google выглядит так:

СлойТехнологияЗачем
ЯзыкKotlinОфициальный стандарт Android, null-safety, корутины из коробки
UIJetpack ComposeДекларативный интерфейс: описываете состояние — фреймворк перерисовывает экран
Состояние экранаremember / ViewModel + StateFlowПережить поворот телефона, отделить логику от отрисовки
Фоновая работаКорутиныТаймеры, сеть, запись на диск без ANR
Локальные данныеDataStore или RoomНастройки и простые модели / полноценные таблицы
СборкаGradle (KTS)Зависимости, minSdk, release-сборка

Когда что выбирать

  • Один экран, одно число, нет сети — достаточно rememberSaveable (KotlinMobileApp).
  • Игра с таймером и сохранением — ViewModel + DataStore + корутины (Kotlinochi).
  • Список заметок с поиском — Room + ViewModel (231.md).

База Compose — Jetpack Compose — первый экран. Асинхронность — корутины и Flow.


Два учебных проекта

Эталонные репозитории на диске (можно открыть в Android Studio и сверять diff):

ПроектПутьТипЧему учит
KotlinMobileAppF:\Projects\JVM\Kotlin\KotlinMobileAppПростое приложениеCompose, rememberSaveable, Material3, strings.xml
KotlinochiF:\Projects\JVM\Kotlin\KotlinochiИгра-тамагочиMVVM, DataStore, корутины, игровой цикл показателей, Canvas
ПрактикумСтатьяВремя
Счётчик — первое приложениеKotlinMobileApp1–2 ч
Тамагочи "Коточи"Kotlinochi3–5 ч
С чего начать

Если Compose ещё не открывали — сначала первый экран Compose, затем KotlinMobileApp. Для игры с сохранением и таймером — Kotlinochi после корутин и Flow.


Рекомендуемый маршрут

ШагМатериалЧто получите
1Первая программа + ComposeHello World в эмуляторе
2Kotlin в мобильныхActivity, Jetpack, MVVM, nullable
3Практикум KotlinMobileAppСчётчик с кнопкой, переживает поворот
4КорутиныFlowviewModelScope, StateFlow, collectAsState
5Практикум KotlinochiИгра с DataStore и decay-циклом
6Сборка APKпубликацияУстановка на свой телефон

После шага 5 логично прочитать Room + ViewModel — тот же паттерн, но с SQL вместо key-value.


Kotlin и другие мобильные стеки

КритерийKotlin + ComposeFlutterReact Native
ПлатформыAndroid (iOS — через KMP отдельно)iOS + Android одним кодомiOS + Android
Язык UIKotlinDartJavaScript / TypeScript
Вид UIНативные Material-компонентыСвои виджеты, единый стильМост к нативным view
Когда выбиратьЦелевой Android, стек GoogleОдин код на две ОС, свой дизайнУже есть React-команда

Практические следствия

  • Kotlin + Compose — максимальная интеграция с Android (уведомления, фоновые сервисы, Play Billing) без "моста".
  • Flutter — быстрее вывести один UI на iOS и Android; см. Flutter.
  • React Native — переиспользование навыков веб-React; см. 11311.

Сравнение сложности сборки — 112.md. AAA-игры на Unity / Unrealраздел "Разработка игр". Kotlinochi — учебная 2D-игра на Compose, не игровой движок: весь код на Kotlin, без C# и без редактора сцен.


Как устроено типичное Compose-приложение

  • Activity создаётся системой, вызывает setContent { … } — дальше живёт дерево Composable.
  • Recomposition — при изменении State Compose перерисовывает только затронутые виджеты (229.md).
  • ViewModel переживает поворот: Activity уничтожается, ViewModel — нет (пока процесс жив).

Частые ошибки

СимптомВероятная причинаКуда смотреть
Счётчик сбрасывается при поворотеremember вместо rememberSaveable или нет ViewModel229, KotlinMobileApp
ANR "приложение не отвечает"Диск или сеть в main thread222, viewModelScope
Gradle не видит ComposeНет buildFeatures { compose = true } или BOMKotlinMobileApp, этап 0
INSTALL_FAILED на телефонеDebug-подпись, старая версия, USB-отладка1121
Статы игры не сохраняютсяНет repository.save после измененияKotlinochi, этап 3

Что попробовать

  1. Пройти KotlinMobileApp и вынести все строки в strings.xml + добавить values-en.
  2. В Kotlinochi уменьшить DECAY_INTERVAL_MS до 5 секунд и наблюдать offline decay после сворачивания приложения.
  3. Собрать debug APK и установить по USB — 1121.
  4. Сравнить KotlinMobileApp (без ViewModel) и Kotlinochi (полный MVVM) — один и тот же Compose, разная глубина архитектуры.