Тестирование совместимости мобильного приложения на разных устройствах
Дизайнер нарисовал макет под iPhone 14 Pro с экраном 6.1'' и Dynamic Island. Разработчик проверял на том же устройстве. Релиз вышел — и выяснилось: на Samsung Galaxy A03 с экраном 720×1600 кнопка «Подтвердить» уходит за границы, потому что вёрстка завязана на safe area, которого на старых Samsung нет. На iPad Mini нижняя навигация занимает треть экрана — планшет никто не тестировал. В нашей практике такие истории — норма. Мы помогаем выявить проблемы до релиза: составляем матрицу устройств, тестируем на эмуляторах, облачных фермах и физических образцах, формируем отчёт с рекомендациями. Свяжитесь с нами для предварительной оценки вашего проекта.
Устройства слишком разные. Единого решения нет — есть методичное тестирование. Мы проводим его, используя комбинацию эмуляторов, облачных ферм (BrowserStack, Firebase Test Lab) и физических устройств. Это позволяет сэкономить время и деньги, предотвратив дорогостоящие баги в продакшне.
Почему устройства отличаются и как это влияет на приложение?
Чем различаются устройства — не только размером экрана. Вот что реально сказывается на поведении приложения.
Разрешение и плотность пикселей
ldpi (120 dpi), mdpi (160), hdpi (240), xhdpi (320), xxhdpi (480), xxxhdpi (640). Иконки без адаптированных вариантов под плотность выглядят размыто или огромными. На Redmi с 720p и Samsung с 1080p при одинаковой физической диагонали — разная плотность, разные dp→px пересчёты.
Соотношение сторон
Стандарт 16:9 (720×1280) устарел. Актуальные: 20:9 (Samsung S-серия), 19.5:9 (iPhone), 21:9 (Sony Xperia), складные устройства с переменным соотношением. Вёрстка, хардкодящая высоту элементов, ломается на нестандартных пропорциях.
Safe Area и вырезы
Dynamic Island (iPhone 14 Pro+), notch-hole (Samsung), punch-hole camera (большинство современных Android). На Android — WindowInsets и displayCutout. Без обработки вырезов контент уходит под камеру. Apple рекомендует придерживаться safe area insets Apple Human Interface Guidelines.
Производительность железа
Qualcomm Snapdragon 8 Gen 3 в флагмане vs MediaTek Helio G85 в бюджетнике — разные уровни. Анимации на 120 fps, плавные на флагмане, дёргаются на mid-range. Сложные Compose-лейауты с множественными recompositions это почувствуют.
Аппаратные возможности
Нет NFC, барометра, LiDAR, Face ID. Без проверки PackageManager.hasSystemFeature() попытка использовать отсутствующее железо — крэш или silent fail.
Как мы проводим тестирование совместимости?
Мы начинаем с анализа целевой аудитории и статистики устройств, затем составляем матрицу тестирования. После этого запускаем проверки на эмуляторах, облачных фермах и физических образцах. В итоге вы получаете отчёт с матрицей несовместимостей, скриншотами и рекомендациями. Закажите тестирование сегодня — мы подготовим детальный план проверок.
Матрица устройств
Составляем на основе аналитики (Firebase, Mixpanel по device_model), общей статистики рынка и бизнес-требований:
| Категория | Примеры | Почему включаем |
|---|---|---|
| Флагман iOS | iPhone 15 Pro, iPhone 14 | Целевая аудитория, Dynamic Island |
| Компактный iOS | iPhone SE 3rd gen | Маленький экран, нет notch |
| Планшет iOS | iPad (10th gen), iPad Pro | Широкий экран, Split View |
| Флагман Android | Google Pixel 8, Samsung S24 | Актуальная Android, OLED |
| Mid-range Android | Samsung A54, Xiaomi Redmi Note 12 | Крупнейшая доля рынка |
| Бюджетный Android | Samsung A03, Redmi 10 | Низкая производительность, 720p |
| Планшет Android | Samsung Galaxy Tab S9 | Адаптивный layout |
| Складной | Samsung Z Fold 5 | Если поддерживается форм-фактор |
Минимальная матрица для большинства проектов: 5–7 устройств. Больше — через BrowserStack или Firebase Test Lab (реальные устройства без покупки). Тестирование на облачной ферме в 5 раз быстрее, чем покупка и обслуживание собственного парка.
Сравнение сред тестирования
| Среда | Преимущества | Недостатки |
|---|---|---|
| Эмуляторы (Android Emulator, iOS Simulator) | Быстрый запуск, множество конфигураций | Не эмулируют аппаратные функции (NFC, датчики), неточно отражают производительность |
| Облачные фермы (BrowserStack, Firebase Test Lab) | Реальные устройства без покупки, параллельные прогоны | Ограниченная работа с нестандартными жестами, задержки сети |
| Физические устройства | Точное воспроизведение, все железные функции | Дорого, долго обслуживать парк |
Что входит в работу?
- Анализ целевой аудитории и статистики устройств
- Составление матрицы устройств (5–7+ моделей)
- Тестирование на эмуляторах (Android Emulator, iOS Simulator)
- Тестирование на облачной ферме (BrowserStack, Firebase Test Lab)
- Ручное тестирование на физических устройствах (при необходимости)
- Отчёт с матрицей несовместимостей, скриншотами и рекомендациями
- Консультация по исправлению найденных проблем
Как тестировать адаптивный layout?
На Android — WindowSizeClass из Jetpack Compose:
val windowSizeClass = calculateWindowSizeClass(this)
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> PhoneLayout() // < 600dp
WindowWidthSizeClass.Medium -> TabletLayout() // 600–840dp
WindowWidthSizeClass.Expanded -> DesktopLayout() // > 840dp
}
Тестируем все три класса: Compact (телефон portrait), Medium (планшет portrait или телефон landscape), Expanded (планшет landscape).
На iOS — horizontalSizeClass в SwiftUI:
@Environment(\.horizontalSizeClass) var sizeClass
var body: some View {
if sizeClass == .compact {
VStack { ... }
} else {
HStack { ... } // iPad, landscape iPhone Plus
}
}
Специфика складных устройств
Samsung Galaxy Z Fold — два режима: сложен (compact, 22:9) и раскрыт (большой экран, ~4:3). Приложение должно корректно переходить между режимами без потери состояния. onConfigurationChanged вызывается при раскрытии/складывании. Если Activity пересоздаётся — все несохранённые данные в форме теряются. Проверяем: фокус в TextField сохраняется, скролл-позиция восстанавливается, модальные окна не «прыгают».
Проверка аппаратных возможностей
// Android: проверяем перед использованием
val hasBluetooth = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
val hasNfc = packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)
val hasCamera = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
Если функция недоступна — скрываем UI-элемент или показываем объяснение. Не крэшимся, не показываем недоступную кнопку.
Опыт и гарантии
Наша команда — сертифицированные инженеры с опытом мобильной разработки 7+ лет. Мы протестировали более 50 проектов разной сложности — от стартапов до enterprise-решений. Гарантируем качество тестирования: вы получите исчерпывающий отчёт с реальными проблемами и конкретными путями их исправления.
Сроки
2–3 дня — составление матрицы устройств по аналитике, тестирование на приоритетных устройствах (эмуляторы + облачная ферма), отчёт с матрицей несовместимостей и скриншотами. Для проектов с расширенным покрытием (складные, планшеты, специфические регионы) срок увеличивается до 5–7 дней. Стоимость рассчитывается индивидуально — получите консультацию для оценки вашего проекта.







