Афоризм
Если больной очень хочет жить, то врачи бессильны.
Фаина Раневская
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698

Отладка приложения, Logcat

Для отладки приложений могут быть использованы всплывающие сообщения Toast. Однако это не эффективно. Android SDK включает средство просмотра отладочных сообщений Logcat. Оно не представляет сложности в освоении, поэтому широко используется программистами. Logcat позволяет просматривать отладочные сообщения не только разрабатываемого приложения, но и протоколируемые системой сообщения. Так, например, Garbage Collection периодически протоколирует свои сообщения о выполнении определенных действий («сборке мусора»), которые можно просматривать с помощью Logcat.

Для протоколирования сообщений необходимо использовать класс android.util.Log, позволяющий объединять сообщения по категориям. В следующем списке приведены методы класса Log, отсортированные по приоритету (важности) от высшего к низшему :

  • Log.e(String, String) - ошибка (error)
  • Log.w(String, String) - предупреждение (warning)
  • Log.i(String, String) - информация (info)
  • Log.d(String, String) - отладка (debug)
  • Log.v(String, String) - подробно (verbose)

Пример протоколирования

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MethodName : get item number " + item.id);

В качестве первого параметра методов Log используется текстовый тег (в примере переменная TAG). Если имеется необходимость в качестве тега сообщения определить наименование класса, то можно использовать следующее определение :

private static String TAG = this.getClass().getSimpleName();

Панель Logcat в Studio

Logcat в среде разработки Android Studio располагается на отдельной вкладке, интерфейс которой представлен на следующем скриншоте. Слева вертикально располагаются кнопки управления сообщениями : очистка, перемещение по списку и т.д. Интерес представляет расположенный сверху справа компонент с выпадающим списком/меню. Если выбрать представленный на скриншоте пункт «Edit Filter Configuration», то можно определить фильтр сообщений, окно которого изображено на следующем скриншоте.

Фильтр сообщений

Logcat позволяет создать набор из нескольких фильтров. Достаточно только для каждого фильтра определить его наименование «Filter Name» и тег сообщений «Log Tag». Значение тега сообщения регистрируется классом android.util.Log.

Создадим простой пример протоколирования сообщений. В примере переопределим методы активности; в каждом методе будем протоколировать соответствующее сообщение.

Листинг активности

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity
{
    final String TAG = "ACTIVITY_STATE";
    @Override
    protected  void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

После старта приложения переходим на вкладку Locat и просматриваем список регистрируемых сообщений. Чтобы исключить сообщений системы установим фильтр State (справа, сверху). После этого можно менять ориентацию устройства (portrait => landscape => portrait) и контролировать список сообщений.

Протоколируемые сообщения можно просматривать не только с помощью Logcat. Они также попадают и на вкладку Run (см. следующий скриншот), но только с ме́ньшей функциональностью (отсутствует время регистрации, нельзя фильтровать и т.д.).

Формат сообщения

Logcat представляет сообщения в определенном формате : «date time PID-TID/package priority/tag: message». Поле даты (date) имеет формат MM-DD (месяц–день). Формат времени (time) HH24:MI:SS.SSS (часы:минуты:секунды.мс) включает милисекунды. Значения идентификаторов процесса PID и потока TID могут совпадать, если существует только один поток. Пример сообщения : 02-08 08:43:51.557 11608-43308/com.android.test.p08activity D/ACTIVITY_STATE: onStop.

Английский вариант полного описания Logcat.

Контроль протоколирования, BuildConfig

На этапе разработки приложения вывод отладочных сообщений, конечно же, полезен и необходим. Но что делать с этими сообщеними в готовом релизе? Если проект включает несколько модулей с различными тегами отладочных сообщений, то подготовка очередного релиза потребует определенных усилий с ручным удалением отладочных сообщений и комментариев. Иногда программисты используют условные выражения для вывода сообщений/комментариев. Например :

public static final boolean IS_RELEASE = false ;
public        final String  TAG_init   = "INIT";

. . .

public void WriteLog(String tag, String message)
{
    if (!IS_RELEASE)
        Log.v(tag, message);
}

. . .

WriteLog(TAG_init, "Read resources");

В этом примере сообщения будут протоколироваться в отдельной процедуре WriteLog только если IS_RELEASE=false. Одним движением (IS_RELEASE=true) можно блокировать протоколирование сообщений перед созданием готового apk-файла.

Начиная с 17-ой версии Android Build Tools в приложении автоматически формируется класс BuildConfig, содержащий статическое поле DEBUG с признаком отладочной сборки. При использовании данного класса перед протоколированием необходимо выполнить следующую проверку :

if (BuildConfig.DEBUG) {
    Log.v(TAG_init, message);
}

Объект BuildConfig можно расширить и включить в него свой «тег». Для этого необходимо внести соответствующие изменения в секцию buildType сборочного build.gradle файла проекта. Вот как может выглядеть секция buildType для тега ACTIVITY_STATE :

buildTypes {
    release {
        minifyEnabled false
        buildConfigField "boolean", "ACTIVITY_STATE", "false"
    }
    debug {
        buildConfigField "boolean", "ACTIVITY_STATE", "true"
    }
    releaseWithLog.initWith(buildTypes.release)
    releaseWithLog {
        buildConfigField "boolean", "ACTIVITY_STATE", "true"
    }
}

Конфигурация releaseWithLog будет релизной сборкой с протоколированием. Соответственно в коде приложения необходимо будет выполнять следующую проверку :

if (BuildConfig.ACTIVITY_STATE) {
	// протоколирование ...
}

В IDE Android Studio файл build.gradle (Module: module_name) располагается в директории Gradle Scripts.

Связанные страницы

Модули Android приложения
Layout интерфейса приложения Android
Всплывающие сообщения Toast

  Рейтинг@Mail.ru