Різні способи дебага запитів з Android-пристроїв і емуляторів

Багато розробники стикаються з питанням: «Як подивитися те, що додаток відправляє в мережу і як побачити відповідь від сервера?». Існує безліч різних варіантів профайлінгу, але описати все буде досить проблематично. Для себе я виділив 5 способів, якими поділюся з вами:

Всі вони мають свої плюси і мінуси, але однозначно дозволять вам зробити профайлинг роботи з мережею зручним і прозорим.

Android Profiler

З кожним роком розробники Android і Android Studio роблять життя програмістів все простіше і простіше. У студії 3.0 був доданий відмінний функціонал — Advanced Network Profiling . Він може відобразити кількість відправлених/отриманих даних, таймінг мережі, а головне, з допомогою нього ви можете побачити запити безпосередньо в Android Studio.

Щоправда, є певні обмеження — підтримка тільки HttpURLConnection або OkHttp , але, думаю, цього достатньо з головою.

Отже, для включення розширеного набору:

1. Треба зайти в меню Run > Edit Configurations .

2. Вибрати свій модуль в лівій частині.

3. Перейти в Profiling вкладку праворуч і включити Enable advanced profiling .

4. І тепер скомпілювати і запустити проект.

Потім відкриваємо Profiler і вибираємо Network . Після цих маніпуляцій бачимо запити в реальному часі, і якщо виділимо якийсь часовий інтервал, то з'явиться детальна інформація:

Всю цю нехитру налаштування і використання ви можете переглянути на відео .

З плюсів такого методу я можу виділити наступні:

З мінусів:

OkHttp Profiler plugin

Плагін до Android Studio /Intellij IDEA , який відображає запити бібліотек OkHttp /Retrofit безпосередньо в IDE. У нього вбудована можливість створення Java/Kotlin моделей для Gson десериализатора з отриманого JSON-відповіді.

Для активізації плагіна необхідно додати Interceptor-бібліотеку у build.gradle файл (на рівень модуля):

dependencies {
//...............
 implementation 'com.itkacher.okhttpprofiler:okhttpprofiler:1.0.3'
}

І підключити її до OkHttp-клієнту:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
 builder.addInterceptor(new OkHttpProfilerInterceptor());
}
OkHttpClient client = builder.build();

Вимикаємо за замовчуванням зайві обробники для релізних білдів — вони там ні до чого. Далі встановлюємо сам плагін, викликаючи меню налаштувань:

Preferences -> вкладка Plugins -> тиснемо на кнопку Browse repositories... -> вводимо OkHttp Profiler.

У списку відображається плагін останньої версії, тиснемо Install іRestart.

Внизу праворуч з'явився «OkHttp Profiler » — відкриваємо його і пересобираем проект. Тепер всі вихідні запити будуть відображатись у цьому вікні.

Невелике демо використання. Додаткова інформація про установці тут .

З плюсів цієї бібліотеки можу відзначити такі:

З мінусів:

Stetho

Профайл-рішення від компанії Facebook , яке припаде до душі тим, хто вже дебажил веб в браузері Chrome. Ця бібліотека створює якийсь міст між вашою програмою і браузером, за допомогою якого відображаються дані по мережі, бази даних і view ієрархії.

Для включення треба додати саму бібліотеку у build.gradle:

dependencies { 
 implementation 'com.facebook.stetho:stetho:1.5.0' 
 implementation 'com.facebook.stetho:stetho-okhttp3:1.5.0' // якщо ви використовуєте OkHttp 
 } 

І ініціалізувати її в onCreate методі MainActivity:

class MainActivity extends AppCompatActivity {
@Override
 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Stetho.initializeWithDefaults(this);
 } 
}

Для OkHttp-клієнта треба додати interceptor при ініціалізації:

new OkHttpClient.Builder()
 .addNetworkInterceptor(new StethoInterceptor())
.build();

Запускаємо додаток з усіма змінами, відкриваємо Chrome-браузер і вбиваємо в рядок адреси chrome://inspect/#devices .

Натискаємо «Inspect » біля додатки.

У вкладці Network буде будуть з'являтися всі вихідні запити.

З плюсів можу відзначити:

З мінусів:

Charles Proxy

