2010-04-27 10 views
30

Programuję aplikacje dla systemu Android, a najlepszy sposób tutaj może być, ale nie musi być taki sam jak Java w ogóle.Najlepszy sposób na włączenie kodu debugowania?

Po prostu chcę móc ustawić flagę debugowania, która będzie wykonywała tylko niektóre części kodu, gdy jest ustawiona na true - equiv to C++ ustawiające preprocesor #define DEBUG i używające #ifdef DEBUG.

Czy jest to zaakceptowany lub najlepszy sposób osiągnięcia tego w Javie?

Teraz właśnie ustawiam zmienną w moim obiekcie aplikacji, ale nie wyobrażam sobie, że to jest najlepszy sposób.

+2

Sprawdź tę odpowiedź: http://stackoverflow.com/questions/1344270/java-preprocessor – zmbush

Odpowiedz

23

To tak, jak to zrobić:

// 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'); 
} 
+3

Nice! Nie wiedziałem, że możesz zaimportować całą drogę do jednej stałej! Starałem się unikać wpisywania X.X.CONST za każdym razem. To, w połączeniu z odpowiedzią wymienioną w komentarzu do mojego pytania (http://stackoverflow.com/questions/1344270/java-preprocessor), pokazuje, w jaki sposób oświadczenie "jeśli" o fałszywej stałej w swoim stanie zostaje wyłączone z kompilacja, dokładnie to, czego szukałem. Dzięki! – stormin986

+0

Przez moje eksperymenty (sprawdzanie kodu bajtowego), to podejście wyklucza tylko kod z klasy, gdzie stała jest zdefiniowana .. inne klasy nadal będą miały w sobie kod (nie będzie on jednak wykonywany). czy się mylę? – Vlad

+0

import statyczny to po prostu nazwa rzeczy. – Vlad

6
if (Debug.isDebuggerConnected()) { 
    // debug stuff 
} 
+0

Podoba mi się to i wyobrażam sobie, że czasami będę dla mnie przydatny, ale podoba mi się, że inne podejście pomija cały blok z kompilacji z fałszywą stałą w "jeśli". komunikat. – stormin986

+1

Używam obu metod i komentarzy warunkowych. Każdy ma swoje miejsce, chociaż najlepszy byłby preprocesor. – drawnonward

+0

Problem polega na tym, że debugger nie zawsze jest podłączony, gdy moja aplikacja ulega awarii. Zbieram ślad stosu w wyjątku i zapisuję w pliku. Ale MUSZĘ zrobić to tylko w wersji do debugowania. – anishsane

51

Zamiast własną flagę, można użyć flagi ustawione automatycznie przez ADT, na przykład:

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

FLAG_DEBUGGABLE bit jest automatycznie ustawiany na wartość true lub false, w zależności od atrybutu "debuggable" aplikacji (ustawionego w AndroidManifest.xml). Najnowsza wersja ADT (wersja 8) automatycznie ustawia ten atrybut dla ciebie, gdy nie eksportujesz podpisanego pakietu.

Dzięki temu nie trzeba pamiętać o ustawianiu/resetowaniu własnej flagi użytkownika.

Możesz przeczytać więcej w this thread.

1

Myślę, że pisanie testów jest lepszą alternatywą niż dodawanie kodu DEBUG.

Chodzi mi o to, że podczas pisania testu dla jakiegoś składnika/metody/klasy nie zanieczyszczasz oryginalnego kodu źródłowego jakimś redundantnym kodem debugowania.

24

Revision 17 narzędzi SDK (marzec 2012) wprowadził drogę do naśladować Od C na #ifdef DEBUG

General Notes:

Dodany funkcja, która pozwala na uruchamianie kodu tylko w trybie debugowania . Kompilacje teraz generują klasę o nazwie BuildConfig zawierającą stałą DEBUG, która jest automatycznie ustawiana zgodnie z typem kompilacji. Możesz sprawdzić stałą (BuildConfig.DEBUG) w swoim kodzie, aby uruchomić funkcje tylko debugowania.

+0

Zawsze zwraca wartość false dla mojej biblioteki, która jest używana przez moją aplikację. –

10

To działa na mnie z kodem if (BuildConfig.DEBUG), używając BuildConfig klasę. To jest bezpieczny i łatwy kod do zrobienia. Zachowaj ostrożność podczas używania tego stylu kodu. Nie używaj go w taki sposób, aby istniały 2 różne oddzielne gałęzie kodu między wersjami Release and Debug. Jeśli to zrobisz, może to unieważnić testowanie aplikacji dla wersji Release. Dla mnie użyłem go tylko do pominięcia wywoływania wiadomości Log. Więcej informacji na temat tej klasy BuildConfig @Build System Concepts.

+0

Prawie zerowe użycie procesora. Idealny. – romulof

+0

@ Orb, cieszę się z Twojej strony i uważam, że to najlepszy wybór dla nowoczesnego studia Android. Będę edytować mój post, ponieważ teraz powinien być używany jako najłatwiejszy do zrobienia. Dziękuję za uwagę i przypomnienie. –

9

Proponuję użyć wbudowanej Android API BuildConfig

if (BuildConfig.DEBUG) { 
    // do something for a debug build 
} 
Powiązane problemy