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