Android: Как программно перехватить сетевой трафик приложения?

В настоящее время я работаю над библиотекой, которая позволяет QA или разработчикам отлаживать сетевой трафик в их приложении, в настоящее время мы используем OKHttp, и я знаю, как создать перехватчик и отправить все данные запроса в библиотеку. так что разработчики или QA могут просматривать такие данные (полезная нагрузка /URL/ размер / коды ответов / продолжительность... и т. д.), однако я хочу создать более общее решение, которое прослушивает HTTP-трафик или даже TCP-трафик, а затем извлекает его оттуда, однако я не смог найти отправную точку, я знаю, что это возможно, поскольку Firebase Performance делает это, но все же я не смог найти API или все равно прослушать такой трафик.

Я надеюсь, что кто-то из команды Google Firebase Performance Team поделится информацией о том, как они это делают, если это не коммерческая тайна:)

Я столкнулся с этим решением: https://github.com/cyruliu/Sensitive_API_Monitor/blob/master/app/src/main/java/com/android/reverse/apimonitor/NetWorkHook.java Однако, с отражением это выглядит довольно плохо, я надеюсь найти лучший путь.

1 ответ

Короткий ответ: это невозможно без прокси всего устройства.

Специально для OkHttp3 я написал здесь: https://github.com/shehabic/sherlock который реализует перехватчик, который создает новый сеанс каждый раз, когда вы открываете свое приложение и захватывает сетевые запросы, вы также можете иметь несколько сеансов, он добавляет Плавающий значок, который помогает вам получить доступ к истории сеансов и запросов, а также некоторые возможности экспорта, кроме того, он добавляет дополнительный значок запуска, который вы можете использовать для доступа к захватам запросов, не прерывая процесс приложения.

Что касается производительности Firebase, вся магия на самом деле в плагине Firebase-Perf Gradle; чтобы упростить его, он просматривает код проекта и заменяет прямые вызовы OkHttpClient, которые должны быть проксированы через их собственный FirebaseOkHttpClient, и оттуда они получают всю информацию, даже для запроса https, когда они становятся клиентом http.

Я надеюсь, что это сэкономит кому-то время в будущем.

Другие вопросы по тегам