Проксі-додаток, що відображає весь вихідний і вхідний трафік з пристрою. Воно також містить багато інструментів для роботи з мережею: складання нових запитів, переадресація, зміна параметрів мережі (імітація поганий зв'язку), відображення підключених сокетів. Додаток платне, але його можна використовувати без покупки (буде вимагати перезавантаження через певний інтервал часу).

Для спрямування всього трафіку через Charles необхідно налаштувати і пристрій, і сам проект. Розглянемо на прикладі нативного емулятора з Android 8.0 на борту.

Качаємо програму за посиланням (є версії для Windows, Mac, Linux).

Відкриваємо налаштування емулятора:

Preferences -> Network & Internet -> Wi-fi -> Edit -> Settings icon

І вводимо:

Proxy: Manual
Proxy hostname: 10.0.2.2 (це не локальний IP, просто завжди використовуйте 10.0.2.2)
Proxy port: 8888

Натискаємо Save .

Тепер потрібно встановити сертифікат безпеки, щоб ми могли бачити HTTPS-запитів.

Повертаємося на головний екран емулятора і вводимо chls.pro/ssl в рядок пошуку. Емулятор збереже файл, відкриваємо його (або натиснувши на push notification або просто в папці Downloads). Система попросить ввести ім'я сертифікату — туди вбиваємо будь-яке значення (ім'я не впливає ні на що). Потім буде запропоновано убезпечити систему, вибираємо простий пін і встановлюємо щось типу 1111 — це теж не має значення.

І це ще не кінець :)

Далі нам треба дозволити додатком використовувати користувальницькі сертифікати, але робимо це тільки для debug-білдів. Для чого нам це робити, ви можете прочитати тут .

Відкриваємо наш проект у папці ресурсів (res ) створюємо папку xml , в ній вже створюємо файл network_security_config.xml.

І додаємо туди рядки:

<?xml version="1.0" encoding="utf-8"?>
<network security-config>
<debug-overrides>
<trust-anchors>
 <certificates src="system" />
 <certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>

В результаті ми отримаємо наступну картину:

Потім додамо налаштування AndroidManifest.xml відкриваємо його і додаємо android:networkSecurityConfig="@xml/network_security_config"у application tag.

І це ще теж не все :)

Відкриваємо Charles , меню Proxy -> SSL Proxing Settings...

У спливаючому вікні ставимо галочку в чекбокс Enable SSL Proxying і додаємо домени, з якими буде працювати наш додаток.

Тепер пересобираем наш проект і дивимося результати в Charles.

З плюсів такого способу:

З мінусів:

AppSpector

Рішення для набору мережі і не тільки. Через нього можна подивитися базу даних, логи, системну інформацію.

Для підключення необхідно зареєструватися на сервісі .

Після реєстрації вам будуть показані актуальні коди з'єднання з потрібним ключем.

Треба додати таке уbuild.gradle проекту:

buildscript {
 repositories {
jcenter()
google()
 maven {
 url "https://maven.appspector.com/artifactory/android-sdk"
}
}

 dependencies {
 classpath "com.appspector:android-sdk-plugin:1.0.4"
}
}

apply plugin: 'com.android.application'

І в build.gradle модуля:

// Put AppSpector plugin after Android plugin
apply plugin: 'com.appspector.sdk'

repositories {
 maven {
 url "https://maven.appspector.com/artifactory/android-sdk"
}
}

dependencies {
 implementation "com.appspector:android-sdk:1.0.4"
}

Потім додати інструмент Application:

import android.app.Application;

import com.appspector.sdk.AppSpector;

public class AmazingApp extends Application {

@Override
 public void onCreate() {
super.onCreate();

 // We recommend to start AppSpector from Application#onCreate method

 // You can start all monitors
AppSpector
.build(this)
 .withDefaultMonitors() 
.run (YOUR_CODE");
}
}

Після запуску проекту з цими змінами в кабінеті користувача з'явиться кожен девайс, на якому запустили додаток.

Вибравши пристрій, бачимо різні області профайлінгу, в тому числі і мережа.

Отже, плюси:

Мінуси:

Висновок

Плюси і мінуси засновані виключно на моїх міркуваннях, так що вони суб'єктивні і можуть відрізнятися від ваших. Якщо ви знаєте, використовуєте ще якісь способи, які зручні і доступні — милості прошу залишити коментар під текстом :)

Всім добра.

Опубліковано: 09/11/18 @ 11:08
Розділ Пошуковики

Рекомендуємо:

Як подолати страх публічних виступів: поради бізнес-тренера
Перегляд бізнес-моделі через 3 дні після старту реклами в Фейсбуці
Предметно-орієнтована архітектура Rails
«У 2016-му моя зарплата з двох шкіл становила 2400 гривень». Як я пройшов шлях від сільського вчителя до програміста
Як українські IT-компанії святкували Halloween 2018