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 цієї проблеми немає.