Мобильные приложения — итоги
Кратко — что стоит унести из раздела "Мобильные приложения". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои и ситуации, с которыми сталкиваются новички в мобильной разработке. Здесь — что делать и где копать в главах; формулировки для самопроверки — в чек-листе.
Вопрос. На телефоне после установки APK всплывает "App keeps stopping" — с чего начать?
Ответ. Подключите устройство по USB, откройте Logcat в Android Studio и воспроизведите краш — ищите stack trace в onCreate или на главном потоке. Частая причина — необработанное исключение при старте или обращение к null. Подробнее здесь — отладка по USB, обзор платформ.
Вопрос. Собрал APK, отправил другу — "Приложение не установлено". На эмуляторе всё работало.
Ответ. Проверьте release-подпись (debug-сборку нельзя обновлять поверх release), архитектуру процессора (arm64-v8a vs старый armeabi), минимальную версию Android и что файл не обрезался при пересылке в мессенджере. Подробнее здесь — публикация Android, сборка.
Вопрос. Gradle на Windows падает с "Filename longer than 260 characters" или после обновления JDK.
Ответ. Укоротите путь к проекту, для RN/Expo используйте JDK 21 (не 24), выполните gradlew clean. На Windows длинные пути — частая причина сбоев React Native и Expo. Подробнее здесь — сборка и сравнение стеков.
Вопрос. Хочу iOS-версию, но у меня только Windows — это вообще возможно?
Ответ. Сборка под iPhone требует macOS и Xcode — это ограничение экосистемы Apple, а не "неправильная настройка". На Windows можно готовить кроссплатформенный код (Flutter, RN), но финальную сборку и подпись IPA делают на Mac или в облачном CI с macOS-агентом. Подробнее здесь — обзор, о разделе.
Вопрос. Expo Go на телефоне не видит проект с ноутбука — QR сканируется, но экран пустой.
Ответ. Телефон и ПК должны быть в одной сети или запустите expo start --tunnel. Корпоративный Wi‑Fi и VPN часто блокируют локальные порты. Подробнее здесь — Expo, первая программа на Expo.
Вопрос. После поворота экрана форма сбрасывается — пользователь теряет введённые данные.
Ответ. При смене конфигурации Activity может пересоздаваться. Сохраняйте состояние через ViewModel, rememberSaveable (Compose) или явный onSaveInstanceState, а не только переменные в памяти экрана. Подробнее здесь — обзор жизненного цикла, Kotlin и Compose.
Вопрос. Приложение в фоне "убивается" — пропадает авторизация или обрывается загрузка.
Ответ. iOS и Android ограничивают фоновую работу: долгие задачи переносите в foreground service (Android), Background Tasks (iOS) или синхронизацию при возврате на экран. Не рассчитывайте на бесконечный фон без явного API. Подробнее здесь — обзор.
Вопрос. Батарея садится за час — в профилере всё зелёное, а телефон греется.
Ответ. Смотрите частоту пробуждений, GPS, фоновые сетевые опросы и анимации на главном потоке. Эмулятор не показывает реальное энергопотребление — проверяйте на устройстве через Energy Profiler или Xcode Instruments. Подробнее здесь — обзор, сборка и тестирование.
Вопрос. Google Play отклонил приложение из‑за "target API level" — что менять в проекте?
Ответ. Поднимите targetSdkVersion до версии, которую требует консоль на момент публикации, прогоните регрессию на новых ограничениях (разрешения, фон, уведомления). Это не "поломка Gradle", а политика магазина. Подробнее здесь — публикация Android, сборка.
Вопрос. Потерял файл keystore — можно ли обновить приложение в Store?
Ответ. Без того же ключа обновить существующее приложение нельзя — только новый package name и новая карточка. Храните keystore в менеджере паролей и резервной копии; для Play рассмотрите App Signing от Google. Подробнее здесь — публикация Android.
Вопрос. Модерация App Store пишет про Privacy Manifest / purpose strings — я просто добавил камеру.
Ответ. Каждое чувствительное API требует объяснения для пользователя в Info.plist и в Privacy Manifest — "зачем приложению камера/геолокация". Без этого отклонят даже рабочий билд. Подробнее здесь — обзор, Swift.
Вопрос. Хочу продавать подписку через свой сайт, а в приложении только ссылку — Apple/Google разрешат?
Ответ. Для цифрового контента и подписок действуют правила In-App Purchase — обход через веб-оплату внутри приложения ведёт к отклонению или удалению. Исключения узкие и зависят от региона и типа товара. Подробнее здесь — обзор, супераппы.
Вопрос. Flutter на Android выглядит иначе, чем "родной" Material — это баг?
Ответ. Кроссплатформа рисует своим движком — pixel-perfect совпадение с нативным UI не гарантируется. Для брендовых экранов закладывайте время на кастомные виджеты и тест на реальных устройствах. Подробнее здесь — Dart, сравнение стеков — сборка.
Вопрос. React Native после npm install ругается на несовместимые версии пакетов — проект "вчера работал".
Ответ. Зафиксируйте версии в lock-файле, проверьте совместимость RN ↔ React ↔ нативных модулей, очистите node_modules и кэш Metro. Слепое обновление одного пакета часто ломает native bridge. Подробнее здесь — React Native, практикум RN.
Вопрос. MAUI-сборка под Android долго качает workloads — можно обойтись без Visual Studio?
Ответ. Для MAUI нужен полный .NET mobile workload — это тяжёлая установка по сравнению с Expo. На CI используйте тот же SDK и workloads, что локально; "только dotnet CLI без workloads" обычно не собирает APK. Подробнее здесь — MAUI, сравнение сложности сборки.
Вопрос. PWA "установилась" на телефон, но push и камера не работают как в нативном app.
Ответ. PWA живёт в ограничениях браузера и ОС — не все API доступны, поведение на iOS отличается от Android. Для Store, фона и глубокой интеграции чаще нужен нативный или гибридный контейнер (Capacitor). Подробнее здесь — PWA, Capacitor.
Вопрос. Запросил разрешение на геолокацию — пользователь нажал "Запретить навсегда", приложение сломалось.
Ответ. Обрабатывайте отказ и повторный запрос — покажите экран "зачем нужно" и кнопку в настройки системы. На Android 11+ есть one-time permissions; код должен работать и без GPS. Подробнее здесь — обзор, компоненты UI Android.
Вопрос. Сеть на метро пропадает — список в приложении пустой, хотя данные уже были.
Ответ. Нужен локальный кэш и понятный офлайн-режим: показывайте последние сохранённые данные, очередь синхронизации при восстановлении сети. "Только online" UX на мобильном воспринимается как баг. Подробнее здесь — обзор, Kotlin.
Вопрос. UI-тест проходит на эмуляторе и падает на Samsung с оболочкой One UI.
Ответ. OEM-оболочки меняют размеры, жесты и тайминги. Держите матрицу реальных устройств или облачную ферму; один эмулятор не покрывает фрагментацию Android. Подробнее здесь — сборка и тестирование, обзор.
Вопрос. Размер APK 150 МБ — пользователи ругаются, Play предлагает AAB.
Ответ. Перейдите на Android App Bundle — Play отдаёт пользователю split по архитектуре и языку. Уберите неиспользуемые native libs, сожмите ассеты, включите ProGuard/R8 для release. Подробнее здесь — сборка, публикация.
Вопрос. Deep link открывает приложение, но не тот экран — маркетинг уже разослал ссылки.
Ответ. Проверьте intent filters / Universal Links, cold start vs warm start, что маршрутизация читает параметры до первого экрана. Тестируйте ссылку из браузера, из push и из другого приложения отдельно. Подробнее здесь — обзор, супераппы.
Вопрос. Хочу сделать "суперапп" с десятью сервисами сразу — с чего начать, чтобы не утонуть?
Ответ. Начните с одного сквозного сценария и модульной архитектуры — единый профиль и платежи добавляют сложность безопасности и модерации. Суперапп без ядра превращается в набор несвязанных WebView. Подробнее здесь — супераппы.
Вопрос. Unity-билд для Android весит сотни мегабайт — это нормально для простой 2D-игры?
Ответ. Движок тащит runtime и ассеты — для лёгкого UI лучше нативный или Flutter/RN стек. Unity/Unreal оправданы, когда нужен их рендер и tooling. Подробнее здесь — Unity и Unreal, сравнение стеков.
Вопрос. RuStore принял APK, а в Google Play та же сборка отклонена — кто прав?
Ответ. У каждого магазина свои правила модерации (разрешения, платежи, контент, target SDK). Готовьте отдельные release notes и иногда разные конфигурации манифеста. Подробнее здесь — публикация Android, о разделе.
Вопрос. Приложение собирает email и телефон — достаточно ли текста "мы не передаём третьим лицам" в описании?
Ответ. Нужны политика конфиденциальности, форма согласия и соответствие GDPR / 152-ФЗ — магазины проверяют декларации данных в консоли. Храните секреты в Keychain / EncryptedSharedPreferences, не в plain text. Подробнее здесь — обзор, публикация.
Вопрос. Переписываю приложение с Java на Kotlin — можно смешивать оба языка в одном модуле?
Ответ. Да, инкрементальная миграция — обычная практика: новые экраны на Kotlin и Compose, старые на Java постепенно. Следите за null-safety на границе вызовов. Подробнее здесь — Kotlin, Java в мобильных.
Вопрос. CI собирает APK, но на устройстве другая версия — "у меня 1.2, в Store 1.0".
Ответ. Сверьте versionCode / versionName в Gradle, что pipeline публикует тот же артефакт, что вы скачиваете, и что internal testing track обновился. Кэш старого APK на телефоне иногда маскирует проблему — удалите приложение и установите заново. Подробнее здесь — сборка, публикация.
Вопрос. Flutter или React Native — что выбрать для первого приложения в 2026 году?
Ответ. Flutter даёт единый UI-движок и стабильную сборку; React Native ближе к веб-разработчикам на JavaScript. Сравните сложность сборки, команду и Store-требования под ваш проект. Подробнее здесь — React Native, Dart/Flutter, сравнение стеков.
Вопрос. Как создать Android-приложение с нуля — с чего начать новичку?
Ответ. Путь: обзор платформы → выбор стека (Kotlin/Compose, RN или MAUI) → hello-экран → установка на телефон → release-сборка. Не начинайте сразу с Store. Подробнее здесь — обзор, о разделе, Kotlin.
Вопрос. Как опубликовать приложение в Google Play пошагово?
Ответ. Нужны аккаунт разработчика, подписанный AAB/APK, скриншоты, политика конфиденциальности и прохождение модерации. Release keystore храните отдельно от проекта. Подробнее здесь — публикация Android-приложения.
Вопрос. Чем APK отличается от AAB (Android App Bundle)?
Ответ. APK — готовый установочный файл; AAB — формат для Google Play, из которого магазин собирает оптимизированные split под устройство. В Play Console для новых приложений обычно нужен AAB. Подробнее здесь — сборка и развёртывание.
Вопрос. Kotlin или Java для Android — что учить в первую очередь?
Ответ. Новые проекты Google ведёт на Kotlin и Jetpack Compose; Java нужен для legacy и чтения старых кодовых баз. Оба языка сосуществуют в одном модуле. Подробнее здесь — Kotlin, Java в мобильных.
Вопрос. Как установить своё приложение на Android-телефон через USB?
Ответ. Включите режим разработчика и отладку по USB, подключите кабель, разрешите отладку на телефоне, установите через Android Studio или adb install. Подробнее здесь — отладка по USB на Android.
Вопрос. Что такое Expo и нужен ли он для React Native?
Ответ. Expo — надстройка над React Native с готовой сборкой, Expo Go для быстрых тестов и managed workflow. Для нативных модулей может понадобиться bare workflow. Подробнее здесь — Expo, первая программа на Expo.
Вопрос. Нативное или кроссплатформенное приложение — в чём разница?
Ответ. Нативное (Swift/Kotlin) — максимальная интеграция с ОС; кроссплатформа (Flutter, RN, MAUI) — общий код на iOS и Android с компромиссами по UI и производительности. Подробнее здесь — обзор мобильных приложений.
Вопрос. Как написать iOS-приложение на Swift — нужен ли Mac?
Ответ. Разработка и публикация в App Store требуют Xcode на macOS. На Windows можно писать кроссплатформенный код, но IPA собирают на Mac или в CI. Подробнее здесь — Swift в мобильных, обзор.
Вопрос. Что такое .NET MAUI и для чего он нужен?
Ответ. MAUI — фреймворк Microsoft для мобильных и десктопных приложений на C# с общей разметкой XAML. Удобен командам .NET. Подробнее здесь — MAUI, сравнение сложности сборки.
Вопрос. PWA или нативное приложение — что выбрать для старта?
Ответ. PWA ставится с сайта без Store, но ограничена в push, фоне и API на iOS. Нативное или Capacitor — если нужны магазины и глубокая интеграция. Подробнее здесь — PWA, Capacitor.
Вопрос. Jetpack Compose — это замена XML-вёрстки Android?
Ответ. Compose — декларативный UI на Kotlin, современная альтернатива View/XML. Новые экраны часто пишут на Compose, старые мигрируют постепенно. Подробнее здесь — Kotlin, Compose в энциклопедии Kotlin.
Вопрос. Как подписать APK для Google Play release?
Ответ. Создайте keystore, пропишите signing config в Gradle, соберите release variant — debug-подпись в Store не примут. Подробнее здесь — публикация Android, сборка.
Вопрос. Как опубликовать приложение в RuStore?
Ответ. Процесс похож на Google Play: аккаунт разработчика, подписанный APK/AAB, описание и модерация. Правила и target SDK свои — сверяйте с консолью RuStore. Подробнее здесь — публикация Android, о разделе.
Вопрос. Сколько стоит аккаунт разработчика Google Play и Apple?
Ответ. Google Play — разовый взнос; Apple Developer — ежегодная подписка (суммы меняются, смотрите официальные сайты). Без оплаченного аккаунта публичный релиз невозможен. Подробнее здесь — публикация Android, обзор.
Вопрос. Как монетизировать мобильное приложение — реклама или подписка?
Ответ. Цифровые товары и подписки в Store — через In-App Purchase; реклама — AdMob и медиация с учётом GDPR. Обход IAP через внешнюю оплату ограничен правилами Apple/Google. Подробнее здесь — обзор, супераппы.
Вопрос. React Native vs Flutter производительность — что быстрее?
Ответ. Зависит от сценария: Flutter рисует своим движком; RN использует native bridge. Для типового UI разница часто не критична — важнее команда и экосистема. Подробнее здесь — React Native, сборка и стеки.
Вопрос. Как включить тёмную тему Dark Mode в Android и iOS приложении?
Ответ. Задайте цветовые схемы для light/dark (Material Theme, Asset Catalog в iOS) и протестируйте на системном переключении темы. Подробнее здесь — компоненты UI Android, обзор.
Вопрос. Unity для мобильной игры — когда это оправдано?
Ответ. Unity/Unreal оправданы для 2D/3D игр и AR; для обычного бизнес-приложения движок даст лишний вес APK. Подробнее здесь — Unity и Unreal в мобильных.
Вопрос. Как сделать push-уведомления в Android приложении?
Ответ. Обычно через Firebase Cloud Messaging (FCM) или APNs на iOS — регистрация токена, серверная отправка, обработка в фоне с учётом ограничений ОС. Подробнее здесь — обзор, сборка.
Вопрос. minSdkVersion и targetSdkVersion — что означают в build.gradle?
Ответ. minSdk — минимальная версия Android для установки; targetSdk — версия, под которую вы тестируете поведение API; compileSdk — SDK для компиляции. Play требует актуальный target. Подробнее здесь — сборка, публикация.
Вопрос. Как уменьшить размер Android-приложения перед публикацией?
Ответ. AAB, ProGuard/R8, сжатие ресурсов, удаление лишних ABI и языков, dynamic feature modules для редких функций. Подробнее здесь — сборка, публикация.
Вопрос. Что такое суперапп (super app) — примеры WeChat, Telegram?
Ответ. Суперапп — платформа с мини-приложениями и сервисами внутри одного клиента, единый профиль и платежи. Архитектура сложнее обычного app. Подробнее здесь — супераппы.
Вопрос. Как стать мобильным разработчиком с нуля — какой язык учить?
Ответ. Android — Kotlin; iOS — Swift; кроссплатформа — Dart (Flutter) или JavaScript (RN). Параллельно — жизненный цикл app, Store и отладка на устройстве. Подробнее здесь — о разделе, обзор, план в дорожной карте.
Что запомнить
Итоги раздела - мобильные приложения
Краткая сборка всего раздела перед чек-листом или переходом к практике — платформы, стеки, Store, монетизация, тестирование.
Мобильные приложения представляют собой самостоятельную и сложную область программной инженерии, объединяющую особенности аппаратного взаимодействия, ограничения ресурсов, специфику пользовательского опыта и строгие требования операционных систем. В отличие от десктопных или веб-решений, мобильная разработка строится вокруг принципов энергоэффективности, асинхронности, прерываемости жизненного цикла и глубокой интеграции с системными сервисами.
Архитектура мобильного приложения определяется платформой — iOS и Android предлагают разные модели управления памятью, фоном, безопасностью и разрешениями. Нативная разработка обеспечивает максимальную производительность и соответствие гайдлайнам, но требует удвоения усилий при поддержке двух экосистем. Кроссплатформенные подходы — такие как Flutter, React Native и Kotlin Multiplatform Mobile — позволяют достичь компромисса между скоростью разработки и качеством UX, однако вносят собственные ограничения и накладные расходы.
Сборка и распространение мобильного приложения — это многоэтапный процесс, включающий цифровую подпись, конфигурацию манифестов, управление версиями, локализацию, минификацию и обфускацию. Публикация в официальных магазинах (App Store, Google Play) требует соблюдения жёстких правил модерации, касающихся приватности, безопасности, монетизации и пользовательского опыта. Любое нарушение этих правил ведёт к отклонению или последующему удалению приложения.
Монетизация мобильных приложений строго регулируется условиями магазинов: все цифровые товары и подписки обязаны продаваться через встроенные механизмы In-App Purchases. Реклама, особенно наградная, дополняет модель дохода, но требует корректной реализации медиации, проверки качества и соблюдения политик приватности. Эффективная монетизация невозможна без баланса между коммерческими целями и удержанием пользователей.
Особый класс мобильных решений — супераппы — демонстрирует эволюцию от узкоспециализированных приложений к универсальным платформам. Суперапп объединяет множество сервисов в единую экосистему, используя модульную архитектуру, единый профиль пользователя и централизованную систему платежей. Такой подход повышает лояльность и снижает стоимость привлечения, но создаёт риски единой точки отказа, усложняет безопасность данных и вызывает регуляторные вопросы.
Тестирование мобильных приложений осложняется фрагментацией устройств, версий ОС, OEM-оболочек и сетевых условий. Эффективная стратегия включает комбинацию unit-тестов, UI-тестов на эмуляторах и реальных устройствах, а также использование облачных ферм тестирования. Профилирование энергопотребления, памяти и производительности становится обязательным этапом перед релизом.
В совокупности, успешная мобильная разработка требует не только владения языками и фреймворками, но и глубокого понимания архитектурных паттернов, жизненного цикла приложения, механизмов безопасности, требований магазинов, принципов энергоэффективности и этики работы с персональными данными. Это дисциплина, где техническое мастерство постоянно балансирует с ограничениями платформы и ожиданиями пользователя.
Частые ошибки (в мышлении)
| Ошибка | Как избежать |
|---|---|
| Один эмулятор | Тест на реальном устройстве |
| Debug в Store | Release keystore |
| Игнор фона iOS | Изучить App Sandbox в Мобильные приложения |
| "Напишу суперапп сразу" | Начните с одного сервиса |
Что попробовать
- Пройдите чек-лист самопроверки — отметьте слабые пункты.
- Один релиз по цепочке: код → сборка → публикация.
- Вернитесь к обзору, если выбираете стек заново.
Куда идти дальше
Полный маршрут — на странице о разделе.
Проверьте себя: Чек-лист самопроверки.