2013/01/19

AndroidのLogを使う時のちょっと便利な方法

Androidで開発している時に、よく使うのがandroid.util.Logクラスですよね。

みなさんもよく使っていると思います。
    Log.d(TAG, "hogehoge");
こんな風に使うのが一般的なのですが、これをいろんな場所に組み込んでログを出力してると、後でめんどうなことになります。

リリースビルドした時も、このログ出力は消えないので、リリース前にはLogの部分を削除したりコメントアウトしたりといった事が必要になってきます。

Logを組み込んでる場所が5箇所とか10箇所ぐらいなら問題ありませんが、100箇所を超えるようになると、消す作業そのものが大変ですし、消し忘れなども出てきます。

そして、この問題を解決できる便利な方法があります。

ADT17から/genに生成されるようになったBuildConfig.javaを利用します。
public final class BuildConfig {
    public final static boolean DEBUG = true;
}
このDEBUGはデバッグビルドの時はtrueのままですが、リリースビルドの時falseになります。

なのでログを出力する際に以下のようにすると、開発してる時はログが出力され、リリースするときはログが出力されないようになります。
if (BuildConfig.DEBUG) {
    Log.d(TAG, "hogehoge");
}

さらに、いちいちログ出力するのに3行も書くのはちょっとめんどうなので、Loggerクラスを作りました。
public class Logger {
    
    private static final String TAG = "MyApplication";
    
    public static final void d(String msg) {
        if (BuildConfig.DEBUG) {
            Log.d(TAG, msg);
        }
    }
    
    public static final void d(String tag, String msg) {
        if (BuildConfig.DEBUG) {
            Log.d(tag, msg);
        }
    }
    
    public static final void e(String msg) {
        if (BuildConfig.DEBUG) {
            Log.e(TAG, msg);
        }
    }
    
    public static final void e(String tag, String msg) {
        if (BuildConfig.DEBUG) {
            Log.e(tag, msg);
        }
    }
    
    public static final void i(String msg) {
        if (BuildConfig.DEBUG) {
            Log.i(TAG, msg);
        }
    }
    
    public static final void i(String tag, String msg) {
        if (BuildConfig.DEBUG) {
            Log.i(tag, msg);
        }
    }
    
    public static final void v(String msg) {
        if (BuildConfig.DEBUG) {
            Log.v(TAG, msg);
        }
    }
    
    public static final void v(String tag, String msg) {
        if (BuildConfig.DEBUG) {
            Log.v(tag, msg);
        }
    }
    
    public static final void w(String msg) {
        if (BuildConfig.DEBUG) {
            Log.w(TAG, msg);
        }
    }
    
    public static final void w(String tag, String msg) {
        if (BuildConfig.DEBUG) {
            Log.w(tag, msg);
        }
    }
    
    public static final void heap(){
        heap(TAG);
    }
    
    public static final void heap(String tag) {
        if (BuildConfig.DEBUG){
            String msg = "heap : Free=" + Long.toString(Debug.getNativeHeapFreeSize() / 1024) + "kb" + 
                    ", Allocated=" + Long.toString(Debug.getNativeHeapAllocatedSize() / 1024) + "kb" + 
                    ", Size=" + Long.toString(Debug.getNativeHeapSize() / 1024) + "kb";
            
            Log.v(tag, msg);
        }
    }
}
このクラスを適当な場所に置いて、ログ出力したい箇所で
Logger.d("hogehoge");
// もしくは
Logger.d(TAG, "hogehoge");
とすると、いつもと同じようにログ出力ができます。もちろんリリースビルド時にはログが出力されません。
あと、heap()メソッドはヒープメモリの情報をログに出力するので、メモリ関連の調査をしてる時に役に立つかなとおもいます。

0 件のコメント:

コメントを投稿