Лучший способ включить код отладки?

Я программирую приложения для Android, и лучший способ здесь может быть или не такой же, как Java в целом.

Я просто хочу иметь возможность установить флаг отладки, который будет выполнять только определенные части кода, когда он настроен на True - Equiv к C ++, устанавливая препроцессор # Debug и с использованием DEBUG #IFDEF.

Есть ли принятый или лучший способ достичь этого в Java?

Прямо сейчас я просто собираюсь установить переменную в моем объекте приложения, но я не представляю, что это лучший способ.


person stormin986    schedule 27.04.2010    source источник
comment
Посмотрите этот ответ: stackoverflow.com/questions/1344270/java-preprocessor   -  person zmbush    schedule 27.04.2010


Ответы (7)


Вот как я это делаю:

// in some.class.with.Constants
public static final boolean DEV_MODE = true;

// in some other class
import static some.class.with.Constants.DEV_MODE;

if(DEV_MODE){
    Log.d('sometag', 'somemessage');
}
person yanchenko    schedule 27.04.2010
comment
Хороший! Я не знал, что вы можете импортировать все вплоть до одной константы! Я старался не вводить X.X.CONST каждый раз. Это в сочетании с ответом, указанным в комментарии к моему вопросу (stackoverflow.com/questions/1344270/java-preprocessor), который показывает, как оператор if с ложной константой в его условии исключается из компиляции, — это именно то, что я искал. Спасибо! - person stormin986; 27.04.2010
comment
Согласно моим экспериментам (проверка байт-кода), этот подход исключит только код из класса, в котором определена константа. В других классах все еще будет код (хотя он не будет выполняться). я ошибся? - person Vlad; 21.10.2015
comment
import static - это просто имя - person Vlad; 21.10.2015

Вместо того, чтобы использовать свой собственный флаг, вы можете использовать флаг, автоматически установленный ADT, например:

final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0

BIT FLAG_DEBUGGABLE BIT автоматически устанавливается на true или false, в зависимости от атрибута «отладки» приложения (установлено в AndroidManifest.xml). Последняя версия ADT (версия 8) автоматически устанавливает этот атрибут для вас, когда не экспортирует подписанный пакет.

Таким образом, вам не нужно запоминать настройку / сброс собственного собственного флага.

Вы можете прочитать больше в Эта тема.

person HRJ    schedule 29.12.2010

Редакция 17 SDK Tools (март 2012) представила способ IMITAL C'S #ifdef DEBUG

Из Общие примечания:

Добавлена ​​функция, позволяющая запускать некоторый код только в режиме отладки. Создание теперь генерирует класс под названием BuildConfig, содержащий константу отладки, который автоматически устанавливается в соответствии с вашим типом сборки. Вы можете проверить константу (BuildConfig.DEBUG) в своем коде, чтобы запускать функции только для отладки.

person IlDan    schedule 29.03.2012
comment
Всегда возвращает false для моей библиотеки, которую использует мое приложение - person Ed of the Mountain; 24.01.2018

Я предлагаю использовать встроенный Android API BuildConfig

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
person Sunny Tambi    schedule 16.03.2017
comment
это должно быть отмечено при правильном ответе или ниже для правильного использования APпредоставляется SDK - person DevZer0; 26.09.2018

Это работает для меня с кодом if (BuildConfig.DEBUG), используя buildconfig класса. Это безопасный и простой код. Будьте осторожны при использовании этого стиля кода. Не используйте так, чтобы существовали 2 различных отдельных ветви кода, между <сильными> версиями выпуска и отладки . Если вы сделаете, это может сделать недействительным тестирование приложений для версии выпуска. Для меня я использовал это только чтобы пропустить звонок Log обмена сообщениями.

Подробнее об этом классе Buildconfig @ Создание концепции системы.

person The Original Android    schedule 28.07.2015
comment
Почти нулевая загрузка процессора. Идеально. - person romulof; 11.12.2015
comment
@OrB, я рад за вас и считаю, что это лучший выбор для современной Android Studio. Я отредактирую свой пост, так как теперь его следует использовать как самый простой код. Спасибо, что заметили и напомнили. - person The Original Android; 12.12.2015

Я думаю, что написание тестов лучше альтернативы, чем добавлять код отладки.

Моя точка зрения - это то, что когда вы пишете тест для некоторого компонента / метода / класса, вы не загрязняете свой исходный код исходного сигнала с некотором избыточным кодом отладки.

person fiction    schedule 29.12.2010

person    schedule
comment
Мне это нравится, и я полагаю, что время от времени я нахожу это весьма полезным, но мне нравится, как другой подход пропускает весь блок из компиляции с ложной константой в выражении 'if'. - person stormin986; 27.04.2010
comment
Я использую оба метода и условные комментарии. У каждого есть свое место, хотя лучше всего было бы использовать настоящий препроцессор. - person drawnonward; 27.04.2010
comment
Проблема в том, что отладчик не всегда подключается при сбое моего приложения. Я собираю трассировку стека в исключении и сохраняю в файл. Но я ДОЛЖЕН делать это только в отладочной сборке. - person anishsane; 03.10.2013