Как настроить Charles Proxy для эмулятора Android Studio
Инструкция проверена в начале 2023 года на Windows 10, эмуляторе с API 33, Android Studio 2022.1.1 и Charles Proxy 4.6.3. Я написал её, потому что не нашёл актуальной инструкции: в настройках эмулятора, запущенного внутри Android Studio, пропала привычная вкладка Proxy, а в Charles немного переделали настройку. Для HTTPS эта вкладка всё равно не помогла бы: она задаёт прокси эмулятора, который туннелирует HTTPS без расшифровки, а Charles нужен системный прокси Android — его и настраивают шаги ниже.
Прокси
- Запускаем Charles Proxy.
- Снимаем галочку Proxy → Windows Proxy (на macOS — macOS Proxy), чтобы Charles не перехватывал весь трафик компьютера.
- Смотрим локальный адрес компьютера в сети: Help → Local IP Address, или в настройках сети.
- В Proxy → Proxy Settings… проверяем, что указан порт 8888.
- Находим Android SDK: в настройках Android Studio вводим в поиске «sdk», открываем Android SDK и копируем путь из Android SDK Location. Утилита
adbлежит в его папкеplatform-tools. - Включаем прокси в эмуляторе:
C:\Users\<имя пользователя>\AppData\Local\Android\Sdk\platform-tools\adb.exe shell settings put global http_proxy <локальный IP>:8888Можно сначала перейти в папку platform-tools командой cd и вызывать просто adb. Вместо локального IP эмулятору можно указать 10.0.2.2 — это его постоянный адрес для компьютера, на котором он запущен, и он не меняется вместе с сетью.
- В Charles появится запрос на подключение — подтверждаем его.
- Во вкладке сессии появятся запросы, в том числе из эмулятора. Чтобы оставить только нужный домен, нажимаем на него правой кнопкой и выбираем Focus.
Выключить прокси, когда он больше не нужен:
adb shell settings put global http_proxy :0Сертификат и HTTPS
- Открываем Chrome в эмуляторе, переходим на
http://chls.pro/sslи скачиваем сертификат. - В настройках эмулятора ищем «certificate», открываем Install certificate (в разных версиях пункт вложен в разные меню) и устанавливаем скачанный сертификат.
- В Trusted credentials на вкладке User должен появиться сертификат Charles Proxy.
- В Charles выбираем нужный адрес, правой кнопкой — Copy URL, затем Proxy → SSL Proxying Settings… → Include → Add и добавляем скопированный адрес; порт можно не указывать. После очистки истории запросы к этому адресу начнут показываться деревом REST-путей.
Важно: так вы увидите HTTPS только из Chrome. Начиная с Android 7 приложения по умолчанию не доверяют сертификатам, которые установил пользователь, поэтому запросы вашего приложения останутся нечитаемыми. Чтобы отладочная сборка доверяла сертификату Charles, добавьте в проект файл res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?><network-security-config> <debug-overrides> <trust-anchors> <certificates src="user" /> </trust-anchors> </debug-overrides></network-security-config>и подключите его в манифесте:
<application android:networkSecurityConfig="@xml/network_security_config" ... >Блок debug-overrides действует только в отладочной сборке, в релиз это доверие не попадёт. Если в приложении настроен certificate pinning, его на время отладки тоже придётся отключить.
Подмена запросов и ответов
Есть три способа:
- Tools → Rewrite… — добавляем адрес, создаём правило типа Body, отмечаем Response и в поле Value пишем нужный ответ.
- Proxy → Breakpoints — запрос или ответ останавливается, и его можно поправить вручную прямо во время выполнения.
- Tools → Map Local — вместо ответа сервера подставляется локальный файл.
И последнее: если роутер выдаёт компьютеру динамический IP-адрес, при следующем подключении он может оказаться другим, и прокси в эмуляторе придётся перенастроить. С адресом 10.0.2.2 этой проблемы нет.