Roman Kryvolapov Engineering Blog

Как настроить 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 — его и настраивают шаги ниже.

Прокси

  1. Запускаем Charles Proxy.
  2. Снимаем галочку Proxy → Windows Proxy (на macOS — macOS Proxy), чтобы Charles не перехватывал весь трафик компьютера.
  3. Смотрим локальный адрес компьютера в сети: Help → Local IP Address, или в настройках сети.
  4. В Proxy → Proxy Settings… проверяем, что указан порт 8888.
  5. Находим Android SDK: в настройках Android Studio вводим в поиске «sdk», открываем Android SDK и копируем путь из Android SDK Location. Утилита adb лежит в его папке platform-tools.
  6. Включаем прокси в эмуляторе:
Terminal window
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 — это его постоянный адрес для компьютера, на котором он запущен, и он не меняется вместе с сетью.

  1. В Charles появится запрос на подключение — подтверждаем его.
  2. Во вкладке сессии появятся запросы, в том числе из эмулятора. Чтобы оставить только нужный домен, нажимаем на него правой кнопкой и выбираем Focus.

Выключить прокси, когда он больше не нужен:

Terminal window
adb shell settings put global http_proxy :0

Сертификат и HTTPS

  1. Открываем Chrome в эмуляторе, переходим на http://chls.pro/ssl и скачиваем сертификат.
  2. В настройках эмулятора ищем «certificate», открываем Install certificate (в разных версиях пункт вложен в разные меню) и устанавливаем скачанный сертификат.
  3. В Trusted credentials на вкладке User должен появиться сертификат Charles Proxy.
  4. В 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 этой проблемы нет.