Скрипт привязывает SIM-карты iPhone по IMSI к системному пакету оператора Vodafone_hu или к любому другому пакету, который есть в iOS телефона. Задуман для включения звонков по Wi-Fi (VoWiFi) в России. Заодно включается кодек EVS и 5G на части диапазонов.
Работает на macOS и Windows. На Linux не работает: там нет нужной библиотеки Apple.
Работает на iPhone 12–18, включая модели mini, Pro, Pro Max, Plus, Air и e, с iOS 18–27, включая iOS 27.0.1 и 27.2 beta 2.
Экспериментальный инструмент. Работа на будущих версиях iOS не гарантируется.
- Python 3.11 или новее, рекомендуется 3.12. На Windows нужна 64-битная версия.
- Windows: iTunes x64 с сайта Apple. Версия из Microsoft Store и Apple Devices могут не подойти.
- macOS: ничего дополнительно ставить не нужно.
- iPhone, кабель USB и интернет для первого запуска. Потом можно без кабеля, по Wi-Fi (пункт 10).
- Распакуйте архив целиком в «Загрузки».
- Подключите iPhone кабелем, разблокируйте его и нажмите «Доверять». Закройте Finder и iTunes, если в них идёт синхронизация.
- Запустите файл двойным щелчком:
- macOS:
Запуск macOS.command - Windows:
Запуск Windows.cmd
- macOS:
- В меню выберите 1 и дождитесь сообщения «Готово».
При первом запуске скрипт сам скачает нужные библиотеки в папку .venv. Это займёт пару минут.
К релизу прикладываются архивы CarrierSIM-vN-macOS-arm64.zip, CarrierSIM-vN-macOS-x86_64.zip и CarrierSIM-vN-Windows-x64.zip. Python и библиотеки уже внутри. Их собирает GitHub Actions (.github/workflows/standalone.yml) из того же тега, происхождение подтверждено attestation: gh attestation verify CarrierSIM-vN-….zip -R ios-bundles/CarrierSIM.
- Распакуйте архив целиком. Рядом с
CarrierSIM(CarrierSIM.exe) лежатbundle.yaml,assets.zipи README.runsпоявится там же. - macOS: сборка не подписана Apple. Один раз снимите карантин со всей папки:
xattr -dr com.apple.quarantine ~/Downloads/CarrierSIM(путь укажите свой, куда распаковали), потом запуститеCarrierSIMдвойным щелчком. Без этого macOS не даст открыть файл или его библиотеки. - Windows: iTunes x64 с сайта Apple нужен так же, как и скрипту. Запустите
CarrierSIM.exe.
Меню и флаги те же, что у скрипта: CarrierSIM --status, CarrierSIM --bundle Vodafone_ro --sims 1 и так далее. Сборка для macOS arm64 проверена без телефона (--check, меню). Сборки для Windows и Intel Mac на железе не запускались.
| Пункт | Что делает |
|---|---|
| 1 | Установить профиль по bundle.yaml (МТС России — Vodafone_ro, остальные — Vodafone_hu) |
| 2 | Показать SIM и план установки, ничего не записывая |
| 3 | Проверить компьютер и файлы, телефон не нужен |
| 4 | Вернуть штатный профиль (выбранной SIM или всем) |
| 5 | Восстановить после сбоя |
| 6 | Справка по флагам |
| 7 | Выбрать другой профиль и SIM (1, 2 или обе): сначала план и паспорт профиля, запись после подтверждения |
| 8 | Диагностика связи: IMS, VoLTE/VoWiFi/VoNR, сеть, 5G SA (только чтение журнала) |
| 9 | Проверка звонка: канал (Wi-Fi/LTE/5G) и кодек EVS/AMR (только чтение журнала) |
| 10 | Переключить связь с iPhone: кабель или Wi-Fi (эксперимент). В режиме Wi-Fi все действия с телефоном идут без кабеля |
| 11 | Отчёт о профиле для темы или issue: журнал CommCenter и что вы проверили сами (только чтение) |
Файл bundle.yaml рядом со скриптом задаёт пакет для пункта 1:
# Пакет по умолчанию для SIM России (250) и Беларуси (257)
default: Vodafone_hu
# Пакет для конкретного оператора: MCCMNC без пробела (250 01 = МТС RU)
25001: Vodafone_roДля каждой SIM сначала ищется строка с её MCCMNC, затем default. Без файла ставится Vodafone_hu. default действует только на SIM операторов России (MCC 250) и Беларуси (MCC 257): зарубежная SIM сохраняет свой профиль, в плане (пункт 2) она помечена «не трогаю». Чтобы сменить профиль зарубежной SIM, добавьте строку с её MCCMNC или выберите её номер в пункте 7 (флаг --sims 1 или 2): явно выбранный слот получает профиль при любом операторе. Имя пакета — как папка в /System/Library/Carrier Bundles/iPhone на телефоне, без .bundle. Пункт 7 и флаг --bundle на время запуска заменяют файл.
Пункты 1, 2 и 7 под планом показывают свойства выбранного пакета из таблицы ios-bundles.github.io: приоритет VoWiFi дома, VoWiFi в роуминге, подпись сети при звонке по Wi-Fi, номер активации iMessage/FaceTime, значок LTE/4G, переключатель VoLTE, 5G, EVS, доп. услуги через IMS (XCAP) и визуальную голосовую почту. Например, у Vodafone_tr номер активации iMessage местный турецкий, 13191: из российской сети он недоступен, и слетевшая активация по номеру может не восстановиться (так пишут в теме на 4pda). У Vodafone_ro VoWiFi в роуминге выключен.
Это содержимое файлов пакета из iOS 27.0 для iPhone 17, не проверка на телефоне: на деле оператор может вести себя иначе. Таблица скачивается раз в неделю в runs/bundles.json. Без интернета паспорт просто не показывается. Если имя пакета отличается от таблицы только регистром (mts_ua вместо MTS_ua), скрипт остановится до записи. Имени, которого нет в таблице, он подскажет похожие и продолжит: в другой iOS пакет может быть.
- «Настройки → Сотовая связь → нужная SIM» → включите «Вызовы по Wi-Fi».
- Включите авиарежим, затем включите Wi-Fi.
- Дождитесь, когда рядом с названием оператора появится отметка Wi-Fi.
- Выключите авиарежим. Дальше VoWiFi должен подключаться сам.
Какой профиль лучше для какого оператора, решают отзывы, а не таблица свойств пакета. Пункт 11 (флаг --report) собирает их в одном виде:
- 90 секунд читает журнал CommCenter, как пункт 8. На это время включите и через 10 секунд выключите авиарежим, Wi-Fi не выключайте.
- По каждой SIM спрашивает, что вы проверили руками: звонок по VoWiFi в авиарежиме, включается ли VoWiFi сам, остаётся ли звонок без Wi-Fi в 4G/5G (VoLTE), полосу 5G из
*3001#12345#*, iMessage с номера, SMS по Wi-Fi, режим модема, объединение вызовов. Отвечайте «д» (да), «н» (нет) или Enter (не проверял). Вопросы задаются только в терминале: если скрипт запущен без него, вопросы пропускаются, а в отчёте появляется строка «Ручные проверки: не заданы». - Печатает блок между «===== Отчёт» и «===== конец отчёта» и сохраняет его в
runs/ДАТА-report/report.txt.
В отчёте модель, iOS, оператор, загруженный профиль с версией, сводка журнала и ваши ответы. Номера, IMSI и ICCID в нём нет. Блок вставьте в тему или в issue по шаблону «Отчёт о профиле». Телефон не меняется.
Слетит ли профиль после обновления iOS или перезагрузки? По отзывам в теме на 4pda не слетает: после обновления 27.0 на 27.0.1 и после перезагрузок профиль остаётся. Закроет ли Apple сам способ записи в следующих версиях iOS, неизвестно.
Поменял SIM, и профиль пропал. Профиль привязан к IMSI. Новая SIM, перевыпуск eSIM или перенос номера с eSIM на пластиковую SIM дают новый IMSI, поэтому профиль нужно поставить заново пунктом 1 или 7.
Есть значок 5G, а скорость как в LTE. Значок и переключатель 5G ещё не значат, что телефон в сети 5G. Наберите *3001#12345# и нажмите вызов, откроется Field Test. Полосы с буквой n (n1, n7, n40) относятся к 5G NR, полосы с буквой b к LTE. NSA значит 5G поверх LTE: если рядом видны только b-полосы, телефон работает в LTE. n78 и n79 в России недоступны при любом пакете: разрешённые полосы задаёт подписанный файл GRI в Default.bundle, скрипт его не меняет.
Пропал переключатель VoLTE. У многих пакетов, в том числе Vodafone_hu, Vodafone_ro и Vodafone_tr, переключателя нет, а VoLTE включён всегда. Проверить просто: выключите Wi-Fi и позвоните. Если сеть во время звонка не падает в 3G и интернет работает, VoLTE работает.
VoWiFi включается только в авиарежиме или при слабом сигнале. Когда звонить через Wi-Fi, а когда через сотовую сеть, решают пакет и оператор. У части пакетов в домашней сети приоритет у сотовой связи. Сравнить пакеты по этому признаку можно на ios-bundles.github.io.
В строке оператора «Vodafone TR Wi-Fi» или «4G» вместо «LTE». Название сети при звонке через Wi-Fi и значок задаёт пакет. На связь это не влияет, а поменять их, не меняя пакет, нельзя: пакеты подписаны Apple.
Предлагают «Обновить настройки оператора». В теме один человек нажал «Обновить», и профиль слетел наполовину: 5G пропал. Ставил он версией v3. У другого с Vodafone_tr это предложение приходит каждый день, у третьего с тем же пакетом не приходит ни разу. Проверенных данных пока нет, поэтому обновление лучше не принимать. Если профиль всё же слетел, поставьте его заново пунктом 1 или 7 и опишите случай в issue #16.
МегаФон: SMS через VoWiFi не приходят. Звонки через Wi-Fi при этом работают. По словам нескольких человек в теме, МегаФон не передаёт SMS через VoWiFi вообще, и пакет здесь ничего не изменит. На Билайне SMS через VoWiFi ходят.
Билайн: переключатель «Вызовы по Wi-Fi» есть, а VoWiFi не работает. Сперва проверьте, что услуга подключена на номере. По отзывам в теме Билайн выключает её у SIM, которая стояла в телефоне без официальной поддержки VoWiFi. Помогает одно из двух. Позвонить в поддержку и попросить включить VoWiFi на номере (бывает, что отказывают). Или вставить SIM в Android либо в iPhone 13 и старее, включить там VoWiFi и вернуть SIM в iPhone.
T2 и VoWiFi. На 30.09.2026 у T2 VoWiFi на iPhone в теме ни у кого не заработал со штатной настройкой, хотя пробовали много пакетов; 5G при этом появляется. Один человек завёл его с пакетом Nova_is и подменой адреса ePDG в своём DNS, у двух других так не вышло. Поддержка T2 отвечает, что VoWiFi у них только для Android. То же пишут про операторов на сети T2, например Ростелеком и Т-Мобайл.
Профиль оператора для SIM выбирает процесс CommCenter. Пакеты лежат в двух местах:
/System/Library/Carrier Bundles/iPhone/*.bundle— системные пакеты, подписаны Apple, раздел только для чтения;/var/mobile/Library/Carrier Bundles/iPhone— пользовательский каталог: обновления пакетов (IPCC) и симлинки, по которым CommCenter находит пакет для SIM.
Скрипт меняет только пользовательский каталог.
Компьютер общается с iPhone по USB или, в режиме Wi-Fi, по локальной сети через службы, которые телефон открывает после «Доверять». Скрипт использует пять из них:
- AFC (Apple File Conduit,
com.apple.afc) — доступ к файлам телефона, но только внутри/var/mobile/Media. Этой службой пользуются приложения для импорта фото и файловые менеджеры для iPhone. К/var/mobile/Libraryи/Systemона доступа не даёт. installation_proxy— установка приложений и пакетов оператора IPCC.syslog_relay— системный журнал телефона, из него читаются сообщения CommCenter.streaming_zip_conduit— загрузка ZIP-архива с распаковкой в/var/mobile/Media.- AirTraffic (
com.apple.atc) — синхронизация медиатеки iTunes/Finder.
Первые четыре скрипт вызывает через библиотеку pymobiledevice3, AirTraffic — через библиотеку Apple (см. ниже).
Шаги:
- Триггер. Через
installation_proxyставит подписанный IPCC другого оператора (AVEA_tr,Swisscom_chилиO2_Germany— тот, что не совпадает с вашими SIM). Установка IPCC заставляет CommCenter заново выбрать пакеты. Если каталога на телефоне ещё нет, она его создаёт. Пакет триггера остаётся в каталоге, но к вашим SIM не относится. - Копия. Забирает каталог в
/var/mobile/Media, читает его по AFC и сохраняет вruns/…/original.zip. - Запись. Добавляет в корень каталога симлинки с именем из 15 цифр IMSI каждой выбранной SIM на
/System/Library/Carrier Bundles/iPhone/Vodafone_hu.bundle(или на пакет, выбранный в пункте 7). Остальное содержимое каталога не меняется. - Проверка. Читает записанный каталог обратно и сравнивает с планом. Затем снова ставит триггер и по журналу CommCenter (
Resolved path,Verification Result) проверяет, какой пакет выбран для каждой SIM и принята ли его подпись. Если в пункте 7 выбранный пакет не выбран ни для одной SIM (такого пакета нет в этой iOS), каталог возвращается из копии.
Каталог лежит вне /var/mobile/Media, поэтому через AFC записать его нельзя. Перенос сделан по методу AirLift: архив с деревом каталога загружается в Media через streaming_zip_conduit, а затем служба синхронизации AirTraffic (протокол iTunes) в ходе поддельной синхронизации книг перемещает его на место по относительному пути. Служебные файлы, которые AirTraffic оставляет в /var/mobile/Media/Books, скрипт удаляет, а исходное состояние Books сверяет с копией. Протокол AirTraffic реализован закрытой библиотекой Apple AirTrafficHost: на macOS она входит в систему, на Windows ставится с iTunes. Под Linux её нет, поэтому там скрипт не работает.
Пункт 4 удаляет из корня каталога все симлинки с именем из 15 цифр. Остальное содержимое каталога, включая симлинки по MCCMNC и пакеты IPCC, не трогается.
- «Прошлая операция не завершилась». Выберите пункт 5, затем повторите нужный пункт.
- Вернуть штатный выбор пакетов. Пункт 4 удаляет IMSI-симлинки, добавленные скриптом.
- «Журнал iPhone оборвался» в пунктах 8 и 9. При включении авиарежима iPhone может закрыть поток журнала. Скрипт переподключается и дочитывает до конца отведённого времени, а в конце пишет, сколько было переподключений. Если журнал не возвращается больше 20 секунд (по Wi-Fi авиарежим может оборвать всю связь), отчёт собирается по тому, что пришло до обрыва; если журнала не было совсем (например, выдернут кабель), сбор останавливается с ошибкой.
- «Выбор не подтверждён» (код выхода 3). По каждой SIM скрипт пишет, что выбрала iOS: «iOS выбрала X вместо Y» (если iOS выбрала другой пакет, скрипт сам возвращает прежние настройки), «подпись не принята» или «нет выбора пакета для этой SIM». Если iOS в журнале выбирала пакеты, но не этот, скрипт возвращает прежние настройки. Если журнал пересканирования пустой, каталог остаётся записанным: включите авиарежим на 15 секунд и посмотрите пунктом 2 строку «сейчас».
- Папка
runsхранит копии каталога и журналы операций. Пока установка идёт, не удаляйте её. Переносить её в новую версию не нужно: остатки прошлых запусков скрипт убирает с телефона сам. Не публикуйте её: в журналах есть идентификаторы SIM и телефона. Стандартнаяrunsуже исключена в.gitignore. Если указываете свою папку через--runsвнутри клона репозитория, исключите её сами, лучше в.git/info/exclude: например, для--runs wifi-runsдобавьте строку/wifi-runs/. Скрипт правила git не меняет. - Версия CarrierSIM указана в меню, начале
session.log,environment.jsonи блоке диагностики. Суффикс-devозначает версию в разработке. «Сборка скрипта» — первые 12 символов SHA256 файлаcarrier.py, позволяющие различать изменения внутри одной версии. Без подключения телефона версию можно посмотреть командойpython carrier.py --version.
macOS пишет «Запуск macOS.command повреждено… Переместите в Корзину». Файл не повреждён: macOS так блокирует неподписанные файлы, скачанные из интернета или Telegram.
- Нажмите «Отменить».
- Откройте «Терминал», напечатайте
bashс пробелом в конце, перетащите в окно файлЗапуск macOS.commandи нажмите Enter.
Можно один раз снять метку карантина с папки, и дальше двойной щелчок будет работать:
/usr/bin/xattr -r -s -d com.apple.quarantine "$HOME/Downloads/CarrierSIM"Windows не видит iPhone. В «Проводнике» телефон есть (как Apple iPhone, видны фото), а iTunes и скрипт его не находят. Значит, не установлен драйвер Apple Mobile Device USB. Переустановка iTunes не всегда помогает. Скачайте драйвер «Apple Mobile Device USB Driver» из Microsoft Update Catalog, распакуйте .cab и в командной строке от администратора выполните pnputil /add-driver usbaapl64.inf /install из папки с распакованными файлами. Затем перезагрузите компьютер.
«Grappa session could not be established». Скрипт пишет «iPhone не принял компоненты Apple на этом компьютере» (версии до этой — «Сбой AirTraffic: Синхронизация закончилась преждевременно»), в журнале iPhone эта строка. Встречалось на Windows. Значит, iPhone не принял установленные компоненты Apple, и повтор не поможет. Удалите iTunes (и версию из Microsoft Store, если есть), установите iTunes x64 с сайта Apple, запустите его один раз и повторите. Ставьте полный установщик iTunes, а не только AppleMobileDeviceSupport64.msi из него. В одном случае помогла только версия 12.11.0.26, и перед первым запуском пришлось удалить старую медиатеку iTunes (иначе iTunes выдавал ошибку).
«iPhone запрещает установку (InstallProhibited)». В «Экранном времени» запрещена установка приложений: «Настройки → Экранное время → Ограничения контента и конфиденциальности → Покупки в iTunes Store и App Store → Установка приложений» — поставьте «Да» на время установки. То же бывает у телефонов с профилем управления (MDM).
«iPhone запрещает изменить Books/Books.plist, а в нём остались записи скрипта». Сохраните папку runs с резервными копиями. В одном случае помогла такая последовательность:
- Отключите iPhone от компьютера.
- Закройте все приложения на iPhone, смахнув их в переключателе приложений.
- Принудительно перезагрузите iPhone: быстро нажмите и отпустите кнопку увеличения громкости, затем кнопку уменьшения громкости, после этого удерживайте боковую кнопку до логотипа Apple (инструкция Apple).
- После загрузки разблокируйте iPhone и подключите его к компьютеру.
- В той же папке CarrierSIM повторите пункт 5 меню (
--recover). Если ошибка повторится, отправьте автору текст ошибки и журнал сеанса.
«Служебные файлы Books постоянно меняются». Закройте приложение «Книги» на iPhone, дождитесь окончания загрузки книг и повторите.
«Скрипт не может работать из этой папки». Скопируйте папку CarrierSIM в «Загрузки» и запустите оттуда.
Пункт 10 в меню или флаг --wifi. Те же службы идут через usbmuxd по сети, как синхронизация Finder по Wi-Fi. Полный цикл установки по Wi-Fi проверен на iPhone 16 Pro Max / iOS 27.0.1: работает, но медленнее, чем по кабелю. Если шаг AirTraffic по Wi-Fi не подключается («AirTraffic не ответил по Wi-Fi за 170 с»), а по кабелю проходит сразу, на macOS проверьте разрешение «Локальная сеть» для терминала («Системные настройки → Конфиденциальность и безопасность → Локальная сеть»): AirTraffic соединяется с iPhone напрямую, и без разрешения macOS молча режет соединение. В tmux, screen и SSH разрешения нет, запускайте Запуск macOS.command (в готовой сборке — CarrierSIM) из Finder или обычное окно терминала. В этом случае скрипт один раз откатывает телефон и не повторяет попытки по Wi-Fi. Дальше подключите кабель, пункт 10 → «кабель» и повторите. Если откат по Wi-Fi не прошёл (сообщение «Автовосстановление не завершено»), сначала выполните пункт 5 по кабелю.
Доверие по Wi-Fi не выдаётся: без готовой пары скрипт остановится и попросит кабель. Сеть должна пропускать Bonjour: гостевые сети и изоляция клиентов на роутере не подойдут.
На macOS терминалу нужно разрешение «Локальная сеть» («Системные настройки → Конфиденциальность и безопасность → Локальная сеть»). Статус и чтение идут через системную службу usbmuxd и работают без него, а шаг AirTraffic соединяется с iPhone напрямую, и без разрешения macOS его молча режет. Скрипт проверяет это перед установкой. При первом запуске macOS может показать окно «Локальная сеть»: нажмите «Разрешить», скрипт ждёт ответа до 20 с. Нет разрешения — останавливается с подсказкой. Откат (пункт 5) проверяет только перед возвратом каталога операторов: если осталось вернуть одни Книги, разрешение не нужно. Из tmux, screen и SSH macOS разрешения не спрашивает и доступ запрещает: запускайте Запуск macOS.command (в готовой сборке — CarrierSIM) из Finder или обычное окно терминала.
Подготовка (с кабелем, один раз)
- Подключите iPhone кабелем, разблокируйте, нажмите «Доверять».
- Запустите меню, пункт 2. SIM должны показаться: доверие есть.
- Откройте Finder → iPhone в боковой панели → вкладка «Основные» → включите «Показывать этот iPhone, если он подключён к Wi-Fi» → «Применить». На Windows то же в iTunes, «Обзор» → «Параметры».
- Закройте Finder/iTunes и отключите кабель.
Проверка связи (ничего не пишет)
- iPhone и компьютер в одной сети Wi-Fi (не гостевой, без изоляции клиентов). iPhone разблокирован, экран не гаснет.
- Меню: 10 (должно стать «Wi-Fi»), затем 2.
- Появились SIM и план — связь по Wi-Fi работает. «iPhone не виден по Wi-Fi» — не включена галка из шага 3, телефон спит или сеть режет Bonjour. «Нет доверия» — повторите шаги 1–2.
Установка
- Кабель держите под рукой. Меню: 10 → Wi-Fi, затем 1.
- Установка идёт дольше, чем по кабелю, — это нормально. Если сеть нестабильна и выпадает «Сбой AirTraffic», подключите кабель и повторите в режиме «кабель».
- При сбое скрипт сам откатывает телефон, тоже по Wi-Fi. Если телефон уснул или пропал из сети посреди записи, этап прерывается через 5 минут, дальше откат. Не откатил — подключите кабель, 10 → кабель, 5.
- «Готово» — проверьте VoWiFi по разделу «После установки».
Журналы каждого запуска лежат в runs, host.jsonl — ответы AirTraffic. Их и прикладывайте к отчёту.
python3 carrier.py --status # SIM и план, без записи
python3 carrier.py --wifi --status # то же по Wi-Fi
python3 carrier.py # Vodafone HU на все SIM
python3 carrier.py --bundle O2_Germany --sims 1 # другой профиль, только SIM 1
python3 carrier.py --restore # вернуть штатные профили
python3 carrier.py --restore --sims 2 # только для SIM 2
python3 carrier.py --help # все флагиНа Windows вместо python3 пишите py. Подробное техническое описание есть в README.txt.
Собственный код CarrierSIM распространяется под MIT. Copyright © 2026 Vladimir B / vlw и участники проекта. При распространении копий или существенных частей кода сохраняйте авторское уведомление и текст лицензии.
Сторонний код сохраняет свои лицензии. Лицензия CarrierSIM не распространяется на файлы Apple, включая IPCC-триггеры в assets.zip, системные пакеты операторов и библиотеки Apple: права на них принадлежат соответствующим правообладателям.
Протокол переноса основан на AirLift (MIT, лицензия в LICENSE-AirLift.txt).
Workflow Tests запускается на коммитах в ветках и в pull request. Матрица проверяет Python 3.11–3.14 на Windows, Linux, macOS 15 и 26 (Apple Silicon и Intel) и macOS 27 (Apple Silicon, образ GitHub xcode-27 в режиме public preview): установку зависимостей через тот же код, что использует запускатель, импорты сервисов, компиляцию исходников и регрессионные тесты. Это 28 сочетаний Python и ОС. Фактические версии ОС и Python и архитектура выводятся в журнал задания. Общий статус Python compatibility успешен только после прохождения всей матрицы; его можно назначить обязательной проверкой в правилах ветки.
Тесты проверяют архивы и резервные копии, конфигурацию профилей, выбор и восстановление SIM, обработку ошибок, служебные файлы Books и логи. Они используют временные файлы и имитацию границ подключения, не подключаются к телефону и не заменяют проверку на реальном iPhone.
Локальный запуск без установки зависимостей и подключения телефона:
python -m unittest discover -s tests -v