Як налаштувати 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 цієї проблеми немає.