Мобильные приложения на 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 Compose | UI на 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, корутины из коробки |
| UI | Jetpack 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):
| Проект | Путь | Тип | Чему учит |
|---|---|---|---|
| KotlinMobileApp | F:\Projects\JVM\Kotlin\KotlinMobileApp | Простое приложение | Compose, rememberSaveable, Material3, strings.xml |
| Kotlinochi | F:\Projects\JVM\Kotlin\Kotlinochi | Игра-тамагочи | MVVM, DataStore, корутины, игровой цикл показателей, Canvas |
| Практикум | Статья | Время |
|---|---|---|
| Счётчик — первое приложение | KotlinMobileApp | 1–2 ч |
| Тамагочи "Коточи" | Kotlinochi | 3–5 ч |
Если Compose ещё не открывали — сначала первый экран Compose, затем KotlinMobileApp. Для игры с сохранением и таймером — Kotlinochi после корутин и Flow.
Рекомендуемый маршрут
| Шаг | Материал | Что получите |
|---|---|---|
| 1 | Первая программа + Compose | Hello World в эмуляторе |
| 2 | Kotlin в мобильных | Activity, Jetpack, MVVM, nullable |
| 3 | Практикум KotlinMobileApp | Счётчик с кнопкой, переживает поворот |
| 4 | Корутины → Flow | viewModelScope, StateFlow, collectAsState |
| 5 | Практикум Kotlinochi | Игра с DataStore и decay-циклом |
| 6 | Сборка APK → публикация | Установка на свой телефон |
После шага 5 логично прочитать Room + ViewModel — тот же паттерн, но с SQL вместо key-value.
Kotlin и другие мобильные стеки
| Критерий | Kotlin + Compose | Flutter | React Native |
|---|---|---|---|
| Платформы | Android (iOS — через KMP отдельно) | iOS + Android одним кодом | iOS + Android |
| Язык UI | Kotlin | Dart | JavaScript / 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 — при изменении
StateCompose перерисовывает только затронутые виджеты (229.md). - ViewModel переживает поворот: Activity уничтожается, ViewModel — нет (пока процесс жив).
Частые ошибки
| Симптом | Вероятная причина | Куда смотреть |
|---|---|---|
| Счётчик сбрасывается при повороте | remember вместо rememberSaveable или нет ViewModel | 229, KotlinMobileApp |
| ANR "приложение не отвечает" | Диск или сеть в main thread | 222, viewModelScope |
| Gradle не видит Compose | Нет buildFeatures { compose = true } или BOM | KotlinMobileApp, этап 0 |
INSTALL_FAILED на телефоне | Debug-подпись, старая версия, USB-отладка | 1121 |
| Статы игры не сохраняются | Нет repository.save после изменения | Kotlinochi, этап 3 |
Что попробовать
- Пройти KotlinMobileApp и вынести все строки в
strings.xml+ добавитьvalues-en. - В Kotlinochi уменьшить
DECAY_INTERVAL_MSдо 5 секунд и наблюдать offline decay после сворачивания приложения. - Собрать debug APK и установить по USB — 1121.
- Сравнить KotlinMobileApp (без ViewModel) и Kotlinochi (полный MVVM) — один и тот же Compose, разная глубина архитектуры.