wtorek, 16 listopada 2010

Logowanie zdarzeń w Androidzie - tips & tricks.

System logowania zdarzeń udostępniany przez Androida za pomocą klasy android.util.Log oraz DDMS'a to bardzo wygodne narzędzie niezbędne każdemu, kto programuje dla tej platformy mobilnej.

Ostatnio na grupie dyskusyjnej PLAG padły pytania:

1) jak całkowicie wyłączyć lub chociaż ograniczyć poziom wyświetlanych logów, gdy publikujemy aplikację w Android Market lub innym sklepie z aplikacjami?

2) czy można w jakiś sposób pominąć komentowanie wywołania funkcji Log.x() w kodzie?

3) czy jest możliwość wyłączenia tego w AndroidManifest.xml?

Sam framework Android'a nie udostępnia mechanizmu selektywnego używania logów. Zapewnia jedynie automatyczne filtrowanie logów typu d (debug) podczas działania programu. Logi  typu e, w, i, v są wyświetlane zawsze.

Można jednak bardzo prostym sposobem osiągnąć pożądane działanie.

Z pomocą przychodzi napisanie własnej klasy (wrappera) na oryginalną klasę Log, której fragment jest poniżej. Wówczas można w metodzie onCreate() głównej Activity naszej aplikacji, lub jeśli mamy własną klasę dziedziczącą po Application to w metodzie onCreate() tej klasy, wywołać jedną z dwóch funkcji allowAll() i cieszyć się filtrowanymi logami.

public class Log {
   public static boolean sAllowDebug = false;
   public static boolean sAllowError = false;
   public static boolean sAllowWarn = false;
   public static boolean sAllowInfo = false;
   public static boolean sAllowVerbose = false;


   public static void allowAll(boolean d, boolean e, boolean i,       
      boolean w, boolean v) {
      
      sAllowDebug = d;
      sAllowError = e;
      sAllowInfo = i;
      sAllowVerbose = v;
      sAllowWarn = w;
   }
    
   public static void allowAll(boolean allow) {
      sAllowDebug = allow;
      sAllowError = allow;
      sAllowInfo = allow;
      sAllowVerbose = allow;
      sAllowWarn = allow;
   }
    
   public static int d(String tag, String msg) {
      int result = 0;
    
      if (sAllowDebug) {
         result = android.util.Log.d(tag, msg); 
      }
    
      return result;
   }
   ...
}