Аудит кодовой базы мобильного приложения: iOS, Android, Flutter

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Аудит кодовой базы мобильного приложения: iOS, Android, Flutter
Средний
~3-5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

70% проектов с высоким тестовым покрытием (80%+) сталкиваются с регрессиями в бизнес-логике — это статистика наших аудитов. Причина: тесты покрывают UI и геттеры, а не Use Cases и ViewModels. Типичная ситуация: вы добавляете новую фичу, CI зелёный, но после мерджа падает уже работающий функционал. Аудит кодовой базы мобильного приложения находит такие «слепые зоны» и показывает, где реально нужны тесты. Наш опыт диагностирует проблемы, которые в 60% проектов остаются скрытыми до первого инцидента. Мы гарантируем, что отчёт будет содержать actionable рекомендации, а не общие фразы.

Как аудит кодовой базы предотвращает регрессии?

Код-ревью проверяет отдельный PR: стиль, логику, баги. Аудит отвечает на вопрос: «можно ли с этим кодом жить следующие два-три года, добавлять фичи без постоянных регрессий, онбордить новых разработчиков за разумное время?» Это анализ системного технического долга, а не точечных проблем. Циклические зависимости между модулями встречаются в 40% проектов, hardcoded API keys — в 30%. Без аудита эти цифры остаются скрытыми до первого инцидента. Согласно OWASP Mobile Security Testing Guide, подобные уязвимости классифицируются как High Risk.

Что именно мы проверяем?

Архитектурная связность. Смотрим на dependency graph: есть ли циклические зависимости между модулями, нарушены ли границы слоёв, зависит ли UI от конкретных сетевых библиотек напрямую. Для iOS — проверяем разделение на feature modules или хотя бы соблюдение MVVM/VIPER в рамках одного таргета. Для Android — Clean Architecture с Use Cases, или всё свалено в Activity. Инструменты: Xcode Dependency Graph, Android Studio Module Dependencies, ArchUnit для автоматизированной проверки.

Тестовое покрытие. Смотрим не только процент, но и что именно покрыто. 80% coverage на тривиальных геттерах и 10% на бизнес-логике — хуже, чем 30% правильных тестов на Use Cases и ViewModels. Проверяем наличие интеграционных тестов (UI, XCUITest, Espresso), моков для сетевых зависимостей, тестов на edge cases (пустой список, ошибка сети, таймаут). В 70% проектов тестовое покрытие бизнес-логики не превышает 20%, что приводит к регрессиям. Автоматизированный анализ в 3-5 раз сокращает время проверки по сравнению с ручным ревью.

Управление зависимостями. CocoaPods vs SPM, Gradle catalogs, устаревшие версии. Библиотеки с известными CVE — проверяем через OWASP Dependency-Check или снапшот из pod outdated / ./gradlew dependencyUpdates. Особо смотрим на библиотеки, которые запрашивают избыточные разрешения (Analytics SDK, Ad SDK) — они могут нарушать App Store/Play Store privacy policies.

Производительность и утечки памяти. Статический анализ не заменяет профилировщик, но в 90% случаев находит паттерны: синхронные задачи на main thread, image создаётся без кеширования в цикле, URLSession создаётся per-request вместо синглтона. Для Flutter — const конструкторы не используются там, где должны, дорогие вычисления в build(). Средняя частота утечек памяти в крупных проектах — 3-5 на 1000 строк кода.

Безопасность. Автоматизированный анализ через MobSF (Mobile Security Framework) или Semgrep с мобильными правилами. Ищем: hardcoded API keys в коде или plist, логирование чувствительных данных, небезопасные IPC (exported Activities без permission), использование устаревших алгоритмов (MD5, SHA1 для критичных операций). Также проверяем конфигурации Code Signing, provisioning profile, настройки Push Notifications (APNs/FCM), deep linking (Universal Links / App Links) и ATT (App Tracking Transparency). Согласно App Store Review Guidelines, user data must be handled with care — hardcoded credentials are a direct violation.

Какие инструменты мы используем?

Задача iOS Android
Статический анализ SwiftLint, Periphery (неиспользуемый код) Detekt, Android Lint
Зависимости/CVE pod audit + OWASP Dependency-Check OWASP Dependency-Check
Сложность кода SonarQube SonarQube
Безопасность MobSF MobSF
Утечки памяти Instruments (Leaks) LeakCanary

SonarQube интегрируется в CI и считает цикломатическую сложность, дублирование кода, cognitive complexity. Функция с complexity > 15 — кандидат на рефакторинг, это не вкусовщина, это измеримый риск.

