Отключение логирования в готовом приложении

Android

Обычно в debug-версии приложения вываливается в LogCat куча полезной для разработчика информации, которую желательно скрывать в релизе. Да и зачем загаживать LogCat отладочной информацией? Однако ручное удаление (или комментирование) методов вызова журналирования превращается в утомительную процедуру. Поэтому стоит обеспечить возможность автоматического отключения вывода лишней информации в LogCat для release-версии приложения.

Помимо ручного выпиливания есть ряд простых способов обеспечивающих отключение излишнего логирования.

Наиболее простой способ заключается в создании обертки вокруг вызова методов LogCat:

public static final boolean isDebug = false;
public final String TAG = "MyTAG";

public void MyLog (String msg){
    if (isDebug) {
        Log.v(TAG, msf);
    }
}

Теперь управление логированием осуществляется через переменную isDebug. Перед релизной сборкой надо всего лишь установить ей значение true.
Этот способ уже устарел, но все ещё иногда встречается.
Более актуальный подход основан на использовании статического поля DEBUG содержащегося в автоматически генерируемом классе BuildConfig. Проверка на признак отладочной версии теперь выглядит так:

if (BuildConfig.DEBUG) {
    // логирование
}

При релизной сборке анализатор вообще выкинет этот участок из кода за полной ненадобностью. Таким образом решена наиболее стандартная ситуация, когда в отладочной сборке есть лог, а в релизной – нет.
В редких случаях бывает необходимость решить нестандартную ситуацию: релиз с выводом в лог, или дебаг с отсутствием логирования. Для этого создается собственный параметр, который добавляется в секцию buildType в файле build.gradle.

buildTypes {
	release {
		// Настройки релиза
		buildConfigField "boolean", "USE_LOG", "false"
	}
	debug {
		buildConfigField "boolean", "USE_LOG", "true"
	}
	// Рилиз с логами, наследуемый от обычного релиза
	releaseWithLog.initWith(buildTypes.release)
	releaseWithLog {
		buildConfigField "boolean", "USE_LOG", "true"
	}
}

Конфигурация releaseWithLog будет являться релизной сборкой в которой будет осуществляться логирование. Новая проверка в коде:

if (BuildConfig.USE_LOG) {
	// логирование
}

З.Ы. Для более гибкого решения можно вместо boolean-поля добавить int, где устанавливать битовые флаги для необходимых типов сообщений.

Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий