Статьи

Отладка Android-приложений с помощью Stetho на Facebook

Stetho — это открытая отладочная платформа с открытым исходным кодом, разработанная Facebook, которая предлагает богатый и интерактивный опыт отладки для разработчиков Android. С помощью Stetho отладка собственных приложений Android становится такой же простой, как и отладка веб-страницы, поскольку она позволяет использовать инструменты разработчика Google Chrome для выполнения различных действий по отладке, таких как проверка иерархии представлений, проверка сети, управление базами данных SQLite и многое другое.

В этом руководстве вы узнаете, как добавить Stetho в проект Android и использовать для его отладки инструменты разработчика Google Chrome и утилиту командной строки Stetho , dumpapp .

Чтобы добавить библиотеку Stetho в свой проект, добавьте com.facebook.stetho:stetho в качестве зависимости compile в файле build.gradle модуля app :

java compile 'com.facebook.stetho:stetho:1.1.1'

В этом руководстве вы будете использовать OkHttp , популярную сетевую библиотеку от Square, для управления всеми сетевыми подключениями, потому что она действительно хорошо работает со Stetho. Добавьте его как еще одну зависимость compile :

java compile 'com.facebook.stetho:stetho-okhttp:1.1.1'

Лучшее время для инициализации Stetho — это когда ваше приложение запускается. Следовательно, вы должны создать новый класс, расширяющий Application и инициализировать Stetho внутри его метода onCreate .

Создайте новый класс с именем MyApplication и переопределите его метод onCreate :

« `открытый класс Java MyApplication расширяет приложение {

Чтобы инициализировать Stetho, необходимо сначала создать экземпляр Stetho.InitializerBuilder , используя метод Stetho.newInitializerBuilder . Затем, чтобы разрешить Stetho работать с инструментами разработчика Chrome, необходимо вызвать enableWebKitInspector . Если вы также хотите включить dumpapp, вы должны вызвать enableDumpapp . Когда Stetho.InitializerBuilder будет готов, вы можете вызвать его метод build чтобы сгенерировать объект Initializer и передать его в метод Stetho.initialize .

А пока давайте DumperPluginsProvider функциональность по умолчанию, используя стандартные InspectorModulesProvider и DumperPluginsProvider . Добавьте следующий код в метод onCreate :

« `java // Создание InitializerBuilder Stetho.InitializerBuilder initializerBuilder = Stetho.newInitializerBuilder (this);

// Включить Chrome DevTools initializerBuilder.enableWebKitInspector (Stetho.defaultInspectorModulesProvider (this));

// Включить интерфейс командной строки initializerBuilder.enableDumpapp (Stetho.defaultDumperPluginsProvider (context));

// Используйте InitializerBuilder для генерации инициализатора Stetho.Initializer initializer = initializerBuilder.build ();

// Инициализируем Stetho с помощью инициализатора Stetho.initialize (initializer); « `

Чтобы операционная система Android знала, что у вас есть собственный класс Application , добавьте атрибут с именем android:name в тег application манифеста и задайте в качестве значения имя вашего пользовательского класса Application .

« `XML

« `

После компиляции и установки приложения на устройстве Android (или в эмуляторе) запустите Google Chrome и введите chrome: // inspect в адресной строке. Вы увидите экран, который выглядит так:

Осмотреть страницу

Нажмите на ссылку осмотреть, чтобы открыть Инструменты разработчика .

Инструменты разработчика

Stetho позволяет вам в реальном времени проверять сетевые соединения, которые устанавливает ваше приложение. Однако в Stetho версии 1.1.1 это работает только с сетевой библиотекой OkHttp. При использовании OkHttp со Stetho следует помнить о том, чтобы добавить StethoInterceptor в List сетевых перехватчиков объекта OkHttpClient .

Вот пример кода, который подключается к HttpBin и получает документ JSON:

« `java // Создать экземпляр OkHttpClient OkHttpClient httpClient = new OkHttpClient ();

// Добавить перехватчик Stetho httpClient.networkInterceptors (). Add (new StethoInterceptor ());

try {// Получить содержимое http://httpbin.org/ip Response response = httpClient.newCall (new Request.Builder (). url («http://httpbin.org/ip») .build ()) .Execute ();

} catch (IOException ioe) {Log.d («StethoTut», ioe.getMessage ()); } « `

После запуска кода вы увидите следующее на вкладке « Сеть » окна « Инструменты разработчика» :

Вкладка сеть

Если щелкнуть URL-адрес в первом столбце, вы попадете на экран, на котором отображается дополнительная информация об ответе:

Содержание ответа

С помощью Stetho вы можете выполнять множество операций с базами данных SQLite вашего приложения. Перейдите на вкладку « Ресурсы » и выберите « Веб-SQL» . Если в вашем приложении есть какие-либо базы данных SQLite, они будут перечислены здесь. Выбор базы данных показывает список таблиц в базе данных. Наконец, щелчок таблицы отображает записи таблицы:

Ряды таблицы

Вы также можете выполнить SQL-запросы после выбора базы данных SQLite:

Выполнять запросы

Чтобы просмотреть SharedPreferences вашего приложения, откройте вкладку « Ресурсы » окна « Инструменты разработчика» и выберите « LocalStorage» . Вы увидите имена файлов, которые ваше приложение использует для хранения настроек. Щелчок по файлу отображает пары ключ-значение, хранящиеся в этом файле:

Посмотреть настройки

Вы даже можете редактировать значения, хранящиеся в файле:

Изменить настройки

Обратите внимание, что любые изменения, которые вы вносите в значения, являются постоянными.

dumpapp — мощная утилита, которая позволяет вам манипулировать вашим Android-приложением из командной строки. Вы можете получить его, клонировав репозиторий Stetho :

bash git clone https://github.com/facebook/stetho

Поскольку dumpapp — это скрипт Python, для его использования на вашем компьютере должна быть установлена ​​последняя версия Python.

Чтобы просмотреть список доступных плагинов, войдите в каталог stetho / scripts и выполните следующую команду:

bash ./dumpapp -l

Вывод выглядит примерно так:

Все стандартные плагины

Давайте использовать плагин под названием prefs . Этот плагин используется для просмотра и редактирования значений, хранящихся в SharedPreferences вашего приложения. Например, следующая команда перечисляет все пары ключ-значение, хранящиеся в SharedPreferences вашего приложения:

bash ./dumpapp prefs print

Вывод выглядит примерно так:

Список предпочтений

Пользовательские плагины для dumpapp — это просто классы Java, которые реализуют интерфейс DumperPlugin . Давайте создадим простой плагин, который печатает имя пакета тестируемого приложения.

Создайте новый класс внутри класса MyApplication с именем MyDumperPlugin . После переопределения методов интерфейса DumperPlugin ваш класс должен выглядеть следующим образом:

« `Java-класс MyDumperPlugin реализует DumperPlugin {@Override public String getName () {}

Метод getName должен возвращать имя плагина. Чтобы вернуть значение my_plugin , добавьте следующий код в метод getName :

java return "my_plugin";

Метод dump — это метод, который вызывается при запуске плагина из командной строки. DumperContext предоставляет различные потоки ввода / вывода, которые позволяют вам читать из командной строки или записывать в нее. Сейчас мы просто будем использовать стандартный вывод. Добавьте следующий код в метод dump чтобы получить ссылку на стандартный поток вывода:

java PrintStream out = dumpContext.getStdout();

Поскольку этот плагин является частью класса MyApplication , для получения имени пакета приложения вы можете напрямую вызвать метод getPackageName . Получив имя пакета, напечатайте его, используя метод println объекта PrintStream :

java out.println(MyApplication.this.getPackageName());

Ваш пользовательский плагин теперь готов к использованию.

Плагин, созданный на предыдущем шаге, не будет доступен для Stetho, если вы не создадите пользовательский поставщик плагинов и будете использовать его при инициализации Stetho. Пользовательский поставщик плагинов — это класс, который реализует интерфейс DumperPluginsProvider .

Давайте создадим собственный поставщик плагинов под названием MyDumperPluginsProvider . Создайте этот класс внутри класса MyApplication . После переопределения единственного метода интерфейса DumperPluginsProvider ваш класс должен выглядеть следующим образом:

« `Java-класс MyDumperPluginsProvider реализует DumperPluginsProvider {@Override public Iterable получить() {

Поскольку метод get возвращает Iterable , все, что вам нужно сделать, это создать список, добавить свой собственный плагин в список и вернуть список. Код для этого будет выглядеть так:

« `java // Создать список ArrayList plugins = new ArrayList <> ();

// Добавить один или несколько пользовательских плагинов plugins.add (new MyDumperPlugin ());

// Возвращаем список return plugins; « `

Однако, поскольку Iterable вашего провайдера пользовательских плагинов не включает в себя плагины по умолчанию, вы не сможете использовать их при запуске dumpapp. Если вы хотите использовать оба пользовательских плагина и плагины по умолчанию, вы должны добавить плагины по умолчанию в ваш ArrayList . Чтобы получить список defaultDumperPluginsProvider по умолчанию, необходимо вызвать метод get поставщика defaultDumperPluginsProvider возвращаемый методом defaultDumperPluginsProvider .

« `java // Добавляем плагины по умолчанию для сохранения оригинальной функциональности

for (плагин DumperPlugin: Stetho.defaultDumperPluginsProvider (MyApplication.this) .get ()) {plugins.add (плагин); } « `

Ваш поставщик пользовательских плагинов готов. Чтобы использовать его, перейдите к методу onCreate и передайте его экземпляр вызову enableDumpapp :

java initializerBuilder.enableDumpapp(new MyDumperPluginProvider());

Перечислите все доступные плагины снова, используя dumpapp -l . Вы увидите название вашего собственного плагина в списке:

Пользовательский плагин в списке

Чтобы запустить его, выполните следующую команду:

bash ./dumpapp my_plugin

Следует напечатать название пакета вашего приложения:

Печатает название пакета

В этом уроке вы узнали, как использовать Stetho в своих проектах Android. Вы также узнали, как использовать интерфейс командной строки, dumpapp и инструменты разработчика Google Chrome для отладки ваших приложений. К настоящему времени вы, должно быть, поняли, что, хотя Stetho еще не может полностью заменить отладчик Android Studio, он определенно предлагает функции, которые могут значительно улучшить ваш опыт отладки.

Чтобы узнать больше о Stetho, обратитесь к коду и документации, которые доступны в репозитории GitHub .