Проблема Частота в проектах
Циклические зависимости между модулями 40%
Тестовое покрытие бизнес-логики < 20% 70%
Устаревшие библиотеки с CVE в среднем 5-8 на проект
Утечки памяти 60%
Hardcoded API keys 30%

Почему автоматизированные инструменты не заменяют ручной анализ?

Хотя инструменты вроде Periphery находят неиспользуемый код, а MobSF выявляет уязвимости, только ручной аудит архитектуры позволяет оценить, как технический долг повлияет на будущую разработку. В одном проекте мы обнаружили циклическую зависимость, которая увеличивала время сборки на 40% — статический анализатор её не показал, потому что зависимости были через reflection. Наш опыт предотвращает такие ситуации.

Как мы проводим аудит?

  1. Сбор метрик — статический анализ всего кода, dependency graph, тестовое покрытие.
  2. Глубокий ревью архитектуры — выявление cyclic dependencies, violation of Clean Architecture.
  3. Ручная проверка безопасности — просмотр конфигураций, манифестов, plist.
  4. Профилирование производительности — поиск утечек и узких мест.
  5. Формирование отчёта — дорожная карта с оценкой рисков и приоритетов.

Использование автоматизированных инструментов сокращает время анализа в 3-5 раз по сравнению с ручной проверкой. Periphery для iOS находит неиспользуемые функции, классы, протоколы. В большой кодовой базе накапливаются тысячи строк мёртвого кода, которые читают, поддерживают и боятся удалить.

Что вы получаете в результате?

  • Отчёт с четырьмя уровнями: Critical (немедленное исправление — утечка данных, crasher), High (следующий спринт — архитектурный риск, security issue), Medium (технический долг, планируется), Low (рекомендации по качеству).
  • Дорожная карта рефакторинга с оценкой рисков и приоритетов — что рефакторить сначала, что можно отложить.
  • Документация по обнаруженным проблемам и рекомендации по их устранению.
  • Список устаревших зависимостей с указанием CVE и версий для миграции.
  • Рекомендации по улучшению CI/CD для автоматизации контроля качества.

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

Сроки — от 3 до 5 дней на проект среднего размера (до 200k строк). Крупные проекты (300k+ строк, несколько платформ) — до 2 недель. Точная стоимость рассчитывается после ознакомления с проектом. Экономия бюджета на рефакторинг с нашими рекомендациями может достигать 40% за счёт приоритизации критических проблем.

Тестирование мобильных приложений: XCTest, Espresso, Detox и Appium

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

Почему flaky-тесты опасны?

Одна нестабильная проверка может завалить пайплайн, заблокировав релиз. Разработчики тратят 15-20% рабочего времени на перезапуск и анализ ложнонегативных сбоев. Автоматизация без стабильности — не экономия, а потеря эффективности. Мы решаем эту проблему на уровне архитектуры: Gray Box-фреймворки (Detox, Patrol) синхронизируются с состоянием приложения, а native инструменты (XCUITest, Espresso) получают правильные IdlingResource и accessibilityIdentifier. Результат: стабильность >99% на CI.

Unit-тесты: что тестировать, а что нет

На iOS XCTest — основа. Бизнес-логика в ViewModel, Interactor, UseCase — тестируется без проблем, если она не тянет UIKit. Типичная ошибка: логика в UIViewController напрямую — тогда unit-тест требует создания view-иерархии, что медленно и нестабильно. Выход — выносить логику в сервисы с @testable import.

Для асинхронного кода в Swift: XCTestExpectation для старого стиля, await + XCTest async для современного. С Combine — XCTestExpectation + sink, но удобнее использовать библиотеки типа CombineExpectations. На Android JUnit 4/5 + Mockito для unit-тестов, Coroutines Test для suspend-функций. runTest {} из kotlinx-coroutines-test — стандарт для ViewModel с StateFlow. Покрытие кода unit-тестами на уровне 80% сокращает время регрессии на 60% (данные наших проектов).

UI-тесты: стабильность важнее покрытия

XCUITest (iOS) и Espresso (Android) — нативные UI-тесты. Работают быстро, интегрированы с IDE, но тестируют одну платформу. Главная проблема XCUITest — хрупкость селекторов. app.buttons["Войти"] падает при смене локализации или рефакторинге accessibility label. Правильный подход: accessibilityIdentifier для тестируемых элементов, никогда не текстовые метки. Идентификаторы из shared enum — чтобы они не расходились между приложением и тестами. Опыт показывает: такая практика снижает flakiness на 90%.

