Ферма Android-устройств — это набор тестовых телефонов, подключённых к хост-машинам, чтобы автотесты и люди могли пользоваться ими, не беря в руки. Термин пришёл из QA, и в этой статье он используется именно так: общий пул устройств для запуска и воспроизведения тестов. Стойки телефонов, на которых массово ведут аккаунты в соцсетях, — совсем другое явление, они нарушают правила всех крупных платформ, и здесь о них речи не идёт.
Каждая мобильная команда доходит до момента, когда ящик с телефонами перестаёт работать. Кто-то унёс Pixel домой, никто не знает, на каком телефоне какая сборка, а CI гоняется на одном эмуляторе. В этом гайде разберём, для чего нужна ферма, что входит в свою стойку и сколько она стоит, и когда ту же работу делают облачные телефоны.
Для чего нужна ферма устройств
- Автоматические UI-тесты на матрице. Наборы Espresso, UI Automator или Appium сразу на нескольких версиях Android и размерах экрана, чтобы релиз-кандидат получил один понятный ответ.
- Воспроизведение бага пользователя. В репорте названы модель и версия Android, и на ферме есть этот телефон или что-то близкое.
- Ручные и исследовательские сессии. Тестировщик удалённо открывает нужную модель, а не одалживает её у коллеги.
- Долгие прогоны. Фоновая синхронизация, доставка уведомлений и память на протяжении часов — то, что не покажет эмулятор, который выбрасывается после каждой задачи CI.
- Smoke перед релизом. Один и тот же быстрый проход на десяти телефонах параллельно перед раскаткой.
Из чего состоит своя стойка
Собрать стойку несложно. Настоящая работа — держать её в рабочем состоянии. В типичной стойке пять частей.
Телефоны. Выбирайте их по аналитике, а не по тому, что продаётся со скидкой: топ моделей по доле сессий, самая старая поддерживаемая версия Android и самая новая. Самую популярную модель берите в двух экземплярах, чтобы один был занят ручной работой, а второй гонял CI.
Питание и USB. Хабы с отдельным питанием и достаточным током на порт, короткие кабели приличного качества и запас на USB-контроллеры. По опыту, adb становится ненадёжным где-то после десяти-пятнадцати телефонов на одном хосте, в зависимости от контроллера и хабов.
Хосты. Небольшие Linux-машины или Mac, на каждой свой adb-сервер для своей полки. Учитывайте устройства по серийным номерам и держите карту, какой телефон в каком порту, потому что она понадобится в самый неудачный момент.
Софт. adb, менеджер устройств вроде DeviceFarmer (преемник OpenSTF от сообщества) для удалённых экранов и бронирования, Appium с грид-сервером, если вы тестируете через WebDriver, и ваш CI для расписания прогонов.
Обслуживание. Эту часть никто не закладывает в бюджет. Батареи вздуваются, когда телефоны месяцами стоят на зарядке, поэтому пользуйтесь ограничением заряда, которое есть у некоторых производителей, или умными розетками, которые отключают питание по расписанию. Посреди прогонов всплывают предложения обновить систему. Экраны блокируются, копятся уведомления, память забивается тестовыми медиафайлами, а телефон, упавший ночью, загружается в диалог, на который некому нажать.
Сколько на самом деле стоит стойка
Для стойки из 20 телефонов грубая оценка на 2026 год выглядит так. Телефоны стоят от $3,000 до $12,000 в зависимости от того, сколько нужно флагманов. Хабы, кабели, стеллажи и два хоста добавляют от $1,500 до $4,000. Плюс каждый год закладывайте 20–30 % от стоимости телефонов на вздувшиеся батареи, сломанные порты и новые модели, которые покупают ваши пользователи.
Строка, которая удивляет команды, — это время: от трёх до восьми часов в неделю, пока кто-то оживляет зависшие телефоны, ставит обновления и перезагружает хосты. Ваши цифры будут другими, но картина та же. Железо — меньшая часть счёта.
Облачные телефоны превращают это в текущие расходы без обслуживания. В Clousd поминутная оплата — $0.004 в минуту, пока телефон работает, и не больше $0.80 за телефон в день, а тарифы начинаются от $20 в месяц; подробности на странице цен. Два расчёта для тех же 20 телефонов:
- По два часа каждый рабочий день: 20 телефонов × 120 минут × $0.004 = $9.60 в день, около $211 за 22 рабочих дня.
- Круглосуточно: действует дневной потолок, так что 20 × $0.80 × 30 дней = не больше $480 в месяц.
Поминутная оплата останавливается вместе с телефоном. Модель, которая нужна для одного баг-репорта, — это телефон, который вы создаёте, используете и удаляете.
Своя стойка, облако устройств или облачные телефоны
| Своя стойка | Публичное облако настоящих устройств | Облачные телефоны | |
|---|---|---|---|
| Стартовые вложения | телефоны, хабы, хосты | нет | нет |
| Текущие расходы | замена устройств и время сотрудников | за сессию или в месяц | поминутно, пока работает, или тариф |
| Камера, GPU, батарея | настоящие | настоящие | не показательны |
| Прошивка и оболочка производителя | да | да | зависит от провайдера |
| Телефон доступен, когда нужен | если его никто не занял | общий, может быть занят | создаётся по запросу |
| Состояние между сессиями | хранится | обычно стирается | хранится, пока вы не сбросите |
| Масштабирование на неделю релиза | купить ещё телефонов | купить ещё времени | создать ещё телефонов |
| Обслуживание | ваше | нет | нет |
Что меняет облако
- Чистый старт. Телефон создаётся примерно за минуту и сбрасывается в чистое состояние перед каждым набором тестов, так что каждый прогон начинается из одной точки.
- Модель как параметр. Android с 12 по 17 на 150+ моделях настоящих аппаратов, которые выбираются для каждого прогона в списке моделей, а не из того, что стоит на полке.
- Удалённость по умолчанию. Живой экран в браузере для ручных сессий, REST API и ADB для CI и MCP-сервер, когда проверку выполняет ИИ-агент.
- Никакой возни с железом. Ничего не вздувается, не требует кабеля и не просит перезагрузки в 2 часа ночи.
Чего облако не меняет
Облачные телефоны — не физические телефоны. Работа камеры, точность датчиков, производительность GPU, расход батареи, троттлинг от нагрева, NFC, Bluetooth и фоновые убийцы процессов от конкретных производителей по-прежнему требуют настоящего железа. Большинство команд приходят к гибриду: три-пять физических телефонов на столе для этих проверок и широкая матрица моделей и версий в облаке. Что должна покрывать такая матрица, перечислено в гайде о тестировании приложения на разных версиях Android.
Запуск тестов на ферме, где бы она ни была
Тест-раннеры обращаются к телефонам по серийному номеру adb, поэтому один и тот же набор работает и на USB-стойке, и на удалённых телефонах. AndroidJUnitRunner умеет делить набор между устройствами по шардам:
R=com.example.app.test/androidx.test.runner.AndroidJUnitRunner adb -s "$P12" shell am instrument -w -e numShards 3 -e shardIndex 0 $R adb -s "$P14" shell am instrument -w -e numShards 3 -e shardIndex 1 $R adb -s "$P16" shell am instrument -w -e numShards 3 -e shardIndex 2 $R
Запустите три строки параллельно, и каждый телефон возьмёт треть тестов. Appium выбирает устройство через capability appium:udid, которая принимает тот же серийный номер. Удалённые телефоны попадают в пул через adb connect; как это работает через реле, показано в документации по ADB, а путь через API для CI — на странице о тестировании приложений.
Учитывайте, что каждое удалённое действие занимает чуть больше времени, чем по USB, и выставляйте таймауты UI-тестов с этим запасом. Тесты, которые проходят на локальном эмуляторе и падают по таймауту удалённо, обычно содержат жёстко прописанный sleep или слишком тесное ожидание.
Ферма мобильных устройств и облачная ферма телефонов
Ферма мобильных устройств — та же идея, только на полке рядом с Android-телефонами стоят iPhone и iPad. В QA облачная ферма телефонов — это просто пул облачных телефонов, на котором работает ваш набор тестов. У слова «ферма» за пределами тестирования есть и другие значения; о них рассказывает статья о фермах телефонов.


