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. Включваме проксито в емулатора:
Shell
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.

Изключване на проксито, когато вече не е нужно:

Shell
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
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>

и го свържете в манифеста:

XML
<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 този проблем го няма.