Тестирование производительности мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Тестирование производительности мобильного приложения
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Тестирование производительности мобильного приложения

Приложение «работает нормально» на iPhone 15 Pro у разработчика. На Xiaomi Redmi 10A с Android 11, которым пользуется треть аудитории, главный экран загружается 4 секунды, а список при быстром скролле заикается до 20 fps. Firebase Crashlytics не покажет — это не крэш. App Store Reviews покажут через неделю после релиза.

Профилирование производительности — это не «запустили и посмотрели». Это воспроизводимые измерения с конкретными числами, сравнение до и после, локализация причины до конкретного метода.

iOS: Xcode Instruments

Instruments — основной инструмент на iOS. Шаблоны, которые используем:

Time Profiler — где CPU тратит время. Запускаем «тяжёлый» сценарий (скролл, загрузка экрана), смотрим Call Tree с Invert Call Tree + Hide System Libraries. Видим собственный код с процентами нагрузки.

Core Animation (Rendering) — FPS и причины просадок. Commit — время формирования слоёв, Render — время GPU. Если Commit высокий — проблема на main thread. Красная линия в 16.67 ms (60 fps) или 8.33 ms (120 fps, ProMotion) — наглядная граница.

Allocations — паттерны выделения памяти. Запускаем, совершаем действие, смотрим Generation Analysis. Если память после Release навигации не падает — утечка.

Пример реальной проблемы: в одном проекте экран с коллекцией фото тормозил при скролле. Time Profiler показал 23% времени на UIImage(data:) в cellForItemAt. Синхронная декодировка JPEG на main thread. Решение: ImageIO + kCGImageSourceShouldCacheImmediately: false + декодировка на background queue с DispatchQueue.global(qos: .userInitiated). FPS вырос с 35 до 58.

Метрики запуска

MetricKit (iOS 13+) собирает production-метрики с реальных устройств пользователей:

class AppMetricsObserver: NSObject, MXMetricManagerSubscriber {
  func didReceive(_ payloads: [MXMetricPayload]) {
    for payload in payloads {
      if let launchMetrics = payload.applicationLaunchMetrics {
        // resumeTime — время при background→foreground
        // timeToFirstDraw — cold start
        let coldStart = launchMetrics.histogrammedTimeToFirstDraw
        // отправляем в аналитику
      }
    }
  }
}

Это не синтетические измерения в тестах, а реальные данные с устройств пользователей. Дополняет профилирование в Instruments.

Android: Android Profiler и Macrobenchmark

В Android Studio — Android Profiler. CPU profiler в режиме Sample Java/Kotlin Methods для общей картины, Trace Java/Kotlin Methods для точного трассирования (с overhead'ом). System Trace — для взаимодействия с GPU, Choreographer, RenderThread.

Janky frames (кадры > 16 ms): adb shell dumpsys gfxinfo com.example.app | grep "Janky frames". Более 5% janky frames — проблема.

Macrobenchmark — библиотека из Jetpack для воспроизводимых измерений:

@RunWith(AndroidJUnit4::class)
class StartupBenchmark {
  @get:Rule
  val benchmarkRule = MacrobenchmarkRule()

  @Test
  fun startup() = benchmarkRule.measureRepeated(
    packageName = "com.example.myapp",
    metrics = listOf(StartupTimingMetric()),
    iterations = 5,
    startupMode = StartupMode.COLD,
  ) {
    pressHome()
    startActivityAndWait()
  }
}

Запускается на реальном устройстве (не эмуляторе), возвращает timeToInitialDisplay и timeToFullDisplay в миллисекундах. Результаты стабильны между запусками — это измерения, а не «запустили и засекли секундомером».

Slow rendering: Jetpack Compose

Для Compose — Recomposition счётчик в Layout Inspector. Но точнее — ComposeUiTest с measureRepeated:

@Test
fun scrollPerformance() {
  benchmarkRule.measureRepeated(
    packageName = "com.example.myapp",
    metrics = listOf(FrameTimingMetric()),
    iterations = 5,
  ) {
    val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
    // скроллим список
    device.findObject(UiSelector().resourceId("com.example.myapp:id/feed_list"))
      .flingForward()
  }
}

FrameTimingMetric собирает данные о каждом кадре: frameOverrunMs — насколько кадр вышел за пределы бюджета.

Flutter: DevTools и flutter_driver

Flutter DevTools → Performance view показывает Frame chart с UI thread и Raster thread. Красные кадры — UI thread занят дольше 16 ms. Жёлтые — Raster thread.

Частая причина красных кадров: setState() перестраивает слишком большое поддерево. Решение — const конструкторы там, где данные не меняются, RepaintBoundary для изолирования перерисовки анимированных элементов.

// Плохо: весь экран перестраивается при каждом тике таймера
class CounterScreen extends StatefulWidget { ... }

// Лучше: только счётчик изолирован
class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(children: [
      const HeaderWidget(),  // const — не перестраивается
      CounterWidget(),       // только эта часть ребилдится
    ]);
  }
}

Что входит в работу

  • Профилирование запуска приложения (cold start, warm start)
  • Анализ FPS при скролле и навигации
  • Поиск утечек памяти через Allocations / Memory Profiler
  • Анализ CPU-профиля на тяжёлых операциях
  • Macrobenchmark-тесты для Android, MetricKit-интеграция для iOS
  • Отчёт с конкретными числами до/после и рекомендациями

Сроки

3–5 дней — профилирование, локализация проблем, отчёт. Если нужна ещё и реализация оптимизаций — оцениваем отдельно по объёму правок. Стоимость рассчитывается индивидуально.