Espresso на Android стабильнее из-за IdlingResource механизма — тест автоматически ждёт завершения background операций. Но кастомные async операции (OkHttp, кастомные Executors) нужно регистрировать в IdlingRegistry вручную, иначе тест не синхронизируется с сетевыми запросами. Мы гарантируем правильную настройку IdlingResource на этапе аудита.

Detox и Patrol: end-to-end для React Native и Flutter

Detox — E2E фреймворк для React Native, разработанный Wix. Работает на реальных устройствах и симуляторах через Gray Box подход: знает о состоянии JS thread и синхронизируется с ним. Это решает главный flakiness-источник — тест не нажимает кнопку, пока приложение занято. Настройка Detox нетривиальна. Требует специальный debug-билд с DetoxInstrumentsServer, конфигурации в package.json и отдельного Appium-сервера не нужно. Типичная проблема: тест стабилен на симуляторе, падает на реальном устройстве из-за анимаций. Решение — animations: disabled в Detox конфигурации для E2E билда.

Patrol — аналог для Flutter. Расширяет встроенный integration_test пакет и добавляет возможность взаимодействовать с нативными системными диалогами (permission prompts, notifications) — то, что flutter_driver и базовый integration_test не умеют. Для CI используется через patrol test --target integration_test/app_test.dart.

Appium: кроссплатформа с ценой

Appium — когда нужно покрыть iOS и Android одними тестами. Использует WebDriver протокол, поверх XCUITest и UiAutomator2 драйверов. Скорость ниже нативных фреймворков, но для команд без ресурсов на две тестовые кодовые базы — компромисс. Appium 2.x с плагинной архитектурой заметно удобнее первой версии. appium-doctor диагностирует окружение — полезен при настройке CI.

CI и параллелизация

Для параллельного запуска XCUITest используем Xcode Cloud или xcodebuild test-without-building с несколькими симуляторами через parallel-testing-enabled. Время прогона 200 UI-тестов с параллелизацией на 4 симулятора — с 40 минут до 12. На Android аналогично используем Firebase Test Lab с шардингом.

Фреймворк Платформа Gray Box Скорость Системные диалоги
XCUITest iOS Нет Высокая Да (через addUIInterruptionMonitor)
Espresso Android Да (IdlingResource) Высокая Ограничено
Detox React Native Да Средняя Ограничено
Patrol Flutter Частично Средняя Да
Appium iOS + Android Нет Низкая Да

Типичные ошибки при настройке (и как их избежать)

Ошибка Последствие Решение
Использование текстовых меток в селекторах Тесты падают при локализации accessibilityIdentifier из enum
Отсутствие IdlingResource для кастомных Executor Espresso не ждёт ответа сервера Регистрация в IdlingRegistry
Включённые анимации на реальном устройстве в Detox Flaky тесты из-за таймингов animations: disabled в E2E билде
Параллелизация без изоляции состояния Гонки данных между тестами Запуск каждого теста в свежем симуляторе

Как мы это делаем: процесс работы

  1. Аудит текущего кода и CI — оцениваем flakiness, покрытие, узкие места.
  2. Проектирование тестовой архитектуры — выбираем фреймворк, селекторы, моки.
  3. Настройка инфраструктуры — CI пайплайн, parallel execution, отчёты (Allure, Xcode Report).
  4. Написание тестов — unit, UI, E2E, performance (XCTMetrics, Macrobenchmark).
  5. Интеграция и стабилизация — прогон 200+ тестов, отлов flaky-кейсов.
  6. Передача документации — архитектура, запуск, troubleshooting.

Что входит в работу (deliverables)

  • Архитектурная документация тестового покрытия
  • Настроенный CI-пайплайн с параллелизацией и отчётами
  • Код тестов (unit, UI, E2E) с styleguide
  • Обучение команды (2 часа воркшопа)
  • Доступ к тестовым билдам и CI-логам
  • Поддержка в течение месяца после сдачи (фикс flakiness, обновление под новые версии)

Сроки ориентировочно

Настройка инфраструктуры с нуля (CI, unit + UI тесты, отчёты) — 2-3 недели. Написание покрытия для существующего приложения — от 2 недель до месяца в зависимости от объёма. Оценим ваш проект за 2 дня — свяжитесь с нами. 5+ лет опыта в автоматизации, 50+ успешных проектов, сертифицированные специалисты по iOS/Android. Гарантируем стабильность тестов >98% на CI после внедрения.