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

Мобильные приложения — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Мобильные приложения". Если пункт кажется туманным — откройте указанную главу или оглавление.


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 и отладка на устройстве. Подробнее здесь — о разделе, обзор, план в дорожной карте.

Вопрос. Capacitor vs Cordova — что выбрать для веб-приложения в Store?

Ответ. Capacitor — современный преемник идей Cordova от Ionic, обёртка WebView + native plugins. Подходит, если UI уже на HTML/JS. Подробнее здесь — Capacitor, PWA.


Что запомнить

Итоги раздела - мобильные приложения

Краткая сборка всего раздела перед чек-листом или переходом к практике — платформы, стеки, Store, монетизация, тестирование.

Мобильные приложения представляют собой самостоятельную и сложную область программной инженерии, объединяющую особенности аппаратного взаимодействия, ограничения ресурсов, специфику пользовательского опыта и строгие требования операционных систем. В отличие от десктопных или веб-решений, мобильная разработка строится вокруг принципов энергоэффективности, асинхронности, прерываемости жизненного цикла и глубокой интеграции с системными сервисами.

Архитектура мобильного приложения определяется платформой — iOS и Android предлагают разные модели управления памятью, фоном, безопасностью и разрешениями. Нативная разработка обеспечивает максимальную производительность и соответствие гайдлайнам, но требует удвоения усилий при поддержке двух экосистем. Кроссплатформенные подходы — такие как Flutter, React Native и Kotlin Multiplatform Mobile — позволяют достичь компромисса между скоростью разработки и качеством UX, однако вносят собственные ограничения и накладные расходы.

Сборка и распространение мобильного приложения — это многоэтапный процесс, включающий цифровую подпись, конфигурацию манифестов, управление версиями, локализацию, минификацию и обфускацию. Публикация в официальных магазинах (App Store, Google Play) требует соблюдения жёстких правил модерации, касающихся приватности, безопасности, монетизации и пользовательского опыта. Любое нарушение этих правил ведёт к отклонению или последующему удалению приложения.

Монетизация мобильных приложений строго регулируется условиями магазинов: все цифровые товары и подписки обязаны продаваться через встроенные механизмы In-App Purchases. Реклама, особенно наградная, дополняет модель дохода, но требует корректной реализации медиации, проверки качества и соблюдения политик приватности. Эффективная монетизация невозможна без баланса между коммерческими целями и удержанием пользователей.

Особый класс мобильных решений — супераппы — демонстрирует эволюцию от узкоспециализированных приложений к универсальным платформам. Суперапп объединяет множество сервисов в единую экосистему, используя модульную архитектуру, единый профиль пользователя и централизованную систему платежей. Такой подход повышает лояльность и снижает стоимость привлечения, но создаёт риски единой точки отказа, усложняет безопасность данных и вызывает регуляторные вопросы.

Тестирование мобильных приложений осложняется фрагментацией устройств, версий ОС, OEM-оболочек и сетевых условий. Эффективная стратегия включает комбинацию unit-тестов, UI-тестов на эмуляторах и реальных устройствах, а также использование облачных ферм тестирования. Профилирование энергопотребления, памяти и производительности становится обязательным этапом перед релизом.

В совокупности, успешная мобильная разработка требует не только владения языками и фреймворками, но и глубокого понимания архитектурных паттернов, жизненного цикла приложения, механизмов безопасности, требований магазинов, принципов энергоэффективности и этики работы с персональными данными. Это дисциплина, где техническое мастерство постоянно балансирует с ограничениями платформы и ожиданиями пользователя.


Частые ошибки (в мышлении)

ОшибкаКак избежать
Один эмуляторТест на реальном устройстве
Debug в StoreRelease keystore
Игнор фона iOSИзучить App Sandbox в Мобильные приложения
"Напишу суперапп сразу"Начните с одного сервиса

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

  1. Пройдите чек-лист самопроверки — отметьте слабые пункты.
  2. Один релиз по цепочке: код → сборкапубликация.
  3. Вернитесь к обзору, если выбираете стек заново.

Куда идти дальше

Полный маршрут — на странице о разделе.

Проверьте себя: Чек-лист самопроверки.