Лучший способ включить код отладки? - PullRequest
36 голосов
/ 27 апреля 2010

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

Я просто хочу иметь возможность установить флаг отладки, который будет выполнять только определенные части кода, когда он установлен в true - эквивалентно C ++, устанавливающему препроцессор #define DEBUG и использующему #ifdef DEBUG.

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

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

Ответы [ 7 ]

54 голосов
/ 29 декабря 2010

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

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

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

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

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

30 голосов
/ 27 апреля 2010

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

// 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');
}
26 голосов
/ 29 марта 2012

В редакции 17 инструментов SDK (март 2012 г.) появился способ имитировать C #ifdef DEBUG

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

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

13 голосов
/ 16 марта 2017

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

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
12 голосов
/ 28 июля 2015

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

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

6 голосов
/ 27 апреля 2010
if ( Debug.isDebuggerConnected() ) {
  // debug stuff
}
1 голос
/ 29 декабря 2010

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

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

...