Как перехватывать HTTPS-трафик на Android без сертификатов и ручной настройки прокси
Репозиторий давно не обновлялся
Последнее обновление было 6 месяцев назад.
Любой Android-разработчик хотя бы раз тратил половину рабочего дня на настройку сетевого отладчика. Сценарий всегда один и тот же: нужно посмотреть, что приложение отправляет на бэкенд, а в ответ прилетает SSLHandshakeException.
Дальше начинается ритуал. Сначала вы генерируете самоподписанный CA-сертификат. Затем пытаетесь установить его в хранилище доверенных сертификатов на тестовом телефоне. Начиная с Android 7.0 (API 24), система по умолчанию игнорирует пользовательские сертификаты, поэтому приходится править network_security_config.xml, прописывать trust-anchors для дебаг-сборок и пересобирать APK. Если же в проекте настроен SSL Pinning или вы тестируете на Android 14, где работу с системными сертификатами усложнили еще сильнее, простая проверка заголовка ответа превращается в отдельную инженерную задачу.
Библиотека atlantis-android от команды Proxyman решает эту головную боль радикально: она убирает необходимость настраивать прокси и трогать системные сертификаты устройства.
В чем идея Atlantis
Традиционные инструменты вроде Charles, Fiddler или самого Proxyman обычно работают по схеме Man-in-the-Middle (MitM). Устройство перенаправляет весь трафик на IP-адрес компьютера, а десктопное приложение перехватывает запросы, расшифровывает их своим сертификатом и шлет дальше. Из-за этого и возникают сложности с доверием к сертификатам и настройкой Wi-Fi.
Atlantis работает иначе. Это компактная библиотека на Kotlin, которая встраивается прямо в дебаг-сборку приложения в виде перехватчика для сетевого клиента. Перехватчик считывает параметры запросов и ответов в тот момент, когда приложение уже сформировало их или только что расшифровало. Затем библиотека сериализует эти данные, сжимает их через GZIP и по отдельному локальному сокету передает напрямую в приложение Proxyman на macOS.
В результате вы получаете детальный лог сетевой активности без вмешательства в настройки Android, без правок манифеста и без манипуляций с сертификатами.
Что умеет библиотека
Atlantis закрывает большинство повседневных задач сетевого дебага:
- Перехват обычных HTTP и HTTPS запросов прямо из OkHttp.
- Логирование событий WebSocket: открытие соединения, отправка сообщений, входящие пакеты и закрытие сессии.
- Полная совместимость с популярными сетевыми клиентами, включая Retrofit 2.9+ и Apollo Kotlin 3.x/4.x.
- Автоматический поиск запущенного Proxyman в локальной сети через Network Service Discovery (mDNS).
Если вы запускаете проект на официальном эмуляторе Android, библиотека умеет подключаться к хостовой машине напрямую, минуя сетевое обнаружение.
Как подключить к проекту
Для работы библиотеке нужен Android с API 26 (Android 8.0) или новее, OkHttp версии 4.x или 5.x, а также Kotlin версии не ниже 1.9.
Сначала добавьте репозиторий JitPack в файл settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
После этого подключите зависимость в build.gradle.kts вашего приложения. Подключать лучше строго через debugImplementation, чтобы отладочный код не попал в релизный билд:
dependencies {
debugImplementation("com.github.ProxymanApp:atlantis-android:v1.0.0")
}
Также библиотека доступна и в Maven Central под артефактом com.proxyman:atlantis-android:1.0.0.
Быстрый старт
Интеграция занимает всего несколько строк кода. Сначала инициализируем Atlantis в классе приложения:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Atlantis.start(this)
}
}
}
Затем добавляем интерцептор в конфигурацию OkHttpClient:
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(Atlantis.getInterceptor())
.build()
Если вы используете Retrofit, передайте этот экземпляр okHttpClient в Retrofit.Builder(), и все запросы начнут автоматически отображаться в окне Proxyman.
Работа с WebSocket
Если в приложении есть вебсокеты, стандартного интерцептора OkHttp будет недостаточно, так как сообщения передаются в рамках уже открытого соединения. Для таких случаев в библиотеке есть специальная обертка для слушателя:
val originalListener = object : WebSocketListener() {
override fun onOpen(webSocket: WebSocket, response: Response) {
// обработка открытия
}
override fun onMessage(webSocket: WebSocket, text: String) {
// входящее сообщение
}
}
val wrappedListener = Atlantis.wrapWebSocketListener(originalListener)
okHttpClient.newWebSocket(request, wrappedListener)
Теперь в десктопном клиенте можно наблюдать за входящими и исходящими фреймами в реальном времени.
Что внутри
Исходный код библиотеки минималистичен и открыт под лицензией Apache 2.0. В репозитории почти нет сторонних тяжелых зависимостей.
Архитектура состоит из нескольких понятных модулей:
AtlantisInterceptorиAtlantisWebSocketListenerперехватывают данные на уровне сетевого стека.GzipCompressionиBase64Utilsупаковывают тела запросов и бинарные пейлоады, уменьшая нагрузку на канал связи между телефоном и компьютером.NsdServiceDiscoveryотвечает за поиск сервиса_proxyman._tcpв локальной сети через Android NSD API.Transporterоткрывает TCP-соединение с десктопным приложением и пересылает структурированные пакеты.
Благодаря сжатию трафика отладка практически не влияет на скорость работы самого приложения.
Ограничения, о которых стоит знать
Перед тем как внедрять библиотеку, нужно учесть два момента.
Во-первых, Atlantis привязан к десктопному клиенту Proxyman. Если в вашей команде привыкли использовать исключительно Wireshark или Charles, передать туда данные через этот интерцептор не получится.
Во-вторых, библиотека перехватывает трафик только тех клиентов, куда вы явно добавили интерцептор. Если в приложении сторонний SDK делает сетевые вызовы через собственный HttpURLConnection или Cronet, эти запросы Atlantis не увидит. Для полного анализа сторонних бинарников по-прежнему придется использовать классический MitM-прокси.
Стоит ли пробовать
Если ваша основная рабочая машина работает на macOS и вы уже используете Proxyman для отладки iOS или бэкенда, atlantis-android экономит массу времени. Вы навсегда забываете о настройке Wi-Fi прокси на тестовых смартфонах, сбросе сертификатов и правках network_security_config. Достаточно собрать debug-сборку, открыть приложение на телефоне, и весь сетевой обмен сразу появляется на экране.

